主要内容

交互式配置c++接口

简化从Simulink生成的c++代码的集成金宝app®使用外部C或c++代码的应用程序、组件和子系统,配置自定义的c++类接口。当您从模型生成c++代码时,模型以类的形式出现,数据元素以类成员的形式出现,而模型函数则以生成的代码中的类方法的形式出现。配置c++类接口使您能够自定义生成的c++代码的以下方面:

  • 类信息——类名和命名空间

  • 类成员信息——类成员访问和可见性

  • 类方法信息——类方法名称和参数

定制的c++类接口使生成的类能够满足特定的代码标准或接口需求,这样生成的代码就可以编译并集成到更大的体系结构中,只需进行最少的后期定制。

交互式工作流概述

交互工作流通过使用可直接从c++代码选项卡。在选项卡中,您可以单击代码接口并访问类名&命名空间配置对话框和代码映射编辑器(带有属性检查器)来配置接口。

交互地配置一个自定义的c++接口:

开放的环境

打开配置自定义c++类接口的环境:

  1. 打开嵌入式编码器®在“应用程序”库中,单击嵌入式编码器

  2. 将语言设置为c++。在c++代码选项卡上,单击输出并选择嵌入式c++代码

    在Simulink中rtwdemo_cppclass_workflow模型的视图。金宝app工具条在顶部。Simu金宝applink模型在底部。

  3. 设置模型配置参数。要打开“配置参数”对话框,请在c++代码选项卡上,单击设置,并选择C/ c++代码生成设置.这些参数配置模型范围内的代码生成行为。要配置特定于生成自定义c++类接口的参数,可以设置这些参数(位于接口窗格):

    编码器界面窗格的选项。检查是否在模型类中包含模型类型。

    配置参数 描述
    代码接口打包 为生成的代码选择输出语言。有关更多信息,请参见代码接口打包
    多实例代码错误诊断

    指定当模型违反生成多实例代码的需求时显示的诊断的严重级别。有关更多信息,请参见多实例代码错误诊断

    删除实时模型数据结构中的错误状态字段

    指定是否从生成的实时模型数据结构中省略错误状态字段rtModel.有关更多信息,请参见删除实时模型数据结构中的错误状态字段

    在模型类中包含模型类型

    指定在模型的类名称空间中包括模型类型定义。有关更多信息,请参见在模型类中包含模型类型

    相关但不常用的接口参数出现在先进的参数

    配置参数 描述
    需要终止函数

    是否生成模型_terminate方法。有关更多信息,请参见需要终止函数

    结合信号/状态结构

    指定是否在生成的代码中将全局块信号和全局状态数据组合为一个数据结构。有关更多信息,请参见结合信号/状态结构

    产生析构函数

    指定是否为c++模型类生成析构函数。有关更多信息,请参见产生析构函数

    为模型块实例化使用动态内存分配

    为模型层次结构指定内存分配。有关更多信息,请参见为模型块实例化使用动态内存分配

将模型配置为类

配置类名和命名空间。当您从一个模型生成c++代码时,该模型将作为一个类出现在生成的代码中。为了简化集成并符合代码和接口需求,您可以自定义生成的类名。可选地,您可以通过为生成的类指定名称空间来限定生成的代码的范围,并防止项目内的符号冲突。在作为模型层次结构构造的建模系统中,您可以为层次结构中的每个模型指定不同的名称空间。

生成的c++类接口,在模型头文件中声明,包含了定制的名称和命名空间:

//文件:rtwdemo_cppclass_workflow.h . txt名称空间CustomizedNamespace {customized_ModelClass{//公共数据和函数成员公共: //私有数据和函数成员私人:};}

工作流

为自定义c++类接口配置类名和命名空间:

  1. c++代码选项卡上,单击代码接口并选择类名&命名空间

    c++类名和命名空间的配置显示视图

  2. 要配置类名,请编辑c++类名字段。

  3. 要配置类名称空间,请编辑c++类命名空间字段。

    您可以通过使用范围解析操作符分隔名称空间来为模型配置一个嵌套的名称空间::在表格中ns1:: ns2:: ns3

  4. 点击好吧.验证以交互方式执行,并在输入无效的名称或名称空间时发出字段警告。

将模型数据元素配置为类成员

配置类成员的可见性和访问。当您从模型生成c++代码时,Simulink数据元素将作为类成员出现在生成的代码中金宝app。要调整类数据的封装以满足代码标准、安全性或性能需求,您可以自定义生成的类成员的可见性和访问。金宝appSimulink数据元素可以分为以下几类建模元素:

模型元素类别 描述
港口

模型的根级数据输入端口,例如轮廓尺寸而且总线元件块。有关更多信息,请参见轮廓尺寸

外港

模型的根级数据输出端口,例如外港而且输出总线元件块。有关更多信息,请参见外港

模型参数参数

显示为实例(非静态)类数据成员的工作区变量。

模型参数

作为静态类数据成员生成的模型类实例之间共享的工作区变量。

信号、状态和内部数据

模型内部的数据元素,如块输出信号、离散块状态、数据存储和过零信号。

对于每个模型元素类别,您可以配置数据可见性来控制生成的类成员的访问修饰符(访问说明符)。在模型头文件中声明的每个选项及其对生成的c++类接口的影响都在这个表中列出。

数据可见性选项 描述
公共

如果将数据元素配置为公共时,它们显示为生成类的公共成员:

文件:rtwdemo_cppclass_workflow.h名称空间CustomizedNamespace {customized_ModelClass {公共: // example import ExtU rtU;// example outport ExtY rtY;//示例阻塞信号和状态DW rtDW;//其他数据、方法和类型(未显示)私人:…};}

私人

如果将元素配置为私人时,它们显示为生成类的私有成员:

文件:rtwdemo_cppclass_workflow.h名称空间CustomizedNamespace {customized_ModelClass {公共私人: // example import ExtU rtU;// example outport ExtY rtY;//示例阻塞信号和状态DW rtDW;//其他数据、方法和类型(未显示)};}
单个参数(仅限模型参数)

如果将数据元素配置为个人观点,元素不会作为类的成员出现,而是作为参数传递给类方法:

文件:rtwdemo_cppclass_workflow.h名称空间CustomizedNamespace {customized_ModelClass {公共: //建模步骤函数void step1(real_T rty_engineestate, const real_T modelParameterArgument);//其他数据、方法和类型(未显示)私人:…};}

在您设置了模型元素类别的数据可见性之后,您可以配置模型访问方法,以确定如何为数据元素生成get和set方法。此配置控制应用程序代码如何查看和修改类成员数据。在模型头文件中声明的每个选项及其对生成的c++类接口的影响都在这个表中列出。

成员访问方法选项 描述
方法

如果您将导入配置为方法时,每个导入都会出现一个set方法。如果将输出端口配置为方法时,为模型中的每个输出端口出现一个get方法。如果您将其他模型元素类别配置为方法,针对数据元素类别出现了基于聚合结构的get和set方法。

文件:rtwdemo_cppclass_workflow.h名称空间CustomizedNamespace {customized_ModelClass {公共: // example inport void setInport(real_T localArgInput);//示例outport real_T getOutport() const;//使用' DataAccess ' ' Direct' ' real_T const &getInstP() const;//使用' DataAccess ' ' Pointer '配置的模型参数实例// real_T const *getInstP() const;// example块参数获取和设置方法const P &getBlockParameters();setBlockParameters(const P *pP)// example块状态获取和设置方法const DW &getDWork();setDWork(const DW *pDW)私人:…};}
内联方法

如果您将导入配置为内联方法时,在其声明中定义的set方法将出现在每个导入中。如果将输出端口配置为内联方法,在其声明中定义的get方法将出现在模型中的每个输出端口中。如果您将其他模型元素类别配置为内联方法,在其声明中定义的基于聚合结构的get和set方法将出现在数据元素类别中。

文件:rtwdemo_cppclass_workflow.h名称空间CustomizedNamespace {customized_ModelClass {公共: //示例输入设置方法void setkeyState(real_T localArgInput) {rtU. txtkeyState = localArgInput;} //示例输出端口获取方法const real_T *getengineState() const{返回rtY.engineState;} // example块参数获取和设置方法const P &getBlockParameters() const{返回rtP;} void setBlockParameters(const P *pP) const {rtP = *pP;} // example块状态的get和set方法const DW &getDWork() const{返回rtDW;} void setDWork(const DW *pDW) {rtDW = *pDW;}私人:…};}
基于结构的方法

如果将导入配置为基于结构的方法时,导入显示为模型元素类别的基于聚合结构的集合方法。如果将输出端口配置为基于结构的方法,输出端口显示为模型元素类别的基于聚合结构的get方法。此配置选项不适用于其他模型元素类别。

文件:rtwdemo_cppclass_workflow.h名称空间CustomizedNamespace {customized_ModelClass{//公共数据和函数成员公共: //外部输入(默认存储的根输入信号)struct ExtU {real_T keyState;// '<根>/keyState'};//外部输出(根输出由默认存储的信号提供)struct ExtY {real_T engineestate [3];// '/ engineestate ' real_T cycleTime;// '<根>/cycleTime'};//输入void setExternalInputs(const ExtU *pExtU);//示例输出const ExtY &getExternalOutputs() const;//其他模型元素类别不能配置为'基于结构的方法'私人:…};}
基于内联结构的方法

如果将导入配置为基于内联结构的方法时,导入显示为在模型元素类别的声明中定义的基于聚合结构的set方法。如果将输出端口配置为基于内联结构的方法,输出端口显示为在模型元素类别的声明中定义的基于聚合结构的get方法。此配置选项不适用于其他模型元素类别。

文件:rtwdemo_cppclass_workflow.h名称空间CustomizedNamespace {customized_ModelClass {公共: //外部输入(默认存储的根输入信号)struct ExtU {real_T keyState;// '<根>/keyState'};//外部输出(根输出由默认存储的信号提供)struct ExtY {real_T engineestate [3];// '/ engineestate ' real_T cycleTime;// '<根>/cycleTime'};//输入void setExternalInputs(const ExtU *pExtU);//示例输出const ExtY &getExternalOutputs() const;// example import void setExternalInputs(const ExtU *pExtU) {rtU = *pExtU;} //示例outport const ExtY &getExternalOutputs() const{返回rtY;} //其他模型元素类别不能配置为'内联结构的方法'私人:…};}
没有一个

如果您将模型元素类别的访问配置为没有一个, get和set方法不会出现在生成的类中,应用程序代码可以直接访问数据。

文件:rtwdemo_cppclass_workflow.h名称空间CustomizedNamespace {customized_ModelClass {公共: //外部输入(默认存储的根输入信号)struct ExtU {real_T keyState;// '<根>/keyState'};//外部输出(根输出由默认存储的信号提供)struct ExtY {real_T engineestate [3];// '/ engineestate ' real_T cycleTime;// '<根>/cycleTime'};//外部输入//外部输出ExtY rtY;私人:…};}

对于每个模型元素类别,有效的数据可见性和成员访问方法组合在此表中概述。

模型元素类别 数据的可见性 成员访问方法
港口 私人

方法

内联方法

基于结构的方法

基于内联结构的方法

公共

没有一个

方法

内联方法

基于结构的方法

基于内联结构的方法

外港 私人

方法

内联方法

基于结构的方法

基于内联结构的方法

公共

没有一个

方法

内联方法

基于结构的方法

基于内联结构的方法

模型参数参数 个人观点

没有一个

私人

方法

内联方法

模型参数 私人

没有一个

方法

内联方法

公共

没有一个

方法

内联方法

信号、状态和内部数据 私人

没有一个

方法

内联方法

公共

没有一个

方法

内联方法

工作流

配置自定义c++类接口的类成员:

  1. 打开代码映射编辑器。在c++代码选项卡上,单击代码接口并选择代码的映射

  2. 打开数据窗格。在代码映射编辑器中,单击数据选项卡。

    在Simulink中rtwdemo_cppclass_workflow模型的视图。金宝app工具条在顶部。Simu金宝applink模型在中间。代码映射- c++类窗格在底部。选中“代码映射”窗格中的“数据”选项卡。右边是“属性检查器”窗格。

  3. 配置可见性。若要在生成的代码中配置Simulink数据元素类别的可见性,请从金宝app数据的可见性列中,从给定选项中选择一个访问说明符。的选项不同模型元素类别

  4. 配置访问。要在生成的代码中配置对一类Simulink数据元素的访问,请从金宝app成员访问方法列中,选择如何从给定选项生成get和set方法。的选项不同模型元素类别被选中的数据的可见性

将模型函数配置为类方法

配置类方法名和参数。当您从模型生成c++代码时,模型函数在生成的代码中以类方法的形式出现。为了与外部代码或接口需求集成,您可以自定义生成的类方法的名称。此外,对于基本速率周期函数和Simulink函数,您可以配置生成参数的名称、顺序和标识符。金宝app

生成的类方法被称为入口点方法,是代码中发生程序控制(执行)转移的位置。入口点方法因Simulink模型的类型而异,可分为以下几种:金宝app

模型类型 模型函数类型 描述 模型函数名称 期望的方法名称
导出功能模型 导出函数 子系统的导出函数。 ExportedFunction:slIdentifier,在那里slIdentifier是模型中函数调用导入块的名称 function-call-inport-block-namesignal-label(如果指定了的话)
金宝app仿真软件的功能 a的导出函数金宝app仿真软件的功能块。 金宝app仿真软件功能:slIdentifier在哪里slIdentifier是名字吗金宝app仿真软件的功能模型中的块 函数名对于一个全局金宝app仿真软件的功能块或模型_函数名对于有范围的金宝app仿真软件的功能
导出功能或基于速率的模型 初始化函数

模型的初始化代码。在应用程序代码的开头,调用该函数一次.不要使用此函数重置实时模型数据结构(rtM).

初始化 模型_initialize
配分函数 对于模型分区,输出和更新代码。型号配置参数单输出/更新功能被选中(默认值)。 分区:slIdentifier,在那里slIdentifier是一个从模型中的块显式创建的分区,并显示在Simulink®日程编辑器中(例如,P1)金宝app 模型_stepn,在那里n唯一标识为一个模型样本周期生成的函数
周期性多任务功能 对于配置为多任务处理、输出和更新代码的基于速率的模型中的块。代码生成器为每个样本周期生成一个函数。型号配置参数单输出/更新功能被选中(默认值)。 周期:slIdentifier在哪里slIdentifier是一个注释,对应于多任务模型的周期或连续速率的采样时间段(例如D1)。 模型_stepn,在那里n唯一标识为一个模型样本周期生成的函数
周期性单任务功能 对于配置为单任务、输出和更新代码的基于速率的模型中的块。型号配置参数单输出/更新功能被选中(默认值)。 周期 模型_step
重置功能

如果模型包含重置功能块,重置代码生成。若要重置条件或状态,请从应用程序代码中调用该函数。

重置:slIdentifier在哪里slIdentifier重置函数的名称是否在模型中 模型_reset-function-name
终止函数

关闭系统的代码。对于基于ert的模型,您可以通过清除模型配置参数来抑制该函数的生成需要终止函数(默认设置)。

终止 模型_terminate

生成的c++类接口,在模型头文件中声明,在生成的入口点方法中合并了函数名和自定义参数:

文件:rtwdemo_cppclass_workflow.h名称空间CustomizedNamespace {customized_ModelClass {公共: //模型初始化函数-自定义名称void customized_initialize();//模型步函数-自定义名称和参数void customized_step(customArg1, const* customArg2);//模型终止函数-自定义名称void customized_terminate();//构造函数customized_ModelClass();//析构函数~customized_ModelClass();私人:…};}

工作流

  1. 打开代码映射编辑器。在c++代码选项卡上,单击代码接口并选择代码的映射

  2. 打开功能窗格。在代码映射编辑器中,单击功能选项卡。要查看模型的入口点函数的完整列表,请单击更新图按钮。

    在Simulink中rtwdemo_cppclass_workflow模型的视图。金宝app工具条在顶部。Simu金宝applink模型在中间。代码映射- c++类窗格在底部。选中“代码映射”窗格中的“功能”选项卡。右边是“属性检查器”窗格。

  3. 配置方法名。

    1. 若要在生成的代码中配置入口点方法的名称,请从方法名称列中,单击并直接编辑电子表格。可以输入自定义名称,也可以使用标识符格式参数来控制动态生成的名称。有关标识符格式参数的详细信息,请参见标识符格式控制

    2. 中的名称进行验证方法预览列。

  4. 配置方法参数。对于基本速率周期函数和Simulink函数,您可以配置方法参数的名称、顺序金宝app和标识符。

    配置基本速率周期函数的参数:

    1. 打开“步骤功能接口配置”对话框。从“代码映射”编辑器中功能选项卡,在方法预览列中,单击基速率周期函数的方法预览超链接:

      在“配置c++步骤函数”对话框中预览c++步骤函数名称和参数

    2. 在对话框中,选择为Step函数原型配置参数并点击获取默认.该操作启动方法参数的视图。

      在“配置c++步骤函数”对话框中查看c++步骤函数的详细信息

    3. 若要更改参数的顺序,请在查看器中单击并拖动参数行。

    4. 中更改标识符c++类型限定符列时,从下拉列表中选择适当的标识符:

      标识符的选择 预览
      值(仅限导入) myPeriodicFunction (argInport)
      Const引用(仅导入) myPeriodicFunction(const和argInport)
      指向Const的指针 myPeriodicFunction(const * argInport)
      指针 myPeriodicFunction (* argInport)
      指向Const的指针 myPeriodicFunction(常量*常量argInport)

    5. 方法中更改参数的名称c++标识符名称列,单击并直接编辑名称。可以输入自定义名称,也可以使用标识符格式参数来控制动态生成的名称。有关标识符格式参数的详细信息,请参见标识符格式控制

      1. 如果您为输入参数和输出参数输入相同的名称,则在生成的方法中,输入和输出将作为一个参数显示。例如,如果指定一个导入为argInport输出参数为argOutport,生成的方法为:

        myStepFunction (argInport argOutport);

        如果指定导入参数为argIO输出参数为argIO,生成的方法为:

        myStepFunction (argIO);
    6. 若要验证参数选择,请单击验证

    7. 如需应用修改并退出对话框,请单击好吧

    使用实例配置Simulink函数的参数。金宝app

    1. 打开“Simuli金宝appnk Function Interface”配置对话框。从“代码映射”编辑器中功能选项卡,在方法预览列中,单击Simulink的方法预览超链接。金宝app

      进入“配置C/ c++函数接口”对话框

    2. 控件中的返回参数选项,可更改返回参数C/ c++返回参数下拉列表。

    3. 若要更改参数的顺序,请在查看器中单击并拖动参数行。

    4. 中更改标识符c++类型限定符列时,从下拉列表中选择标识符:

      标识符的选择 预览
      汽车 my金宝appSimulinkFunction (argInport)
      常量引用 my金宝appSimulinkFunction(const & argInport)
      指向Const的指针 my金宝appSimulinkFunction(const * argInport)
      指针 my金宝appSimulinkFunction (* argInport)
      指向Const的指针 my金宝appSimulinkFunction(const * const argInport)

    5. 要更改参数的名称,请使用c++标识符名称列,单击并直接编辑名称。可以输入自定义名称,也可以使用标识符格式参数来控制动态生成的名称。有关标识符格式参数的详细信息,请参见标识符格式控制

    6. 若要验证对Simulink函数参数的更改,请查看金宝app金宝appSimulink函数原型字段以查看预期的方法原型。

    7. 如需应用修改并退出对话框,请单击好吧

生成c++类接口

通过从模型生成代码来生成定制的c++类接口。要验证c++类接口配置,构建模型并查看生成的类、类成员和类方法表示。

  1. 生成的代码。要生成c++类接口,请在c++代码选项卡上,单击构建

  2. 视图代码。要查看生成的代码,在选项卡上单击视图代码.生成的代码出现在模型工作区中的模型旁边。

    在Simulink中rtwdemo_cppclass_workflow模型的视图。金宝app工具条在顶部。Simu金宝applink模型在中间。代码映射- c++类窗格在底部。选中“代码映射”窗格中的“数据”选项卡。生成的代码显示在右边的Property Inspector窗格中。

  3. 迭代。如果生成的接口不满足代码要求,请进行配置调整,直到满足要求。

如果生成的代码表示不满足您的需求,请重新配置接口并再次生成代码,直到满足代码生成需求为止。有关理解生成的代码的指导,请参见分析生成的代码接口

注意事项和限制

  • 特定于实例的参数支持——您可以使用模型参数参数来配置已指金宝app定为参数的工作区变量。可以将这些参数配置为类的私有成员,也可以配置为在类外部定义的单独参数。要在类中进行配置,可以将数据可见性设置为private,并配置get和set方法的生成。可选地,您可以配置类成员值定义在类(在属性检查器,设置数据访问直接)或通过类构造函数引用传递(在属性检查器中,设置数据访问指针).顶级模型构建支持数据访问设置。金宝app对于引用模型构建,代码将作为模型类中的引用生成。若要在类外部配置特定于实例的参数,请将数据可见性设置为单个参数。

    特定于实例的参数限制包括:

    • MATLAB®标记为模型参数的变量不能配置为私有类成员。

    • 右击构建不支持模型参数参数。金宝app

  • 接口代码生成行为——步骤方法规范的I/O参数风格支持单速率模型和多速率单任务模型。金宝app不支持多速率多任务模型。金宝app此外,c++封装接口不是默认的,该值被忽略按值传递固定大小的标量根输入用于代码生成参数。

  • Stateflow®的状态流许可,用于驻留在根模型中的状态流图,该模型已配置为使用I/O参数步进方法函数规范,使用模型根导入值或调用使用模型根导入值的子系统,执行以下操作之一来生成代码:

    • 在“状态流”图中,清除初始化时执行(输入)图表复选框。

    • 在根导入后立即插入金宝app一个Simulink信号转换块。在“信号转换”块参数对话框中,选择从“减少块”优化中排除此块

  • Simscape™注意事项-如果模型根导入值连接到Simscape块,则在根导入和Simscape转换块之间插入一个Simulink信号转换块。金宝app在“信号转换”块参数对话框中,选择从“减少块”优化中排除此块

  • 参考模型注意事项——当构建一个配置为生成c++类接口的参考模型时:

    • 当引用的模型不能具有组合输出/更新函数时,不要使用c++类接口。情况包括具有连续采样时间或保存状态的模型。

    • 当引用模型使用I/O参数步进方法时,不要使用虚拟总线作为引用模型的输入或输出。当总线信号交叉引用模型边界时,要么使用非虚拟总线,要么使用默认步长方法。

相关的话题