主要内容

之间交换结构化和枚举数据生成和外部代码

这个例子展示了如何生成的代码与外部交换数据时,现有的代码。构建和配置模型与外部代码匹配的数据类型,并避免重复类型定义和内存分配(全局变量的定义)。然后,编译生成的代码与外部代码到一个应用程序。

检查外部代码

创建文件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_TcalPrms_T

这个函数my_alg是用来计算返回值通过使用领域的inSigscalPrms,这是全球结构变量的类型inSigs_TcalPrms_T。函数需要另一个算法来提供信号数据inSigs商店。

这段代码分配内存inSigs,但不是calPrms。创建一个模型,其生成的代码:

  • 定义并初始化calPrms

  • 计算字段的值inSigs

  • 重用类型定义(如err_Tfloat_32外部代码定义)。

创建万博1manbetx模型

  1. 这样你可以创建枚举和仿真软件的结构化数据万博1manbetx®模型中,首先创建的模型表示外部代码定义的万博1manbetx数据类型。模型类型存储在一个新万博1manbetx的数据字典命名ex_cc_integ.sldd

    万博1manbetxSimulink.importExternalCTypes (“ex_cc_algorithm.h”,“DataDictionary”,“ex_cc_integ.sldd”);

    数据字典出现在当前文件夹。

  2. 在Model Explorer检查字典内容,在当前文件夹,双击这个文件,ex_cc_integ.sldd

    万博1manbetxSimulink.importExternalCTypes函数创建万博1manbetxSimulink.Bus,万博1manbetxSimulink.AliasType,万博1manbetxSimulink.data.dictionary.EnumTypeDefinition对应于自定义C数据类型的对象ex_cc_algorithm.h

  3. 创建一个新的模型,并将其保存在当前文件夹ex_struct_enum_integ

  4. 链接模型的数据字典。在建模选项卡,在设计,点击数据字典

  5. 添加算法块计算领域inSigs

现在您已经算法模型,您必须:

  • 组织输出信号到一个结构变量命名inSigs

  • 创建结构变量calPrms

  • 包括ex_cc_algorithm.c构建过程中编译后代码生成的代码。

配置生成的代码编写输出数据对现有结构变量

  1. 添加一个总线的创造者附近街区现有外港块。的输出总线的创造者块是一个总线信号,您可以配置出现在生成的代码结构。

  2. 总线的创造者块,设置这些参数:

    • 输入数量3

    • 输出数据类型总线:inSigs_T

    • 输出作为nonvirtual总线到所选

  3. 删除现有的三个外港块(而不是信号输入模块)。

  4. 把剩下的三线的输入信号总线的创造者块。

  5. 添加一个外港块后总线的创造者块。连接的输出总线的创造者外港

  6. 外港块,设置数据类型参数总线:inSigs_T

  7. 建模选项卡上,单击模型数据编辑器

  8. 港口/外港选项卡,轮廓尺寸块标记In2In3,改变数据类型继承:汽车float_32

  9. 改变改变观点从下拉列表设计代码

  10. 外港块,设置信号的名字inSigs

  11. 存储类ImportFromFile

  12. 头文件ex_cc_algorithm.h

  13. 检查信号选项卡。

  14. 在模型中,选择的输出信号多端口切换块。

  15. 在模型数据编辑器中,选择的信号,设置的名字犯错

  16. 设置的输出信号的名称获得sig1

  17. 设置的输出信号的名称Gain1sig2

当你完成时,该模型将输出信号数据存储(如信号犯错sig1)领域的一个结构变量命名inSigs

因为你设置存储类ImportFromFile,生成的代码并不分配内存inSigs

配置生成的代码定义参数数据

配置生成的代码定义全局结构变量,calPrms,外部代码的需要。

  1. 在模型浏览器中模型层次结构窗格中,在字典节点ex_cc_integ,选择设计数据节点。

  2. 内容窗格中,选择万博1manbetxSimulink.Bus对象命名calPrms_T

  3. 在对话框中窗格(右窗格),点击发射类型编辑器

  4. 在类型编辑器中,选择calPrms_T

  5. 在将来发布类型编辑,单击万博1manbetx模型参数

  6. 在MATLAB®编辑,复制生成的MATLAB代码并在命令提示符运行代码。的代码创建了一个万博1manbetxSimulink.Parameter对象的基本工作空间。

  7. 在模型浏览器中模型层次结构窗格中,选择基本工作空间

  8. 使用Model Explorer来移动参数对象,calPrms_T_Param,从基本工作空间的设计数据部分数据字典。

  9. 选择的数据字典中内容窗格中,重命名对象作为参数calPrms

  10. 在模型数据编辑器中,选择参数选项卡。

  11. 设置改变观点下拉列表,设计

  12. 获得块,取代的价值13.8900013calPrms.cal1

  13. 在另一个获得块,用calPrms.cal2

  14. 在编辑的价值获得块,旁边calPrms.cal2,点击操作按钮并选择calPrms>开放

  15. calPrms属性对话框,旁边价值框,点击操作按钮并选择打开变量编辑器

  16. 使用变量编辑器来设置参数对象的字段值。

    • 的字段cal1cal2,使用的数值获得在以前所使用的模型。

    • cal3,用一个非零数字等15.2299995

    当你完成时,关闭变量编辑器。

  17. 在属性对话框中,设置存储类ExportedGlobal。点击好吧

  18. 使用Model Explorer来保存更改你的字典。

生成、编译和检查代码

  1. 包括配置模型ex_cc_algorithm.c在构建过程。集配置参数>代码生成>自定义代码>代码信息>源文件ex_cc_algorithm.c

  2. 从模型中生成代码。

  3. 检查生成的文件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,而不是手动指定数据类型的块输出信号和汽车元素,您可以使用数据类型替换(配置参数>代码生成>数据类型替换)。有关更多信息,请参见取代和重命名数据类型符合编码标准

另请参阅

相关的话题