Конечные автоматы
Диаграммы состояний
Редактор диаграмм состояний
Диаграмма состояний – это графический язык программирования, который позволяет быстро создать работоспособную модель вашей системы. Вы можете добавлять элементы модели, перетаскивая их из палитры объектов слева.
На диаграмме состояний вы можете управлять элементами, используя стандартные сочетания клавиш:
- Ctrl+C – копирование;
- Ctrl+V – вставка;
- Ctrl+Z – отмена последнего действия.
Кроме того, вы можете использовать стандартные для Engee сочетания клавиш для навигации по диаграмме состояний. Например:
- Колесико прокрутки мыши используется для масштабирования модели;
- Клавиша «пробел» – для подгонки модели к размеру экрана.
В следующем задании вы попрактикуетесь в добавлении состояний, переходов и условий перехода. Условия перехода – это логические выражения, которые должны принимать значение true или false. Они заключаются в квадратные скобки ([]).
✏️Задание 1
Выполните простейшие действия в редакторе конечных автоматов:
- Создайте новую модель. Добавьте на холст блок Chart из библиотеки Конечные автоматы. Дважды щелкните левой кнопкой мыши на блок, чтобы войти в редактор диаграмм состояний.
- Добавьте новое состояние на диаграмму. Для этого перетащите значок
Cостояние(он имеет вид прямоугольника) из палитры объектов на холст. Щелкните левой кнопкой мыши на свободное место в левом верхнем углу состояния, там, где расположен знак?. Впишите в этом месте имя состоянияStateA. - Добавьте на диаграмму второе состояние и расположите его справа от первого состояния. Назовите новое состояние
StateB. - Добавьте переход от состояния
StateAк состояниюStateB, щелкнув левой кнопкой мыши и перетащив курсор мыши от края одного состояния к другому. - Дважды щелкните левой кнопкой мыши по переходу, чтобы добавить условие перехода. Затем введите выражение
[x > 0](в квадратных скобках). Вы можете переместить условие, щелкнув по нему левой кнопкой мыши и перетащив его. Переход, связанный с условием, подсвечивается синей линией.
Решение
В результате у вас должна получиться такая диаграмма состояний:
Переходы, условия и состояния
Представьте, что вам нужно смоделировать систему компьютерного зрения для слежения за объектами. Эта система будет иметь три режима работы: Выключено, Поиск и Отслеживание. Каждый из этих режимов будет соответствовать отдельному состоянию на диаграмме. В каждый момент времени система может находиться только в одном из этих состояний.
Система слежения за объектами представляет собой машину состояний. Существует много примеров машин состояний. Например, светофор имеет три состояния: красный, желтый и зеленый. Другие примеры – автоматическая коробка передач, система управления полетом квадрокоптера.
Машины состояний имеют набор правил для перехода между состояниями. Например, если система компьютерного зрения обнаружила объект, то она переключится из режима Поиск в режим Отслеживание. На диаграмме состояний прямоугольник представляет состояние, а стрелка от одного состояния к другому – переход. Активное состояние соответствует текущему режиму работы. Текущее состояние зависит от значений переменных и начального состояния. При включении системы компьютерного зрения происходит переход на диаграмме от состояния Выключено к состоянию Поиск. При выключении системы происходит переход из текущего состояния в состояние Выключено.
Перед выполнением заданий запустите следующий скрипт для того, чтобы задать значения параметров модели:
using DataFrames
t = [i for i in LinRange(1, 1000, 1000)]
p = [rand([1 0 0 0 0]) for i in t]
of = [rand([1 1 0]) for i in t]
P = DataFrame(time = t, value = p)
Power = WorkspaceArray(string(rand()), P)
OF = DataFrame(time = t, value = of)
ObjectFound = WorkspaceArray(string(rand()), OF);
✏️Задание 2
В этом и последующем заданиях вы будете строить модель системы компьютерного зрения, имеющую три состояния: Off (Выключено), Seeking (Поиск) и Tracking (Отслеживание).
- Откройте модель
Модель 2_1_Начало.engee.

- Войдите внутрь блока Chart. Добавьте сначала состояние
Off(Выключено), а затем состояниеSeeking(Поиск). - Добавьте переходы от состояния
Offк состояниюSeekingи обратно – отSeekingкOff. Напоминаем, что начало и конец стрелки перехода обозначают источник и пункт назначения перехода соответственно.
Решение
В полученной модели диаграмма состояний сразу же переходит из состояния Off в состояние Seeking. Если не заданы условия перехода, то состояния переключаются на каждом временном шаге моделирования.
Для этой задачи к блоку Chart подключены два входных сигнала: Power (питание) и ObjectFound (объект найден). Значения сигналов – это данные о состоянии конечного автомата. Эти сигналы могут принимать значения 0 или 1. Первый из них показывает, нажата ли кнопка включения, а второй – обнаружен ли объект.
Условием для перехода из состояния Off в состояние Seeking является Power == 1. Условием для возврата в состояние Off является Power == 0.
✏️Задание 3
Модифицируйте модель следующим образом:
-
Добавьте условие перехода
Power == 1для перехода из состоянияOffв состояниеSeeking. Напомним, что вы можете добавить условие, дважды щелкнув по переходу и набрав текст. Квадратные скобки ([]), которые обозначают условие перехода, будут добавлены автоматически. -
Добавьте условие перехода
Power == 0к переходу из состоянияSeekingв состояниеOff.
Решение
Вы можете добавлять в модель новые состояния, перетаскивая значок Состояние из палитры объектов на холст. Напомним, что вы можете использовать колесико прокрутки мыши для регулировки масштаба диаграммы состояний и пробел для размещения диаграммы на холсте так, чтобы она занимала все доступное пространство.
✏️Задание 4
Модифицируйте модель следующим образом:
- Добавьте новое состояние, расположите его справа на диаграмме и назовите его
Tracking(Отслеживание). - Добавьте переходы из состояния
Seekingв состояниеTrackingи из состоянияTrackingв состояниеSeeking.
Решение
✏️Задание 5
Сигнал ObjectFound показывает, был ли обнаружен объект. Диаграмма переходит из состояния Seeking в состояние Tracking, если ObjectFound == 1, и из состояния Tracking обратно в состояние Seeking, если ObjectFound == 0.
Добавьте в модель указанные условия перехода между состояниями Seeking и Tracking, заключая их в квадратные скобки.
Решение
✏️Задание 6
Система должна выйти из состояния Tracking, если питание отключено.
Модифицируйте модель следующим образом:
- Добавьте переход от состояния
Trackingк состояниюOff.
Для удобства чтения модели вы можете использовать узлы, чтобы избежать создания изогнутых стрелок перехода. Добавьте в модель два объекта Узел из палитры объектов. Расположите их на одной высоте: один под состоянием Tracking, другой под состоянием Off. Затем поочередно соедините прямыми линиями перехода состояние Tracking с первым узлом, затем первый узел со вторым узлом и, наконец, второй узел с состоянием Off.
- Добавьте к первому из трех новых переходов условие
Power == 0.
Решение
✏️Задание 7
Задайте правильную последовательность выполнения переходов. На нашей диаграмме состояний реакция на отключение питания должна иметь приоритет перед переключением между поиском и отслеживанием.
Щелкните левой кнопкой мыши по переходу из состояния Tracking в узел, от которого идет переход к состоянию Off. В открывшемся окне Настройки выберите значение параметра Порядок исполнения равным 1. Переход теперь будет иметь пометку 1, которая указывает на то, что это первый переход, который будет проверяться на диаграмме состояний.
Решение
Временная логика
В предыдущих заданиях вы использовали логические выражения в качестве условий перехода. На диаграммах состояний также можно задавать временную логику, т.е. использовать временные логические условия, основанные на количестве пройденного времени.
Оператором временной логики является after(N,sec), где N – время в секундах, в течение которого система задерживается в данном состоянии.
✏️Задание 8
- Откройте модель
Модель 2_2_Начало.engee

и войдите внутрь блока Chart.
Представленная диаграмма состояний содержит состояния и переходы, которые описывают режимы работы светофора, но условия перехода между состояниями отсутствуют.
- Добавьте время задержки к переходам:
- из состояния
Stopв состояниеGo– 3 секунды, - из состояния
Goв состояниеPrepareToStop– 10 секунд, - из состояния
PrepareToStopв состояниеStop– 3 секунды.
Решение
Условие after поддерживает и другие единицы измерения времени в качестве второго аргумента:
- Миллисекунды –
msec - Микросекунды –
usec - Такты работы конечного автомата –
tick
Переходы по умолчанию и недостижимые состояния
Вы, возможно, заметили, что каждая диаграмма состояний содержит переход по умолчанию:
Этот переход определяет начальное состояние диаграммы. Когда вы добавляете состояние на пустую диаграмму, Engee автоматически добавляет к нему переход по умолчанию.
✏️Задание 9
- Создайте новую модель и добавьте в нее блок Chart.
- Войдите внутрь блока Chart и на пустую диаграмму добавьте новое состояние. Назовите его
On(Включено).
При запуске этой диаграммы она по умолчанию переходит в режим On.
Решение
✏️Задание 10
Модифицируйте модель:
- Создайте второе состояние. Назовите его
Off(Выключено). СостояниеOffсейчас является недостижимым, т.к. попасть в него невозможно. - Переместите переход по умолчанию на состояние
Off. Для этого щелкните левой кнопкой мыши на стрелку и перетащите ее так, чтобы она оказалась над состояниемOff. - Теперь состояние
Onстало недостижимым. Чтобы в него можно было попасть, добавьте на диаграмму переход от состоянияOffк состояниюOn.
Решение