Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

モデル参照のバリアント

この例では、モデル参照バリアントの使用方法を示します。Model ブロックは、ある Simulink® モデルを別の Simulink モデルから参照するために使用されます。Variant Subsystem ブロックにはバリアントとして Model ブロックを含めることができます。"バリアント" は、1 つの Variant Subsystem ブロックが動作できる N 個のモードのうちの 1 つを表します。各バリアントは、関連付けられているモデル固有の引数を使用して特定のモデルを参照します。シミュレーションでは、1 つのバリアントのみがアクティブになります。アクティブなバリアントは、ベース ワークスペース内の変数の値を変更するか、Variant Subsystem ブロックのダイアログを使用してバリアントの選択を手動でオーバーライドして切り替えることができます。

条件付きで実行されるモデル (制御端子をもつモデル) であるバリアントを使用する必要がなければ、新しいモデルには、モデル バリアントを含めるために Model ブロックではなく Variant Subsystem ブロックを使用します。Model ブロックを使用してモデル バリアントを含めるためのサポートは、将来のリリースで削除されます。

例の要件

この例の実行中、Simulink と Simulink® Coder™ は、現在の作業フォルダー内に作成されたコード生成フォルダーにコードを生成することがあります。このフォルダーにファイルを生成しない (または生成できない) 場合は、作業フォルダーを変更する必要があります。

モデル バリアントの概要

Model ブロックは、ある Simulink モデル (子モデル) を別の Simulink モデル (親モデル) から参照するために使用されます。Variant Subsystem ブロックにはバリアントとして Model ブロックを含めることができます。バリアントは、その Variant Subsystem ブロックに参照される可能性があるモデルのセットで構成されます。この例では、Controller という名の Variant Subsystem ブロックに参照される可能性があるモデルが 2 つあります。

各 "バリアント" は、Simulink.Variant オブジェクトに関連付けられています。Simulink.Variant オブジェクトは、MATLAB® ベース ワークスペースで作成されます。以下に例を示します。

V_LINEAR_CONTROLLER=Simulink.Variant('CTRL==1');

ここで、コンストラクター引数 ('CTRL==1') は、そのバリアントがアクティブになる場合の条件を定義します。この場合、ベース ワークスペースで

CTRL=1

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

シミュレーション中は、任意の Variant Subsystem ブロックについて 1 つのバリアントがアクティブになります。"アクティブなバリアント" は、MATLAB ベース ワークスペース内のバリアント オブジェクトの条件を評価することによって決定されます。あるいは、[バリアントの条件をオーバーライドして以下のバリアントを使用] チェック ボックスをオンにして、Variant Subsystem ブロックに特定のバリアントを使用するように指示することもできます。

バリアントの指定

この例で使用されるモデルには、MATLAB ベース ワークスペースで以下の変数を定義する必要があります。

V_LINEAR_CONTROLLER=Simulink.Variant('CTRL==1');

V_NONLINEAR_CONTROLLER=Simulink.Variant('CTRL==2');

CTRL=2;

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

図 1: 最上位モデル、sldemo_mdlref_variants

Variant Subsystem ブロック Controller を右クリックして [ブロック パラメーター] (Subsystem) メニュー項目を選択し、ブロック ダイアログ ボックスを開きます

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

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

sldemo_mrv_linear_controller を使用してシミュレートするには、ベース ワークスペースで

CTRL=1

を定義してから、モデルをシミュレートします。

図 2: sldemo_mrv_linear_controller バリアントを使用したシミュレーション

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

CTRL=2

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

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

列挙と再利用

sldemo_mdlref_variants_enum モデルで、以下の Simulink.Variant の機能を説明します。

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

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

この例では、MATLAB ベース ワークスペースで以下の変数を定義する必要があります。

VE_LINEAR_CONTROLLER=Simulink.Variant('E_CTRL==sldemo_mrv_CONTROLLER_TYPE.LINEAR')

VE_NONLINEAR_CONTROLLER=Simulink.Variant('E_CTRL==sldemo_mrv_CONTROLLER_TYPE.NONLINEAR')

E_CTRL=sldemo_mrv_CONTROLLER_TYPE.LINEAR

VE_PROTOTYPE=Simulink.Variant('E_CURRENT_BUILD==sldemo_mrv_BUILD_TYPE.PROTOTYPE')

VE_PRODUCTION=Simulink.Variant('E_CURRENT_BUILD==sldemo_mrv_BUILD_TYPE.PRODUCTION')

E_CURRENT_BUILD=sldemo_mrv_BUILD_TYPE.PRODUCTION

これらの Simulink.Variant オブジェクトでは、可読性を高めるために、Simulink.VariantCondition プロパティ内で sldemo_mrv_BUILD_TYPE.msldemo_mrv_CONTROLLER_TYPE.m という列挙型クラスを使用します。

VE_PROTOTYPEVE_PRODUCTION という Simulink.Variant オブジェクトは、Filter1、Filter2 および Filter3 という 3 つの Filter Variant Subsystem ブロック間で再利用されます。

モデル sldemo_mdlref_variants_enum を開くと、File -> ModelProperties -> Callbacks で定義された PreLoadFcn が実行されます。このコールバックにより、ベース ワークスペースに Variant Subsystem ブロックの変数が入力されます。これらの変数は、MATLAB コマンド ウィンドウに表示されます。