本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

变体控制项简介

系统将根据您选择的变体来对包含变体的 Simulink® 模型组件进行激活或反激活。

模型中的每个变体选择项都与一个称为变体控制项的条件表达式相关联。变体控制项确定哪个变体选择项处于活动状态。通过更改变体控制项的值,您可以切换活动变体。

虽然每个变体选择项与一个变体控制项相关联,但只有一个变体控制项的计算结果为 true。当一个变体控制项的计算结果为 true 时,Simulink 会激活对应于该变体控制项的变体选择。

变体控制项是一个布尔表达式,该表达式在计算结果为 true 时会激活特定变体选择项。

注意

您可以在 MATLAB® 全局工作区或数据字典中指定变体控制项。

您可以将变体控制项指定为 Simulink.Variant 对象、MATLAB 表达式(包括结构体)或包含一个或多个下述操作数和运算符的表达式。

Variant control mode

模块参数对话框中提供的 Variant control mode 参数允许您选择 “Expression” 或 “Label” 模式来为变体模块建模。

  • Expression: 根据变体条件的计算结果指定活动变体。

    Variant control modeExpression

  • Label: 指定基于名称的变体控制项(Label 模式活动变体)。在 Label 模式下,无需在全局工作区中创建变体控制项。您也可以从命令行选择 Label 模式活动变体。例如,set_param(block,'LabelModeActiveChoice', 'Choice_1')

    变体控制项模式:标签

操作数

  • 解析为 MATLAB 变量或 Simulink.Parameter 对象的变量名称,其中含有整数或枚举数据类型以及标量字面值

  • 解析为 Simulink.Variant 对象的变量名称

  • 表示整数或枚举值的标量字面值

运算符

  • 用于分组的括号

  • 算术、关系、逻辑或按位运算符

有关详细信息,请参阅变体条件表达式中的运算符和操作数

编译模型时,如果某变体控制项的计算结果为 true,则 Simulink 确定对应的变体选择项处于活动状态。对活动变体的计算发生在编译的早期阶段,一旦模型编译完成,便不能再更改活动变体

已知限制

  • 不允许在结构体内使用 Simulink 变体对象。

  • 不允许在结构体内使用 Simulink 参数。

用于指定变体控制项的方法

您可以使用多种方法在变体选择项之间切换,包括原型构建时可用的方法,以及从模型生成代码时所需的方法,等等。

设定用途示例
标量变量快速原型A == 1
Simulink.Variant 对象重用变体条件LinearController = Simulink.Variant('FUEL==2 && EMIS==1');
Simulink.Parameter 对象或 MATLAB 变量生成用于代码生成的预处理器条件句mode == 1,其中 mode 可以是 Simulink.Parameter 对象或 MATLAB 变量
枚举类型提高代码可读性,因为条件值表示为有意义的名称而不是整数LEVEL == Level.Advanced

您可以使用函数 Simulink.VariantManager.findVariantControlVars 找到控制项变量。

用于快速原型构建的标量变量

MATLAB 标量变量允许您在构建模型时快速创建变体选择项原型。它们可以帮助您更多地专注于构建变体选择项,而不是开发激活这些选择的表达式。

以包含两个变体选择项的模型为例,其中每个变体选择项由一个 Variant Subsystem 模块表示。

您可以在 Variant Subsystem 模块的模块参数对话框中,以标量变量这种最简单的形式来指定变体控制项。

Linear ControllerNonlinear ControllerCondition 字段均为 N/A,因为变体控制项本身是条件。

您可以通过在 MATLAB 命令行窗口中定义标量变量 V 并将其值设置为 1 来激活其中一个变体选择项。

V = 1;
此条件会激活 Linear Controller 变体选择项。使用 % 符号时,将忽略变体控制项。同样,如果变体控制项为空,该选择项将被忽略。

同样,如果将 V 的值更改为 2,则 Simulink 会激活 Nonlinear Controller 变体选择项。

用于变体条件重用的 Simulink.Variant 对象

在确定模型所需的变体选择项后,您可以构建复杂的变体条件来控制变体选择项的激活。将变体条件定义为 Simulink.Variant 对象。

Simulink.Variant 对象使您能够跨多个模型重用常见的变体条件,并帮助您封装复杂的变体条件表达式。

假设有如下示例,其中变体控制项已在全局工作区中定义。

V=1;
V=2;

您可以将这些控制项转换为封装成 Simulink.Variant 对象的条件表达式。

LinearController=Simulink.Variant('V==1');
NonLinearController=Simulink.Variant('V==2');

然后,您可以在 Variant Subsystem 模块的模块参数对话框中将这些 Simulink.Variant 对象指定为变体控制项。

Condition 字段现在反映了封装的变体条件。使用此方法,您可以开发可重用的复杂变体条件表达式。

用于代码生成的 Simulink.Parameter 对象或 MATLAB 变量

如果要为包含变体选择项的模型生成代码,请将变体控制项变量指定为 MATLAB 变量或 Simulink.Parameter 对象。Simulink.Parameter 对象允许您指定生成代码所需的其他属性(如数据类型)。

VSSMODE = Simulink.Parameter;
VSSMODE.Value = 1;
VSSMODE.DataType = 'int32';
VSSMODE.CoderInfo.StorageClass = 'Custom';
VSSMODE.CoderInfo.CustomStorageClass = 'ImportedDefine';
VSSMODE.CoderInfo.CustomAttributes.HeaderFile =...
'rtwdemo_importedmacros.h';
定义为 Simulink.Parameter 对象的变体控制项变量可以具有以下存储类之一:

  • 指定了头文件的 DefineImportedDefine

  • CompilerFlag

  • SystemConstant (AUTOSAR)

  • 将数据定义为宏的存储类

您还可以将标量变体控制项变量转换为 Simulink.Parameter 对象。请参阅Convert Variant Control Variables into Simulink.Parameter Objects

用于提高代码可读性的枚举类型

使用枚举类型为用作变体控制项值的整数赋予有意义的名称。

  1. 在 MATLAB 编辑器中,定义用于将枚举值映射到有意义名称的类。

    classdef sldemo_mrv_CONTROLLER_TYPE < Simulink.IntEnumType
            enumeration
            NONLINEAR (1)
            SECOND_ORDER (2)
            end
    end
    
  2. 在全局工作区中为这些类定义 Simulink.Variant 对象。

    VE_NONLINEAR_CONTROLLER = Simulink.Variant...
    ('E_CTRL==sldemo_mrv_CONTROLLER_TYPE.NONLINEAR')
    VE_SECOND_ORDER_CONTROLLER =Simulink.Variant...
    ('E_CTRL==sldemo_mrv_CONTROLLER_TYPE.SECOND_ORDER')
    VE_PROTOTYPE =Simulink.Variant...
    ('E_CURRENT_BUILD==sldemo_mrv_BUILD_TYPE.PROTOTYPE')
    VE_PRODUCTION =Simulink.Variant...
    ('E_CURRENT_BUILD==sldemo_mrv_BUILD_TYPE.PRODUCTION')

    使用枚举类型可简化生成的代码,因为它包含值的名称而不是整数。

查看变体条件

Variant Condition Legend 可帮助您可视化与模型相关联的变体条件。要查看 Variant Condition Legend,请在 Debug 选项卡上,选择 Information Overlays > Variant Legend

注意

如果 Variant Legend 不可用,请在 Debug 选项卡上,选择 Information Overlays > Variant Conditions

默认情况下,Variant Condition Legend 在仿真期间显示变体条件注释和变体条件。要在生成的代码中查看变体条件,请在 Variant Condition Legend 窗口中选择 Show generated code conditions 选项。

在 Variant Condition Legend 中,模块上的变体条件被注释为 v:c,其中 v 是变体语义指示符,c 表示变体条件索引。您可以逐个点击带有超链接的变体注释以观察条件对应的模型部分。

将鼠标悬停在具有变体条件的模块上时,工具提示会显示变体注释以及该模块的相关变体条件。要查看变体条件注释工具提示,必须选中 Variant Condition 选项。

要以编程方式查看 Variant Condition Legend,请在 MATLAB 命令行窗口中使用 Simulink.VariantManager.VariantLegend 函数。

变体条件表达式中的运算符和操作数

Simulink 计算变体控制项中的条件表达式,以确定活动变体。您可以在条件表达式中包含以下操作数:

  • 标量变量

  • Simulink.Parameter 对象,它们并非结构体且数据类型不是 Simulink.Bus 对象

  • 枚举类型

  • 用于分组的括号

变体条件表达式可以包含 MATLAB 运算符,前提是表达式的计算结果为布尔值。在这些示例中,AB 是计算为整数的表达式,x 是整数字面值常量。

支持预处理器条件句生成的 MATLAB 表达式C 预处理器条件中的等效表达式
算术
  • A + B

  • +A

  • A + B

  • A

  • A - B

  • -A

  • A - B

  • -A

A * BA * B
idivide(A,B)

A / B

如果第二个操作数 (B) 的值为 0,则行为未定义。

rem(A,B)

A % B

如果第二个操作数 (B) 的值为 0,则行为未定义。

关系

A == B

A == B

A ~= B

A != B

A < B

A < B

A > B

A > B

A <= B

A <= B

A >= B

A >= B
Logical
~A!A,其中 A 不是整数
A && BA && B
A || BA || B
按位(AB 不能均为整数字面值常量)

bitand(A,B)

A & B

bitor(A,B)

A | B

bitxor(A,B)

A ^ B

bitcmp(A)

~A

bitshift(A,x)

A << x

bitshift(A,-x)

A >> x

净变体条件

净变体条件是局部条件及其父级条件的总和。

以此模型 slex_netvariant 为例,它具有两个单输入单输出 (SISO) Variant Source 模块 Variant SourceVariant Source1,变体条件分别为 V==1W==1

当您仿真此模型时,Variant Source1 模块和 Subsystem 模块内的其他模块将获得从 Variant Source1 传播而来的局部条件 W==1。父级条件 V==1 会从 Variant Source 模块传播到 Subsystem 模块。因此,Variant Source1 模块和 Subsystem 模块内的其他模块的净变体条件为 V==1 && W==1

相关示例

详细信息