Конечные автоматы
Переменные и данные на диаграммах состояний¶
Данные на диаграммах состояний¶
В диаграммах состояний входные и выходные данные, а также локальные переменные, используемые в диаграмме, называются сигналами. В окне настроек диаграммы состояний можно задать следующие типы сигналов:
- Вход – значения данных передаются через входные порты блока
Chart
. - Выход – значения данных выводятся через выходные порты блока
Chart
. - Локальная переменная – используются только локально в пределах диаграммы.
В примере ниже показано окно настройки диаграммы состояний, в котором заданы две входные переменные In1
и In2
, две выходные переменные Out1
и Out2
и две локальные переменные t
и x
.
Количество и имена входных и выходных портов блока Chart
всегда соответствуют входным и выходным переменным диаграммы состояний.
Чтобы добавить новую переменную, нажмите на кнопку "плюс" в правой верхней части окна настроек. Откроется диалоговое окно Добавление сигнала, в котором нужно ввести имя сигнала, выбрать его тип (Вход, Выход или Локальная переменная) и номер порта и затем нажать кнопку Добавить.
Локальные переменные на диаграммах состояний¶
✏️Задание 1¶
В этом упражнении мы построим «бесполезную машину». Ее работа состоит в том, чтобы выключаться, если она в данный момент включена, и включаться, если она выключена.
- Откройте модель Модель 3_1_Начало.engee и войдите внутрь блока
Chart
.
Состояния и переходы между ними уже добавлены в модель. Вы будете добавлять условия и поведение состояний. Для этой диаграммы нужна одна переменная – сигнал включения/выключения машины.
В новой строке под словом
entry
в состоянииTurnOff
добавьте кодsignal = 0;
для того, чтобы машина выключалась при входе в это состояние.Добавьте условие
signal == 0
к переходу от состоянияTurnOff
к состояниюTurnOn
.В окне настроек диаграммы состояний задайте локальную переменную
signal
.
Решение¶
✏️Задание 2¶
После того как локальная переменная определена, вы можете использовать ее в любом месте диаграммы состояний.
В новой строке под словом
entry
в состоянииTurnOn
добавьте кодsignal = 1;
для того, чтобы машина включалась при входе в это состояние.Добавьте условие
signal == 1
к переходу от состоянияTurnOn
к состояниюTurnOff
.
Теперь машина будет «бесполезно» переходить между двумя состояниями.
Решение¶
✏️Задание 3¶
- В окне настроек диаграммы состояний нажмите на имя переменной
signal
, чтобы изменить ее имя. В открывшемся окне редактирования введите имяButtonPressed
. - Переименуйте переменную
signal
вButtonPressed
везде, где она встречается на диаграмме стостояний.
Решение¶
Входы и выходы диаграммы состояний¶
В этом разделе вы сделаете «бесполезную машину» чуть более полезной, придав ее работе некоторый физический смысл.
Рассмотрим модель, которая содержит подсистему, моделирующую рычаг, приводимый в движение двигателем постоянного тока. Двигатель управляется напряжением $V_{in}$, которое определяет, движется ли рычаг в направлении "Вкл." или "Выкл.".
В предыдущей модели переменная ButtonPressed
была локальной и показывала, включена ли машина (1) или выключена (0). В этой модели переменная buttonPressed
является входным сигналом, который поступает в конечный автомат из основной модели Engee.
✏️Задание 4¶
- Откройте модель Модель 3_2_Начало.ngscript.
Войдите внутрь блока Chart
.
Добавьте условия перехода
buttonPressed == 0
иbuttonPressed == 1
для описания логики переключения между состояниями. Если кнопка включения нажата (1), то машина должна включиться.В окне настроек диаграммы состояний задайте переменную
buttonPressed
в качестве входного сигнала.
Решение¶
✏️Задание 5¶
Теперь вы создадите выходной сигнал диаграммы состояний, который будет равен 1 V, если диаграмма находится в состоянии TurnOn
, и –1 V, если диаграмма находится в состоянии TurnOff
. Он будет определять направление движения рычага.
В состоянии
TurnOn
добавьте командуvoltage = 1;
под ключевым словомentry:
.В состоянии
TurnOff
добавьте командуvoltage = -1;
под ключевым словомentry:
.В окне настроек диаграммы состояний задайте переменную
voltage
в качестве выходного сигнала.
Решение¶
✏️Задание 6¶
Создайте новую переменую и используйте ее на диаграмме состояний.
- В окне настроек диаграммы состояний задайте переменную
counter
в качестве выходного сигнала. Задайте начальное значение переменнойcounter
равным 0. Измените номер порта для этой переменной с 2 на 1. При этом номер порта для переменнойvoltage
автоматически изменится с 1 на 2. - Добавьте команду
counter = counter + 1;
под строкойvoltage = -1;
в состоянииTurnOff
.
Решение¶
✏️Задание 7¶
Завершите построение модели.
- Выйдите из блока
Chart
в основную модель. Соедините выход подсистемыButton Presser
со входом блокаChart
. - Соедините выход
voltage
блокаChart
со входом подсистемыButton Presser
, а выходcounter
соедините со входом блокаOut
. - Залогируйте выходные сигналы блока
Chart
. Запустите симуляцию модели.