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

Автор
avatar-alexey_bondarevalexey_bondarev
Notebook

Переменные и данные на диаграммах состояний

Данные на диаграммах состояний

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

  • Вход – значения данных передаются через входные порты блока Chart.
  • Выход – значения данных выводятся через выходные порты блока Chart.
  • Локальная переменная – используются только локально в пределах диаграммы.

В примере ниже показано окно настройки диаграммы состояний, в котором заданы две входные переменные In1 и In2, две выходные переменные Out1 и Out2 и две локальные переменные t и x.

blok_chart_s_dvumia_vkhodami_i_vykhodami.png

okno_signalov_diagrammy.png

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

Чтобы добавить новую переменную, нажмите на кнопку "плюс" в правой верхней части окна настроек. Откроется диалоговое окно Добавление сигнала, в котором нужно ввести имя сигнала, выбрать его тип (Вход, Выход или Локальная переменная) и номер порта и затем нажать кнопку Добавить.

okno_dobavleniia_signala.png

Локальные переменные на диаграммах состояний

✏️Задание 1

В этом упражнении мы построим «бесполезную машину». Ее работа состоит в том, чтобы выключаться, если она в данный момент включена, и включаться, если она выключена.

bespoleznaia_mashina.png

  1. Откройте модель Модель 3_1_Начало.engee и войдите внутрь блока Chart.

model_bespoleznoi_mashiny_nachalo_2.png

Состояния и переходы между ними уже добавлены в модель. Вы будете добавлять условия и поведение состояний. Для этой диаграммы нужна одна переменная – сигнал включения/выключения машины.

  1. В новой строке под словом entry в состоянии TurnOff добавьте код signal = 0; для того, чтобы машина выключалась при входе в это состояние.

  2. Добавьте условие signal == 0 к переходу от состояния TurnOff к состоянию TurnOn.

  3. В окне настроек диаграммы состояний задайте локальную переменную signal.

Решение

model_bespoleznoi_mashiny_zadanie_1_2.png

model_bespoleznoi_mashiny_zadanie_1_lokalnaia_peremennaia.png

✏️Задание 2

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

  1. В новой строке под словом entry в состоянии TurnOn добавьте код signal = 1; для того, чтобы машина включалась при входе в это состояние.

  2. Добавьте условие signal == 1 к переходу от состояния TurnOn к состоянию TurnOff.


Теперь машина будет «бесполезно» переходить между двумя состояниями.

Решение

model_bespoleznoi_mashiny_zadanie_2_2.png

✏️Задание 3

  1. В окне настроек диаграммы состояний нажмите на имя переменной signal, чтобы изменить ее имя. В открывшемся окне редактирования введите имя ButtonPressed.
  2. Переименуйте переменную signal в ButtonPressed везде, где она встречается на диаграмме стостояний.

Решение

model_bespoleznoi_mashiny_zadanie_3_2.png

model_bespoleznoi_mashiny_zadanie_3.png

Входы и выходы диаграммы состояний

В этом разделе вы сделаете «бесполезную машину» чуть более полезной, придав ее работе некоторый физический смысл.

Рассмотрим модель, которая содержит подсистему, моделирующую рычаг, приводимый в движение двигателем постоянного тока. Двигатель управляется напряжением $V_{in}$, которое определяет, движется ли рычаг в направлении "Вкл." или "Выкл.".

glava_3_dvigatel.png

В предыдущей модели переменная ButtonPressed была локальной и показывала, включена ли машина (1) или выключена (0). В этой модели переменная buttonPressed является входным сигналом, который поступает в конечный автомат из основной модели Engee.

✏️Задание 4

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

glava_3_model_3_2_nachalo_osnovnaia_model.png

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

glava_4_model_4_2_nachalo.png

  1. Добавьте условия перехода buttonPressed == 0 и buttonPressed == 1 для описания логики переключения между состояниями. Если кнопка включения нажата (1), то машина должна включиться.

  2. В окне настроек диаграммы состояний задайте переменную buttonPressed в качестве входного сигнала.

Решение

glava_3_zadanie_4_reshenie.png

glava_3_zadanie_4_vkhodnaia_peremennaia.png

✏️Задание 5

Теперь вы создадите выходной сигнал диаграммы состояний, который будет равен 1 V, если диаграмма находится в состоянии TurnOn, и –1 V, если диаграмма находится в состоянии TurnOff. Он будет определять направление движения рычага.


  1. В состоянии TurnOn добавьте команду voltage = 1; под ключевым словом entry:.

  2. В состоянии TurnOff добавьте команду voltage = -1; под ключевым словом entry:.

  3. В окне настроек диаграммы состояний задайте переменную voltage в качестве выходного сигнала.

Решение

glava_3_zadanie_5_reshenie.png

glava_3_zadanie_5_vykhodnaia_peremennaia.png

✏️Задание 6

Создайте новую переменую и используйте ее на диаграмме состояний.

  1. В окне настроек диаграммы состояний задайте переменную counter в качестве выходного сигнала. Задайте начальное значение переменной counter равным 0. Измените номер порта для этой переменной с 2 на 1. При этом номер порта для переменной voltage автоматически изменится с 1 на 2.
  2. Добавьте команду counter = counter + 1; под строкой voltage = -1; в состоянии TurnOff.

Решение

glava_3_zadanie_6_reshenie.png

glava_3_zadanie_6_vykhodnaia_peremennaia.png

✏️Задание 7

Завершите построение модели.

  1. Выйдите из блока Chart в основную модель. Соедините выход подсистемы Button Presser со входом блока Chart.
  2. Соедините выход voltage блока Chart со входом подсистемы Button Presser, а выход counter соедините со входом блока Out.
  3. Залогируйте выходные сигналы блока Chart. Запустите симуляцию модели.

Решение

glava_3_zadanie_7_reshenie.png

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