Main Content

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

Variant Subsystem を使用した条件の伝播

Variant Subsystem ブロックを含むモデルでバリアント条件を指定すると、Simulink® はこれらの条件を伝播し、シミュレーション中にアクティブになるモデルのコンポーネントを決定します。バリアント条件は条件式またはバリアント オブジェクトにすることができます。

バリアント条件の注釈を使用すると、伝播された条件を可視化できます。バリアント条件の注釈を表示するには、[デバッグ] タブで、[情報のオーバーレイ][バリアント凡例]を選択します。

メモ

[バリアント凡例] が使用できない場合、[デバッグ] タブで、[情報のオーバーレイ][バリアント条件]を選択します。

凡例では、(default) キーワードは否定の条件として表示されます。

バリアントの選択をもつ Variant Subsystem ブロックを含むこのモデルについて検討します。特定のバリアント条件によって、各ブロックが有効になります。

Variant Subsystem (Controller) で、sensor1sensor3 はどちらも線形コントローラーおよび非線形コントローラーで使用されますが、sensor2 は線形コントローラーでのみ使用されます。したがって、sensor2 ブロックは線形コントローラーの選択がアクティブな場合にのみ実行され、その他の選択では実行されません。Variant Subsystem (Controller) の外部のコンポーネントが Variant Subsystem ブロックをもつブロックのアクティブまたは非アクティブな状態を確実に認識できるようにするには、ブロックの条件を Variant Subsystem ブロックの外部で伝播しなければなりません。

プリプロセッサ条件を生成しない条件の伝播

プリプロセッサ条件を生成しないでバリアント サブシステムの外部に条件を伝播するには、Variant Subsystem ブロックの [ブロック パラメーター] ダイアログ ボックスで [バリアント サブシステムの外部に条件を伝播する] チェック ボックスをオンにします。既定では、[バリアント サブシステムの外部に条件を伝播する] は選択されていません。

アクティブな選択肢が非線形コントローラーのモデルのシミュレーションを実行したときに [バリアント サブシステムの外部に条件を伝播する] がオンの場合、アクティブな選択肢のみが解析されます。[バリアントのアクティベーションのタイミング][ブロック線図の更新] に設定されていることに注意してください。

[バリアント条件の凡例] に非アクティブな条件が false として表示されます。ここで、sensor2 は非アクティブで、非線形コントローラーとしてのバリアントの選択をもち、false としてマークされます。注釈は sensor2 端子と、sensor2 に接続された非アクティブなブロックに表示されます。

プリプロセッサ条件を生成しないで条件の伝播のコードを生成すると、非アクティブなブロックは無視されます。この例では、入力端子 In2 は生成されたコードに表示されません。

プリプロセッサ条件を生成する条件の伝播

プリプロセッサ条件を生成して の外部に条件を伝播するには、[バリアント サブシステムの外部に条件を伝播する] チェック ボックスをオンにして、バリアント サブシステムの [ブロック パラメーター] ダイアログ ボックスで [バリアントのアクティベーションのタイミング][コードのコンパイル] に設定します。

メモ

[バリアントのアクティベーションのタイミング] は、[バリアント制御モード][式] として指定した場合にのみ利用可能です。

アクティブな選択肢が非線形コントローラーのモデルのシミュレーションを実行したときに [バリアント サブシステムの外部に条件を伝播する] チェック ボックスをオンにし、[バリアントのアクティベーションのタイミング][コードのコンパイル] に設定した場合、すべてのバリアントの選択肢が解析されます。[バリアント条件の凡例] にモデルに関連付けられたバリアント条件が表示されます。

プリプロセッサ条件を生成する条件の伝播のコードを生成すると、すべての選択肢に対してモデルは解析されます。この例では、入力端子 In2 は必要な条件で保護されます。

メモ

指定された、ゼロまたは 1 つのアクティブなバリアント制御の Variant Subsystem ブロック外部のバリアント条件を伝播するには、[ゼロ アクティブ バリアント制御を許可] を選択します。

Variant Subsystem の適応インターフェイス

[ブロック パラメーター] ダイアログ ボックスの [バリアント サブシステムの外部に条件を伝播する] チェック ボックスをオンにすると、Variant Subsystem はそのインターフェイスを接続されたブロックに適応させます。このモデルについて考えます。

Controller ブロックは Linear および Nonlinear の選択を提供する Variant Subsystem です。V = 1 のときは Linear の選択がアクティブになっています。V = 2 のときは Nonlinear の選択がアクティブになっています。ここでは、VSimulink.Parameter タイプのバリアント制御変数です。Controller ブロックを選択し、Simulink で [ブロック線図][ブロック パラメーター (Subsystem)] をクリックします。[バリアント サブシステム外部に条件を伝播する] チェック ボックスがオンになっていることを確認します。

バリアント制御変数の値を変更するには、MATLAB コマンド ウィンドウで V.Value = 1 または V.Value = 2 を入力します。

Controller ブロックをダブルクリックして、そのコンテンツを表示します。Linear の選択は Controller (Variant Subsystem ブロック) の sensor1 および sensor3 の入力を使用しています。sensor2 は使用していないため、saturate 出力は生成されません。

このモデルをシミュレートする場合、Variant Subsystem ブロックは、条件 V = 2 (v:1 V=2) が In2filter および saturation logger ブロックに伝播するように、そのインターフェイスを適応させます。

条件付きシステムの条件伝播

条件付きのシステムに条件を伝播する場合、同じ条件がすべての端子に設定されます。詳細については、条件付きサブシステムへのバリアント条件の伝播を参照してください。

このモデルについて考えます。ここで、条件が Inport ブロック (fcn) に伝播されるとき、同じ条件がすべての Inport ブロックおよび Outport ブロック (バリアントの凡例に示すとおり) に伝播し、Variant Subsystem ブロックが条件付きになります。

既知の制限事項

  • Variant Subsystem から伝播されたバリアント条件は Simscape™ ブロックまたは Stateflow® ブロックで設定できません。

  • C++ コード生成は、Variant Subsystem ブロックの外部に伝播された条件を含むモデルでサポートされません。

  • ルートのバス要素端子をもつモデルでは、バリアント条件の伝播はサポートされていません。

メモ

Mux ブロック信号、Demux ブロック信号または Vector Concatenate ブロック信号のすべての要素が、同じバリアント条件をもたなければなりません。

プログラムによる条件の伝播

Variant Subsystem ブロックの外部にプログラムで条件を伝播するには、次のいずれかの構文を使用します。

  • プリプロセッサ条件を生成しないで条件を伝播するには、次を実行します。

    set_param(VariantSubsystemName, 'PropagateVariantConditions','on')

    以下に例を示します。

    set_param('sldemo_variant_subsystems/Controller','PropagateVariantConditions','on')
  • プリプロセッサ条件を生成する条件を伝播するには、次を実行します。

    set_param(VariantSubsystemName,'PropagateVariantConditions',...
    'on','GeneratePreprocessorConditionals','on')

    以下に例を示します。

    set_param('sldemo_variant_subsystems/Controller','PropagateVariantConditions','on',...
    'GeneratePreprocessorConditionals','on')

条件付きシステムでのコード生成

モデルのコードを生成できます。そのためには、[アプリ] タブで、[Embedded Coder] をクリックし、[C コード] タブで、[ビルド] をクリックします。コードを生成するためのモデルの構成の詳細は、コード生成用のバリアントが含まれるモデルの準備 を参照してください。

コード生成のための Variant Subsystem ブロックを含むバリアント モデルについて考えます。

生成されたコードで、fcn 定義内のコードは C プリプロセッサの条件 #if および #endif によって保護されます。

void fcn(void)
{
  /* RootInportFunctionCallGenerator: '<Root>/RootFcnCall_InsertedFor_fcn_at_outport_1' */
#if VSSMODE == 0

    rtDWork.Linear.DiscreteFilter = rtU.In1 - 0.5 *
    rtDWork.Linear.DiscreteFilter_states;
 
  rtDWork.Linear.DiscreteFilter_states = rtDWork.Linear.DiscreteFilter;
  
#endif                                 /* VSSMODE == 0 */

#if VSSMODE == 1

    rtDWork.Nonlinear.DiscreteFilter = look1_binlxpw(rtU.In1,
    rtCP_LookupTable_bp01Data, rtCP_LookupTable_tableData, 4U) - 0.5 *
    rtDWork.Nonlinear.DiscreteFilter_states;
  
  rtDWork.Nonlinear.DiscreteFilter_states = rtDWork.Nonlinear.DiscreteFilter;
 
#endif                                 /* VSSMODE == 1 */
  
#if VSSMODE == 0
 
  rtY.Out1 = rtDWork.Linear.DiscreteFilter;

#endif                                 /* VSSMODE == 0 */
  
#if VSSMODE == 1
  
  rtY.Out1 = rtDWork.Nonlinear.DiscreteFilter;

#endif                                 /* VSSMODE == 1 */
 
}

メモ

  • モデルを Variant Subsystem の選択肢としてのランナブルをもつ AUTOSAR コンポーネントとして構成することはサポートされていません。

関数呼び出し定義の保護

関数呼び出し (fcn) 定義の全体を保護するには、次に示すようにバリアントのソースを使用します。

生成されたコードで fcn() の定義は A==1 のとき保護されています。

#if A == 1
void fcn(void)
{
…..
}
#endif

この関数は、コード スニペットを使用すると、次に示すようなものに見えます。

…..
#if A==1
fcn()
#endif
……

関連するトピック