Состояние описывает режим работы реактивной системы. В диаграмме 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 с сдерживанием. Состояние является сверхгосударством, если оно содержит другие состояния. Состояние является подсостоянием, если оно содержится в другом состоянии. Состояние, которое не является ни сверхсостоянием, ни подсостоянием другого состояния, является состоянием, родителем которого является сама диаграмма Stateflow.
Состояния также могут содержать неграфические данные, события и объекты сообщений. Иерархия этой оболочки отображается в обозревателе моделей. Данные, события и содержание сообщений определяются путем указания родительского объекта.
Каждое состояние (или диаграмма) имеет разложение, определяющее, какой тип подсостояний может содержать состояние (или диаграмма). Все подсостояния сверхсостояния должны быть того же типа, что и разложение сверхсостояния. Разложение состояния может быть эксклюзивным (OR) или параллельным (AND).
Подсостояния с сплошными границами указывают на исключающее (ИЛИ) разложение состояния. Эта декомпозиция используется для описания взаимоисключающих режимов работы. Если состояние имеет исключительное разложение (ИЛИ), одновременно может быть активным только одно подсостояние.
В следующем примере любое состояние A или состояние B может быть активным. Если состояние A активен, любое состояние A1 или состояние A2 может быть активным в данный момент времени.

Подсостояния с пунктирными границами указывают на параллельное (И) разложение. Используйте эту декомпозицию для описания параллельных режимов работы. Когда состояние имеет параллельное разложение (И), все подсостояния активны одновременно.
В следующем примере, когда состояние 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
В следующем примере показаны компоненты метки состояния.

Каждое действие в метке состояния отображается в следующих подразделах. Дополнительные сведения о действиях состояния см. в разделе Выполнение диаграммы потока состояний.
Метка состояния начинается с имени состояния, за которым следует необязательный / персонаж. В предыдущем примере имена состояний: 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 действия.
В этой таблице представлены различные типы действий состояния.
| Действие состояния | Сокращение | Описание |
|---|---|---|
entry | en | Выполняется, когда состояние становится активным. |
exit | ex | Выполняется, когда состояние активно и происходит переход из состояния. |
during | du | Выполняется при активном состоянии и возникновении определенного события. |
bind | ничего | Связывает событие или объект данных так, чтобы только это состояние и его дочерние объекты могли передавать событие или изменять значение данных. |
| ничего | Выполняется при активном состоянии и получении широковещательной передачи event_name. |
| ничего | Выполняется при появлении сообщения message_name доступен. |
| ничего | Выполняется в следующих случаях:
Дополнительные сведения см. в разделе |
| ничего | Выполняется в следующих случаях:
Дополнительные сведения см. в разделе |
| ничего | Выполняется в следующих случаях:
Дополнительные сведения см. в разделе |
| ничего | Выполняет:
Дополнительные сведения см. в разделе |
entry ДействияДействия ввода выполняются, когда состояние становится активным. Действия ввода состоят из префикса entry (или аббревиатура en) с последующим двоеточием (:) и одно или несколько действий. Чтобы разделить несколько действий ввода, используйте точку с запятой или запятую. Можно также вводить действия в отдельных строках.
В предыдущем примере операция ввода id = x+y выполняется, когда диаграмма принимает переход по умолчанию и состояние A становится активным. См. раздел Ввод диаграммы или состояния.
exit ДействияДействия выхода выполняются, когда состояние активно и происходит переход из состояния. Действия выхода состоят из префикса exit (или аббревиатура ex) с последующим двоеточием (:) и одно или несколько действий. Чтобы разделить несколько действий выхода, используйте точку с запятой или запятую. Можно также вводить действия в отдельных строках.
В предыдущем примере действие выхода time_out выполняется, когда диаграмма принимает один из переходов из состояния A в состояние B или C. См. раздел Выход из состояния.
during ДействияВо время выполнения действий, когда состояние активно, происходит событие, и допустимый переход в другое состояние или текущее состояние недоступен. Во время действий состоит из префикса during (или аббревиатура du) с последующим двоеточием (:) и одно или несколько действий. Чтобы разделить несколько действий, используйте точку с запятой или запятую. Можно также вводить действия в отдельных строках.
В предыдущем примере во время действия switch_on() выполняется каждый раз, когда состояние C активно, поскольку нет допустимых переходов в другое состояние. См. раздел Выполнение диаграммы потока состояний.
bind ДействияМожно привязать данные и события к состоянию с помощью bind действия. A 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 |
Привязка события function-call к состоянию также связывает вызываемую подсистему function-call. Подсистема вызова функций включается при вводе состояния привязки и отключается при выходе из состояния привязки. Дополнительные сведения об этом поведении см. в разделе Управление подсистемами вызовов функций с помощью действий привязки.
Действия привязки поддерживаются только в диаграммах Stateflow в моделях Simulink ®.
on ДействияДействия выполняются при активном состоянии и получении события или сообщения. В действиях состоят из префикса on за которым следует уникальное событие event_name или сообщение message_name, двоеточие (:) и одно или несколько действий. Чтобы разделить несколько действий, используйте точку с запятой или запятую. Можно также вводить действия в отдельных строках.
Можно указать действия для нескольких событий или сообщений. Например, если необходимо, чтобы различные события запускали различные действия, введите несколько on инструкции действия в метке действия состояния:
on ev1: action1(); on ev2: action2();
ev1 и ev2 происходит в то же время, то action1() выполняет сначала и action2() выполняет второе. См. раздел Выполнение диаграммы потока состояний.