Main Content

通过发送消息与 Stateflow 图通信

要在 Simulink® 模型中的 Stateflow® 图内部和各图之间进行通信,请使用消息。消息是 Stateflow 对象,用于在局部或图之间进行数据通信。在发送方图中,您可以发送或转发包含数据的消息。在接收方图中,使用队列接收并保留消息,直到图能够计算它。

Simulink model with two Stateflow charts that communicate using a message.

消息结合了数据和事件的一些功能。像数据一样,消息可以传输数值和文本信息。像事件一样,消息可以触发转移和状态动作。然而:

  • 消息不会触发图唤醒。消息需要排队,直到图被唤醒。当图唤醒时,它可以响应队列中的消息。

  • 如果接收方图无法立即响应,消息不会丢失。

有关详细信息,请参阅查看 Stateflow 消息、事件和数据之间的差异

当图转移或状态动作计算消息时,图会确定队列是否包含任何消息。如果包含,图将从队列中移除该消息。该消息一直有效,直到时间步结束,或者直到图转发或丢弃该消息。当消息有效时,其他转移或动作可以访问消息数据,并且图不会再从队列中移除其他消息。图会在当前时间步结束时销毁所有有效消息。

在图中定义消息

您可以使用符号窗格、Stateflow 编辑器菜单或模型资源管理器向 Stateflow 图添加消息。

通过“符号”窗格添加消息

  1. 建模选项卡的设计数据下,选择符号窗格

  2. 点击创建消息图标

  3. 在新消息的行中,点击类型下方的图标并选择:

    • 输入消息

    • 局部消息

    • 输出消息

  4. 编辑消息的名称。

  5. 对于输入和输出消息,点击端口字段并选择端口号。

  6. 要指定消息的属性,请打开属性检查器。在符号窗格中,右键点击该消息的行并选择浏览。有关详细信息,请参阅Set Properties for a Message

使用 Stateflow 编辑器菜单添加消息

  1. 在 Stateflow 编辑器中,选择与要添加的消息作用域对应的选项。

    作用域选项
    输入建模选项卡的设计数据下,选择消息输入
    输出建模选项卡的设计数据下,选择消息输出
    局部建模选项卡的设计数据下,选择消息

  2. 在“消息”对话框中,指定数据属性。有关详细信息,请参阅Set Properties for a Message

通过模型资源管理器添加消息

  1. 建模选项卡的设计数据下,选择模型资源管理器

  2. 模型层次结构窗格中,在 Stateflow 层次结构中选择您希望新消息对其可见的对象。所选对象即变为新消息的父级。

  3. 在“模型资源管理器”菜单中,选择添加 > 消息。具有默认定义的新消息出现在模型资源管理器的内容窗格中。

  4. 消息窗格中,指定消息的属性。有关详细信息,请参阅Set Properties for a Message

Stateflow 消息的生命周期

Stateflow 消息具有有限的生命周期。当您使用 send 运算符向接收队列发送消息时,生命周期开始。消息将一直保留在队列中,直到转移或状态 on 动作对其进行计算,或者图使用 receive 运算符接收它。

当图计算或接收消息时,消息变为有效。该消息一直有效,直到:

  • 当前时间步的结束,此时图会销毁任何剩余的有效消息。

  • 图使用 forward 运算符将消息转发到另一个队列。消息在新队列中继续其生命周期。

  • 图使用 discard 丢弃消息。

当消息有效时,其他转移和动作可以计算消息和访问其数据。要检查消息是否有效,请使用 isvalid 运算符。

要查看仿真过程中的消息交换,请将 Sequence Viewer 模块添加到您的 Simulink 模型中。Sequence Viewer 模块显示:

  • 发送的消息

  • 收到的消息

  • 转发的消息

  • 丢失的消息

  • 销毁的消息

  • 丢弃的消息

有关详细信息,请参阅Use the Sequence Viewer to Visualize Messages, Events, and Entities

消息的限制

您不能在以下各项中使用消息:

  • 摩尔图

  • 原子子图

  • 断点条件表达式

  • entry 动作

  • 启用了初始化时执行(进入)图的默认转移

在使用 C 语言作为动作语言的图中,消息不支持多字定点数据。

包含局部消息的图不支持外部模式仿真或快速加速模式仿真。

另请参阅

| | | | | (Simulink) |

相关主题