主要内容

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

定义变量控制

对于变量系统,称为变体控制的条件表达式确定哪个变体选择是活动的。您可以将变体控制指定为条件表达式,a金宝appsimulink.variant.指定条件表达式,MATLAB的对象®变量,或者金宝appSimulink.Parameter.目的。此示例显示了如何定义变量控制金宝appSimulink.Parameter.对象。

  1. 打开模型资源管理器。选择基础工作区

  2. 在模型资源管理器中,选择>金宝appSimulink参数。为新参数指定一个名称。

  3. 使用功能金宝appsimulink.variantmanager.findvariantControlvars.查找和转换在变体控制表达式中使用的MATLAB变量金宝appSimulink.Parameter.对象。例如,看到将变体控制变量转换为Simulink.Parameter对象金宝app

  4. 在这一点金宝appSimulink.Parameter.属性对话框,指定数据类型

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

    • 界定

    • ImportedDefine(定制)

    • CompilerFlag(自定义)

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

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

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

    2. 输入外部标题文件中的变体控件的值。

      注意

      生成的代码是指作为用户定义宏的变体控制。生成的代码不包含宏的值。变型控制的值确定编译代码中的活动变量。

      如果变体控制是一个CompilerFlag自定义存储类,Variant控件的值设置在编译时。使用配置参数>代码生成>自定义代码>其他构建信息>定义参数添加变量控件列表(宏定义)到编译器命令行。例如,用于变体控制vssmode.,在文本字段中定义参数,输入:

      -dvssmode = 1

      如果要在生成Makefile后修改变体控制的值,请在编译代码时使用makefile选项。例如,在MATLAB之外的命令行中,输入:

      makecommand-F模型.mk defines_custom =“ -  dvssmode = 1”

注意

您可以使用variant控件定义使用金宝appSimulink.Parameter.枚举类型的对象。此方法提供有意义的名称并提高了条件的可读性。生成的代码包括预处理器条件,以检查变体条件是否包含枚举类型的有效值。

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

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

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

  3. 在里面报告窗格,选择创建代码生成报告

  4. 在“配置参数”对话框中,清除忽略自定义存储类参数。要生成预处理器条件,必须使用自定义存储类。

  5. 在变体子系统,变体源或变体槽块参数对话框中,设置变体激活时间参数到代码编译

  6. 生成代码。

用于生成预处理器条件的特殊注意事项

  • 每个子变量子系统的端口号和名称必须属于端口号和父变量子系统块的名称的子集。

  • 代码生成过程通过使用存储在基础工作空间中的变体控制值检查存在至少一个活动变量。评估的变体控制真正成为活跃的变体。如果没有任何变体控制评估真正,默认变体(如果指定)将成为活动变量。如果不存在活动变量,则代码生成过程会发出错误。

  • 实现变体对象的条件表达式,使得只有一个评估真正。生成的代码包括对变体对象的测试,以确定仅存在一个活动变量。如果此测试失败,则您的代码将无法编译。

  • 如果您注释出在列出的子系统中变体选择表在“变体子系统块”参数对话框中,代码生成器不会为注释的子系统生成代码。

  • 如果默认变体的采样时间与其他变体选择的采样时间不同,则#其他不为默认变量生成预处理器条件。相反,一个#if!(<变体条件>是生成的。

  • 对于变量子系统,model_private.h.文件包含条件参数定义。例如,如果常量块的值是a金宝appSimulink.Parameter.ImportedDefine自定义存储类,常量块处于变体子系统,条件定义金宝appSimulink.Parameter.在里面model_private.h.文件。

在同一标题文件中生成变体控制宏

此示例显示如何聚合多个变体控制宏(#define.)进入同一生成的头文件。此聚合使您可以更轻松地管理具有多个交互变体条件的系统中固有的复杂性。

探索模型示例

运行脚本prequest_rtwdemo_preproc_subsys.,打开模型RTWDEMO_PREPROCESSOR_SUBSYS.并为这个例子准备它。

运行(fullfile(matlabroot,“例子”'ecoder''主要''prepaster_rtwdemo_preproc_subsys'));

该模型包含两个不同的子系统块。

在变量子系统内导航。子系统各自具有线性和非线性算法变体。

在模型的根级别,打开标记为Variant子系统的块对话框LeftController。子系统中的算法变量是基于两个状态激活的金宝appsimulink.variant.对象,线性非线性,在基础工作区中。

每个对象的状态取决于两个变体控制变量的值,MODE_AMODE_B, 哪个是金宝appSimulink.Parameter.基础工作区中的对象。参数对象使用自定义存储类界定并配置为作为c代码宏出现在生成的代码中macros.h

通过模型数据编辑器更改生成的头文件的名称

在此示例中,更改生成的头文件的名称macros.hvariant_controls.h.。您必须在每个参数对象中更改文件名。

在模型中,选择建模>模型数据编辑器

在“模型数据编辑器”中,选择参数标签。

单击显示/刷新的额外信息按钮。

设定改变视图下拉列表

在里面过滤器件盒子,进入模式。模型数据编辑器显示与参数对象对应的两行。

选择两行。然后,对于其中一个行,使用标题文件列以更改头文件名称的列macros.hvariant_controls.h.。模型数据编辑器将更改应用于两行。

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

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

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

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

在命令提示符下,复制内置金宝appsimulinkdemos.包到您当前的文件夹中mypackage.

Copyfile(FullFile(Matlabroot,......'工具箱''金宝appsimulink''simdemos''dataclasses''+金宝app simulinkdemos'),......'+ mypackage''F'

在里面导航+ mypackage文件夹到文件参数.M.打开文件。

取消的方法定义方法的部分setupcoderinfo.。在函数的调用中USELOCALCUSTOMSTORAGECLASSES.、替换'包裹名字''mypackage'。完成后,该部分显示如下:

方法功能setupCoderInfo (h)%使用这个包中的自定义存储类USELOCALCUSTOMSTORAGECLASSES(H,'mypackage');结束结束% 方法

保存并关闭文件。

将当前文件夹设置为包含包的文件夹mypackage.

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

cscdesigner('mypackage'

选择自定义存储类界定

点击复制。一个新的自定义存储类,define_1.,出现。选择此新的自定义存储类。

名称VariantControlvar.

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

点击应用保存,和

在命令提示符下,更换金宝appSimulink.Parameter.对象MODE_AMODE_Bmypackage.Parameter.对象。应用新的自定义存储类VariantControlvar.

mode_a = mypackage.parameter;mode_a.value = 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.。若要更改头文件的名称,请使用自定义存储类设计器。

相关话题