このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
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 ブロックの変数が入力されます。
図 1: モデル例、sldemo_variant_subsystems
Simulink.Variant
オブジェクトの Controller サブシステム用の関連付けを指定するには、Controller サブシステムを右クリックし、[サブシステムのパラメーター]
を選択します。これで Controller subsystem ブロックのダイアログが開きます。
[Controller subsystem ブロック] ダイアログで、可能なバリアントが 2 つ指定されます。それらの 2 つのバリアントが、VSS_LINEAR_CONTROLLER
と VSS_NONLINEAR_CONTROLLER
という 2 つの Simulink.Variant
オブジェクトに関連付けられます。これらのオブジェクトはグローバル ワークスペース内に存在しています。これらのオブジェクトには、論理値として評価され、どのバリアントがアクティブになるのかを特定する式である、Condition という名のプロパティがあります。条件は、[Variant Subsystem ブロック] ダイアログにも表示されます。この例では、VSS_LINEAR_CONTROLLER
と VSS_NONLINEAR_CONTROLLER
の条件のプロパティはそれぞれ VSS_MODE == 1
と VSS_MODE == 2
です。変数 VSS_MODE
はグローバル ワークスペース内に存在し、標準の MATLAB 変数または Simulink.Parameter
にすることができます。
関連付けられたバリアント オブジェクトが存在しないか、または [Variant Subsystem パラメーター] ダイアログ ボックスでバリアント オブジェクトの先頭に "%" (コメント) 文字が付いている場合は、子サブシステムはコメントと見なされ、モデル実行中は使用されません。
図 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
をグローバル ワークスペースで定義してからモデルをシミュレートします。
Nonlinear Controller
を使用してシミュレートするには、VSS_MODE=2
をグローバル ワークスペースで定義してからモデルをシミュレートします。
列挙と再利用
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.m と sldemo_vss_CONTROLLER_TYPE.m を使用し、Simulink.Variant
の Condition パラメーターを定義して、可読性を改善します。
Variant Subsystem ブロックの 3 つのフィルター、Filter1、Filter2、Filter3 はすべて VSSE_PROTOTYPE
と VSSE_PRODUCTION
Simulink.Variant
オブジェクトを使用します。
メモ: 列挙型クラスの名前はデータ型の名前とグローバル ワークスペース変数の名前の中で固有のものでなければならず、大文字と小文字が区別されます。
モデル例 sldemo_variant_subsystems_enum
を開くと、File -> ModelProperties -> Callbacks
で定義された PreLoadFcn が実行されます。これにより、グローバル ワークスペースに Variant Subsystem ブロックの変数が入力されます。
図 3: モデル例、sldemo_variant_subsystems_enum
列挙型をバリアント制御変数として使用するコードの生成
列挙型を使用して、バリアント制御値として使う整数に意味のある名前を与えることができます。
モデル rtwdemo_preprocessor_subsys
を考えます。
MATLAB エディターで、列挙型の値を意味のある名前にマップするクラスを定義します。
列挙型が正しく定義されない場合、エラーが表示されます。エラーを引き起こす 1 組のシナリオをここに示します。
無効な定義 1: この場合、Simulink.IntEnumType
は定義されていません。
無効な定義 2: この場合は、変数が初期化されていません。
次の例に示すようにバリアント制御式を入力します。
図 4: ブロック パラメーター
グローバル ワークスペースで V の値を定義します。たとえば、V=2 であるとします。値には、通常の MATLAB 変数または Simulink.Parameter
オブジェクトを指定できます。ただし、値は列挙型にできません。
ここで、[バリアントのアクティベーションのタイミング] を [code compile
] に設定してコードを生成します。サンプル コードは次のように示されます。
図 5: 生成コード
バリアント制御変数としての Simulink.Variant
または Simulink.Parameter
オブジェクトまたは MATLAB 変数の使用については、バリアント制御の紹介の「バリアント制御を指定する方法」セクションを参照してください。
Variant Subsystem 用のコード生成の詳細は、Embedded Coder のドキュメンテーションを参照してください。