Государства

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 действия.

В этой таблице представлены различные типы состояний активности.

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

on event_name

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

on message_name

ничегоВыполняется при message_name сообщения доступно.

on after(n, event_name)

on after(n, сек)

on after(n, msec)

on after(n, usec)

ничего

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

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

  • по крайней мере n Модули времени прошли с тех пор, как связанное состояние стало активным.

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

on at(n, event_name)

on at(n, сек)

ничего

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

  • событие event_name произошло точно n с тех пор как связанное состояние стало активным.

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

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

on before(n, event_name)

on before(n, сек)

on before(n, msec)

on before(n, usec)

ничего

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

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

  • меньше n Модули времени прошли с тех пор, как связанное состояние стало активным.

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

on every(n, event_name)

on every(n, сек)

ничего

Выполняет:

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

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

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

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.

Похожие темы