このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
サブシステム参照
サブシステム参照では、サブシステムの内容を別のファイルに保存し、Subsystem Reference ブロックを使用してそれを参照できます。同一のサブシステム ファイルを参照する複数のインスタンスを作成できます。参照サブシステムの任意のインスタンスを編集すると、サブシステムが保存されているファイルとは別のファイルに変更が保存され、そのファイルの参照インスタンスのすべてが同期されます。
メモ
サブシステム参照は SLX および MDL のファイル形式と互換性があります。
サブシステムを別のファイルに保存すると、同じサブシステム ファイルを参照している [サブシステム参照] ブロックを使用することで、複数回それを再利用できます。
Subsystem Reference ブロックは、ブロック アイコンの対角にある三角形で識別できます。
参照サブシステムは通常のサブシステムのセマンティクスすべてをサポートします。非参照サブシステムと比較すると、参照サブシステムは自身を親モデルのコンテキストに適応させて、同一の実行動作になります。
サブシステムのブロック線図の作成
サブシステム ファイルはサブシステムのブロック線図の内容をファイルに保存します。
サブシステム ファイルについて、次のとおりです。
シミュレートできません。
完全なコンフィギュレーション セットがありません。
モデル ワークスペースがありません。
コード生成機能がありません。
メモ
モデル コンフィギュレーション セットの詳細については、モデル コンフィギュレーション パラメーター: Simulation Targetおよびモデル コンフィギュレーション パラメーター: コード生成のカスタム コード (Simulink Coder)を参照してください。
サブシステムのブロック線図を作成するには、以下を行います。
Simulink® を開きます。
スタート ページの Simulink 製品グループで、[空のサブシステム] をクリックします。
あるいは、Simulink ツールストリップの [シミュレーション] タブで、[新規] を選択して [空のサブシステム] をクリックします。サブシステム ウィンドウが開きます。
内容を追加して [保存] をクリックします。
[名前を付けて保存] ダイアログ ボックスでファイル名を指定します。このファイル名は、有効な MATLAB 名でなければなりません。
これにより、新しいサブシステム ファイルが指定の場所に作成されます。
サブシステム ファイルをプログラムで作成するには、次のコマンドを使用します。
new_system(subsystemfilename,'mysubsystem')
プログラムでのサブシステム ファイル制御の詳細については、プログラムでの参照サブシステムの制御を参照してください。
モデルでのサブシステム ファイルの参照
サブシステムのブロック線図を参照するモデルを開きます。
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 ブロックに変更されます。
ヒント
リンク付きブロックを参照サブシステムに変換する際は、該当するリンク付きブロックの親ライブラリ ブロックで変換を実行してください。親ライブラリ ブロックを参照サブシステムに変換すると、そのリンク付きブロック インスタンスもすべて参照サブシステムに変換されます。
サブシステムが次の場合には、サブシステムを参照サブシステムに変換できません。
読み取り/書き込み権限がない
内容を変更しようとしているマスクがある
参照サブシステムの編集と保存
参照サブシステムの複数のインスタンスが含まれるモデルでは、任意のインスタンスを編集できます。参照サブシステムのインスタンスの編集が進行中である場合、他のすべてのインスタンスはロックされ、編集できません。サブシステム参照インスタンスを編集して保存すると、自動的に変更がサブシステム ファイルに保存されます。そうした変更は、同じサブシステム参照のインスタンスを現在表示している他の開いているウィンドウでも反映されます。残りのサブシステム参照インスタンスは以下を行ったときに更新されます。
サブシステム参照インスタンスを含むモデルを開くか、シミュレートするか、更新する。
find_system
、get_param
、またはset_param
コマンドを使用する。コマンドの使用方法の詳細については、プログラムでの参照サブシステムの制御を参照してください。
開いているサブシステム ファイルの左下角に、ファイルが編集可能かを示すバッジが表示されます。バッジは次の 2 つの状態を示します。
はサブシステム ファイルが編集可能であることを示します。バッジを右クリックすると対象サブシステムのすべてのアクティブ インスタンスを確認してそれぞれに移動できます。
は、別のインスタンスの編集が進行中のため、サブシステム ファイルが編集不可であることを示します。編集進行中のインスタンスを開くには、バッジを右クリックします。
モデルでインスタンスを編集すると、変更を保存または破棄できます。
変更を保存するには、モデル ウィンドウの [シミュレーション] タブで [保存] を選択します。[すべて保存] ドロップダウンには、変更の保存について次の 2 つのオプションがリストされます。
[すべて保存] – 現在のモデルでの更新をすべて保存します。
[特定の参照ファイルを保存] – 複数のサブシステム ファイルを変更した場合に特定のサブシステム ファイルを保存します。
特定のサブシステム ファイルに加えた変更をそのインスタンスの編集中に破棄するには、サブシステム ファイルを閉じます。サブシステム ファイルを閉じる前に保存するかどうかを確認するダイアログ ボックスが表示されます。[いいえ] をクリックします。この操作により、サブシステム ファイルのすべてのインスタンスにおける変更が元に戻されます。
サブシステム参照へのデータ ディクショナリの接続
データ ディクショナリをサブシステム参照に接続して変数、オブジェクト、およびインターフェイスを保存できます。接続されたデータ ディクショナリで定義するデータのスコープは、サブシステム参照の境界です。データ ディクショナリを使用すると、あらゆる種類のデータとインターフェイスを定義でき、サブシステム参照の子ブロックおよびインスタンスで再利用できます。
データ ディクショナリをサブシステム参照に接続するには、次を行います。
新しいデータ ディクショナリを作成するか、既存のデータ ディクショナリを開きます。
データ ディクショナリにおいて、使用するすべてのデータ オブジェクト (変数、バス オブジェクト、列挙型など) を定義します。
データ ディクショナリを保存します。
[サブシステムのプロパティ] ダイアログ ボックスの [外部データ] タブを使用するか、
set_param
を使用して、データ ディクショナリをサブシステム ファイルの外部データ ソースとして接続します。[モデル エクスプローラー] に、接続されているデータ ディクショナリとその内容がサブシステム ファイルの外部データ ソースとして表示されます。
サブシステム参照の境界内のデータ ディクショナリで定義されている変数、オブジェクト、およびデータ型を使用できます。詳細については、Attach Data Dictionary to Subsystem Referenceを参照してください。
サブシステム参照のシステム マスクの追加
システム マスクを使用してサブシステム ファイルをマスクできます。サブシステム ファイルのシステム マスクを作成する場合、すべての参照インスタンスが同じシステム マスクを共有します。
サブシステム ファイルをマスクするには、次のようにします。
マスクするサブシステムを開きます。
Simulink ツールストリップの [サブシステム] タブで、[システム マスクの作成] をクリックします。あるいは、キャンバスの任意の場所で右クリックして [マスク] を選択し、[システム マスクの作成] をクリックします。[マスク エディター] ダイアログが開きます。
マスク パラメーターを追加して [OK] をクリックします。
メモ
Subsystem Reference ブロックを直接マスクすることはできません。Subsystem Reference ブロックをマスクするには、そのブロックを選択します。[参照サブシステム] タブで [システム マスクの作成] をクリックします。この操作により、参照されるサブシステム ファイルが開き、そのマスクが作成されます。
マスク サブシステムのコールバック コードで
set_param
を使用してパラメーターを設定することはできません。ただし、サブシステムが自己修正可能であるかライブラリから参照されている場合は可能です。
システム マスクの作成と編集の詳細については、システム マスクの概要を参照してください。
システム マスクを使用した自己修正可能なサブシステム参照の作成
システム マスクを使用して、マスク サブシステム ファイルの内容にインスタンス固有の変更を加えることができます。動的な変更を許可するには、マスク サブシステム ファイルを自己修正可能として設定します。自己修正可能なサブシステム ファイルでは、システム マスクの初期化コールバックを使用してブロックを追加または削除し、ファイル内でブロックのパラメーターを設定できます。
マスク サブシステム ファイルを自己修正可能として設定するには、サブシステム ファイルでシステム マスク エディターの [コード] タブに移動し、[マスク初期化コードでサブシステムのコンテンツを変更できるようにする] をオンにします。
マスク サブシステム ファイル ssref1
をプログラムで自己修正可能として設定することもできます。まず、サブシステム ファイル マスクをマスク オブジェクトとして取得します。次に、マスク サブシステム ファイルを自己修正可能として設定します。
maskObj = Simulink.Mask.get('ssref1'); maskObj.SelfModifiable = 'on';
自己修正可能なマスク サブシステム ファイルでは、マスク サブシステム参照インスタンスのブロックを変更するか、マスク サブシステム参照インスタンス内のマスク サブシステムで自己修正できるようにすることが可能です。
マスク サブシステム参照のブロックの変更
Gain ブロックを含む自己修正可能なマスク サブシステム ファイル ssref1
について考えます。サブシステム参照インスタンス SR1
のシステム マスクでは、[ゲイン] をマスク パラメーターとして使用して Gain ブロックの値を設定します。システム マスクからブロックの値を動的に設定するために、ssref1
のマスク初期化コールバックにより、最初にシステム マスクから [ゲイン] パラメーター値が取得され、次にサブシステム参照インスタンス内の Gain ブロックの値が設定されます。
マスク サブシステム参照内のマスク サブシステムによる自己修正を許可
マスク サブシステム Subsystem-1
を含む自己修正可能なマスク サブシステム ファイル ssref2
について考えます。さらに、Subsystem-1
には Gain ブロックが含まれています。サブシステム参照インスタンス SR3
とマスク サブシステム Subsystem-1
では、[ゲイン] をマスク パラメーターとして使用して Gain ブロックの値を設定します。システム マスクからブロックの値を動的に設定するために、Subsystem-1
のマスク初期化コールバックにより、システム マスクから [ゲイン] パラメーター値が取得されます。ssref2
のマスク初期化コールバックにより、親サブシステム Subsystem-1
のマスクから [ゲイン] パラメーター値が取得され、次に Gain ブロックの値が設定されます。
考慮事項
特定の状況において、自己修正可能なマスクがあっても、サブシステム参照インスタンスの内容をコールバックを使用して変更できないことがあります。
サブシステム参照内にあるブロックを変更する場合、最上位モデル、またはモデルの階層構造でサブシステム参照より上位にあるブロックのコールバックを使用することはできません。
変更するブロックがサブシステム参照のマスク サブシステム内にある場合、親マスク サブシステムのマスク コールバックを使用する必要があります。その他のブロックのコールバックを使用してサブシステム参照のマスク サブシステム内にあるブロックを変更することはできません。
テスト ハーネスを使用したサブシステムのブロック線図のシミュレーション
サブシステムのブロック線図は、モデルやサブシステムのようにシミュレーションできません。ただし、サブシステムのブロック線図上でテスト ハーネスを作成して、テスト ハーネスをシミュレーションすることはできます。この操作によって、サブシステムのブロック線図を編集しながら、エラーまたは不一致がないか確認できます。複数のテスト ハーネスをサブシステム ファイルに関連付けて、利用可能な一連のテスト ハーネスからサブシステムの既定のテスト ハーネスを設定できます。
テスト ハーネスを使用してシミュレーションするには、以下を行います。
サブシステムのブロック線図を開きます。
Simulink ツールストリップの [サブシステム] タブで、[テスト ハーネスの追加] をクリックします。
[テスト ハーネスの作成] ウィンドウが表示されます。
新しいテスト ハーネスの名前を指定して、[OK] をクリックします。これが既定のテスト ハーネスになります。
ツールストリップの [テスト ハーネスで実行] をクリックして、テスト ハーネスを開かずにサブシステムでテスト ハーネスを実行します。テスト ハーネスをサブシステムでの実行時に自動的に開くには、[実行時にハーネスを開く] チェック ボックスをクリックします。
コマンド ラインを使用したテスト ハーネスの設定
以下のコマンドを使用して、サブシステムのブロック線図の既定のテスト ハーネスを設定できます。
set_param('<subsystemfilename>','DefaultTestHarness','<testHarnessName>');
サブシステム参照と以前のバージョンとの互換性
参照サブシステムを含むモデルを R2019b より前のバージョンにエクスポートする場合、すべての Subsystem Reference ブロックが独立した Subsystem ブロックに変換されます。
R2019b で作成されたサブシステム ファイルを以前のバージョンにエクスポートすることはできません。Simulink モデルを以前のバージョンにエクスポートする方法の詳細については、Export Model to Previous Version of 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)
bdname.slx
が Subsystem ブロック線図タイプである場合、このコマンドは 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 ブロックによって参照できるのはサブシステム ファイル タイプのみ。
サブシステム参照の機能を示すモデルの一覧については、サブシステム参照デモを参照してください。