ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

バリアント制御の紹介

バリアントを含む Simulink® モデルのコンポーネントは選択したバリアントの選択に基づいてアクティブ化または非アクティブ化されます。

モデル内のバリアントのそれぞれの選択は、バリアント制御と呼ばれる条件式に関連付けられます。バリアント制御は、どのバリアントの選択がアクティブであるかを決定します。バリアント制御の値を変更することによって、アクティブなバリアントの選択を切り替えることができます。

バリアントのそれぞれの選択がバリアント制御に関連付けられますが、1 つのバリアント制御のみが true として評価されます。バリアント制御が true に評価された場合、Simulink はそのバリアント制御に対応するバリアント選択を有効にします。

バリアント制御は、true に評価される場合に特定のバリアント選択を有効にする論理式です。

メモ

バリアント制御は MATLAB® グローバル ワークスペースまたはデータ ディクショナリで指定できます。

バリアント制御は Simulink.Variant オブジェクト、MATLAB 式 (構造体を含む)、または 1 つ以上のこれらのオペランドおよび演算子を含む式として指定できます。

バリアント制御モード

[ブロック パラメーター] ダイアログ ボックスの [バリアント制御モード] パラメーターを使用すると、バリアント ブロックのモデル化に使用するモードを [Expression] にするか [Label] にするかを選択できます。

  • Expression: バリアント条件の評価に基づいてアクティブなバリアントを指定します。

    バリアント制御モード:式

  • Label: 名前に基づいたバリアント制御 (ラベル モードのアクティブな選択肢) を指定します。[Label] モードでは、グローバル ワークスペースでバリアント制御を作成する必要はありません。代わりに、ラベル モードのアクティブな選択肢をコマンド ラインで選択することができます。たとえば、set_param(block,'LabelModeActiveChoice', 'Choice_1') のようになります。

    バリアント制御モード:ラベル

オペランド

  • 整数データ型または列挙データ型とスカラー リテラル値をもつ MATLAB 変数または Simulink.Parameter オブジェクトに解決される変数名

  • Simulink.Variant オブジェクトに解決される変数名

  • 整数または列挙値を表すスカラーのリテラル値

演算子

  • グループ化に使用される小かっこ

  • 算術演算子、関係演算子、論理演算子、またはビット単位演算子

詳細については、バリアント条件式の演算子とオペランドを参照してください。

モデルのコンパイル時に、Simulink は、バリアント制御が true と評価される場合にバリアントの選択がアクティブであると判断します。アクティブなバリアントの評価はコンパイルの早い段階で行われます。また、アクティブなバリアントは、モデルがコンパイルされた後は変更できません。

既知の制限事項

  • Simulink の構造体内のバリアント オブジェクトは許可されません。

  • Simulink の構造体内のパラメーターは許可されません。

バリアント制御を指定する方法

プロトタイプを作成するときに使用するオプションから、モデルからコードを生成するために必要なオプションまで、バリアントの選択を切り替えるための多くのアプローチを使用できます。

指定目的
スカラー変数ラピッド プロトタイピングA == 1
Simulink.Variant オブジェクトバリアント条件の再利用LinearController = Simulink.Variant('FUEL==2 && EMIS==1');
Simulink.Parameter オブジェクトまたは MATLAB 変数コード生成用のプリプロセッサ条件の生成mode == 1、ここで modeSimulink.Parameter オブジェクトまたは MATLAB 変数
列挙型条件値が整数ではなく意味のある名前として表されるため、コードの可読性が向上LEVEL == Level.Advanced

関数 Simulink.VariantManager.findVariantControlVars を使用して、制御変数を見つけることができます。

ラピッド プロトタイピングのためのスカラー変数

スカラーの MATLAB 変数は、まだモデルを作成しているときに、バリアントの選択のプロトタイプをすばやく作成できるようにします。これにより、バリアントの選択を有効にする式の開発よりも、バリアントの選択の作成により集中できます。

Variant Subsystem ブロックで表現された 2 つのバリアントの選択を含むモデルについて検討します。

Variant Subsystem ブロックの [ブロック パラメーター] ダイアログ ボックスで、バリアント制御を最も単純な形式であるスカラー変数で指定できます。

このバリアント制御はそれ自体が条件であるため、Linear ControllerNonlinear Controller の両方の [条件] フィールドは [N/A] です。

スカラー変数 V を定義し、MATLAB コマンド ウィンドウでその値を 1 に設定することによって、バリアントの選択の 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 オブジェクトをバリアント制御として指定できます。

今回は [条件] フィールドにはカプセル化されたバリアント条件が反映されています。この方法を使用すると、再利用可能な複雑なバリアント条件式を開発できます。

コード生成のための 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 オブジェクトとして定義されたバリアント制御変数は、次のいずれかのストレージ クラスをもつことができます。

  • ヘッダー ファイルが指定された Define または ImportedDefine

  • CompilerFlag

  • SystemConstant (AUTOSAR)

  • データをマクロとして定義する独自のカスタム ストレージ クラス

スカラーのバリアント制御変数を Simulink.Parameter オブジェクトに変換することもできます。バリアント制御変数の Simulink.Parameter オブジェクトへの変換を参照してください。

コードの可読性を高めるための列挙型

列挙型を使用し、バリアント制御値として使う整数に意味のある名前を与えます。

  1. MATLAB エディターで、列挙型の値を意味のある名前にマップするクラスを定義します。

    classdef sldemo_mrv_CONTROLLER_TYPE < Simulink.IntEnumType
            enumeration
            NONLINEAR (1)
            SECOND_ORDER (2)
            end
    end
    
    classdef sldemo_mrv_BUILD_TYPE < Simulink.IntEnumType
            enumeration
            PROTOTYPE (1)
            PRODUCTION (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')

    列挙型を使用すると、整数ではなく値の名前が使用されるので、生成されたコードがわかりやすくなります。

バリアント条件の表示

[バリアント条件の凡例] を使用すると、モデルに関連付けられたバリアント条件を可視化できます。[バリアント条件の凡例] を表示するには、[情報表示][ブロック][バリアント条件の凡例] をクリックします。

メモ

[バリアント条件の凡例][情報表示][ブロック][バリアント条件] がアクティブな場合にのみ使用できます。

既定の設定では、[バリアント条件の凡例] には、シミュレーション中のバリアント条件のバリアント条件と注釈が表示されます。生成コードでバリアント条件を表示するには、[バリアント条件の凡例][Show generated code conditions] オプションを選択します。

[バリアント条件の凡例] で、ブロックのバリアント条件は、v:c のように注釈されます。ここで v はバリアント セマンティクス インジケーターで、c はバリアント条件のインデックスを表します。ハイパーリンクされたバリアントの注釈をクリックして、条件が該当するモデルの部分を表示できます。

バリアント条件をもつブロックにカーソルを合わせると、ツールヒントにバリアントの注釈とブロックに関連するバリアント条件が表示されます。バリアント条件の注釈のツールヒントを表示するには、[バリアント条件] オプションを選択しなければなりません。

[バリアント条件の凡例] をプログラムで表示するには、MATLAB コマンド ウィンドウで関数 Simulink.VariantManager.VariantLegend を使用します。

バリアント条件式の演算子とオペランド

Simulink はバリアント制御内で条件式を評価し、アクティブなバリアントの選択を決定します。条件式には、次のオペランドを含めることができます。

  • スカラー変数

  • 構造体ではない、Simulink.Bus オブジェクト以外のデータ型をもつ Simulink.Parameter オブジェクト

  • 列挙型

  • グループ化に使用される小かっこ

式がブール値を評価する場合、バリアント条件式には MATLAB 演算子を含めることができます。以下の例では、A および B は整数を評価する式であり、x は定数の整数リテラルです。

プリプロセッサ条件の生成をサポートする MATLAB 式C プリプロセッサ条件での等価な式
算術式
  • A + B

  • +A

  • A + B

  • A

  • A - B

  • -A

  • A - B

  • -A

A * BA * B
idivide(A,B)

A / B

2 番目のオペランド (B) の値が 0 の場合、動作は未定義です。

rem(A,B)

A % B

2 番目のオペランド (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
論理式
~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

関連する例

詳細