A state описывает режим работы реактивной системы. In a 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 chart обозначения поддерживает представление иерархии графических объектов в диаграммах Stateflow с ограничением. Состояние является superstate, если оно содержит другие состояния. Состояние является substate, если оно содержится в другом состоянии. Состояние, которое не является ни суперштатом, ни подсостоянием другого состояния, является состоянием, родительским элементом которого является сама диаграмма Stateflow.
Состояния могут также содержать неграфические данные, события и объекты сообщений. Иерархия этого ограничения появляется в Model Explorer. Вы задаете данные, событие и сдерживание сообщения путем определения родительского объекта.
Каждое состояние (или график) имеет decomposition, которая диктует, какой тип подсостояний может содержать состояние (или график). Все подсостояния сверхгосударственного должны быть того же типа, что и сверхгосударственное разложение. Разложение состояний может быть эксклюзивным (OR) или параллельным (AND).
Подсостояний с твердыми границами указывают на эксклюзивное (ИЛИ) разложение состояния. Используйте это разложение для описания рабочих режимов, которые являются взаимоисключающими. Когда состояние имеет эксклюзивное (OR) разложение, только одно подсостояние может быть активным за раз.
В следующем примере любое состояние 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
Следующий пример демонстрирует компоненты метки состояния.
Каждое действие в метке состояния появляется в нижеследующих подтемах. Для получения дополнительной информации о действиях в состоянии смотрите Выполнение диаграммы 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
действия.
В этой таблице представлены различные типы состояний активности.
Состояние активности | Сокращение | Описание |
---|---|---|
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 активно, поскольку нет допустимых переходов в другое состояние. Смотрите Выполнение диаграммы Stateflow.
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 |
Привязка события вызова функции к состоянию также связывает подсистему вызова функций, которую она вызывает. Подсистема вызова функций активируется, когда состояние привязки введено и отключено, когда состояние привязки завершено. Для получения дополнительной информации об этом поведении см. Раздел «Управляйте подсистемами вызова функций при помощи действий привязки».
Действия привязки поддерживаются только в диаграммах Stateflow в Simulink® модели.
on
ДействияДействия выполняются, когда состояние активно и оно получает событие или сообщение. Действия состоят из префикса on
далее следует уникальное событие event_name
или сообщение message_name
, двоеточие (:
), и одно или несколько действий. Чтобы разделить несколько на действия, используйте точки с запятой или запятые. Можно также ввести действия в отдельных линиях.
Можно задать действия для нескольких событий или сообщений. Для примера, если вы хотите, чтобы различные события инициировали различные действия, введите несколько on
операторы действия в метке состояния активности:
on ev1: action1(); on ev2: action2();
ev1
и ev2
происходит одновременно, затем action1()
выполняет сначала и action2()
выполняет second. Смотрите Выполнение диаграммы Stateflow.