Variant Subsystem を使用した個別の階層でのバリエーションの実装
この例では、Variant Subsystem ブロックを Simulink® で構成して使用する方法を示します。Variant Subsystem ブロックは階層的バリアント ブロックです。このブロックを使用して、システム コンポーネントの複数の実装やバリエーションをモデル内の個別の階層にカプセル化できます。Variant Subsystem ブロック内で表現されるコンポーネントのそれぞれのバリエーションを選択肢と呼びます。モデルの実行時には、Variant Subsystem ブロック内のバリアント選択肢のうち 1 つのみをアクティブにできます。Variant Subsystem ブロック内の選択肢は、Subsystemブロック、Modelブロック、またはCreate and Use Referenced Subsystems in Modelsブロックの組み合わせを使用して表現できます。
ブロックとそのパラメーターの詳細については、Variant Subsystemを参照してください。
モデルの確認
モデル
slexVariantSubsystems
を開きます。システムのコントローラー コンポーネントの 2 つの異なる実装が Variant Subsystem ブロックController
でカプセル化されています。
open_system('slexVariantSubsystems');
Variant Subsystem
Controller
を開きます。Controller
コンポーネントの 2 つの可能なバリエーションが 2 つの Subsystem ブロックで表現されています。最初の選択肢はLinear Controller
で、2 番目の選択肢はNonlinear Controller
です。Variant Subsystem ブロック内のブロック間の接続は描画されていないことに注意してください。Simulink でのシミュレーションの実行時に、Variant Subsystem ブロックの Inport ブロックと Outport ブロックにアクティブなバリアントが自動的に接続され、非アクティブな端子は無効になります。
open_system('slexVariantSubsystems/Controller');
Controller
ブロックの [ブロック パラメーター] ダイアログ ボックスを開きます。[バリアントの選択肢] テーブルに Variant Subsystem の選択肢がリストされます。Controller
ブロックの各バリアント選択肢がバリアント制御に関連付けられています。ここで、バリアント制御はV == 1
およびV == 2
です。Simulink では、すべての選択肢のバリアント制御を評価することで Variant Subsystem のアクティブな選択肢を決定します。バリアント制御がtrue
と評価されると、Simulink はそのバリアント制御に対応するバリアント選択肢をアクティブにし、非アクティブな選択肢を無効にします。そのため、それぞれのバリアント選択肢がバリアント制御に関連付けられますが、true
と評価されるバリアント制御は 1 つだけでなければなりません。これにより、モデル構造は変更せずに、Variant Subsystem でアクティブな選択肢と非アクティブな選択肢を切り替えることができます。
Variant Subsystem ブロックの構成
このモデルでは、Linear Controller
と Nonlinear Controller
の 2 つのサブシステムをバリアント選択肢としてもつ Controller
Variant Subsystem が事前構成されています。このモデルに Variant Subsystem ブロックをさらに追加し、そのブロックを構成するには、次の手順を実行します。
Simulink ライブラリ ブラウザーまたはクイック挿入メニューを使用して Variant Subsystem ブロックをモデルに追加し、ブロックに名前を付けます。このブロックはバリアントの選択のコンテナーとして使用します。
Variant Subsystem ブロックを開き、そのバリアント選択肢を確認するには、ブロックをダブルクリックし、Simulink モデル キャンバスの上部のツール バーにある [親に移動] ボタンをクリックします。Variant Subsystem ブロックは、既定では、バリアント選択肢を表現するために 2 つの Subsystem ブロックで事前構成されたテンプレートです。
Variant Subsystem ブロックの入力および出力と一致するように、Variant Subsystem ブロック内に Inport ブロックと Outport ブロックを追加します。
バリアント選択肢ブロックに名前を付けます。
メモ:
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. [ブロック パラメーター] ダイアログ ボックスの使用
Variant Subsystem ブロックの [ブロック パラメーター] ダイアログ ボックスを開きます。Variant Subsystem ブロック上のバッジを右クリックし、[ブロック パラメーター (Subsystem)] を選択します。
[ブロック パラメーター] ダイアログ ボックスのVariant choicesに、追加したバリアント選択肢が表示されます。テーブルの左にあるボタンを使用して、テーブルの要素を追加したり変更したりできます。
Subsystem ブロックを新しいバリアント選択肢として Variant Subsystem 内に含めるには、[バリアントの選択肢] テーブルの左にある [新しいサブシステム バリアントの選択を作成して追加します] ボタンをクリックします。
新しい Subsystem ブロックを開き、バリアント選択肢を表すモデル要素を追加します。
b. 操作バーの使用
Variant Subsystem ブロックをダブルクリックし、Simulink モデル キャンバスの上部のツール バーにある [親に移動] ボタンをクリックします。
選択ボックスをドラッグして Variant Subsystem 内の空の領域を囲みます。操作バーに、ブロック内のサブシステムの選択肢タイプに基づくサブシステム挿入オプションが表示されます。
操作バーから、[Variant Subsystem の選択肢] オプションを選択して Subsystem ブロックを追加します。
新しい Subsystem ブロックを開き、バリアント選択肢を表すモデル要素を追加します。
メモ:
バリアント選択肢に含まれる入力端子と出力端子の数が異なる場合は、異なるインターフェイスをもつバリアント選択肢の表現を参照してください。
Variant Subsystem ブロック内では、Enabled Subsystem、Triggered Subsystem、Reset Subsystem、Function-Call Subsystem などの条件付き実行サブシステムをバリアント選択肢として使用できます。詳細については、Propagate Variant Conditions to Control Execution of Conditional Subsystemsを参照してください。
バリアントのプロトタイプを作成する場合、入力または出力がない空の Subsystem ブロックを Variant Subsystem ブロック内に作成できます。空のサブシステムによって、バリアントの選択の完全なモデル化を必要とせずに、サブシステムが非アクティブな状況が再現されます。
バリアント選択肢として Simulink モデルを含める
Simulink モデル (Model ブロック) を新しいバリアント選択肢として Variant Subsystem 内に含めるには、[バリアントの選択肢] テーブルの左にある [新しいモデル バリアントの選択を作成して追加します] ボタンをクリックします。Simulink により、関連付けられていない Model ブロックが Variant Subsystem ブロック内に作成されます。
関連付けられていない Model ブロックをダブルクリックします。[モデル名] ボックスにモデル バリアント選択肢として使用するモデルの名前を入力し、[OK] をクリックします。
メモ: 参照モデルには、それが含まれる Variant Subsystem ブロックと同じ数の入力端子および出力端子が必要です。モデルに含まれる入力端子と出力端子の数が異なる場合は、異なるインターフェイスをもつバリアント選択肢の表現を参照してください。
バリアント選択肢としてサブシステム参照を含める
サブシステム参照を新しいバリアント選択肢として Variant Subsystem 内に含めるには、Simulink ライブラリ ブラウザーまたはクイック挿入メニューを使用して Subsystem Reference ブロックを追加します。Simulink により、空の Subsystem Reference ブロックが Variant Subsystem ブロック内に作成されます。
Subsystem Reference ブロックをダブルクリックします。[ブロック パラメーター] ダイアログ ボックスでサブシステムのブロック線図ファイルを指定し、[OK] をクリックします。
バリアント制御モードの選択
モデル内の各バリアント選択肢は、その選択肢がアクティブか非アクティブかを決定するバリアント制御に関連付ける必要があります。Variant control modeブロック パラメーターを使用してバリアント制御を指定するモードを選択できます。この例の Controller
ブロックの [バリアント制御モード] パラメーターは [expression]
に設定されています。このモードでは、選択肢のバリアント制御を boolean の条件式、Simulink.VariantExpression
オブジェクト、既定のバリアント選択肢、または空の選択肢として指定できます。各種のバリアント制御モードの詳細については、Variant Control Modes in Variant Blocksを参照してください。
バリアント制御を使用したバリアント選択肢のアクティブ化と切り替え
このモデルでは、各選択肢のバリアント制御 V
は MATLAB® スカラー変数です。Use Variant Control Variables in Variant Blocksで説明されているように、要件に応じて V
をこれらのタイプのいずれかに変更できます。
V
が 1
に設定されているため、既定では Linear Controller
がアクティブになります。アクティブな選択肢を NonLinear Controller
に切り替えるには、ベース ワークスペースで V = 2
を設定し、モデルのシミュレーションを実行します。
既定のバリアント選択肢の指定: バリアント制御モードが 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 Controller
と NonLinear 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
でなければなりません。
例については、Adaptive Interface for Variant Subsystemsを参照してください。
モデルをシミュレートするときに、Variant Subsystem ブロックまたは Variant Assembly Subsystem ブロックで不足している端子や未使用の端子が見つかることがあります。これは、Variant Subsystem に、そのいずれかのバリアント選択肢に存在する端子がないか、その逆にいずれのバリアント選択肢でも使用されていない端子がある場合に発生する可能性があります。これに対処するには、関数
を使用し、Variant Subsystem ブロックまたは Variant Assembly Subsystem ブロックのインターフェイスに、不足している端子の追加や未使用の端子の削除による自動調整を行います。Simulink.VariantUtils.updateVariantSubsystemPorts
Variant Subsystem でのゼロ アクティブ バリアント制御
Variant Subsystem ブロックでアクティブなバリアント選択肢がない場合でもシミュレーションを実行できるかどうかは、ブロックの [組み込みの空の選択肢] パラメーターと [組み込みのパススルーの選択肢] パラメーターで決まります。
[組み込みの空の選択肢] パラメーターを選択すると、アクティブなバリアント選択肢がない場合に、Simulink は Variant Subsystem ブロックのバリアント選択肢の接続を解除し、それによってモデルからバリアント領域を完全に削除します。サブシステムの非アクティブな出力端子はゼロを出力します。
[組み込みのパススルーの選択肢] パラメーターを選択すると、アクティブなバリアント選択肢がない場合に、Simulink は Variant Subsystem ブロックのバリアント選択肢をバイパスします。入力端子と出力端子のみがアクティブなままになり、入力端子から出力端子に値が渡されます。
これらのパラメーターは、Variant Subsystem に (default)
のバリアント選択肢がなく、[バリアント制御モード] を [expression]
に設定している場合にのみ使用できます。
Variant Subsystem の外部へのバリアント条件の伝播
シミュレーションの実行時、Simulink はバリアント ブロックから接続しているブロックにバリアント条件を自動的に伝播することで、アクティブなままにするモデルのコンポーネントを決定します。Variant Subsystem の場合、選択肢で定義されたバリアント条件は Variant Subsystem ブロックの外部に既定では伝播されません。これを有効にするには、Variant Subsystem ブロックで [Variant Subsystem の外部に条件を伝播する] パラメーターを設定します。
[Variant Subsystem の外部に条件を伝播する] パラメーターを選択すると、Simulink は、基となるブロックのバリアント条件を Variant Subsystem コンテナー ブロックに伝播して、サブシステムがそのインターフェイスを基となるブロックの状態に適応できるようにします。アクティブな選択肢の端子にマッピングされた端子がアクティブになります。非アクティブな選択肢の端子にマッピングされた端子は非アクティブになります。このオプションを選択すると、Variant Subsystem の外部のコンポーネントが Variant Subsystem ブロック内のブロックのアクティブな状態と非アクティブな状態を確実に認識します。詳細については、Propagate Variant Conditions to Define Variant Regions Outside Variant Subsystems to Promote Consistency and Reduce Errorsを参照してください。
Variant Subsystem ブロックへの変換
Simulink エディターでは、次のブロックを Variant Subsystem ブロックに変換できます。
Subsystem ブロック
Model ブロック
条件付き実行サブシステム
これを行うには、ブロックを右クリックし、コンテキスト メニューで [サブシステムとモデル参照]、[変換]、[Variant Subsystem] をクリックします。
これらのブロックは、Simulink.VariantUtils.convertToVariantSubsystem
メソッドを使用してプログラムで Variant Subsystem ブロックに変換することもできます。
参考
バリアントの選択の取り扱い | Propagate Variant Conditions to Control Execution of Conditional Subsystems
トピック
- Generate Code for Variant Subsystem Blocks (Simulink Coder)