Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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を参照してください。

Model showing propagation of variant conditions outside of a variant subsystem

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 および sensor3Linear コントローラーと Nonlinear コントローラーのブロックで使用されていますが、sensor2Linear コントローラーのブロックでのみ使用されています。したがって、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 コントローラーがアクティブな場合
  • Linear コントローラーのみが解析されます。

  • Linear コントローラーでは端子 sensor1sensor3、および u のみを使用するため、それらの端子とそれに接続されたブロックがアクティブになります。Linear コントローラーでは端子 sensor2 および saturate は使用しないため、それらの端子とそれに接続されたブロックは非アクティブになります。Linear コントローラーのインターフェイスは Controller サブシステムのインターフェイスと異なるため、サブシステムの外部にバリアント条件が伝播されます。バリアント条件は、いずれのバリアント選択肢でも使用されていない端子にだけ伝播されます。この例では、条件が false に設定されたバリアントの注釈 v:2sensor2saturate、および接続されたすべてのブロックに伝播されます。バリアント条件の凡例で、バリアント条件に関連付けられているブロックがアクティブになることはない場合、バリアント条件は false に設定されます。

    Propagation of variant conditions outside of Controller subsystem when V = 1 for update diagram activation time

  • 生成されるコードにはアクティブな端子のみが含まれます。この例では、入力端子 In2 は非アクティブであるため、生成コードに含まれていません。

    //slexVariantSubsystemsAdaptiveInterface.h
    /* External inputs (root inport signals with default storage) */
    typedef struct {
      real_T In1;                          /* '<Root>/In1' */
      real_T In3;                          /* '<Root>/In3' */
    } ExternalInputs;
    
    /* External outputs (root outports with default storage) */
    typedef struct {
      real_T u;                          /* '<Root>/u' */
    } ExternalOutputs;
    

    アクティブな選択肢は "無条件" になります。無条件のステートメントはいずれの条件ステートメントでも囲まれず、バリアント選択肢の状態に関係なくコンパイルまたは実行されます。

    //slexVariantSubsystemsAdaptiveInterface.c
    /* Model step function */
    void step(void)
    {
    // Logic for Linear choice
    }
    /* Model initialize function */
    void initialize(void)
    {
      /* (no initialization code required) */
    }

  • Nonlinear コントローラーのみが解析されます。

  • Nonlinear コントローラーでは Controller サブシステム ブロックのすべての入力端子と出力端子を使用するため、すべての入力端子 sensor1sensor2sensor3 とそれに接続されたすべてのブロックがアクティブになります。また、両方の出力端子 usaturate およびそれに接続されたすべてのブロックもアクティブになります。Nonlinear コントローラーのインターフェイスは Controller サブシステムのインターフェイスと一致しているため、Controller サブシステム ブロックの外部にバリアント条件は伝播されません。

    Propagation of variant condition outside of Controller subsystem when V = 2 for update diagram activation time

  • 生成されるコードにはアクティブな端子のみが含まれます。この例では、すべての入力端子と出力端子がアクティブであるため、すべて生成コードに含まれています。

    //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 with default storage) */
    typedef struct {
      real_T u;                          /* '<Root>/u' */
    } ExternalOutputs; 
    

    アクティブな選択肢は "無条件" になります。無条件のステートメントはいずれの条件ステートメントでも囲まれず、バリアント選択肢の状態に関係なくコンパイルまたは実行されます。

    /* Model step function */
    void step(void) 
    {
    // Logic for Nonlinear choice
    }
    /* Model initialize function */
    void initialize(void)
    {
      /* (no initialization code required) */
    }

メモ

アクティベーションのタイミングが [ブロック線図の更新] の場合に Variant Subsystem の外部にバリアント条件を伝播すると、次のようになります。

  • [ゼロ アクティブ バリアント制御を許可]on に設定すると、Simulink はバリアント条件をバリアント領域のすべてのブロック (無条件ブロックまたは常時 true のブロックを含む) に伝播します。条件をバリアント領域のすべてのブロックに伝播すると、バリアント選択肢のいずれもアクティブでないときに Simulink でバリアント領域をモデルから完全に削除できるようになります。

  • 生成されるコードは、[ゼロ アクティブ バリアント制御を許可] の設定に関係なく同じです。

アクティベーションのタイミングが [ブロック線図の更新時にすべての選択肢を解析] の場合におけるバリアント条件の伝播

次の表は、アクティベーションのタイミングが [ブロック線図の更新時にすべての選択肢を解析] の場合のバリアント条件の伝播について、Linear コントローラーと Nonlinear コントローラーの選択肢を比較したものです。生成コードは [ブロック線図の更新] の場合と同じです。

V == 1 および Linear コントローラーがアクティブな場合V == 2 および Nonlinear コントローラーがアクティブな場合
  • Linear コントローラーと Nonlinear コントローラーの選択肢が解析されます。

  • Linear コントローラーでは端子 sensor1sensor3、および u のみを使用するため、それらの端子とそれに接続されたブロックがアクティブになります。Linear コントローラーでは端子 sensor2 および saturate は使用しないため、それらの端子とそれに接続されたブロックは非アクティブになります。

  • Linear コントローラーのインターフェイスは Controller サブシステムのインターフェイスと一致していないため、Controller サブシステム ブロックの外部にバリアント条件が伝播されます。バリアント条件は、いずれのバリアント選択肢でも使用されていない端子にだけ伝播されます。この例では、注釈が v:1 でバリアント条件が V == 2 に設定されたバリアントが sensor2saturate、およびそれらに接続されたブロックに伝播されます。

Propagation of variant conditions outside of Controller subsystem when V = 1 for update diagram analyze all choices activation time

  • Linear コントローラーと Nonlinear コントローラーの選択肢が解析されます。

  • Nonlinear コントローラーでは Controller サブシステムのすべての入力端子と出力端子を使用するため、すべての入力端子 sensor1sensor2sensor3 とそれに接続されたすべてのブロックがアクティブになります。また、両方の出力端子 usaturate およびそれに接続されたすべてのブロックもアクティブになります。

  • Linear コントローラーのインターフェイスは Controller サブシステムのインターフェイスと一致していないため、Controller サブシステム ブロックの外部にバリアント条件が伝播されます。バリアント条件は、いずれのバリアント選択肢でも使用されていない端子にだけ伝播されます。この例では、注釈が v:1 でバリアント条件が V == 2 に設定されたバリアントが sensor2saturate、およびそれらに接続されたブロックに伝播されます。

Propagation of variant conditions outside of Controller subsystem when V = 2 for update diagram analyze all choices activation time

メモ

[ブロック線図の更新時にすべての選択肢を解析] のアクティベーションのタイミングで 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 のブロック In1In3、およびバリアント選択肢 LinearNonlinear は、バリアント条件の論理 OR V == 1 || V == 2 で囲まれます。V == 1V == 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 のブロック In1In3、およびバリアント選択肢 LinearNonlinear は、バリアント条件の論理 OR V == 1 || V == 2 で囲まれます。V == 1V == 2 がそれぞれ false に評価されると、Simulink はこれらのブロックのコンパイルをスキップします。したがって、バリアント領域が完全に削除されます。

Inport ブロックと Outport ブロックがない場合の伝播

2 つのバリアント選択肢をもつ Variant Subsystem ブロックを含む次のモデルについて考えます。ブロックには入力端子も出力端子もありません。2 つのバリアント選択肢にはそれぞれバリアント条件 Var == 1 および Var == 2 があります。Variant Subsystem ブロックの [Variant Subsystem の外部に条件を伝播する] パラメーターを off に設定すると、バリアント条件の論理 OR Var == 1 || Var == 2Variant Subsystem ブロックで設定されます。パラメーターを on に設定すると、Variant Subsystem ブロックにはバリアント条件は適用されません。

Variant Subsystem with no inports and outports

制限

バリアント サブシステムから伝播されたバリアント条件は Simscape™ ブロックまたは Stateflow® ブロックで、[ブロック線図の更新] バリアントのアクティベーションのタイミングについてのみ設定できます。

関連するトピック