Variant Control Modes in Variant Blocks
The components of a Simulink® model that contain variants are activated or deactivated based on the variant choice that you select.
Each variant choice in your model is associated with a variant
control. Variant controls determine which variant choice is active. By
changing the value of a variant control, you can switch the active variant choice. While
each variant choice is associated with a variant control, only one variant control can
evaluate to true
. When a variant control evaluates to
true
, Simulink activates the variant choice that corresponds to that variant control. For
a simple example, see Introduction to Variant Controls.
Types of Variant Control Modes in Variant Blocks
These are types of variant control modes in Simulink:
expression
— Inexpression
mode, Simulink chooses the active variant based on the evaluation of the variant conditions. When a condition expression evaluates totrue
, the corresponding variant choice becomes active. When a condition expression evaluates tofalse
, the corresponding variant choice becomes inactive. See Switch Between Choices Using Condition Expressions in Variant Blocks.label
— Inlabel
mode, Simulink chooses the active variant based on the name of the variant. The variant control is a string and does not require you to create any variable in any workspaces. See Switch Between Choices Using Labels in Variant Blocks.sim codegen switching
— To automatically switch between the variants for simulation and code generation workflows without creating any workspace variable, usesim codegen switching
mode. When you simulate a model, Simulink automatically chooses thesim
branch as the active choice. Similarly, when you do a software-in-the-loop (SIL) or processor-In-Loop (PIL) simulation, generate code, or use external mode, Simulink automatically chooses thecodegen
branch. This mode is not supported for models configured with an ERT-based system target file and service code interface. See Switch Between Choices for Simulation and Code Generation Workflows Without Using Control Variables in Variant Blocks.
Switch Between Choices Using Condition Expressions in Variant Blocks
In expression
mode, Simulink chooses the active variant based on the evaluation of the variant
conditions. When a condition expression evaluates to true
, the
corresponding variant choice becomes active. When a condition expression evaluates
to false
, the corresponding variant choice becomes
inactive.
You can use the expression
type of variant controls in
variant blocks and in variant parameters.
Note
You can simulate and generate code from the model containing a variant
block with Variant control mode set to
expression
mode. The generated code can
contain active and inactive choices that are enclosed in preprocessor
conditionals #if
and #elif
, or regular
if
conditions.
Use expression
Type of Variant Control in Variant Blocks
To specify the variant condition expressions in variant blocks:
Right-click the badge on the variant block, select Block Parameters, and then specify the variant condition expression in the Variant control expression parameter of the block parameter dialog box.
Use this command.
In this command,set_param('Model/Controller/Linear Controller',... 'VariantControl', 'VSS_MODE == 1')
Model/Controller/Linear Controller
is the full path of the variant choice, andVSS_MODE == 1
is the expression associated with the variant choice in the modelModel
.
Types of Variant Controls in expression
Mode
The variant controls can be:
Boolean condition expression for rapid prototyping. For example,
A == 1
,A ~= B
,A && B == 1
, and so on.A
Simulink.Variant
object that contains condition expressions for condition reuse. See Simulink.Variant Objects for Variant Condition Reuse of Variant Blocks.A default variant control if none of the choices evaluates to
true
. You can specify at most one variant choice as the default for the block. During simulation, if none of the variant controls evaluate totrue
, Simulink uses the default variant as the active variant choice. To set a variant choice as the default, select the(default)
keyword in the Variant control expression column for that choice.
Here, A
and B
are operands
called as variant control variables.
+
, ==
, and &&
are operators in the condition expression. The condition expression can contain
one or more such variant control variables and operators. For information on
supported types and storage location of variant control variables, see Types of Variant Control Variables (Operands) in Variant Blocks and Storage Locations for Variant Control Variables (Operands) in Variant Blocks. For
information on operators, see Types of Operators in Variant Blocks for Different Activation Times.
Note
You can comment out the variant controls by placing a %
symbol before the control expressions. During simulation, if the
corresponding variant choice is active, Simulink ignores the variant choice. However, Simulink continues to execute block callbacks inside the variant
choice.
Types of Variant Control Variables (Operands) in Variant Blocks
In expression
mode, you can specify the variant
control variables as any of these types, from options to use while prototyping
to options required for generating code from your model.
Specification | Purpose | Example |
---|---|---|
Simulink.VariantControl | Associate a variant activation time to switch choices coherently | A == 1 , where A is a
Simulink.VariantControl object. See Simulink.VariantControl Variables for Coherent Switching of Choices in Variant Blocks. |
Scalar variable | Rapid prototyping |
|
Simulink.Parameter object | Generate preprocessor conditionals for code generation | Vssmode == 1 , where
Vssmode is a
Simulink.Parameter object. See Simulink.Parameter Type of Variant Control Variables for Code Generation in Variant Blocks. |
Simulink Enumerations | Improved code readability because condition values are represented as meaningful names instead of integers | LEVEL == Level.Advanced , where
Level is an integer-based enumeration
class and Advanced is the enumerated value.
See Enumerated Types To Improve Code Readability of Variant Control Variables of Variant Blocks. |
Simulink.Variant
object | Reuse variant conditions |
Note A Variant Assembly Subsystem block
does not support
|
struct | Group related variant control variables | Controller.Linear == 1 , where
Controller is a
struct and Linear is
its field. See Structures to Group Related Variant Control Variables of Variant Blocks. |
For list of all examples, see Use Variant Control Variables in Variant Blocks.
Storage Locations for Variant Control Variables (Operands) in Variant Blocks
You can define the variant control variables in different storage locations based on your requirement.
Note
All the variant control variables in a variant block must originate from the same storage location.
Storage Location | Use for Storage Location | Supported Types of Variant Control Variables (See Types of Variant Control Variables (Operands) in Variant Blocks) | For More Information |
---|---|---|---|
Base workspace | Store variables while you experiment with temporary models | Scalar variables, Simulink.Variant ,
Simulink.Parameter , enumerated type,
Simulink.VariantControl , and
struct | Temporary Data: Base Workspace |
Mask workspace | Permanently store data that is local to the mask of a block. | Scalar variables, enumerated type, and
Simulink.VariantControl | Approaches to Control Active Variant Choice of a Variant Block Using Mask or Model Workspace |
Model workspace | Permanently store data that is local to a model | Scalar variables, enumerated type, and
Simulink.VariantControl | Approaches to Control Active Variant Choice of a Variant Block Using Mask or Model Workspace |
Data dictionary | Permanently store global data, share data between models, and track changes made to data. | Scalar variables, Simulink.Variant ,
Simulink.Parameter , enumerated type,
Simulink.VariantControl , and
struct | What Is a Data Dictionary? |
For capabilities and advantages of each storage location, see Determine Where to Store Variables and Objects for Simulink Models
Types of Operators in Variant Blocks for Different Activation Times
Variant condition expressions can contain MATLAB® operators, provided the expression evaluates to a Boolean value.
In variant blocks, the operators that you can use to form a variant condition expression depends on the Variant activation time.
When you specify the Variant activation time as:
update diagram
— Any condition expression that evaluates totrue
orfalse
.update diagram analyze all choices
orcode compile
— The supported operators are:Parentheses for grouping
Arithmetic Operators, Relational Operators, Logical Operators, and Bit-Wise Operations, as listed in this table.
This table lists the MATLAB operators and their representation in the generated code. In these examples,
A
andB
are expressions that evaluate to an integer, andx
is a constant integer literal.MATLAB Expressions That Support Generation of Preprocessor Conditionals Equivalent Expression in C Preprocessor Conditional of Generated Code Arithmetic A + B
+A
A + B
A
A - B
-A
A - B
-A
A * B
A * B
idivide(A,B)
A / B
If the value of the second operand (
B
) is0
, the behavior is undefined.rem(A,B)
A % B
If the value of the second operand (
B
) is0
, the behavior is undefined.Relational 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
, whereA
is not an integerA && B
A && B
A || B
A || B
Bitwise ( A
andB
cannot both be constant integer literals)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
startup
— The supported operators are:Parentheses for grouping
Relational Operators and Logical Operators, as listed in this table.
This table lists the MATLAB operators and their representation in the generated code. In these examples,
A
andB
are expressions that evaluate to an integer.Supported Operators in Variant Condition Expression Equivalent Expression in Regular if
of Generated CodeRelational A == B
A == B
A ~= B
A != B
Logical ~A
!A
, whereA
is not an integerA && B
A && B
A || B
A || B
Note
In variant blocks with startup
activation time:
The variant control variables that originate from the mask or the model workspace cannot be used in the function-call operators such as
idivide
,bitand
, and so on to form expressions.AUTOSAR post-build variants support only
==
and&&
operators. For more information, see Configure Postbuild Variant Conditions for AUTOSAR Software Components (AUTOSAR Blockset).
Evaluate Variant Condition Expressions at Different Variant Activation Times
In expression
mode, you can specify if Simulink must evaluate condition expressions during model compile,
simulation-loop, code compile, or model start up stage of simulation and code
generation workflow using variant activation times. For information on stages of
simulation and code generation and supported variant activation times in
expression
mode, see Activate Variant During Different Stages of Simulation and Code Generation Workflow.
Automatically Identify Variant Regions Using Variant Condition Propagation
Simulink determines the model components that are active during simulation by the process of variant condition propagation. This process evaluates the variant controls specified on the variant blocks and automatically propagates the variant conditions to the connecting blocks. Variant conditions can propagate through signal lines, buses, and function calls to reach other blocks in the model. The process deactivates the model components associated with the inactive choices and they do not participate in simulation. You can stop condition propagation to define variant regions in the model.
You can use the Variant Conditions Legend to visualize the propagated variant conditions that activate each variant choice. Simulink annotates model components if there are variant conditions on them, and the Variant Conditions Legend displays the condition that corresponds to each annotation.
For more information, see Propagate Variant Conditions to Define Variant Regions with Variant Blocks.
Switch Between Choices Using Labels in Variant Blocks
In label
mode, Simulink chooses the active variant based on the name of the variant. The
variant control is a string
and does not require you to create
variable in any workspaces.
Note
In label
mode, the activation time of the
variant block is set to update diagram
by
default. In other words, when you simulate a model or generate code from a
model, Simulink determines the active choice in the model compilation stage
and generates code only for the active choice. See Activate Variant During Different Stages of Simulation and Code Generation Workflow.
Use label
Mode in Variant Blocks
To specify the labels for choices in variant blocks, right-click the badge on the variant block, select Block Parameters, and then specify the labels in the Variant control label parameter of the block parameter dialog box.
Set Active Choices Using Variant Control Labels
You can follow any of these approaches to set active choices in
label
mode:
Specify a name for each variant choice in the Variant control label parameter of the variant block dialog box. All the names that you specify are listed in the Label mode active choice drop-down. The label that you select from the list becomes the active choice.
Right-click the badge on the variant block and select Label Mode Active Choice.
From the mask workspace using the initialization code. Using the mask initialization code, you can specify the active choice from variant block or any subsystem in the hierarchy. The active choice you specify in the mask initialization code overrides the active choice you specify using the Label mode active choice drop-down or the Label Mode Active Choice menu item. For more information, see Mask a Variant Subsystem.
Use this command:
where blockName is the name of the variant block and variantChoiceLabel is the label associated with the variant choice.set_param(blockName,'LabelModeActiveChoice', 'variantChoiceLabel')
Switch Between Choices for Simulation and Code Generation Workflows Without Using Control Variables in Variant Blocks
To automatically switch between the choices for simulation and code generation
workflows without creating any workspace variable, use the sim codegen
switching
variant control mode.
Note
In sim codegen switching
mode, only the
update diagram
and the update
diagram analyze all choices
activation times are supported. In
other words, when you simulate or generate code from a model, Simulink determines the active choice in the model compilation stage and
generates the code only for the choice. See, Activate Variant During Different Stages of Simulation and Code Generation Workflow.
Use sim codegen switching
Mode in Variant Blocks
To specify simulation and code generation branches for variant choices,
right-click the badge on the variant block, select Block
Parameters, and then specify the (sim)
and
(codegen)
keywords in the Variant control
switch parameter of the block parameter dialog box.
When you simulate a model in normal, accelerator, or rapid Accelerator mode,
Simulink automatically chooses the (sim)
branch as the
active choice. Similarly, when you do a software-in-the-loop (SIL),
processor-In-Loop (PIL) simulation or generate code or use external mode,
Simulink automatically chooses the (codegen)
branch. The
code is generated only for the active choice. Inactive choices are not included
in the generated code. In this mode, you can at most have only two choices in
the variant block.
Compare Different Types of Variant Control Modes in Variant Blocks
This table explains the capabilities of different variant control modes to help you choose one that caters to your requirement.
Variant control mode | Capabilities |
---|---|
| Use
|
| Use
|
| Use
|
Variant Activation Times for Different Variant Control Modes in Variant Blocks
This table explains the variant activation time supported for different variant control modes in variant blocks. For information on variant activation times, see Activate Variant During Different Stages of Simulation and Code Generation Workflow.
Variant activation time | |||||
---|---|---|---|---|---|
Variant blocks | Variant control mode | update diagram | update diagram analyze all choices | code compile | startup |
Variant Subsystem, Variant Model, Variant Source, Variant Sink | expression | ✓ | ✓ | ✓ | ✓ |
label | ✓ | x | x | x | |
sim codegen switching | ✓ | ✓ | x | x | |
Variant Connector (Simscape), Manual Variant Source, Manual Variant Sink | expression | ✓ | x | x | x |
label | not supported | ||||
sim codegen switching | not supported | ||||
Simulink Function, Initialize Function, Reset Function, and Terminate Function | expression | ✓ | ✓ | ✓ | x |
label | not supported | ||||
sim codegen switching | not supported |