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

Группы операторов машины состояний

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

sf state 1 new

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

Группы операторов поддерживают только операции на языке Julia и могут содержать несколько частей, которые чередуются в произвольном порядке. Например:

during: du1
entry: en1
during: du2

В этом случае при активации состояния будет выполнен код entry: en1. После этого, на каждом последующем шаге, пока состояние остается активным, будет выполняться объединенный код группы операторов during, представленный как "du1; du2". Это означает, что du1 и du2 объединяются и выполняются последовательно, будто они соединены вместе в рамках одного during.

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

sf x 1

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

en, during, enter: foobar

Код Julia в блоках состояния может быть многострочным и продолжаться до тех пор, пока в начале строки не встретится ключевое слово entry, during, exit или on. Например:

during:
    if x > 10
        y = 1
    else
        y = 2
    end
exit: y = 3
Код в состоянии без групп операторов выполняется как при активации состояния, так и на каждом шаге, пока состояние остается активным. Таким образом, он совмещает действия, характерные для секций entry и during, но не включает логику, связанную с деактивацией состояния (как это делает секция exit).

Группа entry

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

Группа during

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

Группа exit

exit (выход) — используется для определения действий, которые выполняются при выходе из состояния. Эти действия выполняются один раз, когда состояние становится неактивным, и происходят после того, как завершатся все действия, связанные с переходом из этого состояния. Во время выполнения exit, все операции, которые могут быть заданы в группе during, прекращаются. После выхода из состояния операторы during больше не выполняются, так как состояние больше не активно. Например, есть следующий конечный автомат:

exit order

Здесь конечный автомат выполнится в следующем порядке:

y2 = 2
y1 = 1
y3 = 3

Группа on

on — выполняется при возникновении указанного действия в активном состоянии. Группа операторов on позволяет использовать темпоральную логику внутри состояний. Например:

stateflow on after 2

Здесь:

  • on after(5, sec) определяет, что выполнение начнется с пятой секунды (выполнится и через 6, 7 и т.д. секунд).

  • y = 0 определяет, что нужно присвоить переменной y значение 0.

Логика работы групп операторов

В машине состояний порядок работы с переходами и группами операторов entry, during, exit, и on происходит следующим образом:

Типы логики выполнения групп операторов

entry

during

exit

on

Порядок выполнения

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

during выполняется после активации состояния (entry) на каждом шаге работы конечного автомата, пока состояние остается активным. Однако, если в текущем шаге происходит выход из состояния, то during не выполняется.

exit выполняется перед выходом из текущего состояния, завершая его активность. После выполнения exit активируется новое состояние, для которого сразу выполняется entry.

on активируются при выполнении заданного условия (например, темпоральной логики), если текущее состояние активно.

Особенности активации

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

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

exit может быть использован для сброса значений переменных или завершения вычислений перед выходом из состояния.

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

Взаимодействие с переходами

entry активируется только при успешном переходе в новое состояние. Если переход в состояние не происходит, то группа операторов entry не выполняется;

Во время выполнения during машина состояний может проверять условия для перехода в другое состояние. Если условия перехода выполняются, то действия в during не начинают выполняться вообще, вместо этого машина состояний переходит к выполнению exit текущего состояния;

exit активируются только при успешном выполнении условия перехода и подготовке к переходу в новое состояние. Если переход не совершается, то оператор exit не выполняются.

on работает только внутри текущего активного состояния. Если условие для перехода в новое состояние выполняется, то переход происходит до начала выполнения on. После перехода on больше не будет выполняться. Однако, в отличие от during, которые выполняются на каждом шаге (кроме первого), on реагирует только на конкретные действия (например, на темпоральную логику).