之间交换结构化和枚举数据生成和外部代码
这个例子展示了如何生成的代码与外部交换数据时,现有的代码。构建和配置模型与外部代码匹配的数据类型,并避免重复类型定义和内存分配(全局变量的定义)。然后,编译生成的代码与外部代码到一个应用程序。
检查外部代码
创建文件ex_cc_algorithm.c
在当前文件夹。
# include“ex_cc_algorithm。h”inSigs_T inSigs;如果(inSigs float_32 my_alg (void) {。呃= = TMP_HI){返回27.5;如果(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_32浮动;typedef enum {TMP_HI = 0, TMP_LO,规范}err_T;typedef struct inSigs_tag {err_T犯错;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模型
这样你可以创建枚举和仿真软件的结构化数据万博1manbetx®模型中,首先创建的模型表示外部代码定义的万博1manbetx数据类型。模型类型存储在一个新万博1manbetx的数据字典命名
ex_cc_integ.sldd
。万博1manbetxSimulink.importExternalCTypes (“ex_cc_algorithm.h”,…“DataDictionary”,“ex_cc_integ.sldd”);
数据字典出现在当前文件夹。
在Model Explorer检查字典内容,在当前文件夹,双击这个文件,
ex_cc_integ.sldd
。的
万博1manbetxSimulink.importExternalCTypes
函数创建万博1manbetxSimulink.Bus
,万博1manbetxSimulink.AliasType
,万博1manbetxSimulink.data.dictionary.EnumTypeDefinition
对应于自定义C数据类型的对象ex_cc_algorithm.h
。创建一个新的模型,并将其保存在当前文件夹
ex_struct_enum_integ
。链接模型的数据字典。在建模选项卡,在设计,点击数据字典。
添加算法块计算领域
inSigs
。
现在您已经算法模型,您必须:
组织输出信号到一个结构变量命名
inSigs
。创建结构变量
calPrms
。包括
ex_cc_algorithm.c
构建过程中编译后代码生成的代码。
配置生成的代码编写输出数据对现有结构变量
添加一个总线的创造者附近街区现有外港块。的输出总线的创造者块是一个总线信号,您可以配置出现在生成的代码结构。
在总线的创造者块,设置这些参数:
输入数量来
3
输出数据类型来
总线:inSigs_T
输出作为nonvirtual总线到所选
删除现有的三个外港块(而不是信号输入模块)。
把剩下的三线的输入信号总线的创造者块。
添加一个外港块后总线的创造者块。连接的输出总线的创造者到外港。
在外港块,设置数据类型参数
总线:inSigs_T
。在建模选项卡上,单击模型数据编辑器。
在港口/外港选项卡,轮廓尺寸块标记
In2
和In3
,改变数据类型从继承:汽车
来float_32
。改变改变观点从下拉列表
设计
来代码
。为外港块,设置信号的名字来
inSigs
。集存储类来
ImportFromFile
。集头文件来
ex_cc_algorithm.h
。检查信号选项卡。
在模型中,选择的输出信号多端口切换块。
在模型数据编辑器中,选择的信号,设置的名字来
犯错
。设置的输出信号的名称获得块
sig1
。设置的输出信号的名称Gain1块
sig2
。
当你完成时,该模型将输出信号数据存储(如信号犯错
和sig1
)领域的一个结构变量命名inSigs
。
因为你设置存储类来ImportFromFile
,生成的代码并不分配内存inSigs
。
配置生成的代码定义参数数据
配置生成的代码定义全局结构变量,calPrms
,外部代码的需要。
在模型浏览器中模型层次结构窗格中,在字典节点ex_cc_integ,选择设计数据节点。
在内容窗格中,选择
万博1manbetxSimulink.Bus
对象命名calPrms_T
。在对话框中窗格(右窗格),点击发射类型编辑器。
在类型编辑器中,选择
calPrms_T
。在将来发布类型编辑,单击万博1manbetx模型参数。
在MATLAB®编辑,复制生成的MATLAB代码并在命令提示符运行代码。的代码创建了一个
万博1manbetxSimulink.Parameter
对象的基本工作空间。在模型浏览器中模型层次结构窗格中,选择基本工作空间。
使用Model Explorer来移动参数对象,
calPrms_T_Param
,从基本工作空间的设计数据部分数据字典。选择的数据字典中内容窗格中,重命名对象作为参数
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 = {15.23 0.998300076 13.8900013 f, f, f};/ *变量: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