Конечные автоматы
Переменные и данные на диаграммах состояний
Данные на диаграммах состояний
В диаграммах состояний входные и выходные данные, а также локальные переменные, используемые в диаграмме, называются сигналами. В окне настроек диаграммы состояний можно задать следующие типы сигналов:
- Вход – значения данных передаются через входные порты блока 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везде, где она встречается на диаграмме стостояний.
Решение
Входы и выходы диаграммы состояний
Теперь вы сделаете «бесполезную машину» чуть более полезной, придав ее работе некоторый физический смысл.
Рассмотрим модель, которая содержит подсистему, моделирующую рычаг, приводимый в движение двигателем постоянного тока. Двигатель управляется напряжением , которое определяет, движется ли рычаг в направлении "Вкл." или "Выкл.".
В предыдущей модели переменная ButtonPressed была локальной и показывала, включена ли машина (1) или выключена (0). В этой модели переменная ButtonPressed является входным сигналом, который поступает в конечный автомат из основной модели Engee.
✏️Задание 4
- Откройте модель
Модель 3_2_Начало.ngscript.

Войдите внутрь блока Chart.
-
Добавьте условия перехода
buttonPressed == 0иbuttonPressed == 1для описания логики переключения между состояниями. Если кнопка включения нажата (1), то машина должна включиться. -
В окне настроек диаграммы состояний задайте переменную
buttonPressedв качестве входного сигнала.
Решение
✏️Задание 5
Теперь вы создадите выходной сигнал диаграммы состояний, который будет равен 1 В, если диаграмма находится в состоянии TurnOn, и –1 В, если диаграмма находится в состоянии 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соедините со входом блока Выход. - Залогируйте выходные сигналы блока Chart. Запустите симуляцию модели.
Решение