Main Content

Variant Subsystem を使用した個別の階層でのバリエーションの実装

この例では、Variant Subsystem ブロックを Simulink® で構成して使用する方法を示します。Variant Subsystem ブロックは階層的バリアント ブロックです。このブロックを使用して、システム コンポーネントの複数の実装やバリエーションをモデル内の個別の階層にカプセル化できます。Variant Subsystem ブロック内で表現されるコンポーネントのそれぞれのバリエーションを選択肢と呼びます。モデルの実行時には、Variant Subsystem ブロック内のバリアント選択肢のうち 1 つのみをアクティブにできます。Variant Subsystem ブロック内の選択肢は、Subsystemブロック、Modelブロック、またはサブシステム参照ブロックの組み合わせを使用して表現できます。

ブロックとそのパラメーターの詳細については、Variant Subsystem, Variant Model, Variant Assembly Subsystemを参照してください。

モデルの確認

  • モデル sldemo_variant_subsystems を開きます。システムのコントローラー コンポーネントの 2 つの異なる実装が Variant Subsystem ブロック Controller でカプセル化されています。

  • Variant Subsystem ブロック Controller を開きます。Controller コンポーネントの 2 つの可能なバリエーションが 2 つの Subsystem ブロックで表現されています。最初の選択肢は Linear Controller で、2 番目の選択肢は Nonlinear Controller です。Variant Subsystem ブロック内のブロック間の接続は描画されていないことに注意してください。Simulink でのシミュレーションの実行時に、Variant Subsystem ブロックの Inport ブロックと Outport ブロックにアクティブなバリアントが自動的に接続され、非アクティブな端子は無効になります。

  • Controller ブロックの [ブロック パラメーター] ダイアログ ボックスを開きます。[バリアントの選択肢] テーブルに Variant Subsystem の選択肢がリストされます。Controller ブロックの各バリアント選択肢がバリアント制御に関連付けられています。ここで、バリアント制御は Simulink.Variant オブジェクト VSS_LINEAR_CONTROLLER および VSS_NONLINEAR_CONTROLLER です。Simulink では、すべての選択肢のバリアント制御を評価することで Variant Subsystem のアクティブな選択肢を決定します。バリアント制御が true と評価されると、Simulink はそのバリアント制御に対応するバリアント選択肢をアクティブにし、非アクティブな選択肢を無効にします。そのため、それぞれのバリアント選択肢がバリアント制御に関連付けられますが、true と評価されるバリアント制御は 1 つだけでなければなりません。これにより、モデル構造は変更せずに、Variant Subsystem でアクティブな選択肢と非アクティブな選択肢を切り替えることができます。

Variant Subsystem ブロックの構成

このモデルでは、Linear ControllerNonlinear Controller の 2 つのサブシステムをバリアント選択肢としてもつ Controller Variant Subsystem が事前構成されています。このモデルに Variant Subsystem ブロックをさらに追加し、そのブロックを構成するには、次の手順を実行します。

  1. Simulink ライブラリ ブラウザーまたはクイック ブロック挿入メニューを使用して Variant Subsystem ブロックをモデルに追加し、ブロックに名前を付けます。このブロックはバリアントの選択のコンテナーとして使用します。

  2. Variant Subsystem を開くには、ブロックをダブルクリックします。Variant Subsystem ブロックは、既定では、バリアント選択肢を表現するために 2 つの Subsystem ブロックで事前構成されたテンプレートです。

  3. Variant Subsystem ブロックの入力および出力と一致するように、Variant Subsystem ブロック内に Inport ブロックと Outport ブロックを追加します。

  4. バリアント選択肢ブロックに名前を付けます。

メモ:

  • Variant Subsystem ブロック内に追加できるのは、Inport ブロック、Outport ブロック、Subsystem ブロック、Model ブロック、および Subsystem Reference ブロックのみです。データ端子を通して制御信号を渡すことができます。

  • モデルに Variant Subsystem ブロックを追加すると、既定では [バリアントのアクティベーションのタイミング] パラメーターは update diagram に設定され、[Variant Subsystem の外部に条件を伝播する] パラメーターは off に設定されます。

Variant Subsystem のバリアント選択肢のタイプ

Variant Subsystem には、サブシステム、Simulink モデル、およびサブシステム参照をバリアント選択肢として追加できます。

バリアント選択肢として Subsystem ブロックを含める

バリアント選択肢として Subsystem ブロックを追加するには、Variant Subsystem の [ブロック パラメーター] ダイアログ ボックスを使用するか、Variant Subsystem 内から Simulink エディターの操作バーを使用します。Simulink によって空の Subsystem ブロックが作成され、そのブロックには、それが含まれる Variant Subsystem ブロックと同じ数の入力端子および出力端子があります。

a. [ブロック パラメーター] ダイアログ ボックスの使用

  1. Variant Subsystem ブロックの [ブロック パラメーター] ダイアログ ボックスを開きます。Variant Subsystem ブロック上のバッジを右クリックし、[ブロック パラメーター (Subsystem)] を選択します。

  2. [ブロック パラメーター] ダイアログ ボックスのVariant choices (table of variant systems)に、追加したバリアント選択肢が表示されます。テーブルの左にあるボタンを使用して、テーブルの要素を追加したり変更したりできます。

  3. Subsystem ブロックを新しいバリアント選択肢として Variant Subsystem 内に含めるには、[バリアントの選択肢] テーブルの左にある [新しいサブシステム バリアントの選択を作成して追加します] ボタンをクリックします。

  4. 新しい Subsystem ブロックを開き、バリアント選択肢を表すモデル要素を追加します。

b. 操作バーの使用

  1. Variant Subsystem ブロックをダブルクリックします。

  2. 選択ボックスをドラッグして Variant Subsystem 内の空の領域を囲みます。操作バーに、ブロック内のサブシステムの選択肢タイプに基づくサブシステム挿入オプションが表示されます。

  3. 操作バーから、[Variant Subsystem の選択肢] オプションを選択して Subsystem ブロックを追加します。

  4. 新しい Subsystem ブロックを開き、バリアント選択肢を表すモデル要素を追加します。

メモ:

  • バリアントのプロトタイプを作成する場合、入力または出力がない空の Subsystem ブロックを Variant Subsystem ブロック内に作成できます。空のサブシステムによって、バリアントの選択の完全なモデル化を必要とせずに、サブシステムが非アクティブな状況が再現されます。

バリアント選択肢として Simulink モデルを含める

  1. Simulink モデル (Model ブロック) を新しいバリアント選択肢として Variant Subsystem 内に含めるには、[バリアントの選択肢] テーブルの左にある [新しいモデル バリアントの選択を作成して追加します] ボタンをクリックします。Simulink により、関連付けられていない Model ブロックが Variant Subsystem ブロック内に作成されます。

  2. 関連付けられていない Model ブロックをダブルクリックします。[モデル名] ボックスにモデル バリアント選択肢として使用するモデルの名前を入力し、[OK] をクリックします。

メモ: 参照モデルには、それが含まれる Variant Subsystem ブロックと同じ数の入力端子および出力端子が必要です。モデルに含まれる入力端子と出力端子の数が異なる場合は、異なるインターフェイスをもつバリアント選択肢の表現を参照してください。

バリアント選択肢としてサブシステム参照を含める

  1. サブシステム参照を新しいバリアント選択肢として Variant Subsystem 内に含めるには、Simulink ライブラリ ブラウザーまたはクイック ブロック挿入メニューを使用して Subsystem Reference ブロックを追加します。Simulink により、空の Subsystem Reference ブロックが Variant Subsystem ブロック内に作成されます。

  2. Subsystem Reference ブロックをダブルクリックします。[ブロック パラメーター] ダイアログ ボックスでサブシステムのブロック線図ファイルを指定し、[OK] をクリックします。

バリアント制御モードの選択

モデル内の各バリアント選択肢は、その選択肢がアクティブか非アクティブかを決定するバリアント制御に関連付ける必要があります。Variant control modeブロック パラメーターを使用してバリアント制御を指定するモードを選択できます。この例の Controller ブロックの [バリアント制御モード] パラメーターは [expression] に設定されています。このモードでは、選択肢のバリアント制御を boolean の条件式、Simulink.Variant オブジェクト、既定のバリアント選択肢、または空の選択肢として指定できます。各種のバリアント制御モードの詳細については、Variant Control Modes in Variant Blocksを参照してください。

バリアント制御を使用したバリアント選択肢のアクティブ化と切り替え

このモデルでは、各選択肢のバリアント制御が VSS_LINEAR_CONTROLLERVSS_NONLINEAR_CONTROLLER の 2 つの Simulink.Variant オブジェクトを使用して定義されています。このモデルで使用されている Simulink.Variant オブジェクトの定義を確認するには、[モデル設定]、[モデル プロパティ]、[PreLoadFcn] コールバックの順にクリックします。モデルを開くと、PreLoadFcn コールバックが実行され、モデルのベース ワークスペースにオブジェクトが作成されます。

Simulink.VariantExpressionオブジェクトでは、true と評価されたときに特定のバリアント選択肢をアクティブにする boolean の条件式をカプセル化できます。条件式は、MATLAB® 変数または Simulink.Parameter オブジェクトとしてベース ワークスペースまたはデータ ディクショナリで定義された 1 つ以上のバリアント制御変数を使用して作成できます。次の例では、通常の MATLAB 変数 VSS_MODE を使用して Simulink.Variant オブジェクトの条件式を作成しています。

Simulink.Variant オブジェクトの VSS_LINEAR_CONTROLLERVSS_NONLINEAR_CONTROLLERController ブロックのバリアント選択肢に関連付けるには、次のようにします。

  • [ブロック パラメーター] ダイアログ ボックスで、各選択肢の [バリアント制御式] 列にオブジェクトの名前を入力します。

  • Simulink.Variant オブジェクトが表す boolean 条件が [条件] 列に自動的に表示されます。

VSS_MODE2 に設定されているため、既定では NonLinear Controller がアクティブになります。アクティブな選択肢を Linear Controller に切り替えるには、ベース ワークスペースで VSS_MODE = 1 を設定し、モデルをシミュレートします。

既定のバリアント選択肢の指定: バリアント制御モードが expression に設定されている場合、最大 1 つのバリアント選択肢をモデルの既定として指定できます。Simulink は、バリアント制御を評価し、シミュレーション中に 1 つのバリアント選択肢のみがアクティブになることを検証します。true と評価されるバリアント制御がない場合、Simulink はシミュレーションとコード生成に default のバリアントを使用します。バリアント選択肢を既定として設定するには、その選択肢の [バリアント制御式] 列で (default) キーワードを選択します。

空のバリアント選択肢の指定: 空のバリアント選択肢を追加した場合は、その選択肢用にバリアントのアクティブ化条件を指定するか、条件の前に % 記号を付けて既存のバリアント条件をコメントアウトできます。このバリアント選択肢がシミュレーション中にアクティブである場合、Simulink は空のバリアント選択肢を無視します。ただし、Simulink は空のバリアント選択肢の中にあるブロックのコールバックの実行は継続します。

バリアント制御を定義する他の方法の詳細については、Use Variant Control Variables in Variant Blocksを参照してください。

バリアントのアクティベーションのタイミングの選択

Variant Subsystem ブロックのアクティブな選択肢が Simulink によってどの段階で設定されるかは、ブロックに指定する [バリアントのアクティベーションのタイミング] で決まります。このパラメーターはアクティブな選択肢と非アクティブな選択肢がどのようにシミュレーションおよびコード生成のワークフローに含まれるのかについても決定します。

Controller ブロックでは、このパラメーターは update diagram に設定されています。そのため、モデルのコンパイル段階の開始時に Simulink でアクティブな選択肢が設定され、非アクティブな選択肢が削除されます。モデルの実行時は、アクティブな選択肢のみについて一貫性が解析されます。生成されたコードには、アクティブな選択肢のみが含まれます。他のバリアントのアクティベーションのタイミングの詳細については、Activate Variant During Different Stages of Simulation and Code Generation Workflowを参照してください。

異なるインターフェイスをもつバリアント選択肢の表現

この例では、Linear ControllerNonLinear Controller の 2 つのバリアント選択肢に Controller Variant Subsystem ブロックと同じ数の入力端子と出力端子があります。バリアント選択肢を表すブロックは、親の Variant Subsystem ブロックの入力端子および出力端子とは異なる数の入力端子および出力端子をもつこともできます。Variant Subsystem ブロックでは、そのインターフェイスを基となるブロックのアクティブ性に基づいて適応させることができます。これにより、類似のインターフェイスをもたないコンポーネントのバリエーションをモデル化できます。この場合、バリアント選択肢は次の条件を満たさなければなりません。

  • [柔軟なインターフェイスを許可] パラメーターが 'on' に設定されている必要があります。

  • バリアント選択肢は、Variant Subsystem コンテナー ブロックと同じ入力端子のセットをもつか、コンテナー ブロックの端子のサブセットでなければなりません。

  • バリアント選択肢は、Variant Subsystem コンテナー ブロックと同じ出力端子のセットをもつか、コンテナー ブロックの端子のサブセットでなければなりません。

  • Variant Subsystem コンテナー ブロックに制御端子がある場合、バリアント選択肢すべての制御端子ブロックは、Variant Subsystem ブロックと同じタイプでなければなりません。たとえば、Enabled Subsystem ブロックと Function-Call Subsystem ブロックを Variant Subsystem ブロック内の選択肢として使用することはできません。Variant Subsystem ブロックの制御端子とそのバリアント選択肢の対応する制御端子は、同じ名前でなければなりません。たとえば、Variant Subsystem の制御端子の名前が fcn である場合、そのバリアント選択肢すべての対応する制御端子の名前も fcn でなければなりません。

例については、Variant Subsystem の適応インターフェイスを参照してください。

Variant Subsystem でのゼロ アクティブ バリアント制御の許可

Variant Subsystem ブロックでアクティブなバリアント選択肢がない場合でもシミュレーションを実行できるかどうかは、ブロックの [ゼロ アクティブ バリアント制御を許可] パラメーターで決まります。このオプションを選択すると、アクティブなバリアント選択肢がない場合に、Simulink は Variant Subsystem 内のアクティブなバリアント選択肢なしでモデルのシミュレーションを行います。オプションをクリアした場合は、アクティブなバリアント選択肢がないと Simulink でエラーが生成されます。このパラメーターは、Variant Subsystem に (default) のバリアント選択肢がなく、[バリアント制御モード]expression に設定している場合にのみ使用できます。

Variant Subsystem の外部へのバリアント条件の伝播

シミュレーションの実行時、Simulink はバリアント ブロックから接続しているブロックにバリアント条件を自動的に伝播することで、アクティブなままにするモデルのコンポーネントを決定します。Variant Subsystem の場合、選択肢で定義されたバリアント条件は Variant Subsystem ブロックの外部に既定では伝播されません。これを有効にするには、Variant Subsystem ブロックで [Variant Subsystem の外部に条件を伝播する] パラメーターを設定します。

[Variant Subsystem の外部に条件を伝播する] パラメーターを選択すると、Simulink は、基となるブロックのバリアント条件を Variant Subsystem コンテナー ブロックに伝播して、サブシステムがそのインターフェイスを基となるブロックの状態に適応できるようにします。アクティブな選択肢の端子にマッピングされた端子がアクティブになります。非アクティブな選択肢の端子にマッピングされた端子は非アクティブになります。このオプションを選択すると、Variant Subsystem の外部のコンポーネントが Variant Subsystem ブロック内のブロックのアクティブな状態と非アクティブな状態を確実に認識します。詳細については、Variant Subsystem の外部のバリアント領域を定義するためのバリアント条件の伝播を参照してください。

Variant Subsystem ブロックへの変換

Simulink エディターでは、次のブロックを Variant Subsystem ブロックに変換できます。

  • Subsystem ブロック

  • Model ブロック

  • 条件付き実行サブシステム

これを行うには、ブロックを右クリックし、コンテキスト メニューで [サブシステムとモデル参照]、[変換]、[Variant Subsystem] をクリックします。

これらのブロックは、Simulink.VariantUtils.convertToVariantSubsystemメソッドを使用してプログラムで Variant Subsystem ブロックに変換することもできます。

詳細