Пользовательские шины в конечных автоматах
Пользовательские шины в конечных автоматах
В данном проекте демонстрируется возможность использования пользовательских шин в блоке Chart.
Пользовательские шины - структурированные сигналы типа BusSignal. Этот тип позволяет объединить логически связанные сигналы в единую струтуру - шину, каждому элементу которой соответствует определённое имя, тип данных и размерность.
Используем макрос @__DIR__ для определения пути, содержащего интерактивный скрипт:
demoroot = @__DIR__;
Описание модели
Рассмотрим простую модель с конечным автоматом, реализующим логику блока Saturation, ограничивающего входной сигнал сверху и снизу:
|
Входной сигнал |
Выходной сигнал |
|
Нижний предел <= Входной сигнал <= Верхний предел |
Входной сигнал |
|
Входной сигнал < Нижний предел |
Нижний предел |
|
Входной сигнал > Верхний предел |
Верхний предел |
Пусть на вход блока Chart поступает пользовательская шина InputBus, содержащая сигналы:
signalтипа данныхFloat64- входной сигнал;limitsтипа данныхLimitBus(вложенная шина):upperтипа данныхFloat64- верхний предел;lowerтипа данныхFloat64- нижний предел.
А на выходе блока Chart формируется пользовательская шина OutputBus, содержащая сигналы:
signalтипа данныхFloat64- выходной сигнал;is_saturatedтипа данныхBool- признак насыщения.

Определим пользовательские шины в рабочей области:
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):

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

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

Для обращения к элементам шины внутри блока Chart используется запись через "точку", например:
InputBus.signal > InputBus.limits.upperOutputBus.is_saturated = true
Запуск симуляции
Загрузим модель buses_chart.engee:
buses_chart_model = engee.load("$demoroot/buses_chart.engee");
И запустим её симуляцию:
simulation_results = engee.run(buses_chart_model);
Закроем модель после окончания симуляции:
engee.close(buses_chart_model, force = true);
Результаты симуляции
Импортируем результаты симуляции:
buses_chart_model_signal_t = simulation_results["signal"].time;
buses_chart_model_signal_y = simulation_results["signal"].value;
buses_chart_model_is_saturated_t = simulation_results["is_saturated"].time;
buses_chart_model_is_saturated_y = simulation_results["is_saturated"].value;
И построим графики:
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 = "Признак насыщения")
Выводы
Данный проект демонстрирует использование пользовательских шин при разработке моделей, основанных на библиотеке "Конечные автоматы":
- Объявление шин в рабочей области;
- Настройку символов блока Chart;
- Обращение к пользовательским шинам в конечном автомате.