对于变量系统,称为变体控制的条件表达式确定哪个变体选择是活动的。您可以将变体控制指定为条件表达式,a万博1manbetx仿真软件。变体
指定条件表达式,MATLAB的对象®变量,或万博1manbetxSimulink.Parameter.
目的。此示例显示了如何定义变量控制万博1manbetxSimulink.Parameter.
对象。
打开Model Explorer。选择基本工作空间.
在模型资源管理器中,选择添加>万博1manbetxSimulink参数.为新参数指定一个名称。
使用的函数万博1manbetxsimulink.variantmanager.findvariantControlvars.
查找并转换MATLAB变量中使用的变量控制表达式为万博1manbetxSimulink.Parameter.
对象。例如,请参见在Simulink中转换变量控制变量。万博1manbetx参数对象(万博1manbetxSimulink)。
在万博1manbetxSimulink.Parameter.
属性对话框,指定价值和数据类型.
选择其中一个存储类值。
定义
ImportedDefine(自定义)
CompilerFlag(自定义)
使用自定义存储类设计器创建的存储类。您的存储类必须有数据初始化参数设置为宏
和数据范围参数设置为进口
.看到通过配置自定义存储类属性来控制数据表示为更多的信息。
指定变量控制的值。如果存储类是ImportedDefine(自定义)
,做以下工作:
指定标题文件属性的自定义属性部分中的外部头文件万博1manbetxSimulink.Parameter.
属性对话框。
输入外部标题文件中的变体控件的值。
生成的代码是指作为用户定义宏的变体控制。生成的代码不包含宏的值。变型控制的值确定编译代码中的活动变量。
如果变型控制是CompilerFlag
自定义存储类时,变量控件的值在编译时设置。使用配置参数>代码生成>自定义代码>额外的构建信息>定义了参数添加变量控件列表(宏定义)到编译器命令行。例如,用于变体控制vssmode.
的文本字段中定义了输入参数:
-DVSSMODE = 1
如果您想在生成makefile之后修改变量控件的值,请在编译代码时使用makefile选项。例如,在MATLAB外部的命令行中,输入:
makecommand- f模型楼上DEFINES_CUSTOM = " -DVSSMODE = 1 "
您可以使用万博1manbetxSimulink.Parameter.
枚举类型的对象。此方法提供有意义的名称并提高了条件的可读性。生成的代码包括预处理器条件,以检查变体条件是否包含枚举类型的有效值。
打开“配置参数”对话框。
选择代码生成面板,设置系统目标文件作为ert.tlc.
.
在报告窗格中,选择创建代码生成报告.
在“配置参数”对话框中,清除已配置的参数忽略自定义存储类(万博1manbetx仿真软件编码器)参数。为了生成预处理条件,必须使用自定义存储类。
在“模型变体”块参数对话框中,选择“生成预处理条件参数的选择。在“变体子系统”、“变体源”或“变体接收块”参数对话框中,选择在更新图中分析所有选择并生成预处理器条件选择。
在这两种情况下,清除选项覆盖变体条件并使用以下变体.
生成的代码。
代码生成过程检查导入和输出模型变体块是相同的(相同的端口号和名称)的相应的导入和输出端口的变体。模拟的构建过程不会进行此检查。因此,如果您的变体块包含不匹配的导入或输出端口,代码生成过程将发出错误。
每个子变量子系统的端口号和名称必须属于父变量子系统块的端口号和名称的子集。
代码生成过程通过使用存储在基本工作空间中的变量控制值来检查至少有一个活动变量。计算为的变量控制真正的
成为活跃的变体。如果没有任何变体控制评估真正的
,如果指定,则默认变体成为活动变体。如果活动变量不存在,代码生成过程将发出错误。
实现变体对象的条件表达式,使得只有一个评估真正的
.生成的代码包括变体对象的测试,以确定只有一个活动的变体。如果测试失败,您的代码将无法编译。
如果您注释出在列出的子系统中变量的选择表在“变体子系统块”参数对话框中,代码生成器不会为注释的子系统生成代码。
如果默认变体的示例时间与其他变体选择的示例时间不同,则其他#
不为默认变量生成预处理器条件。相反,一个#如果!
是生成的。<变异条件>
)
对于变型子系统,model_private.h
文件包含条件参数定义。例如,如果Constant块的值是万博1manbetxSimulink.Parameter.
带着ImportedDefine
类的条件定义万博1manbetxSimulink.Parameter.
是在model_private.h
文件。
这个示例展示了如何聚合多个变量控制宏(#定义
)放入同一个生成的头文件中。这种聚合使您更容易管理具有多个交互变量条件的系统中固有的复杂性。
探索模型示例
运行脚本prepare_rtwdemo_preproc_subsys
,打开模型rtwdemo_preprocessor_subsys
并为这个例子准备它。
运行(fullfile (matlabroot“例子”那“是”那'主要的'那'prepaster_rtwdemo_preproc_subsys'));
该模型包含两个变体子系统块。
在变型子系统内部导航。每个子系统都有一个线性和非线性的算法变体。
在模型的根级,打开标记为可变子系统的块对话框LeftController
.该算法在子系统中基于两种状态的激活万博1manbetx仿真软件。变体
对象,线性
和非线性
,在基础工作区中。
每个对象的状态取决于两个变体控制变量的值,MODE_A
和MODE_B
,这是万博1manbetxSimulink.Parameter.
对象。参数对象使用自定义存储类定义
的c代码宏,并配置为在生成的代码中显示macros.h
.
通过模型数据编辑器更改生成的头文件的名称
在本例中,将生成的头文件的名称改为macros.h
来variant_controls.h.
.您必须在每个参数对象中更改文件名。
在模型中,选择查看>模型数据编辑器.
在模型数据编辑器中,选择参数选项卡。
单击显示/刷新的额外信息按钮。
设置改变观点下拉列表代码
.
在内容过滤框中,输入模式
.模型数据编辑器显示与参数对象对应的两行。
选择两行。然后,对于其中一个行,使用标题文件列以更改头文件名称的列macros.h
来variant_controls.h.
.模型数据编辑器对这两行应用更改。
通过创建自定义存储类来减少维护工作
要更改标题文件的名称,您必须更改每个参数对象的配置。您可以使用模型数据编辑器执行批处理编辑,但是当添加新变体控制变量(参数对象)时,必须记住指定该对象的标题文件的名称。此外,模型数据编辑器可以一次显示仅一个模型使用的参数对象。
相反,您可以创建一个自定义存储类并只指定一次头文件的名称:在自定义存储类的定义中。
将当前文件夹设置为可写位置。
在命令提示符下,复制内置万博1manbetxSimulinkDemos
打包到您的当前文件夹为mypackage.
.
Copyfile(FullFile(Matlabroot,...“工具箱”那“万博1manbetx模型”那'simdemos'那“dataclasses”那'+万博1manbetx simulinkdemos'),...'+ mypackage'那“f”)
内导航+ myPackage
文件夹到文件参数.M.
然后打开文件。
取消的方法
定义方法的部分setupCoderInfo
.在函数的调用中USELOCALCUSTOMSTORAGECLASSES.
、替换“packageName”
和“myPackage”
.完成后,该部分显示如下:
方法函数setupCoderInfo (h)%从这个包中使用自定义存储类useLocalCustomStorageClasses (h,“myPackage”);结尾结尾% 方法
保存并关闭文件。
将当前文件夹设置为包含包的文件夹mypackage.
.
打开自定义存储类设计器。
cscdesigner (“myPackage”)
选择自定义存储类定义
.
点击复制.一个新的定制存储类,define_1.
,出现了。选择这个新的自定义存储类。
放的名字来VariantControlVar
.
放头文件来指定
.在文本框中输入variant_controls.h.
.
点击申请那保存,好吧.
在命令提示符处,替换万博1manbetxSimulink.Parameter.
对象MODE_A
和MODE_B
和mypackage.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.value = 1;mode_b.datatype =.“int32”;MODE_B.CoderInfo。StorageClass ='风俗';mode_b.coderinfo.customstorageclass ='VariantControlvar';
现在,要指示参数对象表示变体控制变量,可以应用自定义存储类VariantControlVar
.若要更改头文件的名称,请使用自定义存储类设计器。