Сообщение является Stateflow® объект, который передает данные локально или между графиками в Simulink® модель. Из графика отправителя можно отправить или переслать сообщение. На диаграмме приема очередь получает сообщение и удерживает его до тех пор, пока график не сможет его вычислить.
Используя операторов Stateflow, можно получить доступ к данным сообщений и отправить, получить, отменить или переслать сообщение. Можно также определить, является ли сообщение допустимым, и найти количество сообщений в очереди. Для получения дополнительной информации см. Раздел «Связь с диаграммами Stateflow путем отправки сообщений».
Сообщения Stateflow имеют поле данных. Чтобы считать или записать в поле данных сообщения допустимого сообщения, используйте синтаксис записи через точку:
message_name.data
enumeration
раздел определения, если вы не задаете обратное в methods
раздел определения.Вы не можете получить доступ к данным сообщений, которые находятся в очереди или которые уже были сброшены.
Чтобы отправить выход или локальное сообщение, используйте send
оператор:
send(message_name)
A
отправляет сообщение M
со значением данных 3
. Если возможности Local
, затем сообщение переходит в локальную очередь приема. Если возможности Output
, затем график отправляет сообщение через порт выхода другому блоку в модели Simulink.
За один временной шаг можно отправить несколько сообщений через выход порт или в локальную очередь приемов.
Если график отправляет сообщение, которое превышает емкость очереди приема, происходит переполнение очереди. Результат переполнения очереди зависит от типа очереди приема.
Когда переполнение происходит во внутренней очереди, диаграмма Stateflow отбрасывает новое сообщение. Можно управлять уровнем диагностического действия, задав свойство Queue Overflow Diagnostic для сообщения. См. Раздел «Диагностика переполнения очереди»
Когда переполнение происходит во внешней очереди, блок Queue (Simulink) либо отбрасывает новое сообщение, либо перезаписывает самое старое сообщение в очереди, в зависимости от строения блока. См. «Перезаписать самый старый элемент, если очередь полна» (Simulink). Переполнение внешней очереди всегда приводит к предупреждению.
Сообщения могут защищать переходы или состояния активности типа on
. Во время временного шага, когда защитное сообщение оценивается впервые, график удаляет сообщение из очереди и делает сообщение действительным. В то время как сообщение является действительным, другие переходы или действия могут получить доступ к данным сообщения, но они не удаляют другое сообщение из очереди.
На этом графике сообщение M
охраняет переход от состояния A
в состояние B
. Переход происходит, когда оба эти условия верны:
В очереди присутствует сообщение.
Значение данных сообщения равно 3.
Если сообщения нет или если значение данных не равно 3, то переход не происходит. Если сообщение присутствует, оно удаляется из очереди независимо от того, происходит ли переход.
on
Действие с сообщениемНа этом графике сообщение M
охраняет on
действие в состоянии A
. Когда состояние A
становится активным, оно увеличивает значение x
если оба эти условия верны:
В очереди присутствует сообщение.
Значение данных сообщения равно 3.
Если сообщения нет или если значение данных не равно 3, то значение x
не меняется. Если сообщение присутствует, оно удаляется из очереди независимо от того, x
изменяется.
Чтобы извлечь вход или локальное сообщение из его очереди приема, используйте receive
оператор:
receive(message_name)
M
существует, receive(M)
возвращает true
. Если допустимое сообщение не существует, но в очереди находится сообщение, то график удаляет сообщение из очереди и receive(M)
возвращает true
. Если допустимое сообщение не существует и в очереди нет сообщений, receive(M)
возвращает false
.Для примера, в этом графике, during
действие в состоянии A
проверяет очередь сообщений M
и увеличивает значение x
если оба эти условия верны:
В очереди присутствует сообщение.
Значение данных сообщения равно 3.
Если сообщения нет или если значение данных не равно 3, то значение x
не меняется. Если сообщение присутствует, график удаляет его из очереди независимо от значения данных.
Чтобы отменить допустимое входное или локальное сообщение, используйте discard
оператор:
discard(message_name)
Для примера, в этом графике, during
действие в состоянии A
проверяет очередь сообщений M
. Если сообщение присутствует, график удаляет его из очереди. Если значение данных сообщения равно 3, график отбрасывает сообщение.
Чтобы переслать допустимый вход или локальное сообщение в локальную очередь или выход порт, используйте forward
оператор:
forward(message_in_name,message_out_name)
На этом графике состояние A
проверяет очередь входа на наличие сообщения M_in
. Если сообщение присутствует, график удаляет сообщение из очереди и пересылает его в выход порт M_out
. После того, как график пересылает сообщение, сообщение перестанет быть действительным в состоянии A
.
На этом графике переход между состояниями A
и состояние B
проверяет локальную очередь сообщений M_local
. Если сообщение присутствует, переход удаляет сообщение из M_local
очередь сообщений и пересылает ее в выход порт M_out
.
Чтобы проверить, является ли входы или локальное сообщение допустимым, используйте isvalid
оператор:
isvalid(message_name)
Для примера этот график сначала выполняет A состояния
, как описано в «Отменить сообщение». Когда график выполняет состояние B
, а during
действие проверяет, чтобы сообщение M
является допустимым. Если сообщение верно и имеет значение данных, равное 6, график отбрасывает сообщение.
Чтобы проверить количество сообщений во внутренней очереди приема входного или локального сообщения, используйте length
оператор:
length(message_name)
Для примера, в этом графике, during
действие в состоянии A
проверяет очередь сообщений M
. Если сообщение присутствует, график удаляет его из очереди. Если в очереди остается только семь сообщений, график увеличивает значение x
.
The length
оператор не поддерживается для входных сообщений, которые используют внешние очереди приема, управляемые блоком Queue (Simulink).
discard | forward | isvalid | length | receive | send | Queue (Simulink)