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

Variant Subsystem

このモデルでは Simulink® Variant Subsystem について説明します。Variant Subsystem を使用すると、シミュレーション時には 1 つの実装のみアクティブであるサブシステムに対して、複数の実装を提供することができます。プログラムでアクティブな実装を切り替え、モデルを変更せずに他の実装で置き換えることができます。

Variant Subsystem の概要

Variant Subsystem ブロックには複数の子サブシステムがあり、モデルの実行時にいずれかの子がアクティブになります。アクティブな子サブシステムは "アクティブなバリアント" と呼ばれます。Variant Subsystem ブロックのアクティブなバリアントは、グローバル ワークスペース内の変数の値を変更することによってプログラムで切り替えるか、または Variant Subsystem ブロックのダイアログを使用してバリアントの選択を手動でオーバーライドすることによって切り替えることができます。"アクティブなバリアント" はモデルのコンパイル時に Simulink によって Variant Subsystem の Inport ブロックと Outport ブロックにプログラムで結線されます。

バリアントの選択をプログラムで制御するには Variant Subsystem ブロックのダイアログで Simulink.Variant オブジェクトを各子サブシステムに関連付けます。Simulink.Variant オブジェクトは MATLAB® グローバル ワークスペースで作成されます。これらのオブジェクトには、ブール値として評価され、アクティブなバリアントの子サブシステムを決定するために使用される式である、Condition という名のプロパティがあります。

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

たとえば、VSS_LINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==1');

を定義すると、グローバル ワークスペースに Simulink.Variant オブジェクトが作成され、コンストラクターの引数 ('VSS_MODE==1') はそのバリアントがアクティブになるときを定義します。次に [Variant Subsystem] ダイアログを使用し、VSS_LINEAR_CONTROLLER を Variant Subsystem 内の子サブシステムの 1 つに関連付けます。グローバル ワークスペースで、

VSS_MODE=1

を定義すると、VSS_LINEAR_CONTROLLER バリアントがアクティブになります。条件引数は、スカラー変数、列挙型、等値、非等値、&&、, および ~ で構成される "単純な式" にすることができます。小かっこ () を使用すると、優先順位をグループ化できます。

Variant Subsystem の使用方法

この例のモデルでは、次のバリアント オブジェクトとバリアント制御変数を使用します。これらは MATLAB グローバル ワークスペースで定義します。

VSS_LINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==1');

VSS_NONLINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==2');

VSS_MODE=2;

モデル例 sldemo_variant_subsystems を開くと、File -> ModelProperties -> Callbacks で定義された PreLoadFcn が実行されます。これにより、グローバル ワークスペースに Controller という名の Variant Subsystem ブロックの変数が入力されます。

open_system('sldemo_variant_subsystems')

図 1: モデル例、sldemo_variant_subsystems

Simulink.Variant オブジェクトの Controller サブシステム用の関連付けを指定するには、Controller サブシステムを右クリックし、[サブシステムのパラメーター] を選択します。これで Controller subsystem ブロックのダイアログが開きます。

[Controller subsystem ブロック] ダイアログで、可能なバリアントが 2 つ指定されます。それらの 2 つのバリアントが、VSS_LINEAR_CONTROLLERVSS_NONLINEAR_CONTROLLER という 2 つの Simulink.Variant オブジェクトに関連付けられます。これらのオブジェクトはグローバル ワークスペース内に存在しています。これらのオブジェクトには、論理値として評価され、どのバリアントがアクティブになるのかを特定する式である、Condition という名のプロパティがあります。条件は、[Variant Subsystem ブロック] ダイアログにも表示されます。この例では、VSS_LINEAR_CONTROLLERVSS_NONLINEAR_CONTROLLER の条件のプロパティはそれぞれ VSS_MODE == 1VSS_MODE == 2 です。変数 VSS_MODE はグローバル ワークスペース内に存在し、標準の MATLAB 変数または Simulink.Parameter にすることができます。

関連付けられたバリアント オブジェクトが存在しないか、または [Variant Subsystem パラメーター] ダイアログ ボックスでバリアント オブジェクトの先頭に "%" (コメント) 文字が付いている場合は、子サブシステムはコメントと見なされ、モデル実行中は使用されません。

open_system('sldemo_variant_subsystems/Controller');

図 2: Controller subsystem ブロックのコンテンツ

Variant Subsystem ブロック内に、Inport ブロック、Outport ブロック、Subsystem ブロックを配置することができます。この例では、Linear Controller Subsystem ブロックはバリアント オブジェクト VSS_LINEAR_CONTROLLER に関連付けられ、Nonlinear Controller Subsystem ブロックはバリアント オブジェクト VSS_NONLINEAR_CONTROLLER に関連付けられます。

Variant Subsystem 内で信号の接続はできません。Simulink はモデルのシミュレーション時に、Inport ブロックと Outport ブロックをアクティブなバリアントにプログラム上で接続します。

アクティブなバリアントの切り替え

Linear Controller バリアントを使用してシミュレーションを行うには、

VSS_MODE=1

をグローバル ワークスペースで定義してから、モデルをシミュレートします。

open_system('sldemo_variant_subsystems/Controller','parameter');
close_system('sldemo_variant_subsystems/Controller')
VSS_MODE=1; %#ok (used by sldemo_variant_subsystems)
sim sldemo_variant_subsystems;

図 3: Linear Controller バリアントを使用したシミュレーション

Nonlinear Controller を使用してシミュレートするには、

VSS_MODE=2

をグローバル ワークスペースで定義してから、モデルをシミュレートします。

VSS_MODE=2; % (used by sldemo_variant_subsystems)
sim sldemo_variant_subsystems;

図 4: Nonlinear Controller バリアントを使用したシミュレーション

列挙と再利用

sldemo_variant_subsystems_enum モデルは以下の Simulink.Variant の機能を説明します。

1. 列挙型: MATLAB 列挙型クラスを使用すると、バリアント オブジェクトの条件を読みやすくすることができます。

2. 再利用: Simulink.Variant オブジェクトは、別の Variant Subsystem ブロックで再利用できます。

この例では、MATLAB グローバル ワークスペースで定義される以下の変数を使用します。

VSSE_LINEAR_CONTROLLER=Simulink.Variant( ... 'VSSE_MODE==sldemo_vss_CONTROLLER_TYPE.LINEAR')

VSSE_NONLINEAR_CONTROLLER=Simulink.Variant( ... 'VSSE_MODE==sldemo_vss_CONTROLLER_TYPE.NONLINEAR')

VSSE_MODE=sldemo_vss_CONTROLLER_TYPE.LINEAR

VSSE_PROTOTYPE=Simulink.Variant( ... 'VSSE_MODE_BUILD==sldemo_vss_BUILD_TYPE.PROTOTYPE')

VSSE_PRODUCTION=Simulink.Variant( ... 'VSSE_MODE_BUILD==sldemo_vss_BUILD_TYPE.PRODUCTION')

VSSE_MODE_BUILD=sldemo_vss_BUILD_TYPE.PRODUCTION

これらの Simulink.Variant オブジェクトでは列挙クラス sldemo_vss_BUILD_TYPE.msldemo_vss_CONTROLLER_TYPE.m を使用し、Simulink.VariantCondition パラメーターを定義して、可読性を改善します。

Variant Subsystem ブロックの 3 つのフィルター、Filter1、Filter2、Filter3 はすべて VSSE_PROTOTYPEVSSE_PRODUCTION Simulink.Variant オブジェクトを使用します。

メモ: 列挙型クラスの名前はデータ型の名前とグローバル ワークスペース変数の名前の中で固有のものでなければならず、大文字と小文字が区別されます。

モデル例 sldemo_variant_subsystems_enum を開くと、File -> ModelProperties -> Callbacks で定義された PreLoadFcn が実行されます。これにより、グローバル ワークスペースに Variant Subsystem ブロックの変数が入力されます。

open_system('sldemo_variant_subsystems_enum')

図 5: モデル例、sldemo_variant_subsystems_enum

列挙型をバリアント制御変数として使用するコードの生成

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

モデル rtwdemo_preprocessor_subsys を考えます。

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

列挙型が正しく定義されない場合、エラーが表示されます。エラーを引き起こす 1 組のシナリオをここに示します。

無効な定義 1: この場合、Simulink.IntEnumType は定義されていません。

無効な定義 2: この場合は、変数が初期化されていません。

次の例に示すようにバリアント制御式を入力します。

図 6: ブロック パラメーター

グローバル ワークスペースで V の値を定義します。たとえば、V=2 であるとします。値には、通常の MATLAB 変数または simulink.parameter オブジェクトを指定できます。ただし、値は列挙型にできません。

[ブロック線図の更新中にすべての選択肢を解析し、プリプロセッサの条件を生成する] オプションを選択してコードを生成します。サンプル コードは次のように示されます。

図 7: 生成コード

バリアント制御変数としての Simulink.Variant or Simulink.Parameter オブジェクトまたは MATLAB 変数の使用については、バリアント制御の紹介の「バリアント制御を指定する方法」セクションを参照してください。

Variant Subsystem 用のコード生成の詳細は、Embedded Coder のドキュメンテーションを参照してください。