文档

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

这个例子展示了如何根据接口控制文档(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子系统,泵恒块使用参数对象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数据项。

在对话框窗格(右窗格)中,进行配置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);

相关的话题