主要内容

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

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

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

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

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

要生成C ++消息以在Simulink顶部模型和操作系统或中间件之间进行通信,请准备模型,生成代金宝app码,并将该代码与所选操作系统或中间件集成。

准备模型

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

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

生成代码

从模型生成c++代码:

  1. 在Apps Gallery中,单击嵌入式编码器

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

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

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

    • 在里面模板窗格中,选择生成示例主程序

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

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

整合代码

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

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

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

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

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

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

集成:

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

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

    显示了POSIX的示例实现:

    class mhmihandlerrecvdata_real_t:public recvdata_real_t {public:void recvdata(real_t * data,int32_t长度,int32_t * status){//使用posix api mq_receive接收邮件无符号int priority = 1;* status = mq_receive(msgqueue,(char *)数据,长度和优先级);}};

    创建一个接收对象。

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

    显示了POSIX的示例实现:

    class mhmihandlersenddata_real_t:public senddata_real_t {public:void senddata(const real_t * data,int32_t长度,int32_t * status){//使用posix api mq_send发送消息无符号int priority = 1;* status = mq_send(msgqueue,(char *)数据,长度,优先级);}};

    创建一个发送对象。

    静态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);// initialize model mhmi_obj.initialize();//打开posix queue mqd_t msgqueue = mq_open(“/ posixmq_example”,o_rdonly);if(msgqueue == -1){printf(“mq_open失败\ n”);出口(1);} //在(rtmgeterrorstatus(mhmi_obj.getrtm())==(null)){//此处执行应用程序任务时发送和接收消息。RT_ONESTEP();} //关闭posix队列mq_close(msgqueue);//终止模型mhmi_obj.terminat():返回0; }

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

考虑和局限性

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

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

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

相关话题