根据接口控制文档交互配置生成的代码
这个例子展示了如何根据接口控制文档(ICD)中的规范为模型配置代码生成设置。存储必要的Simulink变量和金宝app对象,例如金宝app仿真软件。参数
对象,在数据字典中。
ICD描述两个软件组件之间的数据接口。为了交换和共享数据,组件声明和定义存储信号和参数值的全局变量。ICD为变量命名并列出诸如数据类型、物理单元和参数值等特征。当您在Simulink中创建组件的模型时,您可以配置生成的代码以符合接口规范。金宝app
在本例中,ICD是Microsoft®Excel®工作簿。
浏览界面控制文档
导航到文件夹matlabroot/ /例子是
(开放).将此文件复制到可写的工作文件夹:
ex_ICD_PCG_inter.xls
在Microsoft®Excel®或其他兼容程序中,打开ex_ICD_PCG_inter.xls
并查看第一个工作表,信号
.工作表的每一行描述一个跨越接口边界的信号。
检查工作表中的单元格值。的老板
列表示为每个信号分配内存的组件的名称。的数据类型
列表示内存中的信号数据类型。例如,工作表使用表达式总线:EngSensors
以指示命名的结构类型EngSensors
.
在参数
工作表,价值
列表示每个参数的值。如果参数的值是非标量的,则该值存储在与参数同名的单独工作表中。
在数值类型
工作表中,每一行表示一个已命名的数字数据类型。在这个ICD中,数据使用定点数据类型(定点设计器)。的IsAlias
列指示C代码是否使用数据类型的名称(例如,s16En3
)或使用与字长度对应的原语整数数据类型的名称(例如短
).的DataScope
列指示生成的代码是导出还是导入类型的定义。
在结构类型
工作表中,每一行表示一个结构类型或结构类型的字段。中的值对于结构类型数据类型
列是结构体
.不使用的后续行结构体
表示前面结构类型的字段。这个ICD定义了一个结构类型,EngSensors
,共有四个字段:节气门
,速度
,自我
,地图
.
在枚举类型
工作表,类似结构类型
工作表中,每一行表示枚举类型或枚举成员。这个ICD定义了一个枚举类型sldemo_FuelModes
.
编写外部代码
ICD中的一些数据项属于other_component
,这是一个存在于MATLAB之外的组件。创建定义和声明此外部数据的代码文件。
创建头文件ex_inter_types.h
在您的当前文件夹中。这个文件定义了结构类型EngSensors
和数字数据类型,例如u8En7
.
#定义INTER_TYPES_H__类型定义short s16En3;typedef short s16En7;typedef unsigned char u8En7typedef short s16En15;/*仪器测量的结构类型。*/ typedef struct{/*油门角度。*/ s16En3油门;/*发动机转速。*/ s16En3速度;/* EGO传感器。 */ s16En7 ego; /* Manifold pressure. */ u8En7 map; } EngSensors; #endif
创建源文件ex_inter_sigs.c
在您的当前文件夹中。这个文件定义了导入的信号传感器
.
#include "ex_inter_sig .h" EngSensors传感器;/*仪器测量。* /
创建头文件ex_inter_sigs.h
在您的当前文件夹中。
#include "ex_inter_types.h" extern EngSensors传感器;/*仪器测量。* /
探索范例模型
运行脚本prepare_sldemo_fuelsys_dd_inter
.对于本例,脚本准备了一个系统模型,sldemo_fuelsys_dd
.
运行(fullfile (matlabroot“例子”,“是”,“主要”,“prepare_sldemo_fuelsys_dd_inter”))
打开系统模型sldemo_fuelsys_dd
.
sldemo_fuelsys_dd
该系统模型引用了控制器模型。在本例中,您将从控制器模型生成代码。
打开控制器模型sldemo_fuelsys_dd_controller
.
sldemo_fuelsys_dd_controller
控制器模型中的一些信号有名称,例如,输入信号传感器
.模型中的一些块参数参考金宝app仿真软件。参数
数据字典中的对象。例如,在airflow_calc
子系统,泵恒
块使用参数对象PumpCon
,SpeedVect
,PressVect
.这些参数对象设置相应块参数的值。可以对信号和参数对象应用代码生成设置。
控制器模型链接到一个数据字典,sldemo_fuelsys_dd_controller.sldd
.在模型的左下角,单击模型数据徽章,然后单击数据字典链接。在模型浏览器中模型层次结构窗格中,选择设计数据节点。
字典已经存储:
参数对象
金宝app仿真软件。NumericType
对象如u8En7
一个
金宝app仿真软件。公共汽车
对象,EngSensors
枚举数据类型的定义,
sldemo_FuelModes
根据ICD配置型号
导航到控制器模型的根级别,然后在建模选项卡上,单击模型数据编辑器.
在模型数据编辑器中,激活变化范围按钮。模型数据编辑器现在显示子系统中有关数据项的信息。
单击显示/刷新附加信息按钮。模型数据编辑器现在显示关于数据对象的信息金宝app仿真软件。参数
数据字典中的对象)。
选择港口/外港选项卡(默认选择)。
在模型中,选择标记的import块传感器
.模型数据编辑器突出显示相应的行。
在ICD中选择信号选项卡。
使用模型数据编辑器根据ICD中的信息配置信号:
中的值数据类型列
总线:EngSensors
.在本例中,该值已经设置。设置改变观点下拉列表
代码
和,传感器
,设置存储类来ImportFromFile
.使用这个存储类是因为老板列表示不同的组件,而不是sldemo_fuelsys_dd_controller
类的c代码定义传感器
变量。使用这个存储类,生成的代码不定义变量。集头文件来
ex_inter_sigs.h
.当您使用表示导入数据的存储类时,例如ImportFromFile
,您不能指定定义文件在模型数据编辑器中。相反,应该包括定义文件(在本例中,ex_inter_sigs.c
)在代码生成和构建过程中使用模型配置参数源文件.
在模型中,选择标记的Outport块fuel_rate
.
使用模型数据编辑器进行配置fuel_rate
根据ICD。以访问设计属性,例如最小值(最小值)和物理单位(单位),设置改变观点来设计
.用于代码生成设置,因为ICD指定sldemo_fuelsys_dd_controller
作为其他信号的所有者,设置存储类来ExportToFile
.
检查信号选项卡。
集改变观点来代码
并为信号配置代码生成设置fuel_mode
.
不能使用模型数据编辑器来配置的设计属性fuel_mode
(如数据类型)因为fuel_mode
是状态流图的输出。在模型中,导航到图表中。
在建模选项卡上,单击模型浏览器.
在模型浏览器中内容窗格(中间窗格),选择fuel_mode
数据项。
在对话框窗格(右窗格)中,进行配置fuel_mode
根据ICD。在本例中,信号数据类型已经设置,因此您只能指定描述。
导航到模型的根级别。
在ICD和模型数据编辑器中,选择参数选项卡。在模型数据编辑器中,设置改变观点来设计
.
在模型数据编辑器中,使用内容过滤框中搜索第一个参数,总统
.Model Data Editor显示了两行:一行对应于参数对象总统
和一行对应于使用的块参数总统
.
使用模型数据编辑器进行配置总统
根据ICD。参数值价值列)已设置。因为ICD规定了sldemo_fuelsys_dd_controller
作为总统
,设置存储类来ExportToFile
.
使用模型数据编辑器来配置其他参数。如果要一次对多个参数应用更改,可以选择数据表中的多个行。
在模型的左下角,单击模型数据徽章,然后单击数据字典链接以在模型资源管理器中打开数据字典。
在模型层次结构窗格中,选择设计数据节点。
在内容窗格(中间窗格),选择金宝app仿真软件。NumericType
对象u8En7
.该对象表示原语之一类型定义
语句ex_inter_types.h
.
在ICD中选择数值类型选项卡。
使用Model Explorer对话框窗格(右窗格)根据ICD配置对象。
使用Model Explorer配置另一个金宝app仿真软件。NumericType
对象。您可以使用内容窗格执行批处理操作。
在内容窗格中,单击金宝app仿真软件。公共汽车
对象EngSensors
.该对象表示的结构类型ex_inter_types.h
定义了。
在对话框窗格(右窗格)中,单击启动巴士编辑器.
在ICD中选择结构类型选项卡。
使用总线编辑器来配置总线对象和总线中的信号元素(例如节气门
)。
在ICD中选择枚举类型选项卡。
在模型浏览器中内容窗格中,单击枚举类型定义sldemo_FuelModes
.
使用“对话框”窗格根据ICD配置类型。集存储类型来本机整数
而且数据范围来出口
.
生成和检查代码
通过清除模型配置参数,配置控制器模型将生成的代码编译为可执行程序只生成代码.
从控制器模型生成代码。
已成功完成模型:sldemo_fuelsys_dd_controller的构建过程
生成的头文件sldemo_FuelModes.h
定义枚举。sldemo_FuelModes
.
typedef enum {LOW = 1, /*默认值*/ RICH, DISABLED}
该文件sldemo_fuelsys_dd_controller_types.h
包括(# include
)外部头文件ex_inter_types.h
,它定义了数据类型,例如u8En7
以及结构类型EngSensors
.
# include“ex_inter_types.h”
该文件sldemo_fuelsys_dd_controller_private.h
包括头文件ex_inter_sigs.h
.该外部头文件包含走读生
信号的声明传感器
这是一个不同的软件组件拥有的。
数据头文件global_data.h
声明ICD指定的导出参数和信号。为了共享此数据,其他组件可以包含此头文件。
/*导出数据声明*/ /*自定义存储类声明:ExportToFile */ extern u8En7 pres最[855];'/压力估计' */ extern s16En15 PumpCon[551];/*引用:' /抽水常数' */ extern s16En15 RampRateKiZ[25];/*引用:' /Ramp Rate Ki' */ extern s16En3 SpeedEst[1305];/*引用:' /速度估计' */ extern s16En7 ThrotEst[551];/*引用:' /Throttle estimate ' */ extern sldemo_FuelModes fuel_mode;/* ' /control_logic' */ extern s16En7 fuel_rate;/* '<根>/fuel_rate' */
数据定义(内存分配)出现在ICD指定的源文件中:params.c
而且signals.c
.例如,params.c
定义并初始化参数RampRateKiZ
.
s16En15 RampRateKiZ[25] = {393, 786, 1180, 1573, 1966, 786, 1573, 2359, 3146, 3932, 1180, 2359, 3539, 4719, 5898, 1573, 3146, 4719, 6291, 7864, 1966, 3932, 5898, 9830};/*引用:'/Ramp Rate Ki' */
算法在模型中一步
文件中的函数sldemo_fuelsys_dd_controller.c
.该算法使用ICD识别的全局数据。例如,算法使用信号的值fuel_mode
在一个开关
块来控制执行流。
/* SwitchCase: '/Switch Case' */ Switch (fuel_mode) {Case LOW: /* Outputs for IfAction子系统:' /low_mode'合并:* ActionPort: ' /Action Port' */ /* Discrete tefilter: ' /Discrete Filter'合并:* Discrete teintegrator: ' /Discrete Integrator' */ Discrete tefilter_tmp = (int16_T)(int32_T)((int32_T)((int32_T) rtDWork. 'discrete teintegrator_dstate << 14) - (int32_T)(-12137 * (int32_T) rtdwork . discrete tefilter_states_g)) >> 14);