主要内容

根据接口控制文档交互式配置生成的代码

这个示例展示了如何根据接口控制文档(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

#ifndef INTER_TYPES_H__ #define INTER_TYPES_H__ typedef short s16En3;typedef短s16En7;unsigned char u8En7;typedef短s16En15;/*用于仪器测量的结构类型。*/ *节流角度。* / s16En3节流;/ *发动机转速。* / s16En3速度;/ *自我传感器。 */ 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_type .h" extern EngSensors sensors;/ *仪器测量。*/

探索模型示例

运行脚本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子系统,泵恒块使用参数对象PumpConSpeedVect,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数据项。

在Dialog窗格(右窗格)中,配置fuel_mode根据ICD。在本例中,已经设置了信号数据类型,因此只能指定描述。

导航到模型的根级别。

在ICD和模型数据编辑器中,选择参数选项卡。在模型数据编辑器中,设置改变观点设计

在模型数据编辑器中,使用内容过滤框来搜索第一个参数,总统.模型数据编辑器显示了两行:一行对应于参数对象总统一行对应于使用的块参数总统

使用模型数据编辑器进行配置总统根据ICD。参数值价值列)已经设置。因为ICD指定sldemo_fuelsys_dd_controller作为总统,设置存储类ExportToFile

使用模型数据编辑器配置其他参数。如果要一次对多个参数应用更改,可以选择数据表中的多行。

在模型的左下角,单击模型数据面板,然后单击数据字典链接以在模型资源管理器中打开数据字典。

模型层次结构窗格中,选择设计数据节点。

内容窗格(中间窗格),选择金宝app仿真软件。NumericType对象u8En7.该对象表示其中一个原语类型定义语句ex_inter_types.h

在ICD中,选择数值类型选项卡。

使用“模型资源管理器对话框”窗格(右侧窗格)根据ICD配置对象。

使用模型资源管理器配置另一个金宝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 PressEst[855];/* reference by: '/Pressure Estimation' */ extern s16En15 PumpCon[551];/*引用by: '/Pumping Constant' */ extern s16En15 RampRateKiZ[25];/*引用by: '/Ramp Rate Ki' */ extern s16En3 SpeedEst[1305];/* reference by: '/Speed Estimation' */ extern s16En7 ThrotEst[551];/* reference by: '/Throttle Estimation' */ extern sldemo_FuelModes fuel_mode;/* '/control_logic' */ extern s16En7 fuel_rate;/ * < Root > / fuel_rate * /

数据定义(内存分配)出现在ICD指定的源文件中:params.csignals.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, 7864, 9830};/*引用:'/Ramp Rate Ki' */

算法在模型中一步文件中的函数sldemo_fuelsys_dd_controller.c.算法使用ICD识别的全局数据。例如,算法使用信号的值fuel_mode在一个开关块来控制执行流。

/* SwitchCase: '/Switch Case' */ Switch (fuel_mode) {Case LOW: /* Outputs for iffaction SubSystem: '/low_mode' includes: * ActionPort: '/Action Port' */ /* DiscreteFilter: '/Discrete Filter' includes: * Discrete integrator:'/Discrete Integrator' */离散filter_tmp = (int16_T)(int32_T)((int32_T)((int32_T)((int32_T) rtDWork. txt . txt . txt . txt。- (int32_T)(-12137 * (int32_T) rtdwork . discrete tefilter_state_g)) >> 14); / /离散数据

相关的话题