ドキュメンテーション

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

モデル参照のバリアント

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

例の要件

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

モデル バリアントの概要

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

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

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

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

CTRL=1

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

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

Model ブロックのバリアントの指定

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

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

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

CTRL=2;

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

 
V_LINEAR_CONTROLLER =
 
Simulink.Variant
    Condition: 'CTRL==1'

 
V_NONLINEAR_CONTROLLER =
 
Simulink.Variant
    Condition: 'CTRL==2'


CTRL =

     2

図 1: 最上位モデル、 sldemo_mdlref_variants

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

このダイアログで、可能なバリアントが 2 つ指定されます。それらの 2 つのバリアントが、V_LINEAR_CONTROLLERV_NONLINEAR_CONTROLLER という 2 つの Simulink.Variant オブジェクトに関連付けられます。これらのオブジェクトはベース ワークスペース内に存在しています。これらのオブジェクトには、論理値として評価され、どのバリアントがアクティブになるのかを特定する式である、Condition という名のプロパティがあります。Condition は、[Model ブロック] ダイアログにも表示されます。この例では、V_LINEAR_CONTROLLERV_NONLINEAR_CONTROLLERCondition は、それぞれ 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 オブジェクトは、別の Model ブロックで再利用できます。

この例では、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_BUILD_TYPE.msldemo_mrv_CONTROLLER_TYPE.msldemo_mrv_CONTROLLER_TYPE.m という列挙型クラスを使用します。

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

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

 
VE_LINEAR_CONTROLLER =
 
Simulink.Variant
    Condition: 'E_CTRL==sldemo_mrv_CONTROLLER_TYPE.LINEAR'

 
VE_NONLINEAR_CONTROLLER =
 
Simulink.Variant
    Condition: 'E_CTRL==sldemo_mrv_CONTROLLER_TYPE.NONLINEAR'


E_CTRL = 

    LINEAR   

 
VE_PROTOTYPE =
 
Simulink.Variant
    Condition: 'E_CURRENT_BUILD==sldemo_mrv_BUILD_TYPE.PROTOTYPE'

 
VE_PRODUCTION =
 
Simulink.Variant
    Condition: 'E_CURRENT_BUILD==sldemo_mrv_BUILD_TYPE.PRODUCTION'


E_CURRENT_BUILD = 

    PRODUCTION

この情報は役に立ちましたか?