このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
Variant Subsystem の外部のバリアント領域を定義するためのバリアント条件の伝播
Simulink® は、Variant Subsystem ブロックのバリアント条件を接続されているブロックに伝播します。バリアント条件の伝播により、Simulink でシミュレーション中にアクティブなままであるモデルのコンポーネントを決定できるようになります。その後、Simulink は非アクティブな選択肢に関連付けられているモデル コンポーネントを非アクティブにして、アクティブな接続を強調表示します。既定では、バリアント条件は Variant Subsystem ブロックの外部に伝播しません。接続されているブロックにバリアント条件を伝播できるようにするには、Variant Subsystem ブロックで [Variant Subsystem の外部に条件を伝播する] パラメーターを選択します。Variant Subsystem ブロックの詳細については、Variant Subsystem, Variant Model, Variant Assembly Subsystem を参照してください。
ヒント
モデル コンポーネント上のバリアント条件の注釈を使用すると、伝播された条件を可視化できます。注釈を表示するには、[デバッグ] タブで、[情報のオーバーレイ] 、 [バリアント凡例] を選択します。[バリアント凡例] が使用できない場合、[デバッグ] タブで、[情報のオーバーレイ] 、 [バリアント条件]を選択します。詳細については、Visualize Propagated Variant Conditions in Variant Conditions Legendを参照してください。
Variant Subsystem ブロックの外部でのバリアント条件の伝播に影響する要因
Variant Subsystem ブロックの外部へのバリアント条件の伝播は、ブロックのバリアントのアクティベーションのタイミング、および基となるバリアント選択肢のインターフェイスに依存します。[バリアントのアクティベーションのタイミング] パラメーターによって、Simulink でモデルのシミュレーション時に、ブロックのアクティブな選択肢のみを解析する必要があるか、アクティブな選択肢と非アクティブな選択肢の両方を解析する必要があるかが決まります。解析対象のバリアント選択肢のインターフェイスが Variant Subsystem ブロックのインターフェイスと一致する場合、バリアント条件は Variant Subsystem ブロックの外部に伝播されません。つまり、解析対象のバリアント選択肢で Variant Subsystem ブロックの入力信号と出力信号をすべて使用していれば、バリアント条件はブロックの外部に伝播されません。インターフェイスが一致しない場合のみ、Variant Subsystem ブロックの外部にバリアント条件が伝播されます。
Variant Subsystem の適応インターフェイス
この例では、さまざまなアクティベーションのタイミングについて、Variant Subsystem ブロックの外部にバリアント条件を伝播することでブロックのインターフェイスを基となるブロックの状態に従って適応させる方法を示します。例では、さまざまなアクティベーションのタイミングで生成されるコードについても説明します。伝播に影響する要因の詳細については、Variant Subsystem ブロックの外部でのバリアント条件の伝播に影響する要因を参照してください。
2 つのバリアント選択肢 Linear
および Nonlinear
をもつ Controller
という名前の Variant Subsystem ブロックを含むモデル slexVariantSubsystemsAdaptiveInterface
について考えます。V == 1
のときは Linear
コントローラーがアクティブになり、V == 2
のときは Nonlinear
コントローラーがアクティブになります。V
はバリアント制御変数であり、モデルの "PreLoadFcn" コールバックで定義されています。
バリアント制御変数の値を変更するには、MATLAB™ コマンド ウィンドウで V = 1
または V = 2
を入力します。
Controller
ブロックをダブルクリックして、その内容を表示します。Linear
コントローラーと Nonlinear
コントローラーは、同じインターフェイスをもっていません。入力端子 sensor1
および sensor3
は Linear
コントローラーと Nonlinear
コントローラーのブロックで使用されていますが、sensor2
は Linear
コントローラーのブロックでのみ使用されています。したがって、sensor2
ブロックは Linear
コントローラーがアクティブな場合にのみアクティブになり、Nonlinear
コントローラーがアクティブな場合には実行されません。Controller
ブロックの外部のモデル コンポーネントに Controller
ブロック内のブロックのアクティブまたは非アクティブな状態を認識させるには、ブロックのバリアント条件をブロックの境界の外側に伝播しなければなりません。Controller
ブロックの外部にバリアント条件を伝播するには、ブロックの [ブロック パラメーター] ダイアログ ボックスで [Variant Subsystem の外部に条件を伝播する] を選択します。既定では、このパラメーターは off
に設定されます。
モデルをシミュレートして Linear
コントローラーと Nonlinear
コントローラーのコードを生成するには、以下の手順を実行します。
1. Controller
ブロックの [ブロック パラメーター] ダイアログ ボックスで、[バリアントのアクティベーションのタイミング] パラメーターでアクティベーションのタイミングを設定します。
2. Linear
コントローラーとそれに接続されたブロックをアクティブにするには、V
の値を 1
に変更します。
3. モデルをシミュレートし、さまざまなアクティベーションのタイミングでの伝播で説明されているように伝播された条件を確認します。
4. Embedded Coder® を使用して、モデルからコードを生成します。コードを生成する方法の詳細については、Embedded Coder を使用したコード生成 (Embedded Coder)を参照してください。さまざまなアクティベーションのタイミングでの伝播で説明されているように、結果を確認します。
メモ
モデルの saturate
端子は未接続の出力端子であるため、バリアントのアクティベーションのタイミングがいずれの場合も生成コードに含まれません。
5. 同様に、Nonlinear
コントローラーとそれに接続されたブロックをアクティブにするには、V
の値を 2
に変更してモデルをシミュレートします。モデルからコードを生成し、結果を確認します。
さまざまなアクティベーションのタイミングでの伝播
このセクションでは、さまざまなアクティベーションのタイミングにおけるシミュレーション結果および Linear
コントローラーと Nonlinear
コントローラーに生成されるコードについて説明します。
[ブロック線図の更新]
のアクティベーションのタイミングにおけるバリアント条件の伝播
次の表は、アクティベーションのタイミングが [ブロック線図の更新]
の場合のバリアント条件の伝播と生成コードについて、Linear
コントローラーと Nonlinear
コントローラーの選択肢を比較したものです。
V == 1 および Linear コントローラーがアクティブな場合 | V == 2 および Nonlinear コントローラーがアクティブな場合 |
---|---|
|
|
メモ
アクティベーションのタイミングが [ブロック線図の更新]
の場合に Variant Subsystem の外部にバリアント条件を伝播すると、次のようになります。
[ゼロ アクティブ バリアント制御を許可] を
on
に設定すると、Simulink はバリアント条件をバリアント領域のすべてのブロック (無条件ブロックまたは常時true
のブロックを含む) に伝播します。条件をバリアント領域のすべてのブロックに伝播すると、バリアント選択肢のいずれもアクティブでないときに Simulink でバリアント領域をモデルから完全に削除できるようになります。生成されるコードは、[ゼロ アクティブ バリアント制御を許可] の設定に関係なく同じです。
アクティベーションのタイミングが [ブロック線図の更新時にすべての選択肢を解析]
の場合におけるバリアント条件の伝播
次の表は、アクティベーションのタイミングが [ブロック線図の更新時にすべての選択肢を解析]
の場合のバリアント条件の伝播について、Linear
コントローラーと Nonlinear
コントローラーの選択肢を比較したものです。生成コードは [ブロック線図の更新]
の場合と同じです。
V == 1 および Linear コントローラーがアクティブな場合 | V == 2 および Nonlinear コントローラーがアクティブな場合 |
---|---|
|
|
メモ
[ブロック線図の更新時にすべての選択肢を解析]
のアクティベーションのタイミングで Variant Subsystem の外部にバリアント条件を伝播するときは次のようになります。
[ゼロ アクティブ バリアント制御を許可] を
on
に設定すると、Simulink はバリアント条件をバリアント領域のすべてのブロック (常時true
のブロックまたは無条件ブロックを含む) に伝播します。条件をバリアント領域のすべてのブロックに伝播すると、バリアント選択肢のいずれもアクティブでないときに Simulink でバリアント領域をモデルから完全に削除できるようになります。生成されるコードは、[ゼロ アクティブ バリアント制御を許可] の設定に関係なく同じです。
アクティベーションのタイミングが [コードのコンパイル]
の場合におけるバリアント条件の伝播
アクティベーションのタイミングが [コードのコンパイル]
の場合における Linear
コントローラーと Nonlinear
コントローラーの選択肢に対するバリアント条件の伝播は、[ブロック線図の更新時にすべての選択肢を解析]
の場合における伝播と同じです。Linear
コントローラーと Nonlinear
コントローラーの生成コードは次のようになります。
コードには、必要なプリプロセッサ条件 #if
および #elif
で囲まれた Linear
および Nonlinear
の選択肢が含まれます。
//slexVariantSubsystemsAdaptiveInterface.c /* Model step function */ void step(void) { #if V == 1 // Logic for Linear choice #elif V == 2 // Logic for Nonlinear choice } /* Model initialize function */ void initialize(void) { /* (no initialization code required) */ }
いずれのバリアント選択肢でも使用されていない端子 sensor2
も、プリプロセッサ条件 #if
で囲まれます。
//slexVariantSubsystemsAdaptiveInterface.h External inputs (root inport signals with default storage)*/ typedef struct { real_T In1; /* '<Root>/In1' */ #if V == 2 real_T In2; /* '<Root>/In2' */ #define EXTERNALINPUTS_VARIANT_EXISTS #endif real_T In3; /* '<Root>/In3' */ } ExternalInputs; // External outputs (root outports fed by // signals with default storage) typedef struct { real_T u; } ExternalOutputs;
メモ
アクティベーションのタイミングが [コードのコンパイル]
の場合に Variant Subsystem ブロックの外部にバリアント条件を伝播すると、[ゼロ アクティブ バリアント制御を許可] を on
に設定した場合、Simulink はバリアント条件をバリアント領域のすべてのブロック (常時 true
のブロックまたは無条件ブロックを含む) に伝播します。生成されたコードでは、バリアント領域のブロックは、バリアント選択肢からの条件の論理 OR である追加のバリアント条件で囲まれます。これにより、バリアント選択肢のいずれもアクティブでないときに Simulink でバリアント領域をモデルから完全に削除できるようになります。この例では、常時 true
のブロック In1
と In3
、およびバリアント選択肢 Linear
と Nonlinear
は、バリアント条件の論理 OR V == 1 || V == 2
で囲まれます。V == 1
と V == 2
がそれぞれ false
に評価されると、Simulink はこれらのブロックのコンパイルをスキップします。したがって、バリアント領域が完全に削除されます。
アクティベーションのタイミングが [起動]
の場合におけるバリアント条件の伝播
アクティベーションのタイミングが [起動]
の場合における Linear
コントローラーと Nonlinear
コントローラーの選択肢に対するバリアント条件の伝播は、アクティベーションのタイミングが [ブロック線図の更新時にすべての選択肢を解析]
の場合における伝播と同じです。
Linear
コントローラーと Nonlinear
コントローラーの生成コードは次のようになります。
コードには、通常の条件 if
および else if
で囲まれた Linear
および Nonlinear
の選択肢が含まれます。
//slexVariantSubsystemsAdaptiveInterface.c /* Model step function */ void step(void) { if (V == 1) // Logic for Linear choice else if (V == 2) // Logic for Nonlinear choice } /* Model initialize function */ void initialize(void) { startupVariantChecker(); } static void startupVariantChecker(void) { /* startup variant condition checks */ utAssert((rtP.V == 1.0) + (rtP.V == 2.0) == 1); }
端子は無条件です。
//slexVariantSubsystemsAdaptiveInterface.h /* External inputs (root inport signals with default storage) */ typedef struct { real_T In1; /* '<Root>/In1' */ real_T In2; /* '<Root>/In2' */ real_T In3; /* '<Root>/In3' */ } ExternalInputs; // External outputs (root outports fed by signals // with default storage) */ typedef struct { real_T u; /* '<Root>/u' */ } ExternalOutputs;
メモ
アクティベーションのタイミングが [起動]
の場合に Variant Subsystem ブロックの外部にバリアント条件を伝播すると、[ゼロ アクティブ バリアント制御を許可] を on
に設定した場合、Simulink はバリアント条件をバリアント領域のすべてのブロック (常時 true
のブロックまたは無条件ブロックを含む) に伝播します。生成されたコードでは、バリアント領域のブロックは、バリアント選択肢からの条件の論理 OR である追加のバリアント条件で囲まれます。これにより、バリアント選択肢のいずれもアクティブでないときに Simulink でバリアント領域をモデルから完全に削除できるようになります。この例では、常時 true
のブロック In1
と In3
、およびバリアント選択肢 Linear
と Nonlinear
は、バリアント条件の論理 OR V == 1 || V == 2
で囲まれます。V == 1
と V == 2
がそれぞれ false
に評価されると、Simulink はこれらのブロックのコンパイルをスキップします。したがって、バリアント領域が完全に削除されます。
Inport ブロックと Outport ブロックがない場合の伝播
2 つのバリアント選択肢をもつ Variant Subsystem ブロックを含む次のモデルについて考えます。ブロックには入力端子も出力端子もありません。2 つのバリアント選択肢にはそれぞれバリアント条件 Var == 1
および Var == 2
があります。Variant Subsystem ブロックの [Variant Subsystem の外部に条件を伝播する] パラメーターを off
に設定すると、バリアント条件の論理 OR Var == 1 || Var == 2
が Variant Subsystem ブロックで設定されます。パラメーターを on
に設定すると、Variant Subsystem ブロックにはバリアント条件は適用されません。
制限
バリアント サブシステムから伝播されたバリアント条件は Simscape™ ブロックまたは Stateflow® ブロックで、[ブロック線図の更新]
バリアントのアクティベーションのタイミングについてのみ設定できます。