Control Variant Choices in Masked Variant Assembly Subsystem Block Using Mask Parameter Object - MATLAB & Simulink (original) (raw)

Main Content

This section shows how to specify variant choices and set an active choice in a masked Variant Assembly Subsystem option of a Variant Subsystem block by using a mask parameter object.

Switch Between Variant Choices of Masked Variant Assembly Subsystem Block in Label Mode

In this example, you create one MATLABĀ® class per variant choice. To activate a variant choice, you instantiate the corresponding class using a mask parameter object. You then access the class property to get the names of the variant choices and to set a variant choice to be active.

Explore Model

Open the model slexVariantAssemblySubsystemWithMaskInLabel, which contains a masked Variant Assembly Subsystem block, Controller.

open_system('slexVariantAssemblySubsystemWithMaskInLabel')

Define Classes for Reference Models

In this example, the vas_controller class is a superclass that includes a property and two methods. The getVariantChoices method returns a cell array of variant choices to be added to the Variant Assembly Subsystem block. From the list of choices, the setActiveVariant method sets the choice, specified as subsystemFile, to be active.

classdef (Abstract) vas_controller properties subsystemFile char end methods (Static) function list = getVariantChoices() list = {'linearController','nonlinearController'}; end end

methods
    function setActiveVariant(obj,blk)
        set_param(blk,'LabelModeActiveChoice',obj.subsystemFile)
    end
end

end

The two classes vas_linearController and vas_nonlinearController inherit from the vas_controller superclass. The vas_linearController class stores the name of the active choice as linearController in the inherited property subsystemFile. The class also stores numerator and denominator values used in the Discrete Transfer Fcn block of the linearController model.

type vas_linearController.m

classdef vas_linearController < vas_controller properties numerator denominator end

methods
    function obj = vas_linearController()
        obj.numerator = [1 .7];
        obj.denominator = [1 .09 0.5];
        obj.subsystemFile = 'linearController';
    end
end

end

Similarly, the vas_nonlinearController class stores the name of the active choice as nonlinearController in subsystemFile. The class also stores breakpoint and table values used in the 1-D Lookup Table of the nonLinearController model.

type vas_nonlinearController.m

classdef vas_nonlinearController < vas_controller properties breakpoints table end

methods
    function obj = vas_nonlinearController()
        obj.breakpoints = -5:5;
        obj.table = tanh(-5:5);
        obj.subsystemFile = 'nonlinearController';
    end
end

end

Set Parameter Object Value in Parent Model

Double-click the Controller block to open the mask dialog box.

The value that you specify for vssObj in the mask dialog box is mapped to the mask parameter object obj.

Using obj, you can instantiate the class vas_linearController or vas_nonlinearController. You can then call its methods, getVariantChoices and setActiveVariant.

For example, to specify the variant choices of the Controller block, the Variant choices specifier parameter in the Block Parameters dialog box is set to obj.getVariantChoices().

To set an active choice in the Variant Assembly Subsystem block, the obj.setActiveVariant() method is used in its mask initialization code.

Set Active Choice by Instantiating Classes Using Mask Parameter Object

Case 1: linearController Is Active and nonlinearController Is Inactive

When you specify vssObj as vas_linearController, the value vas_linearController is mapped to the mask parameter object obj. The Variant choices specifier parameter value obj.getVariantChoices() evaluates to a cell array that contains the filenames linearController and nonlinearController to be added as variant choices to the Controller block. obj.setActiveVariant(gcb) in the mask initialization code sets the linearController subsystem to be active.

vssObj = vas_linearController; out = sim('slexVariantAssemblySubsystemWithMaskInLabel'); plot(out.tout, out.yout); xlabel('Time (seconds)') ylabel('data')

Case 2: linearController Is Inactive and nonlinearController Is Active

When you specify vssObj as vas_nonlinearController, the value vas_nonlinearController is mapped to the mask parameter object obj. The Variant choices specifier parameter value obj.getVariantChoices() evaluates to a cell array that contains the filenames linearController and nonlinearController to be added as variant choices to the Controller block. obj.setActiveVariant(gcb) in the mask initialization code sets the nonlinearController subsystem to be active.

vssObj = vas_nonlinearController; out = sim('slexVariantAssemblySubsystemWithMaskInLabel'); plot(out.tout, out.yout); xlabel('Time (seconds)') ylabel('data')

See Also

Add or Remove Variant Choices of Variant Assembly Subsystem Blocks Using External Files

Switch Between Variant Choices of Masked Variant Assembly Subsystem Block in Expression Mode

In this example, you create one MATLABĀ® class per variant choice. To activate a variant choice, you instantiate the corresponding class using a mask parameter object. You then access the class property to get the name of the variant file to be activated. SimulinkĀ® then compares the variant filename to the variant choice names by evaluating the variant control expressions and activates the variant choice for the expression that evaluates to true.

Explore Model

Open the model slexVariantAssemblySubsystemWithMaskInExpression, which contains a masked Variant Assembly Subsystem block, Controller.

mdl = 'slexVariantAssemblySubsystemWithMaskInExpression'; open_system(mdl)

The Controller block has two Subsystem Reference choices, linearController and nonlinearController. The choices are added to the Controller block using the slexVasExprControllerTypes enumeration class. To add more choices, add members to slexVasExprControllerTypes.

type slexVasExprControllerTypes.m

classdef slexVasExprControllerTypes < Simulink.IntEnumType %

% Copyright 2023 The MathWorks, Inc.

enumeration linearController(0) nonlinearController(1) end end

Define Classes for Reference Models

In this example, the slexVasExprControllerVariant class is a superclass that includes a property, variantFile, of enumerated type slexVasExprControllerTypes.

type slexVasExprControllerVariant.m

classdef (Abstract) slexVasExprControllerVariant %

% Copyright 2023 The MathWorks, Inc.

properties
    variantFile slexVasExprControllerTypes;
end

end

The two classes slexVasExprLinearController and slexVasExprNonLinearController inherits property from the slexVasExprController superclass. The slexVasExprLinearController class represents the linearController variant. This class stores the name of the active choice as linearController in the inherited property variantFile. The class also stores numerator and denominator values used in the Discrete Transfer Fcn block of the linearController model.

type slexVasExprLinearController.m

classdef slexVasExprLinearController < slexVasExprControllerVariant %

% Copyright 2023 The MathWorks, Inc.

properties
    numerator
    denominator
end

methods
    function obj = slexVasExprLinearController()
        % Values for the properties of this variant
        obj.numerator = [1 .7];
        obj.denominator = [1 .09 0.5];
        % Specify which subsystem file it corresponds to
        obj.variantFile = 'linearController';
    end
end

end

Similarly, the slexVasExprNonLinearController class represents the nonlinearController variant. It stores the name of the active choice as nonlinearController in the inherited property variantFile. This class stores breakpoint and table values used in the 1-D Lookup Table of the nonLinearController model.

type slexVasExprNonLinearController.m

classdef slexVasExprNonLinearController < slexVasExprControllerVariant %

% Copyright 2023 The MathWorks, Inc.

properties % parameters specific to this variant
    breakpoints
    table
end
methods
    function obj = slexVasExprNonLinearController()
        % values for the additional parameters
        obj.breakpoints = -5:5;
        obj.table = tanh(-5:5);
        % and the file
        obj.variantFile = 'nonlinearController';
    end
end

end

Set Active Choice by Instantiating Classes Using Mask Parameter Object

In this example, the value that you specify for ctrlObj in the mask dialog box of the Controller block is mapped to the mask parameter object obj. Using obj, you can instantiate the class slexVasExpLinearController or slexVasExpNonLinearController. You can then access its property, variantFile to get the filename of the variant choice to be activated.

Case 1: linearController Is Active and nonlinearController Is Inactive

When you specify ctrlObj as slexVasExprLinearController, the class slexVasExprLinearController is instantiated. The class properties including variantFile are initialized.

ctrlObj = slexVasExprLinearController;

During simulation, slexVasExprLinearController, the value of ctrlObj, is mapped to the mask parameter object obj. The left side and the right side of the variant control expression obj.variantFile == slexVasExprControllerTypes.linearController each resolve to linearController. The expression evaluates to true and linearController becomes active.

Similarly, to set nonlinearController to be active, set ctrlObj to slexVasExprNonLinearController.

ctrlObj = slexVasExprNonLinearController; sim(mdl);

Optionally, you can plot the results for both the variant choices as shown:

in(1:2) = Simulink.SimulationInput(mdl); in(1) = in(1).setVariable('ctrlObj',slexVasExprLinearController); in(2) = in(2).setVariable('ctrlObj',slexVasExprNonLinearController); out = sim(in); figure plot(out(1).tout, out(1).yout); hold on plot(out(2).tout, out(2).yout) xlabel('Time (seconds)') ylabel('Data')

[01-Feb-2025 16:16:00] Running simulations... [01-Feb-2025 16:16:01] Completed 1 of 2 simulation runs [01-Feb-2025 16:16:01] Completed 2 of 2 simulation runs

See Also

Add or Remove Variant Choices of Variant Assembly Subsystem Blocks Using External Files