文档

在Simulink中为基于消息的通信生成C或c++代码金宝app

若要生成在Simulink环境中支持模型组件之间基于消息的通信金宝app的C++或C代码,请使用Simulink消息和事件库块金宝app发送收到.要自定义通信,请使用队列块(来自同一个库)来设置容量、排序策略(LIFO、FIFO和优先级)和覆盖策略(当队列超过容量时的行为)的参数。您可以使用Simulink Coder为基于grt的系统目标文件生成C代码,使用Embedded Coder为基于ert的系统目标文件金宝app生成c++或C代码。

对于可以在Simulink中建模的分布式和复杂系统,消息是一种有效的通信技术。金宝app为了更好地理解生成的代码对基于消息的通信的支持,下面解释:金宝app

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

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

  • 如何从给定的示例模型生成和检查c++和C代码。

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

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

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

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

  3. 创建一个带有两个模型块的模型(顶部模型)。

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

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

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

要查看此设计的示例,请参见中提供的模型软件组件之间基于消息的通信(金宝app模型)。

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

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

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

  2. 包含队列的顶级模型根据定义容量、交付顺序和其他服务质量(QoS)度量的参数管理消息。

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

生成的c++和C代码的底层架构非常相似。top模型通过建立一个被引用模型可以独立访问的集合接口来促进发送和接收引用模型之间的连接。

生成的c++和C代码以以下方式实现消息行为:

  1. 在每个模型边界上创建一个服务。服务包含对顶层模型的引用和入口点功能(称为服务功能),供被引用的模型使用,以通过顶层模型传递消息。

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

  3. 被引用的模型调用服务函数以使用顶级模型传递消息。

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

c++和C代码生成示例

c++代码生成示例

这个例子从模型中生成并检查c++代码软件组件之间基于消息的通信(金宝app模型)。

生成c++代码:

  1. 打开模型。

  2. 在应用程序库中,单击嵌入式编码器

  3. 对于每个模型(顶部和两个参照模型),在“配置参数”对话框中设置以下参数:

    • 在“代码生成”窗格中,设置语言c++

    • 在“接口”窗格中设置代码接口包装c++类

    保存模型。

  4. 生成的代码。在c++代码选项卡上,单击建造

  5. 查看生成的代码。在c++代码选项卡上,单击视图代码

检查c++代码:

  1. 在每个模型边界上创建一个服务。在C++中,服务被表示为保存顶层模型的实例的对象和引用模型调用消息的服务功能。

    1. 要查看服务的创建,请打开顶层模型c++文件,MessageSendReceiveDefaultBufferModel.cpp。查看构造函数方法。

      构造函数方法,ReceiveComponentRecvData (*)SendComponentSendData (*),通过将顶层模型实例的引用作为参数,分别创建接收和发送服务对象。每个服务对象保存对顶层模型的引用,并定义消息接口(服务函数)RecvDataSendData).

    2. 要查看接收和发送服务类,请打开顶部模型头文件,MessageSendReceiveDefaultBufferModel.h,并查看以下部分。

  2. 顶部模型初始化每个服务,以创建到每个引用模型的连接。要查看初始化,打开顶部模型c++文件,MessageSendReceiveDefaultBufferModel.cpp。查看构造函数方法。

    构造函数方法,Receive_ComponentMDLOBJ0(获取_ReceiveComponentRecvData()),将对接收服务的引用传递给接收引用模型。构造函数方法,Send_ComponentMDLOBJ1 (get_SendComponentSendData ()),将对发送服务的引用传递给发送引用模型。

  3. 被引用的模型调用服务函数以与顶层模型传递消息。在C++中,引用模型调用顶部模型(公共祖先,如果在层次结构中)服务函数来发送或接收消息(具体地,引用模型调用抽象服务方法)。RecvDataSendData从步骤2中创建的接口),抽象接口类被发射到共享文件夹。每个服务中的服务功能的实现在顶部模型C++文件中定义。

    1. 要查看要发送消息的抽象接口类,请从共享文件夹中打开头文件,SendData.h

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

    3. 要查看send引用模型如何调用服务函数,请打开它的c++文件,mSend.cpp.在step函数中,模型调用服务函数向顶层模型发送消息并接收返回状态。

    4. 要查看接收消息的抽象接口类,请从共享文件夹中打开头文件,RecvData.h

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

    6. 要查看接收引用模型如何调用服务函数,请打开它的c++文件,mRecieve.cpp。在step函数中,模型调用服务函数以从顶层模型接收消息和状态。

C代码生成示例

这个例子生成并检查C代码软件组件之间基于消息的通信(金宝app模型)。

生成C代码:

  1. 打开模型。

  2. 在应用程序库中,单击嵌入式编码器

  3. 对于每个模型(顶部和两个引用的模型),在“配置参数”对话框的“代码生成”窗格中,设置语言C保存模型。

  4. 生成的代码。在C代码选项卡上,单击建造

  5. 查看生成的代码。在C代码选项卡上,单击视图代码

检查C代码:

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

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

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

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

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

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

    2. 要查看发送消息的服务功能的实现,请打开顶部的model C文件,MessageSendReceiveDefaultBufferModel.c

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

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

    5. 要查看接收消息的服务功能的实现,请打开顶部的model C文件,MessageSendReceiveDefaultBufferModel.c

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

注意事项和限制

  • 通过使用Sim金宝appulink Coder应用程序,可以为基于GRT的系统目标文件提供C代码支持。金宝app

  • C和c++代码支持可以通过使用金宝app嵌入式编码器应用程序来支持基于ert的系统目标文件。

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

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

  • 可重用子系统无法发送或接收跨越模型边界的消息。

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

  • 在模拟中,不支持SIL/PIL。金宝app

相关话题