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

Пользовательские шины в конечных автоматах

В данном проекте демонстрируется возможность использования пользовательских шин в блоке Chart.

Пользовательские шины - структурированные сигналы типа BusSignal. Этот тип позволяет объединить логически связанные сигналы в единую струтуру - шину, каждому элементу которой соответствует определённое имя, тип данных и размерность.

Используем макрос @__DIR__ для определения пути, содержащего интерактивный скрипт:

In [ ]:
demoroot = @__DIR__;

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

Рассмотрим простую модель с конечным автоматом, реализующим логику блока Saturation, ограничивающего входной сигнал сверху и снизу:

Входной сигнал

Выходной сигнал

Нижний предел <= Входной сигнал <= Верхний предел

Входной сигнал

Входной сигнал < Нижний предел

Нижний предел

Входной сигнал > Верхний предел

Верхний предел

Пусть на вход блока Chart поступает пользовательская шина InputBus, содержащая сигналы:

  • signal типа данных Float64 - входной сигнал;
  • limits типа данных LimitBus (вложенная шина):
    • upper типа данных Float64 - верхний предел;
    • lower типа данных Float64 - нижний предел.

А на выходе блока Chart формируется пользовательская шина OutputBus, содержащая сигналы:

  • signal типа данных Float64 - выходной сигнал;
  • is_saturated типа данных Bool - признак насыщения.
buses_chart--1790945236851.png

Определим пользовательские шины в рабочей области:

In [ ]:
LimitBus = BusSignal((:upper, :lower), (Float64, Float64), ((), ()), :LimitBus);
InputBus = BusSignal((:signal, :limits), (Float64, LimitBus), ((), ()), :InputBus);
OutputBus = BusSignal((:signal, :is_saturated), (Float64, Bool), ((), ()), :OutputBus);

И укажем корректные типы данных в настройках блоков Bus Creator (LimitBus и InputBus) и Bus Selector (OutputBus):

image.png

Перейдём в блок Chart и в редакторе данных модели (на вкладке "Конечные автоматы") создадим входной и выходной сигналы:

image.png

Типы данных зададим пользовательскими шинами следующим образом:

image.png

Логику блока представим в виде графа переходов:

buses_chart--1790945920417.png

Для обращения к элементам шины внутри блока Chart используется запись через "точку", например:

  • InputBus.signal > InputBus.limits.upper
  • OutputBus.is_saturated = true

Запуск симуляции

Загрузим модель buses_chart.engee:

In [ ]:
buses_chart_model = engee.load("$demoroot/buses_chart.engee");

И запустим её симуляцию:

In [ ]:
simulation_results = engee.run(buses_chart_model);

Закроем модель после окончания симуляции:

In [ ]:
engee.close(buses_chart_model, force = true);

Результаты симуляции

Импортируем результаты симуляции:

In [ ]:
buses_chart_model_signal_t = simulation_results["signal"].time;
buses_chart_model_signal_y = simulation_results["signal"].value;
In [ ]:
buses_chart_model_is_saturated_t = simulation_results["is_saturated"].time;
buses_chart_model_is_saturated_y = simulation_results["is_saturated"].value;

И построим графики:

In [ ]:
plot(buses_chart_model_signal_t, buses_chart_model_signal_y, label = "Выходной сигнал")
plot!(buses_chart_model_is_saturated_t, buses_chart_model_is_saturated_y, label = "Признак насыщения")
Out[0]:

Выводы

Данный проект демонстрирует использование пользовательских шин при разработке моделей, основанных на библиотеке "Конечные автоматы":

  • Объявление шин в рабочей области;
  • Настройку символов блока Chart;
  • Обращение к пользовательским шинам в конечном автомате.