このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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 Controller
と Nonlinear Controller
の 2 つのサブシステムをバリアント選択肢としてもつ Controller
Variant Subsystem が事前構成されています。このモデルに Variant Subsystem ブロックをさらに追加し、そのブロックを構成するには、次の手順を実行します。
Simulink ライブラリ ブラウザーまたはクイック ブロック挿入メニューを使用して Variant Subsystem ブロックをモデルに追加し、ブロックに名前を付けます。このブロックはバリアントの選択のコンテナーとして使用します。
Variant Subsystem を開くには、ブロックをダブルクリックします。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 (table of variant systems)に、追加したバリアント選択肢が表示されます。テーブルの左にあるボタンを使用して、テーブルの要素を追加したり変更したりできます。
Subsystem ブロックを新しいバリアント選択肢として Variant Subsystem 内に含めるには、[バリアントの選択肢] テーブルの左にある [新しいサブシステム バリアントの選択を作成して追加します] ボタンをクリックします。
新しい Subsystem ブロックを開き、バリアント選択肢を表すモデル要素を追加します。
b. 操作バーの使用
Variant Subsystem ブロックをダブルクリックします。
選択ボックスをドラッグして 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.Variant オブジェクト、既定のバリアント選択肢、または空の選択肢として指定できます。各種のバリアント制御モードの詳細については、Variant Control Modes in Variant Blocksを参照してください。
バリアント制御を使用したバリアント選択肢のアクティブ化と切り替え
このモデルでは、各選択肢のバリアント制御が VSS_LINEAR_CONTROLLER
と VSS_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_CONTROLLER
と VSS_NONLINEAR_CONTROLLER
を Controller
ブロックのバリアント選択肢に関連付けるには、次のようにします。
[ブロック パラメーター] ダイアログ ボックスで、各選択肢の [バリアント制御式] 列にオブジェクトの名前を入力します。
Simulink.Variant
オブジェクトが表す boolean 条件が [条件] 列に自動的に表示されます。
VSS_MODE
が 2
に設定されているため、既定では 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 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
でなければなりません。
例については、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 ブロックに変換することもできます。