Документация Engee
Notebook

Подсчет событий при помощи enabled- и triggered-подсистем

В этой модели мы демонстрируем разницу в работе блока enabled и блока triggered, определяющих условия срабатывания подсистемы. Демонстрация осуществляется на примере подсчета событий.

Описание модели

На модели размещен генератор импульсов Pulse Generator, который в режиме Sample based управляет параметрами сигнала опираясь на заданное количество дискретных шагов симуляции, которое должно пройти между переключениями.

image.png

Дальше сигнал попадает в два варианта реализации счетчиков:

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

image.png

Оба счетчика, при срабатывании, прибавляют единицу к своему выходному сигналу. Но, как нам может быть заметно по раскраске, время срабатывания (Sample Time) второго счетчика обусловлено работой блока TriggerPort, поэтому цвет блока счетчика отличается от цвета остальных блоков системы (для которых установлено время дискретизации 0.01).

Работа модели

Модель позволяет изучить, как работают разные блоки управления выполнением подсистем. Запустим модель и проанализируем результаты.

In [ ]:
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 )
Out[0]:
Dict{String, DataFrames.DataFrame} with 3 entries:
  "Счетчик Enabled"   => 226×2 DataFrame…
  "Счетчик Triggered" => 226×2 DataFrame…
  "Сигнал управления" => 226×2 DataFrame

Первый сигнал демонстрирует работу дискретного источника сигнала управления.

In [ ]:
plot( data["Сигнал управления"].time, data["Сигнал управления"].value )
Out[0]:

На втором графике мы видим работу enabled-подсистемы с логикой срабатывания, заданной EnablePort. Счетчик нарастает с каждым тактом симуляции, когда подсистема получает положительный сигнал на порту управления. Пока подсистема отключена, она возвращает последнее накопленное значение сигнала. При возобновлении подачи положительного сигнала управления выход сбрасывается – такое поведение задается выставленной конфигурацией блока EnablePort.

In [ ]:
plot( data["Счетчик Enabled"].time, data["Счетчик Enabled"].value )
Out[0]:

На третьем графике мы видим работу triggered-подсистемы с логикой срабатывания, заданной через TriggerPort. С каждым нарастающим фронтом сигнала управления, счетчик увеличивается на 1.

In [ ]:
plot( data["Счетчик Triggered"].time, data["Счетчик Triggered"].value )
Out[0]:

Почему счетчик "пропускает" первые два нарастающих фронта? В его схеме есть блок Unit Delay, который возвращает 0 при первом срабатывании. А первое срабатывание этого блока происходит не в момент t=0, а в момент регистрации первого нарастающего импульса:

  • при запуске модели сигнал управления изначально находится в значении 1 и нарастающего импульса нет,
  • при наступлении первого фронта счетчик впервые срабатывает и возвращает 0,
  • при регистрации второго фронта (третий импульс) счетчик вернет нам 1.

Заключение

Используя различные режимы срабатывания подсистем в Engee можно организовывать сложные гибридные сценарии симуляции дискретных или непрерывных процессов. Мы убедились в этом на примере двух модификаторов исполнения подсистем – EnablePort и TriggerPort, но в Engee есть еще несколько подобных модификаторов, позволяющих задавать более сложные условия работы подсистем, с которыми можно ознакомиться на панели Подсистемы базовой библиотеки блоков.

Блоки, использованные в примере