主要内容

生成c++消息在Simulink和操作系统或中间件之间进行通信金宝app

要生成支持Simulink顶级模型和外部应用程序之间金宝app的消息通信的c++代码,请使用Simulink Messages & Even金宝appts库发送收到块。从顶级模型生成代码以方便在Simulink环境之外传递消息,使建模的应用程序能够在使用外部消息协议服务的分布式系统中通信,该服务通常被称为操作系统或中间件(金宝app例如,DDS、ROS、SOMEIP或POSIX消息)。

金宝appSimulink顶级模型通过以下方式传递消息:

  • 顶级模型包含在Simulink环境之外进行通信的消息块。金宝app如果顶级模型包含一个直接连接到根Outport块的Send块,则该块将其信号转换为消息并将它们传递到Simulink环境之外。金宝app如果顶级模型包含一个直接连接到根import块的Receive块,则该块将接收到的消息转换为信号。

  • 外部消息协议根据其自己的标准(控制容量、交付顺序和其他服务质量行为的策略)管理消息通信。

要生成在Simulink顶级模型和操作系统或中间件之间通信的c++消息,请准备您的模型,生成代码金宝app,并将代码与您选择的操作系统或中间件集成。

准备模型

要设置模型,使其能够通过操作系统或中间件传递消息,请将模型配置为至少有一个消息块(连接到根Outport块的发送块或连接到根Inport块的接收块)的顶级模型。top模型可以通过如下消息块连接到你选择的操作系统或中间件:

在模型中,消息端口的连接如下所示:

生成代码

从模型生成c++代码:

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

  2. 在“配置参数”对话框中设置以下参数:

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

    • 接口窗格中,设置代码接口包装c++类

    • 模板窗格中,选择生成一个示例主程序

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

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

集成代码

要将模型中生成的c++代码与所选的操作系统或中间件集成在一起,使用手写代码实现发送和接收消息类,以及使用这些类传递消息的应用程序代码。具体地说:

  1. 如果你使用自己的main,从生成的抽象类中创建具体的子类RecvData_ < T > . hSendData < T > . h.如果您使用生成的示例主程序,文件中将为您提供具体的子类。

  2. 实现类函数SendDataRecvData调用所选的操作系统或中间件来发送和接收消息。

  3. 创建已实现的发送和接收消息类(发送和接收对象)的实例。

  4. 通过在模型构造函数中使用每个消息类(发送和接收对象)的实例作为参数来创建模型类的实例。

  5. 根据应用程序的要求发送和接收消息。您需要管理消息队列的生存期。在模型的第一步之前,队列必须处于准备接受消息的状态。

整合:

  1. 打开生成的示例主程序(或创建您自己的)。如果使用主程序生成的例子,具体的子类RecvData_real_TSendData_real_T文件中提供的。如果你创建了自己的main,在你的应用程序代码中创建具体的子类:

  2. 要接收消息,手工编写生成的接收类的实现。实现类函数RecvData调用所选的操作系统或中间件来接收消息。

    下面是POSIX的一个实现示例:

    类mHMIHandlerRecvData_real_T: public RecvData_real_T {public: void RecvData(real_T* data, int32_T length, int32_T* status){//使用POSIX API mq_receive接收消息unsigned int priority = 1;*status = mq_receive(msgQueue, (char *)data, length, &priority);}};

    创建一个接收对象。

    静态mHMIHandlerRecvData_real_T InMsgRecvData_arg;
  3. 要发送消息,手工编写生成的send类的实现。实现类函数SendData调用所选的操作系统或中间件来发送消息。

    下面是POSIX的一个实现示例:

    类mHMIHandlerSendData_real_T: public SendData_real_T {public: void SendData(const real_T* data, int32_T length, int32_T* status){//使用POSIX API mq_send发送消息unsigned int priority = 1;*status = mq_send(msgQueue, (char*)data, length, priority);}};

    创建一个发送对象。

    静态mHMIHandlerSendData_real_T OutMesgSendData_arg;

    通过在模型构造函数中使用send和receive对象作为参数来创建模型类的实例。

    静态mHMIHandler mHMI_Obj(InMsgRecvData_arg, OutMsgSendData_arg);
  4. 根据应用程序的要求发送和接收消息,并维护消息队列的生命周期。

    下面是POSIX的一个实现示例:

    int_T main(int_T argc, const char *argv[]){//未使用的参数(void)(argc);(空白)(argv);/ /初始化模型mHMI_obj.initialize ();//打开POSIX队列mqd_t msgQueue = mq_open("/PosixMQ_Example", O_RDONLY);如果(msgQueue == -1) {printf("mq_open失败\n");退出(1);} //发送和接收消息while (rtmGetErrorStatus(mHMI_Obj.getRTM()) == (NULL)){//执行应用程序任务。rt_OneStep ();} //关闭POSIX队列mq_close(msgQueue);//终止模型mHMI_Obj.terminat():返回0; }

有关更复杂的POSIX集成示例,请参见使用手写代码集成c++消息与POSIX

注意事项和限制

  • 手写代码是唯一受支持的集成技术。金宝app

  • 的参数生成一个示例主程序必须选择。不支持需要静态main的应用程序。金宝app

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

相关的话题