Конечные автоматы
Диаграммы состояний¶
Редактор диаграмм состояний¶
Диаграмма состояний – это графический язык программирования, который позволяет быстро создать работоспособную модель вашей системы. Вы можете добавлять элементы модели, перетаскивая их из палитры объектов слева.
На диаграмме состояний вы можете управлять элементами, используя стандартные сочетания клавиш:
- 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
(Поиск) и обратно – от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
.