此示例显示如何根据接口控制文档(ICD)中的规范配置模型的代码生成设置。此示例还显示如何在数据字典中存储共享Simulink变量和数据对象。金宝app
ICD是软件组件之间的数据接口。为了交换和共享数据,组件根据ICD声明和定义全局变量来存储信号和参数值。ICD为变量命名,并列出数据类型、物理单位和参数值等特征。当您在Simulink中创建组件模型时,您可以配置模型,使生成的代码符合金宝appICD。例如,您可以在交互配置模型时使用ICD作为参考源,或者您可以通过使用脚本从ICD导入数据来自动化配置。
在Microsoft®Excel®或其他兼容程序中,打开ex_ICD_PCG.xlsx
并复习工作表的内容。
开放ex_ICD_PCG.xlsx
信号
工作表。每一行代表一个跨越接口边界的信号。检查工作表中的单元格值。的物主
列标识为信号分配内存的组件的名称。的数据类型
列名称内存中的信号数据类型。例如,工作表使用表达式总线:传感器
命名结构类型的步骤EngSensors
.
参数
工作表。的价值
列列出每个参数的值。如果参数的值为非标度,则该值存储在其单独的工作表中,该工作表与参数同名。
数值类型
工作表。每一行表示一个命名的数字数据类型。在此ICD中,数据使用定点数据类型(定点设计器)IsAlias
列指示C代码是否使用数据类型的名称(例如,s16En3
)或使用与单词长度相对应的基本整数数据类型的名称(例如短
).这个数据镜
列指示生成的代码是导出还是导入数据类型定义。
结构类型
工作表。每行表示一种结构类型或结构类型的字段数据类型
列是结构体
。不使用的后续行结构体
表示前面结构类型的字段。此ICD定义结构类型,EngSensors
,共有四个字段:节气门
,速度
,自我
和地图
.
枚举类型
工作表。类似于结构类型
工作表中,每行表示一个枚举类型或枚举成员。此ICD定义枚举类型sldemo_FuelModes
.
ICD中的某些数据项属于other_component
,这是一个存在于MATLAB之外的组件。打开并浏览这些示例文件的内容,这些文件定义并声明外部数据:
编辑ex_inter_types.h编辑ex_inter_sigs.c编辑ex_inter_sigs.h
在本例中,您将从控制器模型生成代码rtwdemo_fuelsys_dd_controller
.打开您的副本模式
l
开放式系统(“rtwdemo\u fuelsys\u dd\u控制器”)
控制器模型中的一些信号有名称,例如,输入信号传感器
.模型中的某些块参数参考金宝app仿真软件。参数
对象在数据字典中。例如,在空气流量计算
子系统,泵恒
块使用参数对象PumpCon
,快车
和PressVect
. 这些参数对象设置相应块参数的值。可以将代码生成设置应用于信号和参数对象。
控制器模型链接到数据字典rtw演示燃料系统控制器.sldd
.探索数据字典。
在控制器模型的左下角,单击模型数据面板。
点击外部数据链接
在模型浏览器中模型层次结构窗格中,展开节点rtwdemo_fuelsys_dd_controller,外部数据和rtwdemo_fuelsys_dd_controller.
选择设计数据.
字典存储:
参数对象
金宝appSimulink.NumericType
对象,如u8En7
金宝app仿真软件。公共汽车
对象EngSensors
打开ICD电子表格(如果尚未打开)。
在控制器模型的金宝appSimulink Editor窗口中,导航到模型的根级别。
上建模选项卡上,单击模型数据编辑器.
在模型数据编辑器中,单击变化范围按钮。模型数据编辑器显示了关于模型子系统中的数据项的信息。
点击显示/刷新的额外信息按钮。模型数据编辑器显示有关数据对象的信息(金宝app仿真软件。参数
对象)。
在ICD中,单击信号选项卡。
在模型数据编辑器中,单击港口/外港选项卡。
确保导入块的配置设置传感器
符合ICD规格。数据类型必须设置为Bus: ENGS传感器
.
确保Outport块的配置设置fuel_rate
符合ICD规格。数据类型必须设置为s16En7。
分钟必须设置为0.8000。
马克斯必须设置为1.7000。
单元必须设置为g / s
.
确保信号的配置设置fuel_mode
符合ICD规格。因为fuel_mode
是状态流图的输出信号,则必须使用Model Explorer配置设计设置。在模型中,导航到状态流图。模型浏览器打开。在模型浏览器中内容窗格(中间窗格),选择fuel_mode
.数据类型必须设置为枚举:sld_燃料模式
.
在ICD中,单击参数选项卡。
导航到控件模型的根级别。
在模型数据编辑器中,单击参数选项卡。
使用过滤内容框来搜索参数压力
.模型数据编辑器显示了两行:一行对应于参数对象压力
以及一行,该行对应于使用压力
.
确保参数的配置设置压力
符合ICD规格。数据类型必须是u8En7。
价值必须是一个19x45的数值矩阵。
确保数据类型和价值设置参数PumpCon
,速度
,抽搐
和拉普拉特基兹
符合ICD规格。
在ICD中,单击数值类型选项卡。
如果模型资源管理器未打开,请打开它。
在模型层次结构窗格中,导航到控制器模型的数据字典中的设计数据(rtwdemo_fuelsys_dd_controller>外部数据>rtwdemo_fuelsys_dd_controller>设计数据).
在内容(中)窗格中,选择金宝appSimulink.NumericType
对象u8En7
.该对象表示类型定义
声明ex_inter_types.h
.
在右边的窗格中设计选项卡,确认设置为数据类型模式与ICD规格一致。
确保数字类型的设计配置s16En3
,s16En7
和s16En15
符合ICD规格。
在ICD中,单击结构类型选项卡。
在模型浏览器中内容窗格中,选择EngSensors
.这金宝app仿真软件。公共汽车
对象表示中定义的结构类型ex_inter_types.h
.
确认数据类型配置与ICD规范一致。在右边的窗格中设计选项卡,或在总线编辑器中,调整总线信号配置(例如分钟和马克斯)以符合ICD规格。
在ICD中,单击枚举类型选项卡。
打开文件sld_FuelModes.m
,它定义枚举类型的类sld_FuelModes
.
确认类定义与ICD规范一致。在sld_FuelModes文件中。m,调整成员名称和基础整数值以与ICD规范一致。
打开ICD电子表格(如果尚未打开)。
打开嵌入式编码器应用程序。
在ICD中,单击信号标签。ICD中的所有者列表示不同的组件(other_componnent
),不是rtwdemo_fuelsys_dd_controller
的代码定义传感器
变量
包括定义变量的C源代码文件传感器
. 在Simuli金宝appnk编辑器的“C代码”选项卡上,选择设置>C/ c++代码生成设置。请确保代码生成自定义代码参数源文件设置为ex_inter_sigs.c
.
在Simuli金宝appnk编辑器中,在C代码选项卡上,选择代码接口>单个元素代码映射.
在代码映射编辑器中,单击入口选项卡。
选择用于传感器
。因为源代码定义是在外部文件中提供的ex_inter_sigs.c
,您在步骤2中配置的,存储类必须设置为导入文件
.
点击图标。检查头饰属性设置与ICD规范匹配,ex_inter_sigs.h
.的值,请确保已指定标识符财产。此属性指定生成代码中的数据元素的变量名。
在代码映射编辑器中,单击前哨选项卡。
选择用于fuel_rate
.因为ICD指定rtwdemo_fuelsys_dd_controller
作为fuel_rate
,存储类必须设置为出口文件
.
点击图标。确保属性的设置头文件,定义文件和物主符合ICD规范global_data.h
,信号
和rtwdemo_fuelsys_dd_controller
,分别进行。请确保为标识符财产。
在代码映射编辑器中,单击信号/州表4.1中列出的第三个信号信号选项卡为fuel_mode
.
添加fuel_mode
信号到模型代码映射。在模型图中,选择信号fuel_mode
。将光标放在信号线上方或下方出现的省略号上,以打开操作栏。单击将所选信号添加到代码映射按钮。在代码映射编辑器中信号Node展开并列出您添加的信号。存储类设置必须表明信号解析为信号对象,并且对象的存储类设置为出口文件
.因为信号与信号对象相关联,所以必须使用Model Explorer来确认代码生成配置与ICD规范一致。
打开Model Explorer。在模型层次结构窗格中,导航到控制器模型的数据字典中的设计数据(rtwdemo_fuelsys_dd_controller>外部数据>rtwdemo_fuelsys_dd_controller>设计数据).在内容窗格中,选择fuel_mode
.
在右侧窗格中,单击代码生成选项卡。存储类必须设置为出口文件
.确认属性头饰,DefintionFile和物主符合ICD规范global_data.h
,信号
和rtwdemo_fuelsys_dd_controller
,分别。
在ICD中,单击参数选项卡。
在代码映射编辑器中,单击参数选项卡。
使用过滤内容框来搜索参数压力
.代码映射编辑器显示与参数对象对应的行压力
.因为ICD指定rtwdemo_fuelsys_dd_controller
作为压力
,存储类应设置为出口文件
.
点击偶像检查属性的设置是否正确头文件,定义文件和物主符合ICD规范global_data.h
,参数s、 c
和rtwdemo_fuelsys_dd_controller
分别地此外,请确保为指定了一个值标识符财产。
检查存储类,头饰,定义文件,标识符和物主设置参数PumpCon
,速度
,抽搐
和拉普拉特基兹
.
在ICD中,单击数值类型选项卡。
如果模型资源管理器未打开,请打开它。
在模型层次结构窗格中,导航到控制器模型的数据字典中的设计数据(rtwdemo_fuelsys_dd_controller>外部数据>rtwdemo_fuelsys_dd_controller>设计数据).
在内容窗格中,选择金宝appSimulink.NumericType
对象u8En7
.该对象表示类型定义
声明ex_inter_types.h
.
在右侧窗格中,单击代码生成选项卡。确认设置数据范围和头文件与ICD规格一致,进口
和ex_inter_types.h
,分别。
检查并调整数字类型的代码生成配置s16En3
,s16En7
和s16En15
.
在ICD中,单击结构类型选项卡。
在模型浏览器中内容窗格中,选择EngSensors
.这金宝app仿真软件。公共汽车
对象表示中定义的结构类型ex_inter_types.h
.
在右侧窗格中,单击代码生成选项卡。确认设置数据范围和头文件与ICD规格一致,进口
和ex_inter_types.h
,分别。
1.为控制器模型生成代码。
slbuild(“rtwdemo\u fuelsys\u dd\u控制器”)
###第二,第三,第三,第三,第四,第二,第三,第三,第三,第三,第四,第四,第四,第四,第,第四,第,第,第,第,第,第,第四,第,第四,第四,第四,第四,第四,第四,第四,第四,第二,第四,第二,第,第四,第四,控制器,控制器,建立,建立,建立,总结,总结,重点,模型,重点,模型,重点,模型,重点,模型,模型,模型,重点,模型,模型,目标,模型,模型,模型,目标,模型,模型,模型,模型,模型,模型,模型,模型,模型,模型,模型,行动,模型,模型,模型,行动,模型,模型,模型,行动,模型,模型,模型,模型,行动,模型,行动,模型,模型,模型,行动,行动,重建,模型,模型,模型,模型,模型,模型,模型,模型,行动,模型,控制er代码生成和编译的代码生成信息文件不存在。已生成1个模型中的1个(0个模型已更新)生成持续时间:0h 3m 1.371s
2.检查生成的代码。生成的头文件是rtwdemo_fuelsys_dd_controller_types.h:
包括(# include
)外部头文件ex_inter_types.h
,它定义数值数据类型u8En7,s16En3
和s16En7
以及结构类型EngSensors
定义枚举sld_FuelModes
文件= fullfile (“rtwdemo\u fuelsys\u dd\u控制器\u ert\u rtw”,...“rtwdemo\u fuelsys\u dd\u controller\u types.h”);rtwdemodbtype(文件,“# include“ex_inter_types.h””,“}sld_FuelModes;”, 1, 1)
#包括“ex_inter_types.h”/*模型代码变体*/#为sld_FuelModes定义的ifndef_TYPEDEF_#为sld_FuelModes定义的_TYPEDEF_(类型定义)枚举{LOW=1,/*默认值*/RICH,DISABLED}sld_FuelModes;
档案rtwdemo_fuelsys_dd_controller_private.h
包含头文件ex_inter_sigs.h
. 此外部头文件包含走读生
信号声明传感器
,由不同的软件组件拥有。
数据头文件global_data.h
声明ICD指定的导出参数和信号。要共享此数据,其他组件可以包含此头文件。
文件= fullfile (“rtwdemo\u fuelsys\u dd\u控制器\u ert\u rtw”,“global_data.h”);rtwdemodbtype(文件,“/*导出的数据声明*/”,...“燃油率”, 1, 1)
/*导出数据声明*/ /*自定义存储类声明:ExportToFile */ extern real32_T PressEst[855];/* reference by: '/Pressure Estimation' */ extern real32_T PumpCon[551];/*引用by: ' /Pumping Constant' */ extern real32_T RampRateKiz[25];/*引用by: ' /Ramp Rate Ki' */ extern real32_T SpeedEst[1305];/* reference by: ' /Speed Estimation' */ extern real32_T ThrotEst[551];/* reference by: ' /Throttle Estimation' */ extern sld_FuelModes fuel_mode;/* ' /control_logic' */ extern real32_T fuel_rate;/ * < Root > / fuel_rate * /
算法代码在模型中一步
函数在文件RTWdemo_fuelsys_dd_controller.c
.算法使用ICD识别的全局数据。例如,算法使用信号的值fuel_mode
在一个转换
块来控制执行流。
文件= fullfile (“rtwdemo\u fuelsys\u dd\u控制器\u ert\u rtw”,...“rtwdemo_fuelsys_dd_controller.c”);rtwdemodbtype(文件,'/*多端口开关的结尾:“”/多端口开关'*/' ,...'/*输出端口:'/fuel\u rate''包含:' ,0,0)
/* SwitchCase: '/Switch Case' */ Switch (fuel_mode) {Case LOW: /* Outputs for iffaction SubSystem: ' /low_mode' inclusions: * ActionPort: ' /Action Port' */ /* DiscreteFilter: ' /Discrete Filter' inclusions: * DiscreteIntegrator: ' /Discrete Integrator' */ denAccum = rtDWork。* rtdwork . distefilter_stat_g;
bdclose (“rtwdemo\u fuelsys\u dd\u控制器”)S金宝appimulink.data.dictionary.closeAll(“rtwdemo_fuelsys_dd_controller.sldd”,“-丢弃”)
您可以使用MATLAB脚本将数据设置从ICD导入到Simulink基础工作空间中的变量中。金宝app
1.打开并检查示例脚本ex_importICD_PCG.m
.
编辑ex_importICD_PCG
这个脚本:
将ICD的每个工作表中的数据导入基本工作区中的变量。
使用导入的数据配置的设计和代码生成属性金宝app模拟信号
和金宝app仿真软件。参数
基本工作空间中的对象。
如果基本工作区已包含与ICD中的数据元素相对应的数据对象,则脚本将配置现有对象的属性。如果该对象不存在,则脚本将创建该对象。
2.加载模型并运行脚本。
load_system (“rtwdemo\u fuelsys\u dd\u控制器”)跑(“ex_importICD_PCG”)
3.重新生成并检查代码。
slbuild(“rtwdemo\u fuelsys\u dd\u控制器”)
###正在启动:rtwdemo\u fuelsys\u dd\u控制器的生成过程成功完成:rtwdemo\u fuelsys\u dd\u控制器生成摘要生成的顶级模型目标:模型操作生成原因======================================================================================================================================================================================================================编译生成的代码已过期。已生成1个模型中的1个(0个模型已更新)生成持续时间:0h 1m 36.732s
对ICD进行更改时,可以重用导入脚本来重新配置模型。
如果使用脚本将数据从ICD导入到基本工作区,请考虑将数据对象和变量迁移到数据字典。数据字典永久存储并跟踪对数据对象和变量的更改。例如,可以导入枚举类型的定义。sld_FuelModes
进入控制器模型字典。请参阅导入和导出字典数据和数据字典中的枚举.
可以存储信号和状态数据元素的配置设置,例如数据类型、最小值和最大值以及模型文件内部或外部的物理单位。金宝app模拟信号
对象将配置设置存储在模型文件的外部。或者,您可以通过使用块和端口参数在模型文件中存储配置设置,您可以通过模型数据编辑器、属性检查器和其他对话框访问这些参数。看到存储信号和状态的设计属性.