Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

生成用于在 Simulink 组件之间通信的 C 消息

要生成支持 Simulink 环境中的模型组件之间基于消息的通信的 C 代码,请使用 Simulink Messages & Events Library 模块 SendReceive。要自定义通信,请使用 Queue 模块(来自同一个库)来设置容量、排序策略(LIFO、FIFO 和优先级)和覆盖策略(队列超出容量时的行为)的参数。您可以使用 Simulink Coder 为基于 GRT 的系统目标文件生成 C 代码,或使用 Embedded Coder 为基于 ERT 的系统目标文件生成 C 代码。

对于可以在 Simulink 中建模的分布式复杂系统,消息是一种有效的通信方法。为了更好地理解生成代码对基于消息的通信的支持,需要回答以下问题:

  • 如何在 Simulink 中为基于消息的通信准备模型。

  • 模型组件如何传递消息,以及代码如何实现此行为。

  • 如何基于给定示例模型生成和检查 C 代码。

如何在 Simulink 中为基于消息的通信准备模型

在 Simulink 中,您可以使用以下步骤对模型组件之间基于消息的通信进行建模:

  1. 创建一个包含 Send 模块的模型(引用模型)。

  2. 创建一个包含 Receive 模块的模型(引用模型)。

  3. 创建一个包含两个 Model 模块的模型(顶层模型)。

    • 将第一个 Model 模块设置为包含 Send 模块的模型(步骤 1 中的模型)。

    • 将第二个 Model 模块设置为包含 Receive 模块的模型(步骤 2 中的模型)。

  4. 运行模型时,顶层模型中消息线上会自动生成一个队列。队列可显式或隐式控制消息通信。您可以使用自动生成的队列,也可以在顶层模型中添加 Queue 模块来显式指定通信参数。

模型组件如何传递消息以及代码如何实现此行为

从概念上讲,引用模型通过以下方式传递消息:

  1. 在包含 Send 模块的模型中,Send 模块将信号转换为消息。

  2. 包含队列的顶层模型根据定义容量、传送顺序和其他服务质量 (QoS) 指标的参数来管理消息。

  3. 在包含 Receive 模块的模型中,Receive 模块将消息转换回信号。

在生成的 C 代码中,顶层模型通过建立发送和接收引用模型可彼此独立访问的集合接口来支持这些引用模型之间的连接。

生成的 C 代码通过以下方式实现消息行为:

  1. 在每个模型边界上创建一个服务。服务包含对顶层模型的引用和一个入口函数(称为服务函数),供引用模型与顶层模型传递消息。

  2. 顶层模型初始化每个服务,以创建与每个引用模型的连接。

  3. 引用模型调用服务函数与顶层模型传递消息。

这些步骤的实现细节显示在生成代码示例中。

C 代码生成示例

此示例基于Establish Message Send and Receive Interfaces Between Software Components中提供的模型生成并检查 C 代码。

生成 C 代码:

  1. 打开模型。

  2. 在 App 库中,点击 Embedded Coder

  3. 对于每个模型(顶层模型和两个引用模型),在 Configuration Parameters 对话框的 Code Generation 窗格中,将 Language 设置为 C 并保存模型。

  4. 生成代码。在 C Code 选项卡上,点击 Build

  5. 查看生成的代码。在 C Code 选项卡上,点击 View Code

检查 C 代码:

  1. 在每个模型边界上创建一个服务。在 C 语言中,引用模型将服务表示为 DWork。服务提供了指向顶层模型实例的指针,以及一个引用模型调用的服务函数,用于传递消息。

    1. 要查看发送消息的服务,请打开发送引用模型头文件 mSend.h。查看 DWork 分配。

    2. 要查看发送消息数据类型,如果数据类型是可共享的(例如,内置数据类型、导入的总线类型和采用指定数据类型的导出总线类型),则信息位于共享头文件中。如果数据类型不可共享,则信息位于模型头文件 mSend.h 中。在此示例中,请通过打开共享头文件 SendData_real_T.h 查看可共享数据类型。

    3. 要查看用于接收消息的服务,请打开接收引用模型头文件 mReceive.h。查看 DWork 分配。

    4. 要查看收到的消息数据类型,如果数据类型是可共享的(例如,内置数据类型、导入的总线类型和采用指定数据类型的导出总线类型),则信息位于共享头文件中。如果数据类型不可共享,则信息位于模型头文件 mReceive.h 中。在此示例中,请通过打开共享头文件 RecvData_real_T.h 查看可共享数据类型。

  2. 顶层模型初始化每个服务,以创建与每个引用模型的连接。在 C 语言中,顶层模型初始化每个引用模型 DWork。要查看初始化,请打开顶层模型 C 文件 MessageSendReceiveDefaultBufferModel.c

  3. 引用模型调用服务函数与顶层模型传递消息。在 C 语言中,引用模型通过解引用服务函数指针并传递一个指向顶层模型实例的指针来调用服务函数。您可以在顶层模型头文件中查看服务函数的原型,并且可以在引用模型 C 文件中查看这些服务函数的引用模型调用。

    1. 要查看发送消息的服务函数的原型,请打开顶层模型头文件 MessageSendReceiveDefaultBufferModel.h

    2. 要查看发送消息的服务函数的实现,请打开顶层模型 C 文件 MessageSendReceiveDefaultBufferModel.c

    3. 要查看发送消息的引用模型如何调用服务函数,请打开模型的 C 文件 mSend.c。在单步函数中,模型调用服务以向顶层模型发送实例数据和消息,并接收返回状态。

    4. 要查看接收消息的服务函数的原型,请打开顶层模型头文件 MessageSendReceiveDefaultBufferModel.h

    5. 要查看接收消息的服务函数的实现,请打开顶层模型 C 文件 MessageSendReceiveDefaultBufferModel.c

    6. 要查看接收消息的引用模型如何调用服务函数,请打开模型的 C 文件 mReceive.c。在单步函数中,模型调用服务来接收消息有效负载和返回状态。

注意事项和限制

  • Simulink Coder 支持为基于 GRT 的系统目标文件生成 C 代码。

  • Embedded Coder 支持为基于 ERT 的系统目标文件生成 C 代码。

  • 要生成代码,顶层模型和引用模型必须选择相同的语言 (C) 和系统目标文件。

  • 不能为具有根级消息端口的顶层模型配置函数原型控制 (FPC)。

  • 不支持外部模型和变体模型。

  • 在仿真中,不支持 SIL/PIL。

相关主题