在生成代码和外部代码之间交换结构化和枚举数据
这个例子展示了如何生成与外部现有代码交换数据的代码。构造和配置一个模型,使数据类型与外部代码相匹配,并避免重复类型定义和内存分配(全局变量的定义)。然后,将生成的代码与外部代码一起编译为单个应用程序。
检查外部代码
创建文件ex_cc_algorithm.c
在您的当前文件夹中。
#include "ex_cc_algorithm.h" inSigs_T inSigs;float_32 my_alg(void) {if (ininsigs . float_32 my_alg(void) {err == TMP_HI){返回27.5;} else if (ininsigs .}犯错== 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类型定义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
)是外部代码定义的。
创建万博1manbetx模型
这样您就可以在Simulink中创建枚举和结构化数据万博1manbetx®模型,首先创建外部代码定义的数据类型的S万博1manbetximulink表示。将Simulink类万博1manbetx型存储在名为
ex_cc_integ.sldd
.万博1manbetxSimulink.importExternalCTypes (“ex_cc_algorithm.h”,...“DataDictionary”,“ex_cc_integ.sldd”);
数据字典出现在当前文件夹中。
要检查Model Explorer中的字典内容,请在当前文件夹中双击该文件,
ex_cc_integ.sldd
.的
万博1manbetxSimulink.importExternalCTypes
函数创建万博1manbetx仿真软件。公共汽车
,万博1manbetx仿真软件。AliasType
,万博1manbetxSimulink.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,选择设计数据节点。
在内容窗格中,选择
万博1manbetx仿真软件。公共汽车
对象calPrms_T
.在对话框窗格(右窗格)中,单击启动巴士编辑器.
在总线编辑器的左窗格中,选择
calPrms_T
.在“总线编辑器”工具栏上,单击创建/编辑Simulink。万博1manbetx参数Object from a Bus Object按钮。
在MATLAB编辑器中,复制生成的MATLAB代码,并在命令提示符处运行代码。该代码创建一个
万博1manbetx仿真软件。参数
对象。在模型浏览器中模型层次结构窗格中,选择基本工作空间.
使用Model Explorer移动参数对象,
calPrms_T_Param
,从基本工作区到数据字典的Design Data部分。选择数据字典后,在内容窗格中,将参数对象重命名为
calPrms
.在模型数据编辑器中,选择参数选项卡。
设置改变观点下拉列表
设计
.为获得块,替换值
13.8900013
与calPrms.cal1
.另一方面获得块,用
calPrms.cal2
.同时编辑另一个的值获得Block,挨着
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
,而不是手动指定块输出信号和总线元素的数据类型,您可以使用数据类型替换(配置参数>代码生成>数据类型替换).有关更多信息,请参见替换和重命名数据类型以符合编码标准.
另请参阅
万博1manbetxSimulink.importExternalCTypes
相关的话题
- 外部C/ c++代码与Simulink模型或生成代码之间的数据交换万博1manbetx(万博1manbetx仿真软件编码器)
- 生成代码中的控件数据类型名称
- 在生成的代码中使用枚举数据
- 在生成的代码中将数据组织成结构