Управление активностью сообщений в диаграммах Stateflow

Сообщение является Stateflow® объект, который передает данные локально или между графиками в Simulink® модель. Из графика отправителя можно отправить или переслать сообщение. На диаграмме приема очередь получает сообщение и удерживает его до тех пор, пока график не сможет его вычислить.

Используя операторов Stateflow, можно получить доступ к данным сообщений и отправить, получить, отменить или переслать сообщение. Можно также определить, является ли сообщение допустимым, и найти количество сообщений в очереди. Для получения дополнительной информации см. Раздел «Связь с диаграммами Stateflow путем отправки сообщений».

Доступ к данным сообщений

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

message_name.data
Если вы отправляете сообщение, не присваивая предварительно значение данным сообщения, значение по умолчанию для числовых данных равняется 0. Для перечисленных данных по умолчанию является первым значением, перечисленным в enumeration раздел определения, если вы не задаете обратное в methods раздел определения.

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

Отправить сообщение

Чтобы отправить выход или локальное сообщение, используйте send оператор:

send(message_name)
Для примера на этом графике действие входа в состоянии A отправляет сообщение M со значением данных 3. Если возможности Local, затем сообщение переходит в локальную очередь приема. Если возможности Output, затем график отправляет сообщение через порт выхода другому блоку в модели Simulink.

Stateflow chart that uses the send operator in a state.

За один временной шаг можно отправить несколько сообщений через выход порт или в локальную очередь приемов.

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

  • Когда переполнение происходит во внутренней очереди, диаграмма 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 не меняется. Если сообщение присутствует, график удаляет его из очереди независимо от значения данных.

Stateflow chart that uses the receive operator.

Отменить сообщение

Чтобы отменить допустимое входное или локальное сообщение, используйте discard оператор:

discard(message_name)
После того, как график отбросит сообщение, он может удалить другое сообщение из очереди за тот же временной шаг. График не может получить доступ к данным отброшенного сообщения.

Для примера, в этом графике, during действие в состоянии A проверяет очередь сообщений M. Если сообщение присутствует, график удаляет его из очереди. Если значение данных сообщения равно 3, график отбрасывает сообщение.

Stateflow chart that uses the discard operator.

Пересылка сообщения

Чтобы переслать допустимый вход или локальное сообщение в локальную очередь или выход порт, используйте forward оператор:

forward(message_in_name,message_out_name)
После того, как график пересылает сообщение, оно может удалить другое сообщение из очереди за тот же временной шаг.

Пересылка входного сообщения

На этом графике состояние A проверяет очередь входа на наличие сообщения M_in. Если сообщение присутствует, график удаляет сообщение из очереди и пересылает его в выход порт M_out. После того, как график пересылает сообщение, сообщение перестанет быть действительным в состоянии A.

Stateflow chart that uses the forward operator.

Пересылка локального сообщения

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

Stateflow chart that uses the forward operator.

Определите, является ли сообщение действительным

Чтобы проверить, является ли входы или локальное сообщение допустимым, используйте isvalid оператор:

isvalid(message_name)
Сообщение действительно, если график удалил его из очереди приема и не переадресовал или не сбросил.

Для примера этот график сначала выполняет A состояния, как описано в «Отменить сообщение». Когда график выполняет состояние B, а during действие проверяет, чтобы сообщение M является допустимым. Если сообщение верно и имеет значение данных, равное 6, график отбрасывает сообщение.

Stateflow chart that uses the isvalid operator.

Определите длину очереди

Чтобы проверить количество сообщений во внутренней очереди приема входного или локального сообщения, используйте length оператор:

length(message_name)

Для примера, в этом графике, during действие в состоянии A проверяет очередь сообщений M. Если сообщение присутствует, график удаляет его из очереди. Если в очереди остается только семь сообщений, график увеличивает значение x.

Stateflow chart that uses the length operator.

The length оператор не поддерживается для входных сообщений, которые используют внешние очереди приема, управляемые блоком Queue (Simulink).

См. также

| | | | | | (Simulink)

Похожие темы