主要内容

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

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

检查外部代码

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

  1. 这样您就可以在Simulink中创建枚举数据和结构化数据金宝app®模型,首先创建外部代码定义的数据类型的S金宝appimulink表示。将Simulink类金宝app型存储在名为ex_cc_integ.sldd

    金宝appSimulink.importExternalCTypes (“ex_cc_algorithm.h”...“DataDictionary”“ex_cc_integ.sldd”);

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

  2. 要检查模型资源管理器中的字典内容,在当前文件夹中,双击文件,ex_cc_integ.sldd

    金宝appSimulink.importExternalCTypes函数创建金宝app仿真软件。公共汽车金宝app仿真软件。AliasType,金宝appSimulink.data.dictionary.EnumTypeDefinition对应自定义C数据类型的对象ex_cc_algorithm.h

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

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

  5. 添加计算字段的算法块inSigs

现在你有了算法模型,你必须:

  • 将输出信号组织到一个名为inSigs

  • 创建结构变量calPrms

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

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

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

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

    • 输入数量3.

    • 输出数据类型总线:inSigs_T

    • 输出为非虚拟总线到所选

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

  4. 将其余三根信号线连接到电源的输入端总线的创造者块。

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

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

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

  8. 港口/外港选项卡,用于轮廓尺寸块标记In2而且In3,改变数据类型继承:汽车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. 内容窗格中,选择金宝app仿真软件。公共汽车对象命名calPrms_T

  3. 在Dialog窗格(右侧窗格)中,单击启动巴士编辑

  4. 在总线编辑器中,选择calPrms_T

  5. 在“总线编辑器”工具栏中,单击金宝app模型参数

  6. 在MATLAB中®编辑器,复制生成的MATLAB代码并在命令提示符下运行代码。代码创建一个金宝app仿真软件。参数基本工作区中的对象。

  7. 在模型资源管理器模型层次结构窗格中,选择基本工作空间

  8. 使用模型资源管理器移动参数对象,calPrms_T_Param,从基本工作空间到数据字典的Design Data部分。

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

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

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

  12. 获得块,替换该值13.8900013calPrms.cal1

  13. 另一方面获得块,用calPrms.cal2

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

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

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

    • 对于田野cal1而且cal2,使用的数值获得先前使用的模型中的块。

    • 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 = {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,无需手动指定块输出信号和总线元素的数据类型,可使用数据类型替换(配置参数>代码生成>数据类型替换).有关更多信息,请参见替换和重命名数据类型以符合编码标准

另请参阅

相关的话题