В этом примере сравнивается поведение сообщений, событий и данных в Stateflow ®.
Эта модель имеет три графиков отправителя: DataSender
, EventSender
, и MessageSender
. Каждый график отправителя имеет одно состояние. В действии входа состояния графики присваивают значение данным, отправляют событие вызова функции или отправляют сообщение.
Для каждой из графиков отправителя существует соответствующий график приемника. Каждый график приемника имеет диаграмму состояний с состояниями A0
, A1
, A2
, и A3
. Неявное after(3,sec) события
запускает переход от A0
на A1
. Данные, событие или сообщение из соответствующего графика отправителя защищают переходы между A1
, A2
, и A3
.
Каждый график приемника имеет активный выход состояния включенный и соединенный с возможностями. Область возможностей показывает, какие состояния активны в каждом временном шаге. Этот выход подчеркивает различие в поведении между выходными данными, событиями и сообщениями.
The DataSender
график присваивает выходным данным значение 1 M
, который соединяется как вход с DataReceiver
график.
The DataReceiver
график выполняется один раз в каждый временной шаг. В начале симуляции состояние A0
активно. Во время t=3
, переход от A0
на A1
происходит. Во время t=4
график проверяет ли M
равен 1. Это условие верно, поэтому график переходит от A1
на A2
. Во время t=5
, M
все еще равен 1
, поэтому график переходит от A2
на A3
. На возможностях вы видите, что DataReceiver
изменяет состояния три раза.
После того, как данным присвоено значение, оно удерживает его значение на протяжении всей симуляции. Поэтому каждый раз, когда DataReceiver
оценивает условие [M == 1]
, он переходит к новому состоянию.
The EventSender
на графике используется команда send(M)
чтобы отправить вызов функции выходное событие, чтобы пробудить EventReceiver
график.
The EventReceiver
график выполняется только тогда, когда входное событие M
пробуждает график. В начале симуляции состояние A0
активно. Переход от A0
на A1
основан на абсолютной временной логике и не действителен в то время t=0
. A0
остается активным, и график возвращается в спящий режим. Потому что EventSender
отправляет событие M
только один раз, EventReceiver
не просыпается снова. На возможностях вы видите, что EventReceiver
никогда не переходит из A0
.
События не остаются действительными на протяжении всех временных шагов, поэтому получающий график имеет только один шанс ответить на событие. Когда EventSender
отправляет событие, EventReceiver
не готов ответить на него. Возможность для EventReceiver
переход в ответ на событие потерян.
The MessageSender
график использует синтаксис send(M)
для отправки сообщения через порт выходного сообщения. Сообщение переходит во входную очередь сообщений MessageReceiver
график. Сообщение ожидает в очереди до MessageReceiver
оценивает его.
The MessageReceiver
график выполняется один раз в каждый временной шаг. В начале симуляции состояние A0
активно. Во время t=3
, переход от A0
на A1
происходит. Во время t=4
график определяет, что M
присутствует в очереди, поэтому он принимает переход на A2
. В конце временного шага график удаляет M
из очереди. Во время t=5
, в очереди нет сообщения, поэтому график не переходит на A3
. A2
остается активным состоянием. На возможностях вы видите, что MessageReceiver
изменяет состояние только два раза.
В отличие от событий, сообщения находятся в очереди. Приемный график может принять решение ответить на сообщение в любое время после того, как оно было отправлено. В отличие от данных, сообщение не остается действительным до бесконечности. Сообщение уничтожается в конце временного шага.