Документация Engee

Синтаксис Конечных автоматов

Общие сведения

Для более полного понимания статьи рекомендуется изучить общую информацию о конечных автоматах (КА) в Engee (см. здесь) и основы языка Julia для описания работы состояний (см. здесь).

В этой статье:

Модель КА может включать в себя следующие элементы:

stateflow all in one

Синтаксис состояний

Правило Ошибка при нарушении условия

У каждого состояния должно быть название.

Ошибка цикла обработки результатов в router: ErrorException('имя_модели/Chart': state name ' ' is incorrect.)

  • Имя состояния может состоять из:

    • Букв латинского алфавита в любом регистре.

    • Цифр.

    • Символа подчеркивания.

  • Имя должно начинаться с буквы латинского алфавита.

  • Имя не должно повторяться на одном уровне вложенности.

Ошибка цикла обработки результатов в router: ErrorException('имя_модели/Chart': state name 'пример некорректного имени' is incorrect.)

Группы операторов поддерживают только операции на языке Julia.

Ошибка инициализации модели: [EXEC] Ошибка инициализации модели id_модели id_симуляции: UndefVarError(:некорректный синтаксис)

Код, написанный в состоянии, будет выполняться на каждом шаге модели конечного автомата. Например, состояние с циклом for выглядит так:

stateflow cycles variables

Если вы хотите настроить более сложное поведение модели, то можете использовать группы операторов.

Группы операторов — это условия, которые инициируют действия модели внутри состояний. При наступлении групп операторов задается поведение конечного автомата.

В Chart доступны три группы операторов:

  • During (во время) — используется для определения действий, которые выполняются на каждом этапе шага расчета модели, если состояние активно. Действия, указанные в during, выполняются, пока состояние активно.

  • Entry (вход) — используется для определения действий, которые выполняются при входе в состояние. Действия, указанные в entry, выполняются один раз, когда состояние становится активным.

  • Exit (выход) — используется для определения действий, которые выполняются при выходе из состояния. Действия, указанные в exit, выполняются один раз, когда состояние перестает быть активным.

Пример состояния с группами операторов выглядит так:

sf state 1

Код в состоянии без группы операторов будет выполняться на каждом шаге модели КА, что эквивалентно одновременному использованию групп entry и during.

Вы можете использовать короткие названия для этих групп — du для during, en для entry и ex для exit соответственно. Вы также можете перечислять их через запятую:

sf x 1

Вложенные состояния

Вы можете использовать модель конечного автомата с вложенными состояниями:

embedded state 1 1

  • Родительское состояние — это состояние, которое содержит одно или несколько подсостояний, называемых дочерними состояниями. При активации родительского состояния происходит переход по умолчанию для дочерних состояний. Далее дочерние состояния работают по обычной логике конечного автомата до тех пор, пока родительское состояние не перестанет быть активным.

  • Дочернее состояние — это состояние, которое находится внутри родительского состояния.

Состояния можно вкладывать друг в друга, но не должны перекрываться. При перекрытии выдается ошибка (восклицательный красный знак) о том, что состояния не могут быть наложены друг на друга:

chart error 1

Все вложенные состояния подчиняются следующим правилам:

  • На каждом уровне вложенности должен быть свой переход по умолчанию.

  • У состояний нет ограничений по глубине вложенности. При входе в состояние Engee автоматически определяет наличие вложенности:

    • Есть вложенные состояния — выполняется переход по умолчанию для дочерних состояний. Далее к дочерним состояниям применяется логика конечного автомата до тех пор, пока активно родительское состояние.

    • Нет вложенных состояний — применяется логика конечного автомата.

Синтаксис переходов

  • На переходах настраивается темпоральная логика, условия и действия:

    condition action stateflow

Темпоральная логика представлена отдельно в таблице. Условия [] определяют, когда должен произойти переход, а действия {} определяют, что должно произойти при переходе. Действия и условия подчиняются следующим правилам:

  • Условия задаются в квадратных скобках [].

  • Действия задаются в фигурных скобках {}.

  • Все поля опциональны и могут быть пропущены.

  • Условия и действия поддерживают математические операции языка Julia. Например:

    stateflow example synth 1

  • Для назначения различных значений переменным, используйте точку с запятой ; в качестве разделителя:

    {y = 0; v = 1}
  • Условия в рамках одного перехода задаются через логические операторы && (и) и || (или).

    #Вариант с "и"
    [x>1 && x<3]
    
    #Вариант с "или"
    [x>1 || x<3]
  • В условиях приоритеты операторов могут быть заданы круглыми скобками, как и в языке Julia, например:

    [x == 1 && (y == 3 || after(3,sec))] # выражение (y == 3 || after(3,sec)) будет вычислено первым

After — функция, которая реализует темпоральную логику. Возможны два варианта вызова:

Синтаксис Описание Пример

after(n,tick)
n — целое положительное число или выражение.
tick — такт работы конечного автомата.

Возвращает true, если блок Chart включался не менее n раз с тех пор, как текущее состояние стало активным. В противном случае функция возвращает false.

after(3,tick)[x>3]

Выход из текущего состояния, когда блок активируется не менее трех раз с тех пор, как состояние стало активным, при условии, что x > 3.

after(n,sec) after(n,msec) after(n,usec)
n — положительное вещественное число или результат вычисления выражения.
sec — секунда.
msec — миллисекунда.
usec — микросекунда.

Возвращает true, если с момента, когда текущее состояние стало активным, прошло не менее n единиц времени. В противном случае функция возвращает false.

[after(1,tick) || x > 5]

after(10,tick)[x > 5]

after(n, tick){y = 20;}

after(2, sec)[x < 3]{y = 0;}

Для лучшего понимания приводимых примеров рассмотрим:

after(4,sec)[x > 10]

Eсли значение переменной x больше 10 и прошло 4 секунды после начала перехода, то происходит переход в следующее состояние.

Приоритеты переходов

Приоритет переходов — порядок, в котором они оцениваются и выполняются, если условия нескольких переходов одновременно истинны.

Рассмотрим пример из статьи:

im3

В примере у состояния Rest (покой) имеются два перехода, приоритеты которых задаются автоматически:

sf transition prior 1

Нажмите по переходу для настройки нужного приоритета и выберите Порядок исполнения:

stateflow example settings 1

В нашем случае переход до состояния Alarm (тревога) был поставлен первым и имеет первый приоритет, а до состояния Fault (неисправность) — вторым и второй приоритет соответственно.

Настройка локальных переменных

В блоке Chart можно работать только с теми внутренними переменными, которые были объявлены в меню добавления сигналов.

Внутренние переменные (видны только в блоке Chart) задаются в окне настроек stateflow settings icon при нажатии кнопки plus button 1:

stateflow settings 3

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

state machines work 1state machines work 2

  • Выход — выходная внутренняя переменная, создающая выходной порт для блока Chart. Выходной переменной можно присвоить начальное значение. Можно создать несколько выходных переменных, каждой будет присвоено свое имя порта в блоке Chart.

  • Локальная переменная — переменная, которая существует только внутри блока Chart и может быть изменена в состоянии или при переходе. Локальной переменной можно присвоить начальное значение.