Состояния

state описывает рабочий режим реактивной системы. В Stateflow® стройте диаграмму, состояния используются для последовательного проекта, чтобы создать диаграммы переходов состояний.

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

Иерархия состояния

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

Пример иерархии состояния

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

В этом примере график является родительским элементом Car_done состояния. Car_done состояния родительское состояние Car_made и Car_shipped состояния. Car_made состояния также родительский элемент Parts_assembled и Painted состояния. Можно также сказать что состояния Parts_assembled и Painted дочерние элементы Car_made состояние.

Чтобы представлять иерархию Stateflow дословно, используйте символ наклонной черты (/) представлять график и использовать период (.) разделить каждый уровень в иерархии состояний. Следующий список является текстовым представлением иерархии объектов в предыдущем примере:

  • /Car_done

  • /Car_done.Car_made

  • /Car_done.Car_shipped

  • /Car_done.Car_made.Parts_assembled

  • /Car_done.Car_made.Painted

Объекты, которые может содержать состояние

Состояния могут содержать все другие объекты Stateflow. Обозначение диаграммы Stateflow поддерживает представление иерархии графического объекта в диаграммах Stateflow с включением. Состоянием является superstate, если оно содержит другие состояния. Состоянием является substate, если оно содержится в другом состоянии. Состояние, которое не является ни сверхсостоянием, ни подсостоянием другого состояния, является состоянием, родительским элементом которого является сама диаграмма Stateflow.

Состояния могут также содержать неграфические данные, событие и объекты сообщения. Иерархия этого включения появляется в Model Explorer. Вы задаете данные, событие и включение сообщения путем определения родительского объекта.

Разложение состояния

Каждое состояние (или график) имеет decomposition, который диктует, какие подсостояния состояние (или график) может содержать. Все подсостояния сверхсостояния должны иметь тот же тип как разложение сверхсостояния. Разложение состояния может быть исключительным (OR) или параллель (AND).

Исключительный (OR) разложение состояния

Подсостояния со сплошными границами указывают исключительный (OR) разложение состояния. Используйте это разложение, чтобы описать рабочие режимы, которые являются взаимоисключающими. Когда состояние имеет исключительный (OR) разложение, только одно подсостояние может быть активным за один раз.

В следующем примере, любом A состояния или B состояния может быть активным. Если A состояния активно, любой A1 состояния или A2 состояния может быть активным в установленный срок.

Параллель (AND) разложение состояния

Подсостояния с пунктирными границами указывают на параллель (AND) разложение. Используйте это разложение, чтобы описать параллельные рабочие режимы. Когда состояние имеет параллель (AND) разложение, все подсостояния активны одновременно.

В следующем примере, когда A состояния активно, A1 и A2 оба активны одновременно.

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

В следующем примере, когда A состояния становится активным, оба состояния B и C станьте активными одновременно. Когда C состояния становится активным, любой C1 состояния или C2 состояния может быть активным.

Метки состояния

Метка для состояния появляется в главном левом угле прямоугольника состояния со следующим общим форматом:

name/
entry:entry actions
during:during actions
exit:exit actions
on event_name:on event_name actions
on message_name:on message_name actions
bind:events

Следующий пример демонстрирует компоненты метки состояния.

Каждое действие в метке состояния появляется в подтемах, которые следуют. Для получения дополнительной информации о состояниях активности смотрите Выполнение диаграммы Stateflow.

Имя состояния

Метка состояния запускается с имени состояния, сопровождаемого дополнительным / символ. В предыдущем примере именами состояния является On и Off. Допустимые имена состояния состоят из алфавитно-цифровых символов и могут включать подчеркивание (_Символ. Для получения дополнительной информации см. Инструкции для Именования Объектов Stateflow.

Иерархия обеспечивает некоторую гибкость в именовании состояний. Имя, что вы вводите в метку состояния, должно быть уникальным, когда предшествуется состояниями предка. Имя в иерархии Stateflow является текстом, который вы вводите как метка на состоянии, которому предшествуют имена родительских состояний, разделенных периодами. Каждое состояние может иметь то же имя, появляются в метке, пока их полные имена в иерархии уникальны.

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

Каждое из этих состояний имеет уникальное имя из-за своего местоположения в графике. Полные имена для состояний в FAN1 и FAN2 :

  • PowerOn.FAN1.On

  • PowerOn.FAN1.Off

  • PowerOn.FAN2.On

  • PowerOn.FAN2.Off

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

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

Для каждого типа действия можно начать больше чем одно действие путем разделения каждого действия возвратом каретки, точкой с запятой или запятой. Можно задать действия больше чем для одного события или сообщения путем добавления дополнительного on event_name или on message_name линии.

Если вы вводите имя и режете сопровождаемый непосредственно действиями, действия интерпретированы как entry действие (действия). Это сокращение полезно, если вы задаете только entry действия.

Эта таблица суммирует различные типы состояния активности.

Состояние активностиСокращениеОписание
entryenВыполняется, когда состояние становится активным.
exitexВыполняется, когда состояние активно, и переход из состояния происходит.
duringduВыполняется, когда состояние активно, и определенное событие имеет место.
bind'none'Связывает событие или объект данных так, чтобы только, что состояние и его дочерние элементы могут широковещательно передать событие или изменить значение данных.

on event_name

'none'Выполняется, когда состояние активно, и оно получает широковещательную передачу event_name.

on message_name

'none'Выполняется когда сообщение message_name доступно.

on afterNEventName)

on afterNсекунда

on afterN, msec)

on afterN, мкс)

'none'

Выполняется когда:

  • событие event_name произошел, по крайней мере, n времена, поскольку ассоциированная страна стала активной.

  • по крайней мере, n модули времени протекли, поскольку ассоциированная страна стала активной.

Для получения дополнительной информации смотрите after.

on atNEventName)

on atNсекунда

'none'

Выполняется когда:

  • событие event_name произошел точно n времена, поскольку ассоциированная страна стала активной.

  • точно n секунды протекли, поскольку ассоциированная страна стала активной.

Для получения дополнительной информации смотрите at.

on beforeNEventName)

on beforeNсекунда

on beforeN, msec)

on beforeN, мкс)

'none'

Выполняется когда:

  • событие event_name произошел меньше, чем n времена, поскольку ассоциированная страна стала активной.

  • меньше, чем n модули времени протекли, поскольку ассоциированная страна стала активной.

Для получения дополнительной информации смотрите before.

on everyNEventName)

on everyNсекунда

'none'

Выполняется:

  • каждый nth вхождение события event_name поскольку ассоциированная страна стала активной.

  • каждый n секунды, с тех пор как ассоциированная страна стала активной.

Для получения дополнительной информации смотрите every.

entry Действия

Действия входа выполняются, когда состояние становится активным. Действия входа состоят из префиксного entry (или сокращение en) сопровождаемый двоеточием (:) и одно или несколько действий. Чтобы разделить многократные действия, используйте точки с запятой или запятые. Можно также начать действия на отдельных линиях.

В предыдущем примере, действие входа id = x+y выполняется, когда график берет переход по умолчанию, и состояние A становится активным. Смотрите Вводят График или состояние.

exit Действия

Выйдите действия выполняются, когда состояние активно, и переход из состояния происходит. Выйдите действия состоят из префиксного exit (или сокращение ex) сопровождаемый двоеточием (:) и одно или несколько действий. Чтобы разделить несколько выходных действий, используйте точки с запятой или запятые. Можно также начать действия на отдельных линиях.

В предыдущем примере, выходное действие time_out выполняется, когда график берет один из переходов от состояния, чтобы утвердить B или C. Смотрите Выход состояние.

during Действия

Во время действий выполняются, когда состояние активно, событие имеет место, и никакой допустимый переход к другому состоянию или текущему состоянию не доступен. Во время действий состоят из префиксного during (или сокращение du) сопровождаемый двоеточием (:) и одно или несколько действий. Чтобы разделить несколько во время действий, используйте точки с запятой или запятые. Можно также начать действия на отдельных линиях.

В предыдущем примере, во время действия switch_on() выполняется каждый раз, когда состояние C активно, потому что нет никаких допустимых переходов к другому состоянию. Смотрите Выполнение диаграммы Stateflow.

bind Действия

Можно связать данные и события к состоянию при помощи bind действие. bind действие состоит из префиксного bind сопровождаемый двоеточием (:) и одно или несколько событий или данных. Чтобы разделить несколько событий и данных, используйте точки с запятой или запятые. Можно также ввести события и данные по отдельным линиям.

Только состояние и его дочерние элементы могут изменить данные или широковещательно передать события, связанные с тем состоянием. Другие состояния могут считать связанные данные или прислушаться к связанному событию, но они не могут изменить связанные данные или отправить связанные события.

Свяжите действия, применяются к графику, активно ли обязательное состояние или нет. В предыдущем примере, связывать действие bind: id, time_out для A состояния связывает данные id и событие time_out утверждать A. Эта привязка предотвращает любое другое состояние (или его дочерние элементы) в графике от изменения id или широковещательное событие time_out.

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

Состояние активностиПричина ошибки
bind: id в B состоянияТолько одно состояние может изменить данные id, который обязан утвердить A
entry: time_out в C состоянияТолько одно состояние может широковещательно передать событие time_out, который обязан утвердить A

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

Свяжите действия, не поддерживаются в автономных диаграммах Stateflow в MATLAB®.

on Действия

На действиях выполняются, когда состояние активно, и оно получает событие или сообщение. На действиях состоят из префиксного on сопровождаемый уникальным событием event_name или передайте message_name, двоеточие (:), и одно или несколько действий. Чтобы разделить несколько на действиях, используйте точки с запятой или запятые. Можно также начать действия на отдельных линиях.

Можно задать действия больше чем для одного события или сообщения. Например, если вы хотите, чтобы различные события инициировали различные действия, введите несколько on операторы действия в метке состояния активности:

on ev1: action1();
on ev2: action2();
Если несколько событий имеют место одновременно, соответствие на действиях выполняются в порядке, что они появляются в метке состояния активности. Например, в предыдущем примере, если события ev1 и ev2 происходите одновременно, затем action1() выполняется сначала и action2() выполняется второй. Смотрите Выполнение диаграммы Stateflow.

Похожие темы