Конечные автоматы
Иерархия диаграмм
Теоретическое введение
Использование иерархии позволяет группировать состояния с общими свойствами или функциональностью и избегать избыточности на диаграмме состояний. Снова рассмотрим работу светофора. Эта модель будет содержать два режима работы:
- Нормальный режим, при котором индикатор переключается между красным, желтым и зеленым;
- Режим неисправности, при котором индикатор меняется на мигающий красный.
В Разделе 1 вы моделировали систему, которая содержала состояния Normal (нормальный режим) и Fault (режим неисправности) с определенными правилами перехода между этими двумя состояниями.
Чтобы реализовать светофор с функцией обнаружения неисправностей, вам необходимо определить поведение светофора в каждом режиме. В нормальном режиме работы светофор имеет три состояния: Stop (Красный), PreparetoStop (Желтый) и Go (Зеленый). Вы можете использовать иерархию, чтобы эти три состояния сделать подсостояниями одного суперсостояния Normal.
Для создания мигающего индикатора требуются два состояния, которые называются BlinkOn (Мигание включено) и BlinkOff (Мигание выключено). Они могут быть созданы в качестве подсостояний другого суперсостояния Fault.
При такой структуре переходы между суперсостояниями Normal и Fault происходят независимо от того, какое из подсостояний активно. Обратите внимание, что приведенный выше пример на каждом уровне иерархии содержит переход по умолчанию, который требуется для всех иерархических диаграмм состояний.
Практическая часть
Чтобы создать суперсостояние, содержащее внутри себя подсостояния, новое состояние должно полностью охватывать одно или несколько других состояний. Чтобы изменить размер состояния, нужно щелкнуть левой кнопкой мыши на состояние и перетащить его границу.
✏️Задание 1
- Откройте модель
Модель 8_Начало.ngscript

и войдите внутрь блока Chart.
- Создайте новое состояние
Normalи сделайте его суперсостоянием для состоянийStop,PreparetoStopиGo. - Добавьте переход по умолчанию в состояние
Normal.
Решение
✏️Задание 2
Часто бывает полезно моделировать иерархию сверху вниз: сначала добавить общий функционал, а потом заполнить его подробностями.
- Добавьте в модель новое состояние
Fault. Оно должно располагаться на том же уровне иерархии, что и состояниеNormal. - Добавьте переход из
NormalвFaultс условием[fault == 1]. - Добавьте переход из
FaultвNormalс условием[fault == 0].
Решение
✏️Задание 3
В режиме неисправности желтый и зеленый индикаторы всегда выключены, независимо от состояния красного индикатора.
В состояние Fault добавьте следующие действия entry:
yellow = 0;
green = 0;
Решение
✏️Задание 4
Конечный автомат Engee автоматически добавляет переход по умолчанию в состояние, добавленное первым на данном уровне иерархии.
Добавьте новое состояние внутри границ состояния Fault. Оно должно быть создано как субсостояние с переходом по умолчанию. Назовите это состояние BlinkOn (Мигание включено).
Решение
✏️Задание 5
- Добавьте второе субсостояние
BlinkOff(Мигание выключено) внутри границ состоянияFault. - Добавьте следующие действия
entryдля управления индикатором:
red = 1;в состояниеBlinkOn;red = 0;в состояниеBlinkOff.
Решение
✏️Задание 6
- Добавьте переходы из
BlinkOnвBlinkOffи изBlinkOffвBlinkOn. - Добавьте на каждый из этих переходов оператор временной логики
after(1,sec)для задержки 1 с в каждом из состояний.
Решение
✏️Задание 7
Вы построили модель светофора, с которой вы знакомились в Разделе 1 этого курса.
- Запустите следующий скрипт для того, чтобы задать значения входных сигналов модели:
using DataFrames
f1 = [rand([1 0 0 0 0 0 0]) for i in LinRange(1, 20, 20)]
f = repeat(f1, inner = 5)
t = [i for i in LinRange(1, 100, 100)]
F = DataFrame(time = t, value = f)
fault = WorkspaceArray(string(rand()), F);
- Запустите симуляцию модели и постройте графики выходных сигналов.
Решение
Ниже приведен возможный вид графиков выходных сигналов модели.
Красный сигнал:
Желтый сигнал:
Зеленый сигнал: