文档

在生成代码中配置数据接口

指定要包含在生成代码中的信号、状态和参数。

学习如何在生成的代码中控制数据的这些属性:

  • 的名字

  • 数据类型

  • 数据存储类

有关示例模型的信息,请参见从嵌入式系统的控制算法生成C代码

打开示例模型

打开示例模型,rtwdemo_PCG_Eval_P2

Open_System('RTWDEMO_PCG_EVAL_P2'

数据声明

大多数编程语言要求您在使用之前声明数据和功能。“声明”规定了:

  • 作用域:程序中可以访问数据的区域

  • 持续时间:数据在内存中存在的时间

  • 数据类型:为数据分配的内存量

  • 初始化:值,到内存的指针,或null

范围和持续时间的组合是存储类。如果不提供初始值,大多数编译器分配零值或空指针。

金宝app支持的数据类型包括:

  • 双倍的:双精度浮点数

  • :单精度浮点

  • int8:带符号的8位整数

  • uint8.:无符号8位整数

  • int16: 16位有符号整数

  • uint16:无符号16位整数

  • INT32.:有符号32位整数

  • uint32: 32位无符号整数

  • 固定点:8-,16-,32位字长度

使用存储类,您可以:

  • 生成包含自定义名称的导出文件,包含全局变量声明和定义。

  • 导入包含全局变量声明的自定义头文件。

  • 生成const易挥发的声明中的类型限定符。

  • 将参数表示为宏(#定义或编译器选项)。

  • 将信号或参数打包成扁平结构或位域。

在Simulink®和statf金宝applow®中的控制数据

本例使用数据对象指定数据的代码生成设置。或者,您可以使用对话框将设置存储在模型中。这两种方法都允许完全控制数据类型和存储类。您可以在单个模型中使用这两种方法。

此示例侧重于这些类型的数据对象:

  • 信号

  • 参数

  • 公共汽车

代码生成器使用MATLAB基础工作空间或Simulink数据字典中的对象。金宝app您可以在命令提示符或模型数据编辑器或模型资源管理器中使用命令创建和检查对象。

例如,检查的定义金宝app仿真软件。信号对象pos_cmd_one,模型在基本工作空间中创建:

  1. 打开嵌入式编码器应用程序。

  2. 造型选项卡上,单击模型数据编辑器

  3. 在模型数据编辑器中,检查信号标签。

  4. 点击显示/刷新其他信息按钮。

  5. 设定改变观点下拉列表,代码

  6. 旁边的内容过滤框,切换过滤器使用选择按钮。

  7. 在模型中,选择pos_cmd_one线信号。现在,数据表包含两行:一行对应于模型中的信号线,另一行对应于基本工作空间中的信号对象。对应于信号线的行解决选中复选框,这意味着信号线从信号对象获取设置。

  8. 可选地,要检查信号对象的其他属性,请调整设置的设置改变观点下拉列表。

在模型数据编辑器中,切换使用选择按钮过滤.现在,数据表显示了这些信号线和信号对象:

  • pos_cmd_one:顶级输出,双倍,导出全球

  • POS_RQST.:顶级输入,Double,导入的Extern指针

  • P_InErrMap:校准参数,自动,常数

  • ThrotComm:顶层输出结构,Auto, Exported Global

ThrotComm是一个总线信号,这是一个实例化金宝app仿真软件。公共汽车对象ThrottleCommands.如果总线信号是非尺寸的,则信号显示为C代码中的结构。总线对象不会出现在模型数据编辑器中。但是,您可以检查模型资源管理器中的对象(查看>模型资源管理器).

如在C中,您可以使用总线定义(ThrottleCommands)来创建该结构的多个实例。在模型图中,总线信号显示为一条中间有破折号的宽线。

数据对象具有配置模拟和代码生成的属性,包括:

  • 数据类型(在生成的代码中存储的数字数据类型)

  • StorageClass(用于代码生成的存储类)

  • 价值(参数值)

  • InitialValue(信号的初始值)

  • 别名(代码生成器使用的数据的替代名称)

  • (参数或信号值尺寸及数量)

  • 复杂性(数字复杂性)

  • 单位(物理单位,如cm)

  • 最小值(最小值)

  • 马克斯(最大值)

使用属性描述为数据对象指定自定义文档。

添加新的数据对象

您可以为命名信号,状态和参数创建数据对象。要将数据对象与构造相关联,构造必须具有名称。

数据对象向导工具可以查找可以为其创建数据对象的构造,然后为您创建对象。示例模型包括两个不与数据对象关联的信号:FBK_1pos_cmd_two

找到信号并为它们创建数据对象:

1.打开“数据对象向导”。

dataobjectwizard ('RTWDEMO_PCG_EVAL_P2'

2.点击找到寻找候选结构。

3.点击选择所有选择所有候选人。

4.点击创建以创建数据对象。

数据对象向导执行相当于以下命令的操作:

fbk_1 = 金宝appsimulink.signal;fbk_1.dimensions = 1;fbk_1.datatype =.“双”;出口= get_param('RTWDEMO_PCG_EVAL_P2 / FBK_1''porthandles');外港= outport.Outport;set_param(外港,'mustresolvetosignalobject'“上”)pos_cmd_two = s金宝appimulink.signal;pos_cmd_two.dimensions = 1;pos_cmd_two.datatype =.“双”;出口= get_param(“rtwdemo_PCG_Eval_P2 / PI_ctrl_2”'porthandles');外港= outport.Outport;set_param(外港,'mustresolvetosignalobject'“上”

配置数据对象

为每个数据对象设置数据类型和存储类。要配置数据对象属性,请检查模型数据编辑器中的适当选项卡。使用改变观点下拉列表显示设计属性(如数据类型)和代码生成设置(如存储类)。

在模型数据编辑器中,检查信号标签并单击显示/刷新其他信息按钮以显示数据对象向导创建的信号对象的信息。然后,为对象配置这些属性:

  • FBK_1:数据类型双倍的,存储类进口交换机

  • pos_cmd_two:数据类型双倍的,存储类ExportedGlobal.

或者,您可以在命令提示符下使用这些命令来配置对象:

fbk_1.datatype =.“双”;fbk_1。StorageClass =“ImportedExtern”;pos_cmd_two.datatype =.“双”;pos_cmd_two.storageClass =.'ExportedGlobal'

控制文件数据的文件放置

使用嵌入式码码®,您可以控制参数和常量定义的文件放置。示例模型将参数定义写入文件eval_data.c

要更改参数和常量定义的位置,请为模型配置设置数据位置选项。在“配置参数”对话框中配置代码生成>代码放置窗格。

在示例模型中,检查代码的位置窗格中的。模型将数据定义放在文件中eval_data.c和文件中的声明eval_data.h

声明块参数可调或内联

您可以通过设置模型配置参数来控制生成代码中块参数的默认可调性默认参数行为

对于示例模型,默认参数行为被设置为.默认情况下,块参数在代码中显示为数字文字值,而不是存储在内存中的变量。您可以使用金宝app仿真软件。参数对象以覆盖内联并保留单个参数的可调性。

在生成代码中启用信号数据对象

确保信号数据对象(金宝app仿真软件。信号)出现在生成的代码中。对于模型中的各个信号线,请选择选项信号名称必须解析为Simulink信号对象金宝app将信号名称显式解析为金宝app仿真软件。信号对象在工作区或数据字典中。在模型数据编辑器中,设置改变观点代码并选择复选框解决柱子。

或者,您可以为一个模型中的所有信号选择该选项。在命令提示符处,使用disableimplicitsignalresolution函数。

查看生成的代码中的数据对象

从示例模型生成代码

RTWBuild('RTWDEMO_PCG_EVAL_P2');
###成功完成模型的代码生成:rtwdemo_PCG_Eval_P2

创建一个代码生成报告,以便更容易地查看生成的文件。在Simuli金宝appnk Editor中,选择模型配置参数开放模式报告

你可以访问这些生成的文件:

  • RTWDEMO_PCG_EVAL_P2.c:定义步骤和初始化函数。使用已定义的数据对象。

  • eval_data.c:给定义的参数赋初始值。模型配置专门设置文件名。

  • eval_data.h:提供走读生参数数据的声明。模型配置专门设置文件名。

  • ert_main.c:定义调度函数。

  • RTWDEMO_PCG_EVAL_P2.H.:包含存储信号、状态和参数数据的默认结构的类型定义。由于数据对象设置,一些数据出现在eval_data.c代替。

  • PCG_Eval_p2_private.h:声明生成函数的私有(本地)数据。

  • RTWDEMO_PCG_EVAL_P2_TYPES.H.:声明实时模型数据结构。

  • rtwtypes.h:提供到Simulink®Coder™定义的数据类型的映射(金宝apptypedef.).用于与外部系统集成。

例如,查看文件eval_data.c,分配const对应于此的全局变量的内存金宝app仿真软件。参数基础工作区中的对象。

用= fullfile ('rtwdemo_pcg_eval_p2_ert_rtw'“eval_data.c”);rtwdemodbtype(用'/*导出数据定义*/''* [eof]', 1, 1)
/ *导出数据定义* / / * const内存部分* / / *自定义存储类的定义:const * / const real_t i_gain = -0.03;const real_t i_inerrmap [9] = {-1.0,-0.5,-0.25,-0.05,0.0,0.05,0.25,0.5,1.0};const real_t i_outmap [9] = {1.0,0.75,0.6,0.0,0.0,0.0,0.6,0.75,1.0};const real_t p_gain = 0.74;const real_t p_inerrmap [7] = {-1.0,-0.25,-0.01,0.0,0.01,0.25,1.0};const real_t p_outmap [7] = {1.0,0.25,0.0,0.0,0.0,0.25,1.0};/ * *生成代码的文件预告片。* * [eof]

查看模型中的代码算法文件中的函数RTWDEMO_PCG_EVAL_P2.c.算法直接使用数据对象名称。

用= fullfile ('rtwdemo_pcg_eval_p2_ert_rtw'“rtwdemo_PCG_Eval_P2.c”);rtwdemodbtype(用'/* Model step函数*/'...'/ *总和:'' / sum3''包含:'1 0);
/ *模型步骤功能* / voidTTWDEMO_PCG_EVAL_P2_STEP(void){REAL_T RTB_INTEGRALGAINSHAPE;real_t sclotete_time_tim_integrator1;real_t sclotete_time_itegrator1_i;/ *总和:' / sum2'包含:* inport:' / fbk_1'* inport:' / pos_rqst'* / rtb_integrainshape = * pos_rqst  -  fbk_1;/ *独立凝集器:' / scolete_time_integrator1'包含:*增益:' / int gain1'* lookup_n-d:' /积分增益形状'*产品:' / product3'* /if(rtwdemo_pcg_eval_p2_dwork.discrete_time_integrator1_syste!= 0){discrete_time_integrator1 = rtwdemo_pcg_eval_p2_dwork.discrete_time_integrator1_dstat;} else {collette_time_integrator1 = i_gain * look1_binlx(rtb_integrainshape,(&(i_inerrmap [0])),(&(i_outmap [0])),8u)* rtb_integrainshape * 0.001 + rtwdemo_pcg_eval_p2_dwork.discrete_time_integrator1_dstat;} / *离散仪器结束:' / sclotete_time_integrator1'* /

如果没有存储类和其他代码生成设置,则数据对象指定,生成的代码:

  • 当您在模型配置参数中选择这些优化时,内联不变信号和块参数

  • 在全局数据结构中放置模型输入和输出信号、块状态和可调参数

  • 不会创建与Matlab®变量对应的全局变量

相比之下,示例代码显示大多数默认数据结构已被用户定义的数据对象替换。例如,这些信号和参数在代码中以全局变量的形式出现:

  • POS_RQST.

  • FBK_1

  • I_Gain

  • I_OutMap

  • I_InErrMap

但是,局部变量rtb_IntegralGainShape和状态变量RTWDEMO_PCG_EVAL_P2_DWORK.DISCRETE_TIME_INTEGRATOR1_DSTAT.仍然使用代码生成器数据结构。这些实体不存在数据对象。

在数据字典中存储模型数据

当您结束MATLAB会话时,您在基础工作区中创建的变量不会持续。要永久存储数据对象和总线对象,请考虑将模型链接到数据字典。

  1. 在示例模型中造型选项卡,在设计, 点击链接到数据字典

  2. 在模型属性对话框中,单击

  3. 在“创建新数据字典”对话框中,设置文档名称RTWDEMO_PCG_EVAL_DICT.然后点击保存

  4. 在模型属性对话框中,单击应用

  5. 点击迁移数据

  6. 点击迁移响应关于复制引用变量的消息。

  7. 点击好吧

或者,要手动将对象迁移到数据字典中,可以使用Programmatic命令:

%创建目标变量和对象的列表%模型用途。二手Vars = {si金宝appmulink.findvars('RTWDEMO_PCG_EVAL_P2')。姓名};%在当前文件夹中创建新的数据字典。将模型链接到这本新字典。dictobj = 金宝appsimulink.data.dictionary.Create('rtwdemo_pcg_eval_dict.sldd');set_param('RTWDEMO_PCG_EVAL_P2'“DataDictionary”'rtwdemo_pcg_eval_dict.sldd'%仅从基本工作区导入目标变量到数据%字典。importFromBaseWorkspace (dictObj“clearWorkspaceVars”,真的,'Varlist', usedVars);

数据字典永久存储模型使用的对象。要查看字典的内容,请单击模型左下角的模型数据标识,然后单击数据字典链接。在模型浏览器中模型层次结构窗格中,选择设计数据节点。

来自模型的数据分离提供了以下优点:

一个模型,多个数据集

  • 使用不同的数据类型来更改目标硬件(例如,用于浮点和定点目标)

  • 使用不同的参数值来改变控制算法的行为(例如,对于具有不同校准值的可重用组件)

多个模型,一个数据集

  • 系统中Simulink®模型之间的数据共享金宝app

  • 项目之间的数据共享(例如,传输、引擎和车轮控制器可能都使用相同的CAN消息数据集)

相关的话题