在生成的代码和外部代码之间交换结构化和枚举数据
这个例子展示了如何生成与外部现有代码交换数据的代码。构造和配置一个模型,使数据类型与外部代码匹配,并避免重复类型定义和内存分配(全局变量的定义)。然后,将生成的代码与外部代码一起编译为单个应用程序。
检查外部代码
创建文件ex_cc_algorithm.c
在当前文件夹中。
#include "ex_cc_algorithm.h" inSigs_T inSigs;float_32 my_alg(void) {if (inSigs。err == TMP_HI){返回27.5;} else if (inSigs.)犯错== TMP_LO) { return inSigs.sig1 * calPrms.cal3; } else { return inSigs.sig2 * calPrms.cal3; } }
C代码定义了一个全局结构变量inSigs
.代码还定义了一个函数,my_alg
,使用inSigs
和另一个名为calPrms
.
创建文件ex_cc_algorithm.h
在当前文件夹中。
#ifndef ex_cc_algorithm_h #define ex_cc_algorithm_h typedef float float_32;typedef enum {TMP_HI = 0, TMP_LO, NORM,} err_T;typedef struct inSigs_tag {err_T err;float_32 sig1;float_32 sig2;} inSigs_T;typedef struct calPrms_tag {float_32 cal1;float_32 cal2;float_32 cal3;} calPrms_T; extern calPrms_T calPrms; extern inSigs_T inSigs; float_32 my_alg(void); #endif
文件定义float_32
作为C数据类型的别名浮动
.该文件还定义了一个枚举数据类型,err_T
,和两种结构类型,inSigs_T
而且calPrms_T
.
这个函数my_alg
的字段计算返回值inSigs
而且calPrms
,为类型的全局结构变量inSigs_T
而且calPrms_T
.该函数需要另一种算法来提供信号数据inSigs
商店。
这段代码为inSigs
,但不是为了calPrms
.创建一个模型,其生成的代码:
定义并初始化
calPrms
.的字段的值
inSigs
.重用类型定义(例如
err_T
而且float_32
)外部代码定义的。
创建金宝app模型
这样您就可以在Simulink中创建枚举数据和结构化数据金宝app®模型,首先创建外部代码定义的数据类型的S金宝appimulink表示。将Simulink类金宝app型存储在名为
ex_cc_integ.sldd
.金宝appSimulink.importExternalCTypes (“ex_cc_algorithm.h”,...“DataDictionary”,“ex_cc_integ.sldd”);
数据字典出现在当前文件夹中。
要检查模型资源管理器中的字典内容,在当前文件夹中,双击文件,
ex_cc_integ.sldd
.的
金宝appSimulink.importExternalCTypes
函数创建金宝app仿真软件。公共汽车
,金宝app仿真软件。AliasType
,金宝appSimulink.data.dictionary.EnumTypeDefinition
对应自定义C数据类型的对象ex_cc_algorithm.h
.创建一个新模型,并将其保存在当前文件夹为
ex_struct_enum_integ
.将模型链接到数据字典。在建模选项卡,在设计,点击数据字典.
添加计算字段的算法块
inSigs
.
现在你有了算法模型,你必须:
将输出信号组织到一个名为
inSigs
.创建结构变量
calPrms
.包括
ex_cc_algorithm.c
在代码生成后编译代码的构建过程中。
配置生成的代码将输出数据写入现有结构变量
添加一个总线的创造者在现有的外港块。的输出。总线的创造者Block是一个总线信号,您可以配置它以结构的形式出现在生成的代码中。
在总线的创造者块,设置这些参数:
输入数量来
3.
输出数据类型来
总线:inSigs_T
输出为非虚拟总线到所选
删除现有的三个外港块(但不是进入块的信号)。
将其余三根信号线连接到电源的输入端总线的创造者块。
添加一个外港块后的总线的创造者块。连接的输出总线的创造者到外港.
在外港块,设置数据类型参数
总线:inSigs_T
.在建模选项卡上,单击模型数据编辑器.
在港口/外港选项卡,用于轮廓尺寸块标记
In2
而且In3
,改变数据类型从继承:汽车
来float_32
.改变改变观点下拉列表
设计
来代码
.为外港块,设置信号的名字来
inSigs
.集存储类来
ImportFromFile
.集头文件来
ex_cc_algorithm.h
.检查信号选项卡。
在模型中,选择的输出信号多端口切换块。
在“模型数据编辑器”中,为所选信号设置名字来
犯错
.的输出信号的名称获得块
sig1
.的输出信号的名称Gain1块
sig2
.
当你完成时,模型存储输出信号数据(如信号犯错
而且sig1
的结构变量字段中inSigs
.
因为你设置存储类来ImportFromFile
,生成的代码不分配内存inSigs
.
配置生成的代码来定义参数数据
配置生成的代码以定义全局结构变量,calPrms
,即外部代码所需要的。
在模型资源管理器模型层次结构窗格,在字典节点下ex_cc_integ,选择设计数据节点。
在内容窗格中,选择
金宝app仿真软件。公共汽车
对象命名calPrms_T
.在Dialog窗格(右侧窗格)中,单击启动巴士编辑.
在总线编辑器中,选择
calPrms_T
.在“总线编辑器”工具栏中,单击金宝app模型参数.
在MATLAB中®编辑器,复制生成的MATLAB代码并在命令提示符下运行代码。代码创建一个
金宝app仿真软件。参数
基本工作区中的对象。在模型资源管理器模型层次结构窗格中,选择基本工作空间.
使用模型资源管理器移动参数对象,
calPrms_T_Param
,从基本工作空间到数据字典的Design Data部分。的数据字典中内容窗格,将参数对象重命名为
calPrms
.在模型数据编辑器中,选择参数选项卡。
设置改变观点下拉列表
设计
.为获得块,替换该值
13.8900013
与calPrms.cal1
.另一方面获得块,用
calPrms.cal2
.同时编辑另一个的值获得块,在旁边
calPrms.cal2
,点击操作按钮并选择calPrms>开放.在
calPrms
属性对话框中的价值框,单击操作按钮并选择打开变量编辑器.使用变量编辑器设置参数对象中的字段值。
对于田野
cal1
而且cal2
,使用的数值获得先前使用的模型中的块。为
cal3
,使用非零数,如15.2299995
.
完成后,关闭变量编辑器。
在属性对话框中,设置存储类来
ExportedGlobal
.点击好吧.使用Model Explorer保存您对字典所做的更改。
生成、编译和检查代码
配置要包含的模型
ex_cc_algorithm.c
在构建过程中。集配置参数>代码生成>自定义代码>代码信息>源文件来ex_cc_algorithm.c
.从模型生成代码。
检查生成的文件
ex_struct_enum_integ.c
.文件定义和初始化calPrms
./*导出块参数*/ calPrms_T calPrms = {13.8900013F, 0.998300076F, 15.23F};/*变量:calPrms
在模型中生成的算法
一步
函数定义用于缓冲信号值的局部变量犯错
.err_T rtb_err;
然后算法计算并存储数据在字段
inSig
.inSigs。犯错= rtb_err; inSigs.sig1 = (rtU.In2 + rtDW.DiscreteTimeIntegrator_DSTATE) * calPrms.cal1; inSigs.sig2 = (real32_T)(calPrms.cal2 * rtDW.DiscreteTimeIntegrator_DSTATE);
在整个模型中替换数据类型名称
生成使用的代码float_32
而不是默认的,real32_T
,无需手动指定块输出信号和总线元素的数据类型,可使用数据类型替换(配置参数>代码生成>数据类型替换).有关更多信息,请参见替换和重命名数据类型以符合编码标准.
另请参阅
金宝appSimulink.importExternalCTypes