サブシステム参照
サブシステム参照では、サブシステムの内容を別のファイルに保存し、Subsystem Reference ブロックを使用してそれを参照できます。同一のサブシステム ファイルを参照する複数のインスタンスを作成できます。参照サブシステムの任意のインスタンスを編集すると、サブシステムが保存されているファイルとは別のファイルに変更が保存され、そのファイルの参照インスタンスのすべてが同期されます。
メモ
サブシステム参照は SLX および MDL のファイル形式と互換性があります。
サブシステムを別のファイルに保存すると、同じサブシステム ファイルを参照している [サブシステム参照] ブロックを使用することで、複数回それを再利用できます。
Subsystem Reference ブロックは、ブロック アイコンの対角にある三角形で識別できます。
参照サブシステムは通常のサブシステムのセマンティクスすべてをサポートします。非参照サブシステムと比較すると、参照サブシステムは自身を親モデルのコンテキストに適応させて、同一の実行動作になります。
サブシステムのブロック線図の作成
サブシステム ファイルはサブシステムのブロック線図の内容をファイルに保存します。
サブシステム ファイルについて、次のとおりです。
シミュレートできません。
完全なコンフィギュレーション セットがありません。
モデル ワークスペースがありません。
コード生成機能がありません。
サブシステムのブロック線図を作成するには、以下を行います。
Simulink® を開きます。
スタート ページの Simulink 製品グループで、[空のサブシステム] をクリックします。
あるいは、Simulink ツールストリップの [シミュレーション] タブで、[新規] を選択して [空のサブシステム] をクリックします。サブシステム ウィンドウが開きます。
内容を追加して [保存] をクリックします。
[名前を付けて保存] ダイアログ ボックスでファイル名を指定します。このファイル名は、有効な MATLAB 名でなければなりません。
これにより、新しいサブシステム ファイルが指定の場所に作成されます。
サブシステム ファイルをプログラムで作成するには、次のコマンドを使用します。
new_system(subsystemfilename,'subsystem')
プログラムでのサブシステム ファイル制御の詳細については、プログラムでの参照サブシステムの制御を参照してください。
モデルでのサブシステム ファイルの参照
サブシステムのブロック線図を参照するモデルを開きます。
Simulink ライブラリ ブラウザーまたはクイック ブロック挿入メニューを使用して Subsystem Reference ブロックを追加します。空の Subsystem Reference ブロックが Simulink キャンバスに追加されます。
Simulink ツールストリップの [参照サブシステム] タブで、サブシステムのブロック線図ファイルの名前を [ファイル名] フィールドに指定するか、[参照] をクリックして移動します。
あるいは、Subsystem Reference ブロックをダブルクリックして、サブシステムのブロック線図ファイルを指定できます。
[OK] をクリックして変更を保存します。
既存のサブシステムから参照サブシステムへの変換
既存の Subsystem ブロックを Subsystem Reference ブロックに変換できます。
次のように、2 つの Subsystem ブロックがあるモデルを考えます。
このモデルには、2 つの Subsystem ブロックがあります。Controller サブシステムと Plant サブシステムです。Controller サブシステム ブロックを参照サブシステムに変換するには、次のようにします。
[Subsystem ブロック] タブで Controller Subsystem ブロックを選択し、[変換] を選択して [サブシステム参照に変換] をクリックします。
[サブシステム ファイル名] フィールドでサブシステム コンポーネントの名前を指定します。名前は有効な MATLAB 名でなければなりません。変換により、現在のディレクトリにサブシステム ファイルが作成されます。特定の場所にファイルを作成するには、[参照] をクリックして保存する場所に移動します。次に、既存のテスト ハーネスをサブシステムのブロック線図に転送します。テスト ハーネスを転送するには、[テスト ハーネスの転送] チェック ボックスをオンにしてから、[変換] をクリックします。
Subsystem ブロックは、ブロック アイコンの上にサブシステム ファイルの名前が表示された Subsystem Reference ブロックに変更されます。
ヒント
リンク付きブロックを参照サブシステムに変換する際は、該当するリンク付きブロックの親ライブラリ ブロックで変換を実行してください。親ライブラリ ブロックを参照サブシステムに変換すると、そのリンク付きブロック インスタンスもすべて参照サブシステムに変換されます。
サブシステムが次の場合には、サブシステムを参照サブシステムに変換できません。
読み取り/書き込み権限がない
内容を変更しようとしているマスクがある
参照サブシステムの編集と保存
参照サブシステムの複数のインスタンスが含まれるモデルでは、任意のインスタンスを編集でき、変更を保存すると同時に、その更新がすべての参照インスタンスに伝播します。参照サブシステムのインスタンスの編集が進行中である場合、他のすべての参照インスタンスはロックされ、編集できません。
開いているサブシステム ファイルの左下角に、ファイルが編集可能かを示すバッジが表示されます。バッジは次の 2 つの状態を示します。
はサブシステム ファイルが編集可能であることを示します。バッジを右クリックすると対象サブシステムのすべてのアクティブ インスタンスを確認してそれぞれに移動できます。
は、別のインスタンスの編集が進行中のため、サブシステム ファイルが編集不可であることを示します。編集進行中のインスタンスを開くには、バッジを右クリックします。
モデルでインスタンスを編集すると、モデル ウィンドウの [シミュレーション] タブで [保存] オプションが有効になり、変更を保存できます。[すべて保存] ドロップダウンには、変更の保存について次の 2 つのオプションがあります。
[すべて保存] – 現在のモデルでの更新をすべて保存します。
[特定の参照ファイルを保存] – 複数のサブシステム ファイルを変更した場合に特定のサブシステム ファイルを保存します。
サブシステム参照のシステム マスクの追加
システム マスクを使用してサブシステム ファイルをマスクできます。サブシステム ファイルのシステム マスクを作成する場合、すべての参照インスタンスが同じシステム マスクを共有します。
サブシステム ファイルをマスクするには、次のようにします。
マスクするサブシステムを開きます。
Simulink ツールストリップの [サブシステム] タブで、[システム マスクの作成] をクリックします。あるいは、キャンバスの任意の場所で右クリックして [マスク] を選択し、[システム マスクの作成] をクリックします。[マスク エディター] ダイアログが開きます。
マスク パラメーターを追加して [OK] をクリックします。
メモ
Subsystem Reference ブロックを直接マスクすることはできません。Subsystem Reference ブロックをマスクするには、そのブロックを選択します。[参照サブシステム] タブで [システム マスクの作成] をクリックします。この操作により、参照されるサブシステム ファイルが開き、そのマスクが作成されます。
マスク サブシステムのコールバック コードで
set_param
を使用してパラメーターを設定することはできません。ただし、サブシステムがライブラリから参照されている場合は可能です。
システム マスクの作成と編集の詳細については、システム マスクの概要を参照してください。
テスト ハーネスを使用したサブシステムのブロック線図のシミュレーション
サブシステムのブロック線図は、モデルやサブシステムのようにシミュレーションできません。ただし、サブシステムのブロック線図上でテスト ハーネスを作成して、テスト ハーネスをシミュレーションすることはできます。この操作によって、サブシステムのブロック線図を編集しながら、エラーまたは不一致がないか確認できます。複数のテスト ハーネスをサブシステム ファイルに関連付けて、利用可能な一連のテスト ハーネスからサブシステムの既定のテスト ハーネスを設定できます。
テスト ハーネスを使用してシミュレーションするには、以下を行います。
サブシステムのブロック線図を開きます。
Simulink ツールストリップの [サブシステム] タブで、[テスト ハーネスの追加] をクリックします。
[テスト ハーネスの作成] ウィンドウが表示されます。
新しいテスト ハーネスの名前を指定して、[OK] をクリックします。これが既定のテスト ハーネスになります。
ツールストリップの [テスト ハーネスで実行] をクリックして、テスト ハーネスを開かずにサブシステムでテスト ハーネスを実行します。テスト ハーネスをサブシステムでの実行時に自動的に開くには、[実行時にハーネスを開く] チェック ボックスをクリックします。
コマンド ラインを使用したテスト ハーネスの設定
以下のコマンドを使用して、サブシステムのブロック線図の既定のテスト ハーネスを設定できます。
set_param('<subsystemfilename>','DefaultTestHarness','<testHarnessName>');
サブシステム参照と以前のバージョンとの互換性
参照サブシステムを含むモデルを R2019b より前のバージョンにエクスポートする場合、すべての Subsystem Reference ブロックが独立した Subsystem ブロックに変換されます。
R2019b で作成されたサブシステム ファイルを以前のバージョンにエクスポートすることはできません。Simulink モデルを以前のバージョンにエクスポートする方法の詳細については、モデルを前の Simulink バージョンにエクスポートするを参照してください。
プログラムでの参照サブシステムの制御
コマンド ライン インターフェイスを使用して、参照サブシステムの作成、モデルでの有効な参照サブシステムの検出、ブロックでの参照サブシステム ファイルの変更、ファイルのブロック線図タイプの確認が可能です。
参照サブシステムの作成
次のように new_system コマンドを使用して、参照サブシステムを作成できます。
new_system(subsystemfilename,'SubSystem')
モデルでのサブシステム参照の検出
次のように関数 Simulink.findBlocksOfType
を使用して、モデルが参照サブシステムを含むかどうかを検出できます。
Simulink.findBlocksOfType(bdroot, 'SubSystem','ReferencedSubsystem','.',Simulink.FindOptions('RegExp',1))
また、find_system コマンドを使用することもできます。
find_system(bdroot, 'RegExp','on','BlockType','SubSystem','ReferencedSubsystem', '.')
いずれもモデル内の Subsystem Reference ブロック数を返します。既定では、find_system
はサブシステム参照インスタンス内のすべての子ブロックをリストします。
find_system
で参照サブシステム内が検索されないようにする場合は、LookInsideSubsystemReference
が off
に設定された find_system
を使用します。既定では、LookInsideSubsystemReference
は on
に設定されています。
サブシステムの参照ファイルの変更
コマンド ライン インターフェイスで次のように set_param
コマンドを使用して、Subsystem Reference ブロックで参照されているサブシステム ファイルを変更できます。
set_param(gcb, 'ReferencedSubsystem', '<subsystemfilename>')
SLX ファイルまたは MDL ファイルが Subsystem ブロック線図タイプであるかの確認
次のコマンドのいずれかを使用して、SLX ファイルまたは MDL ファイルが Subsystem Reference ブロックに配置できる Subsystem ブロック線図タイプであるかを確認できます。
bdIsSubsystem(bdname)
logical 1
を返し、そうでない場合は logical 0
を返します。このコマンドの使用時には、bdname.slx が読み込まれていることを確認してください。get_param(bdname,'BlockDiagramType')
bdname.slx が Subsystem ブロック線図タイプである場合、このコマンドは Subsystem
を返します。このコマンドの使用時には、bdname.slx が読み込まれていることを確認してください。
Simulink.MDLInfo(bdname)
bdname.slx が Subsystem ブロック線図タイプである場合、このコマンドは BlockDiagramType
プロパティが Subsystem
であると示されるモデル全体の情報を提供します。
ベスト プラクティス
モデルで参照サブシステムを使用する条件は、次のとおりです。
参照サブシステムをマスクするには、システム マスクを使用する。
参照ループが作成されるため、親サブシステムを参照しない。
Subsystem Reference ブロックによって参照できるのはサブシステム ファイル タイプのみ。