Main Content

查看 Stateflow 消息、事件和数据之间的差异

此示例比较 Stateflow® 中消息、事件和数据的行为。

发送方图

此模型有三个发送方图:DataSenderEventSenderMessageSender。每个发送方图都有一个状态。在状态的 entry 动作中,图对数据赋值,发送函数调用事件,或发送消息。

接收方图

每个发送方图都有一个对应的接收方图。每个接收方图都有一个状态图,具有状态 A0A1A2A3。隐式事件 after(3,sec) 触发从 A0A1 的转移。来自对应发送方图的数据、事件或消息保护 A1A2A3 之间的转移。

示波器输出

每个接收方图都启用激活状态输出并连接到一个示波器。示波器显示每个时间步中哪些状态被激活。此输出突出显示输出数据、事件和消息之间的行为差异。

数据行为

DataSender 图将值 1 赋给输出数据 M,该数据作为输入连接到 DataReceiver 图。

DataReceiver 图在每个时间步执行一次。在仿真开始时,状态 A0 被激活。在时间 t=3 处,发生从 A0A1 的转移。在时间 t=4 处,图测试 M 是否等于 1。此条件为 true,因此图发生从 A1A2 的转移。在时间 t=5 处,M 仍等于 1,因此图发生从 A2A3 的转移。在示波器上,您可以看到 DataReceiver 更改了三次状态。

对数据赋值后,它会在整个仿真期间保持其值。因此,每次 DataReceiver 计算条件 [M == 1] 时,它都会转移到一个新状态。

事件的行为

EventSender 图使用命令 send(M) 发送一个函数调用输出事件来唤醒 EventReceiver 图。

EventReceiver 图仅在输入事件 M 唤醒图时执行。在仿真开始时,状态 A0 被激活。从 A0A1 的转移基于绝对时间时序逻辑,并且在时间 t=0 处无效。A0 保持激活,图返回休眠状态。由于 EventSender 只发送事件 M 一次,EventReceiver 不会再次唤醒。在示波器上,您可以看到 EventReceiver 从未转移出 A0

事件不会跨时间步保持有效,因此接收方图只有一次机会来响应事件。当 EventSender 发送事件时,EventReceiver 未准备好响应它。EventReceiver 失去响应事件来发生转移的机会。

消息的行为

MessageSender 图使用语法 send(M) 通过输出消息端口发送消息。该消息进入 MessageReceiver 图的输入消息队列。消息在队列中等待,直到 MessageReceiver 对其进行计算。

MessageReceiver 图在每个时间步执行一次。在仿真开始时,状态 A0 被激活。在时间 t=3 处,发生从 A0A1 的转移。在时间 t=4 处,图确定队列中存在 M,因此它发生到 A2 转移。在该时间步结束时,图从队列中删除 M。在时间 t=5 处,队列中不存在消息,因此图不会触发到 A3 的转移。A2 保持激活状态。在示波器上,您可以看到 MessageReceiver 只更改了两次状态。

与事件不同,消息需要排队。接收图可以选择在消息发送后的任何时间对器进行响应。与数据不同,消息不会无限期保持有效。消息在对应的时间步结束时被销毁。

相关主题