Сообщество Engee

Конечные автоматы

Автор
avatar-alexey_bondarevalexey_bondarev
Notebook

Иерархия диаграмм

Теоретическое введение

Использование иерархии позволяет группировать состояния с общими свойствами или функциональностью и избегать избыточности на диаграмме состояний. Снова рассмотрим работу светофора. Эта модель будет содержать два режима работы:

  • Нормальный режим, при котором индикатор переключается между красным, желтым и зеленым;
  • Режим неисправности, при котором индикатор меняется на мигающий красный.

В Разделе 1 вы моделировали систему, которая содержала состояния Normal (нормальный режим) и Fault (режим неисправности) с определенными правилами перехода между этими двумя состояниями.

Модель светофора - блок Chart.png

Чтобы реализовать светофор с функцией обнаружения неисправностей, вам необходимо определить поведение светофора в каждом режиме. В нормальном режиме работы светофор имеет три состояния: Stop (Красный), PreparetoStop (Желтый) и Go (Зеленый). Вы можете использовать иерархию, чтобы эти три состояния сделать подсостояниями одного суперсостояния Normal.

Для создания мигающего индикатора требуются два состояния, которые называются BlinkOn (Мигание включено) и BlinkOff (Мигание выключено). Они могут быть созданы в качестве подсостояний другого суперсостояния Fault.

При такой структуре переходы между суперсостояниями Normal и Fault происходят независимо от того, какое из подсостояний активно. Обратите внимание, что приведенный выше пример на каждом уровне иерархии содержит переход по умолчанию, который требуется для всех иерархических диаграмм состояний.

Практическая часть

Чтобы создать суперсостояние, содержащее внутри себя подсостояния, новое состояние должно полностью охватывать одно или несколько других состояний. Чтобы изменить размер состояния, нужно щелкнуть левой кнопкой мыши на состояние и перетащить его границу.

✏️Задание 1

  1. Откройте модель Модель 8_Начало.ngscript

![глава 8 модель 8_начало 1.png](attachment:глава 8 модель 8_начало 1_2.png)

и войдите внутрь блока Chart.

глава 8 модель 8_начало 2.png
  1. Создайте новое состояние Normal и сделайте его суперсостоянием для состояний Stop, PreparetoStop и Go.
  2. Добавьте переход по умолчанию в состояние Normal.
Решение
глава 8 задание 1 - решение.png

✏️Задание 2

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

  1. Добавьте в модель новое состояние Fault. Оно должно располагаться на том же уровне иерархии, что и состояние Normal.
  2. Добавьте переход из Normal в Fault с условием [fault == 1].
  3. Добавьте переход из Fault в Normal с условием [fault == 0].
Решение
глава 8 задание 2 - решение_2.png

✏️Задание 3

В режиме неисправности желтый и зеленый индикаторы всегда выключены, независимо от состояния красного индикатора.

В состояние Fault добавьте следующие действия entry:

yellow = 0;
green = 0;
Решение
глава 8 задание 3 - решение.png

✏️Задание 4

Конечный автомат Engee автоматически добавляет переход по умолчанию в состояние, добавленное первым на данном уровне иерархии.

Добавьте новое состояние внутри границ состояния Fault. Оно должно быть создано как субсостояние с переходом по умолчанию. Назовите это состояние BlinkOn (Мигание включено).

Решение
глава 8 задание 4 - решение_3.png

✏️Задание 5

  1. Добавьте второе субсостояние BlinkOff (Мигание выключено) внутри границ состояния Fault.
  2. Добавьте следующие действия entry для управления индикатором:
  • red = 1; в состояние BlinkOn;
  • red = 0; в состояние BlinkOff.
Решение
глава 8 задание 5 - решение.png

✏️Задание 6

  1. Добавьте переходы из BlinkOn в BlinkOff и из BlinkOff в BlinkOn.
  2. Добавьте на каждый из этих переходов оператор временной логики after(1,sec) для задержки 1 с в каждом из состояний.
Решение
глава 8 задание 6 - решение.png

✏️Задание 7

Вы построили модель светофора, с которой вы знакомились в Разделе 1 этого курса.

  1. Запустите следующий скрипт для того, чтобы задать значения входных сигналов модели:
In [ ]:
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);
  1. Запустите симуляцию модели и постройте графики выходных сигналов.
Решение

Ниже приведен возможный вид графиков выходных сигналов модели.

Красный сигнал:

глава 1 светофор - график 1.png

Желтый сигнал:

глава 1 светофор - график 2.png

Зеленый сигнал:

глава 1 светофор - график 3.png

Тест для получения сертификата