主要内容

生成预处理器变量系统的条件

定义变量控制

变体系统变异控制确定哪些变量选择是活跃。您可以指定一个变量控制作为一个条件表达式,a金宝appSimulink.Variant对象指定一个条件表达式,MATLAB®变量,或金宝appSimulink.Parameter对象。这个例子展示了如何定义变量控制金宝appSimulink.Parameter对象。

  1. 模型浏览器打开。选择基本工作空间。或者,您可以创建一个金宝appSimulink.Parameter在数据词典。

  2. 在Model Explorer中,选择添加>金宝app模型参数。新的参数指定一个名称。

  3. 使用的函数金宝appSimulink.VariantManager.findVariantControlVars找到并转换中使用MATLAB变量变异控制表达式金宝appSimulink.Parameter对象。例如,看到的不同控制变量转换成仿真软件。金宝app参数对象

  4. 金宝appSimulink.Parameter属性对话框中,指定价值数据类型

  5. 选择其中一个存储类值。

    • 定义

    • ImportedDefine(自定义)

    • CompilerFlag(自定义)

    • 存储类使用自定义创建的存储类设计师。你的存储类必须有数据初始化参数设置为数据范围参数设置为进口。看到控制数据表示通过配置存储类属性为更多的信息。

  6. 指定变量的值控制。如果存储类ImportedDefine(自定义),请执行以下操作:

    1. 指定头文件参数作为外部头文件的自定义属性部分金宝appSimulink.Parameter属性对话框。

    2. 输入变量的值控制外部的头文件。

      请注意

      生成的代码是指一个变量控制作为一个用户定义的宏。生成的代码不包含宏的值。变量的值控制决定了活跃的变体编译的代码。

      如果变量控制CompilerFlag自定义存储类、变量的值在编译时控制设置。使用配置参数>代码生成>自定义代码>代码信息>定义了参数添加变量的列表控件(宏定义)编译器命令行。例如,版本控制VSSMODE的文本字段定义了输入参数:

      -DVSSMODE = 1

      如果你想修改变量的值控制生成makefile后,使用一个makefile选项当编译你的代码。例如,在MATLAB以外的一个命令行,输入:

      makecommand- f模型楼上DEFINES_CUSTOM = " -DVSSMODE = 1 "

请注意

您可以定义变量控制使用金宝appSimulink.Parameter枚举类型的对象。这种方法提供了有意义的名称和改善条件的可读性。生成的代码包括预处理条件检查变异条件包含枚举类型的有效值。

配置模型生成预处理条件指令

  1. 打开配置参数对话框。

  2. 选择代码生成面板,设置系统目标文件作为ert.tlc

  3. 报告窗格中,选择创建代码生成报告

  4. 在配置参数对话框中清除忽略定制的存储类参数。为了生成预处理条件,您必须使用自定义存储类。

  5. 在不同的子系统,变异来源,或变体沉块参数对话框,设置变体激活时间参数代码编译

  6. 生成的代码。

用于生成预处理条件特殊考虑

  • 每个孩子的端口号和名字变体子系统必须属于一个子集的端口号和父母的名字变体子系统。

  • 代码生成过程检查至少有一个活跃的变体使用变异控制值存储在工作区底部。评估的变量控制真正的成为活跃的变体。如果没有控制评估的变体真正的默认的变体,如果指定,成为活跃的变体。一个错误的代码生成过程问题如果不存在一个活跃的变体。

  • 实现版本控制的条件表达式,这样只有一个变量控制评估真正的。生成的代码包含变量控制的测试来确定,只有一个活跃的变体。如果该测试失败,您的代码将不会编译。

  • 如果你注释掉的孩子子系统中列出变量的选择表的变体子系统块参数对话框,代码生成器不生成代码注释掉了子系统。

  • 对于不同子系统,model_private.h文件包含条件参数定义。例如,如果一个常数块的价值金宝appSimulink.Parameter与一个ImportedDefine自定义存储类和固定块的变体子系统,条件的定义金宝appSimulink.Parameter是在model_private.h文件。

产生变异控制宏相同的头文件

这个例子展示了如何控制宏(聚合多个变体#定义)到相同的生成的头文件。这种聚合使得你更容易管理系统固有的复杂性与多个交互变量条件。

探索模型示例

运行脚本prepare_rtwdemo_preproc_subsys打开模型rtwdemo_preprocessor_subsys对于这个例子,准备。

prepare_rtwdemo_preproc_subsys;

模型包含两个子系统模块。

导航子系统内部的变体。每个子系统有一个线性和非线性算法的变体。

模型的根级别的,打开块对话框不同子系统的标记LeftController。子系统的算法变异激活状态的基础上两个金宝appSimulink.Variant对象,线性非线性在基本工作空间。

每个对象的状态取决于不同控制变量的值,VSSMODE,这是一个金宝appSimulink.Parameter对象的基本工作空间。使用自定义存储类的参数对象定义和配置为生成的代码中出现一个c代码的宏macros.h

通过模型浏览器更改名称生成的头文件

在这个例子中,改变生成的头文件的名称macros.hvariant_controls.h

建模选项卡上,选择模型浏览器

模型层次结构窗格中,展开金宝app仿真软件根并选择基本工作空间。的内容窗格中显示基本工作空间中的所有对象。

选择VSSMODE然后在金宝appSimulink.Parameter: VSSMODE窗格中,单击代码生成选项卡。

HeaderFile参数,指定文件的名称variant_controls.h

另外,您可以通过编程方式更改文件名,使用这个命令。的更多信息金宝appSimulink.CoderInfo,请参阅金宝appSimulink.CoderInfo

金宝appSimulink.CoderInfo.CustomAttributes。HeaderFile =“variant_controls.h”;

减少维护工作通过创建自定义存储类

头文件的名称改变,你必须改变每个参数的配置对象。您可以使用模型数据编辑器来执行批处理编辑,但当你添加一个新的变量控制变量(参数对象),您必须记住指定该对象的头文件的名称。此外,模型数据编辑器显示了所使用的参数对象只有一个模型。

相反,您可以创建一个自定义存储类并指定头文件的名称只有一次:在自定义存储类的定义。

当前文件夹设置为可写的位置。

在命令提示符下,内置的副本金宝appSimulinkDemos包到你的当前文件夹myPackage

拷贝文件(fullfile (matlabroot,“工具箱”,“金宝app模型”,“simdemos”,“dataclasses”,' 金宝app+ SimulinkDemos '),' + myPackage ',“f”)

内导航+ myPackage文件夹的文件Parameter.m并打开该文件。

取消的方法部分定义了方法setupCoderInfo。在调用函数useLocalCustomStorageClasses、替换“packageName”“myPackage”。当您完成时,部分出现如下:

方法函数setupCoderInfo (h)从这个包%使用自定义存储类useLocalCustomStorageClasses (h,“myPackage”);结束结束%的方法

保存并关闭该文件。

设置当前文件夹的文件夹包含包myPackage

打开自定义存储类设计师。

cscdesigner (“myPackage”)

选择自定义存储类定义

点击复制。一个新的自定义存储类,Define_1,出现了。选择这个新的自定义存储类。

的名字VariantControlVar

头文件指定。在文本框中,输入variant_controls.h

点击应用,保存,好吧

在命令提示符处,取代金宝appSimulink.Parameter对象VSSMODEmyPackage.Parameter对象。应用新的自定义存储类VariantControlVar

MODE_A = myPackage.Parameter;MODE_A。价值= 1; MODE_A.DataType =“int32”;MODE_A.CoderInfo。StorageClass =“自定义”;MODE_A.CoderInfo。CustomStorageClass =“VariantControlVar”;MODE_B = myPackage.Parameter;MODE_B。价值= 1; MODE_B.DataType =“int32”;MODE_B.CoderInfo。StorageClass =“自定义”;MODE_B.CoderInfo。CustomStorageClass =“VariantControlVar”;

现在,表明一个参数对象表示一个变量控制变量,您可以应用定制的存储类VariantControlVar。改变头文件的名称,使用自定义存储类设计师。

相关的话题