モデルでの参照サブシステムの作成と使用
サブシステム参照とは
コンポーネントベースのモデル化では、Simulink® モデルをサブシステム、サブシステム参照、モデル参照などのより小さなコンポーネントに分割できます。各コンポーネントには適切に定義された範囲があり、特定の機能を実行します。各種の Simulink コンポーネントの詳細については、高水準のコンポーネント選択ガイドラインを参照してください。
"サブシステム参照" を使用すると、サブシステムを独立したファイルに格納してモデルで参照できます。これは、モデルでサブシステムを複数回再利用する必要がある場合に特に役立ちます。これにより、元のサブシステムに加えた変更がその参照インスタンスすべてに自動的に伝播されるため、モデル内の一貫性を維持し、冗長性を軽減できます。これらのインスタンスは、元のサブシステムと同じ実行動作を示します。
たとえば、自動車のフロント ワイパーとリア ワイパーについて考えます。フロント ワイパーとリア ワイパーの動作は同じですが、それらの速度の制御に使用するレイン センサー入力は異なります。ワイパーの速度を制御する同じロジックを含むサブシステムを複数設計する代わりに、ワイパーの速度を制御する単一のサブシステムを独立したファイルに保存し、異なる入力を渡すことで、このサブシステムをモデル内で再利用することができます。このアプローチによりコンポーネントの再利用が促進され、モデルのメンテナンスが簡略化されて、設計のモジュール性が高まります。
サブシステム参照を使用するには、"サブシステム ファイル" と呼ばれる独立したファイルにサブシステムを .slx 形式または .mdl 形式で保存します。その後、Subsystem Reference ブロックを使用してモデルでこのサブシステム ファイルを参照します。モデルでサブシステム ファイルを参照すると、参照サブシステムが形成されます。Subsystem Reference ブロックでは、ブロック アイコンの対角の隅に三角形が配置されており、その中央にサブシステムのファイル名が表示されます。
![]()
サブシステム参照を使用する利点
コンポーネントベースのモデル化でサブシステム参照を使用すると、以下のような複数の利点があります。
モジュール開発 — サブシステム参照は、それを使用するモデルから独立した個別のコンポーネントとして開発およびテストできます。
参照によるインクルード — サブシステム ファイルは何度でも参照できるので、同じものを繰り返しコピーする必要がありません。
自動同期 — サブシステム参照インスタンスを編集して保存すると、その変更内容がサブシステム ファイルに保存され、そのファイルのすべての参照インスタンスが同期されます。
動的なインターフェイス — サブシステム参照は親モデルのコンテキストに適応するため、定義済みの入出力インターフェイスは必要ありません。
インクリメンタルな読み込み処理 — Simulink は必要な場合にのみサブシステム参照を読み込むため、モデルの読み込みが速くなります。
ファイルの競合の軽減 — サブシステム参照により、サブシステム コンポーネントが別々のファイルに分離されるため、並列アクセス中の競合が軽減されます。
インスタンス固有のカスタマイズ — サブシステム参照インスタンスを個別にカスタマイズしてデバッグでき、元のサブシステムと同じ実行動作を維持できます。
モデルでのサブシステム ファイルの参照
この例では、モデルでサブシステム ファイルを作成して参照する方法を説明します。また、この例では、サブシステム参照の次の機能も示します。
システム マスクを使用したインスタンス固有のカスタマイズ。
入力データのプロパティに基づく動作の適応。
インスタンス固有のデバッグ。
編集および保存中における複数のサブシステム参照インスタンスの自動同期。
サブシステム ファイルの個別のテスト。
サブシステム ファイルの作成
1. 次のいずれかの方法を使用して、空のサブシステム ウィンドウを開きます。
Simulink® を起動します。Simulink スタート ページの [Simulink] 製品グループで、[空のサブシステム] をクリックします。
Simulink ツールストリップの [シミュレーション] タブで、[新規] を選択して [空のサブシステム] をクリックします。
new_systemコマンドを使用します。
sub = new_system("slexTimesK","Subsystem"); open_system(sub);
2. サブシステムにコンテンツを追加します。サブシステム内に、Inport ブロック、Gain ブロック、Outport ブロックを追加し、次に示すように連結します。

3. サブシステム ファイルを slexTimesK として保存します。
モデルまたはライブラリ内の既存の Subsystem ブロックを Subsystem Reference ブロックに変換することもできます。Subsystem ブロックを変換すると、Subsystem Reference ブロック用のサブシステム ファイルが作成されます。詳細については、Convert Subsystem to a Referenced Subsystemを参照してください。
モデルでのサブシステム ファイルの参照
サブシステム参照を使用すると、余分なコピーを作成することなく、モデル内で同じサブシステム ファイルを複数回参照できます。
1. slexSubsystemReferenceContextAdapting という新しいモデルを作成します。または、サブシステム ファイルを参照するモデルを開くことができます。
2. Simulink ライブラリ ブラウザーまたはクイック ブロック挿入メニューを使用して Subsystem Reference ブロックを追加します。
3. Simulink ツールストリップの [Subsystem ブロック] タブで、[ファイル名] フィールドにサブシステム ファイルの名前 slexTimesK を入力するか、[参照] をクリックしてサブシステム ファイルに移動します。
あるいは、Subsystem Reference ブロックをダブルクリックしてサブシステム ファイル名を入力できます。

これにより、サブシステム ファイル slexTimesK を参照するサブシステム参照インスタンスがモデル内に作成されます。このインスタンスに SSREF1 という名前を付けます。
4. 同じサブシステム ファイルを別のサブシステム参照インスタンス SSREF2 で参照するには、Subsystem Reference ブロック SSREF1 のコピーを作成します。
サブシステム参照インスタンスのカスタマイズ
サブシステム参照インスタンスごとに異なる動作を設定し、サブシステム ファイルの共有特性および機能を同時に使用できます。インスタンス固有のカスタマイズを可能にするには、サブシステム ファイルのシステム マスクを作成します。サブシステム ファイルのシステム マスクを作成すると、そのすべての参照インスタンスで同じマスク パラメーターが共有されます。各参照インスタンスのマスク ダイアログ ボックスを使用して、これらのマスク パラメーターに異なる値を代入できます。
1. サブシステム ファイルにシステム マスクを追加します。slexTimesK の Simulink ツールストリップの [サブシステム] タブで [システム マスクの作成] をクリックします。[マスク エディター] ウィンドウが開きます。新しいマスク パラメーターを追加し、それを [ゲイン] 値 k に設定します。[プロンプト] を Input for Gain に設定します。マスクを保存します。
サブシステム ファイルのマスクの詳細については、Mask a Subsystem Fileを参照してください。
2. サブシステム ファイル slexTimesK を保存します。
3. モデル slexSubsystemReferenceContextAdapting 内のサブシステム参照インスタンスのマスク パラメーター値を編集します。Subsystem Reference ブロック SSREF1 をダブルクリックし、マスク ダイアログ ボックスの [Input for Gain] ボックスに値 5 を入力します。同様に、SSREF2 のマスク パラメーター値を 10 に設定します。
入力データに基づくサブシステム参照の動的動作
サブシステム参照は、その入力データのプロパティに従ってその動作を適応させます。信号属性を定義する必要はなく、サブシステム参照インスタンスごとに異なる次元およびデータ型の入力信号を直接使用できます。
1. モデル slexSubsystemReferenceContextAdapting で、両方のサブシステム参照インスタンスに異なる入力信号を設定します。
Constant ブロックを使用して、
SSREF1への入力としてスカラー値1を指定します。Constant ブロックを使用して、
SSREF2への入力としてベクトル値[1,2,3,4]を指定します。
2. 出力を表示するには、両方のサブシステム参照インスタンスに Display ブロックを追加します。
3. モデルのシミュレーションを実行します。

サブシステム参照インスタンス SSREF1 および SSREF2 について以下を確認します。
マスク ダイアログ ボックスを使用して設定したマスク パラメーター値
5および10をそれぞれ使用している。出力がそれぞれ 1 次元と 4 次元になるように適応している。
インスタンス固有のデバッグ
各サブシステム参照インスタンスはモデル内の独自の入力セットによって駆動されるため、各インスタンスのデバッグと解析を個別に行う必要があります。
サブシステム参照インスタンス SSREF1 をデバッグするには、次を行います。
1. モデルでサブシステム参照 SSREF1 を選択し、[サブシステム] タブで [マスク内を表示] をクリックします。
2. SSREF1 内で、Gain ブロックの出力信号を選択し、ブレークポイントを設定します。信号値が 2 を超える場合にシミュレーションを一時停止するようにブレークポイントの条件を設定します。ブレークポイントの設定の詳細については、信号のブレークポイントを使用したシミュレーションのデバッグを参照してください。

3. SSREF1 を保存します。
4. SSREF1 をシミュレートして、サブシステム参照インスタンスの動作をデバッグおよび解析します。
サブシステム参照インスタンス SSREF1 にブレークポイントを設定しても、もう一方のサブシステム参照インスタンス SSREF2 は影響を受けません。このため、SSREF2 を単独でデバッグすることができます。
サブシステム参照の編集と保存
同じサブシステム ファイルの複数のインスタンスを含むモデルでは、任意のインスタンスを編集できます。サブシステム参照インスタンスを編集して保存すると、その変更内容がサブシステム ファイルに自動的に保存されます。これらの変更は、同じサブシステム ファイルのインスタンスを表示している他の開いているウィンドウにも反映されます。残りのサブシステム参照インスタンスは以下の場合に更新されます。
サブシステム参照インスタンスを含むモデルを開くか、シミュレートまたは更新する。
find_system、get_param、またはset_paramコマンドを使用する。これらのコマンドの使用の詳細については、Control Subsystem Reference Programmaticallyを参照してください。
サブシステム参照インスタンスをアクティブに編集すると、他のすべてのインスタンスがロックされ、編集できなくなる場合があります。他のインスタンスのロックを解除するには、変更を保存する必要があります。サブシステム参照インスタンスに対する変更の中には、サブシステム ファイルおよび読み込まれている他のサブシステム参照インスタンスに対し、ロックすることなく、自動的に伝播されるものがあります。このような変更は、インスタンスの編集中に、他のインスタンスで同時に確認できます。自動同期は以下の場合に適用されます。
ブロックを追加または削除する。
ブロック名、パラメーター、位置、またはサイズを変更する。
信号ラベルを変更する。
注釈を追加または変更する。
次の手順に従って、サブシステム ファイル slexTimesK のインスタンスを編集します。
1. モデルで、サブシステム参照インスタンス SSREF1 内を移動し、Scope ブロックを追加します。
左下隅にあるバッジは、インスタンスが編集可能かどうかを示します。

2. バッジを右クリックし、[インスタンスに移動] を選択して、同じサブシステム ファイルのすべてのアクティブなインスタンスのリストを表示します。インスタンス SSREF2 を開くオプションを選択します。新しく追加した Scope ブロックを確認します。この変更では、自動同期が行われます。
3. サブシステム参照インスタンス SSREF1 で、Inport ブロックと Scope ブロックを接続します。

4. サブシステム参照インスタンス SSREF2 に移動します。この変更では、SSREF2 はグレー表示されており、編集できません。

サブシステム参照インスタンスを編集したら、変更を保存または破棄できます。
変更を保存するには、サブシステム ファイルを保存するか、モデル ウィンドウの [シミュレーション] タブにある [すべて保存] ボタンのドロップダウン メニューから次のオプションを使用します。
すべて保存 — 現在のモデル内のすべての更新を保存します。
[参照ファイルを保存]、[特定のファイルを保存] — 複数のサブシステム ファイルに変更を加えた場合に、特定のサブシステム ファイルを保存します。
特定のサブシステム ファイルのインスタンスを編集している際に加えた変更内容を破棄するには、サブシステム ファイルを閉じます。サブシステム ファイルを閉じる前に保存するかどうかを確認するダイアログ ボックスが表示されます。[いいえ] をクリックします。この操作により、サブシステム ファイルのすべてのインスタンスの変更が元に戻ります。
テスト ハーネスを使用したサブシステム ファイルのシミュレーション
サブシステム ファイルはモデルやサブシステムのようにシミュレートできません。代わりに、サブシステム ファイルにテスト ハーネスを関連付けてから、そのテスト ハーネスを使用してサブシステム ファイルをシミュレートする必要があります。テスト ハーネスを使用すると、次のことが可能になります。
サブシステム ファイルの編集中にエラーや不一致がないか確認する。
モデル内のテスト済み環境に限りサブシステム参照インスタンスを使用できる。単体テストの詳細については、Define Subsystem Reference Interfaces Using Test Harnesses and Generate Reusable Codeを参照してください。
サブシステム ファイルに複数のテスト ハーネスを関連付けて、使用可能な一連のテスト ハーネスから既定のテスト ハーネスを設定できます。
次の手順に従って、サブシステム ファイルを、それを使用するモデルから独立した個別のコンポーネントとして開発およびテストします。
1. サブシステム ファイル slexTimesK の Simulink ツールストリップの [サブシステム] タブで [テスト ハーネスの追加] をクリックします。[テスト ハーネスの作成] ダイアログ ボックスが開きます。
2. テスト ハーネスを作成するには、名前を指定して [OK] をクリックします。テスト ハーネスを保存します。テスト ハーネスの詳細については、テスト ハーネスの作成 (Simulink Test)を参照してください。

3. サブシステム ファイル slexTimesK を編集し、Gain ブロックと Outport ブロックの間の信号線を削除することでエラーを発生させます。
4. Simulink ツールストリップで [テスト ハーネスで実行] をクリックし、テスト ハーネスを使用してサブシステム ファイルをシミュレートします。また、[実行時にハーネスを開く] チェック ボックスをオンにして、実行中にテスト ハーネスを自動的に開くこともできます。

診断ビューアーに表示される警告を観察します。
サブシステム参照の要件
参照ループが生成されるため、サブシステム ファイルから親サブシステムを参照しないでください。
以前のバージョンの Simulink とサブシステム参照の互換性
サブシステム参照コンポーネントを含むモデルを R2019b より前のバージョンの Simulink にエクスポートすると、すべての Subsystem Reference ブロックが独立した Subsystem ブロックに変換されます。この変換が行われるのは、R2019b より前ではサブシステム参照コンポーネントを使用できなかったためです。また、R2019b で作成されたサブシステム ファイルをそれより前のバージョンにエクスポートすることはできません。Simulink モデルを Simulink の以前のバージョンにエクスポートする方法については、以前のバージョンの Simulink へのモデルのエクスポートを参照してください。