查看 Stateflow 消息、事件和数据之间的差异
此示例比较 Stateflow® 中消息、事件和数据的行为。
发送方图
此模型有三个发送方图:DataSender
、EventSender
和 MessageSender
。每个发送方图都有一个状态。在状态的 entry 动作中,图对数据赋值,发送函数调用事件,或发送消息。
接收方图
每个发送方图都有一个对应的接收方图。每个接收方图都有一个状态图,具有状态 A0
、A1
、A2
和 A3
。隐式事件 after(3,sec)
触发从 A0
到 A1
的转移。来自对应发送方图的数据、事件或消息保护 A1
、A2
和 A3
之间的转移。
示波器输出
每个接收方图都启用激活状态输出并连接到一个示波器。示波器显示每个时间步中哪些状态被激活。此输出突出显示输出数据、事件和消息之间的行为差异。
数据行为
DataSender
图将值 1 赋给输出数据 M
,该数据作为输入连接到 DataReceiver
图。
DataReceiver
图在每个时间步执行一次。在仿真开始时,状态 A0
被激活。在时间 t=3
处,发生从 A0
到 A1
的转移。在时间 t=4
处,图测试 M
是否等于 1。此条件为 true,因此图发生从 A1
到 A2
的转移。在时间 t=5
处,M
仍等于 1
,因此图发生从 A2
到 A3
的转移。在示波器上,您可以看到 DataReceiver
更改了三次状态。
对数据赋值后,它会在整个仿真期间保持其值。因此,每次 DataReceiver
计算条件 [M == 1]
时,它都会转移到一个新状态。
事件的行为
EventSender
图使用命令 send(M)
发送一个函数调用输出事件来唤醒 EventReceiver
图。
EventReceiver
图仅在输入事件 M
唤醒图时执行。在仿真开始时,状态 A0
被激活。从 A0
到 A1
的转移基于绝对时间时序逻辑,并且在时间 t=0
处无效。A0
保持激活,图返回休眠状态。由于 EventSender
只发送事件 M
一次,EventReceiver
不会再次唤醒。在示波器上,您可以看到 EventReceiver
从未转移出 A0
。
事件不会跨时间步保持有效,因此接收方图只有一次机会来响应事件。当 EventSender
发送事件时,EventReceiver
未准备好响应它。EventReceiver
失去响应事件来发生转移的机会。
消息的行为
MessageSender
图使用语法 send(M)
通过输出消息端口发送消息。该消息进入 MessageReceiver
图的输入消息队列。消息在队列中等待,直到 MessageReceiver
对其进行计算。
MessageReceiver
图在每个时间步执行一次。在仿真开始时,状态 A0
被激活。在时间 t=3
处,发生从 A0
到 A1
的转移。在时间 t=4
处,图确定队列中存在 M
,因此它发生到 A2
转移。在该时间步结束时,图从队列中删除 M
。在时间 t=5
处,队列中不存在消息,因此图不会触发到 A3
的转移。A2
保持激活状态。在示波器上,您可以看到 MessageReceiver
只更改了两次状态。
与事件不同,消息需要排队。接收图可以选择在消息发送后的任何时间对器进行响应。与数据不同,消息不会无限期保持有效。消息在对应的时间步结束时被销毁。