exponenta event banner

Действие управляющего сообщения в диаграммах потока состояний

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

С помощью операторов 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 удаляет новое сообщение. Можно управлять уровнем диагностических действий, задав для сообщения свойство Диагностика переполнения очереди. См. раздел Диагностика переполнения очереди.

  • При переполнении внешней очереди блок очереди (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.

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

См. также

| | | | | | (Simulink)

Связанные темы