Подсчет событий при помощи enabled- и triggered-подсистем
В этой модели мы демонстрируем разницу в работе блока enabled
и блока triggered
, определяющих условия срабатывания подсистемы. Демонстрация осуществляется на примере подсчета событий.
Описание модели
На модели размещен генератор импульсов Pulse Generator
, который в режиме Sample based
управляет параметрами сигнала опираясь на заданное количество дискретных шагов симуляции, которое должно пройти между переключениями.

Дальше сигнал попадает в два варианта реализации счетчиков:
- один реализован в виде подсистемы с портом
EnablePort
(срабатывающий по наличию положительного сигнала на входе, - другой – в виде подсистемы
TriggerPort
, и он срабатывает при регистрации нарастающего фронта сигнала.

Оба счетчика, при срабатывании, прибавляют единицу к своему выходному сигналу. Но, как нам может быть заметно по раскраске, время срабатывания (Sample Time
) второго счетчика обусловлено работой блока TriggerPort
, поэтому цвет блока счетчика отличается от цвета остальных блоков системы (для которых установлено время дискретизации 0.01).
Работа модели
Модель позволяет изучить, как работают разные блоки управления выполнением подсистем. Запустим модель и проанализируем результаты.
modelName = "counters_demo";
model = modelName in [m.name for m in engee.get_all_models()] ? engee.open( modelName ) : engee.load( "$(@__DIR__)/$(modelName).engee");
# Запустим модель
data = engee.run( modelName, verbose=false )
Первый сигнал демонстрирует работу дискретного источника сигнала управления.
plot( data["Сигнал управления"].time, data["Сигнал управления"].value )
На втором графике мы видим работу enabled
-подсистемы с логикой срабатывания, заданной EnablePort
. Счетчик нарастает с каждым тактом симуляции, когда подсистема получает положительный сигнал на порту управления. Пока подсистема отключена, она возвращает последнее накопленное значение сигнала. При возобновлении подачи положительного сигнала управления выход сбрасывается – такое поведение задается выставленной конфигурацией блока EnablePort
.
plot( data["Счетчик Enabled"].time, data["Счетчик Enabled"].value )
На третьем графике мы видим работу triggered
-подсистемы с логикой срабатывания, заданной через TriggerPort
. С каждым нарастающим фронтом сигнала управления, счетчик увеличивается на 1.
plot( data["Счетчик Triggered"].time, data["Счетчик Triggered"].value )
Почему счетчик "пропускает" первые два нарастающих фронта? В его схеме есть блок Unit Delay
, который возвращает 0 при первом срабатывании. А первое срабатывание этого блока происходит не в момент t=0
, а в момент регистрации первого нарастающего импульса:
- при запуске модели сигнал управления изначально находится в значении
1
и нарастающего импульса нет, - при наступлении первого фронта счетчик впервые срабатывает и возвращает
0
, - при регистрации второго фронта (третий импульс) счетчик вернет нам
1
.
Заключение
Используя различные режимы срабатывания подсистем в Engee можно организовывать сложные гибридные сценарии симуляции дискретных или непрерывных процессов. Мы убедились в этом на примере двух модификаторов исполнения подсистем – EnablePort
и TriggerPort
, но в Engee есть еще несколько подобных модификаторов, позволяющих задавать более сложные условия работы подсистем, с которыми можно ознакомиться на панели Подсистемы базовой библиотеки блоков.