Конечные автоматы
Действия на диаграммах состояний
Общие сведения о действиях на диаграммах состояний
Действия на диаграмме состояний позволяют выполнять код во время симуляции диаграммы. В этом курсе вы познакомитесь с двумя видами действий с диаграммами:
- Действия с состояниями определяют, что делает конечный автомат, когда активировано определенное состояние.
- Действия с условиями определяют, что делает конечный автомат, когда выполняется условие перехода.
Действия с состояниями
В предыдущих примерах вы уже сталкивались с ключевым словом entry для состояний. Оно позволяет включить код, который выполняется при входе в состояние. Это один из примеров действия с состояниями.
Тремя наиболее распространенными действиями с состояниями являются entry, during и exit. Они выполняются при входе в состояние, при нахождении в в состоянии и при выходе из состояния соответственно.
В примере, приведенном ниже, при входе в состояние StateA значения переменных x и y задаются равными 1. При выходе из состояния значение переменной x задается равным 0.
Действия с условиями
Конечные автоматы также могут выполнять действия, связанные с условиями переходов. Действие с условиями выполняется, когда выполняется предыдущее условие перехода. Действия c условиями обозначаются фигурными скобками ({}), чтобы отличать их от условий, записываемых в квадратных скобках ([]).
В примере ниже переменной y присваивается значение 1, если условие x == 1 возвращает значение true. Это происходит перед действием entry для состояния StateB.
Если для перехода не задано условие, то этот переход будет выполняться всегда.
Обратите внимание на то, что в приведенных выше примерах каждая строка кода заканчивается точкой с запятой. Это связано с тем, что в действиях по умолчанию используется язык Julia.
Перед выполнением заданий запустите следующий скрипт для того, чтобы задать значения входных сигналов модели:
using DataFrames
f1 = [rand([1 0 0 0 0 0 0]) for i in LinRange(1, 100, 100)]
t = [i for i in LinRange(1, 100, 100)]
F = DataFrame(time = t, value = f)
fault = WorkspaceArray(string(rand()), F);
Создание действий с состояниями
✏️Задание 1
В этом разделе ваша задача – смоделировать систему, которая работает в двух режимах: нормальном режиме и режиме неисправности. Это, например, может быть светофор, который мы рассматривали в Разделе 1. Cистема также будет отслеживать, сколько раз она возвращалась в нормальный режим.
- Откройте модель
Модель 4_Начало.engee.
Войдите внутрь блока Chart.
- Добавьте на диаграмму состояний следующие условия:
fault == 1на переход изNormalвFault;fault == 0на переход изFaultвNormal.
- В окне настроек диаграммы состояний задайте переменную
faultв качестве входного сигнала.
Решение
✏️Задание 2
Теперь вам нужно создать выходной сигнал running, который будет принимать значение 1 при входе в нормальный режим работы.
- В новой строке под именем состояния
Normalвведите ключевое словоentry:(с двоеточием). - В следующей строке введите команду
running = 1;. - Добавьте переменную
runningв качестве выходного сигнала диаграммы состояний.
Решение
✏️Задание 3
При выходе из нормального режима работы переменная running будет принимать значение 0. Действие exit использует такой же синтаксис, что и действие entry.
- В состояние
Normalв новой строке добавьте действиеexit:. - В следующей строке введите команду
running = 0;.
Решение
✏️Задание 4
Чтобы отслеживать, сколько раз перезапускалась система, вам нужно будет ввести новую локальную переменную. Полезно инициализировать ее там, где выполняется переход по умолчанию.
- Добавьте действие с условием на переход по умолчанию, щелкнув левой кнопкой мыши дважды на переход по умолчанию. Введите
{reset = 0;}в открывшемся диалоговом окне. - Добавьте переменную
resetв качестве второго выходного сигнала диаграммы состояний.
Решение
✏️Задание 5
Значение переменной reset должно увеличиваться на единицу каждый раз, когда сбрасывается ошибка.
Добавьте действие с условием reset = reset + 1; на переход от состояния Fault к состоянию Normal.
Решение
Действия during
В предыдущих заданиях вы изучали логику для управления нормальным режимом и режимом неисправности в системе. В системах обнаружения неисправностей обычно используется следующая логика: если сигнал неисправности быстро колеблется между 0 и 1, система должна оставаться в состоянии неисправности, а не возвращаться в нормальный режим и многократно прерываться.
Один из способов реализовать это – использовать счетчик, чтобы убедиться, что неисправность сохраняется непрерывно в течение определенного числа временных шагов.
✏️Задание 6
Модифицируйте модель следующим образом:
- Добавьте действие
entryв состояниеFault:counter = 0;для инициализации счетчика. - В окне настроек диаграммы состояний задайте переменную
counterв качестве локальной переменной.
Решение
✏️Задание 7
Действия during выполняются один раз на каждом временном шаге, в течение которого конечный автомат остается в данном состоянии.
Добавьте действие during: в состояние Fault: counter = counter + 1;.
Решение
✏️Задание 8
Предположим, что вы хотите подождать в течение 5 временных шагов перед тем как выполнить перезапуск системы. В этом случае условием возвращения в состояние Normal будет fault == 0 и counter > 5.
Вспомним, что условия перехода, записанные в квадратных скобках, являются логическими выражениями. Поэтому в записи условий допустимы операторы || и &&, поскольку все выражение возвращает одно логическое значение.
- Добавьте условие
counter > 5на переход из состоянияFaultв состояниеNormal. Соедините это условие оператором "И" (&&) с условиемfault == 1. - Запустите симуляцию модели и выведите графики выходных сигналов.
Решение
Графики выходных сигналов могут выглядеть так: