このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
モデル参照の基礎
Model ブロックを使用してモデルを別のモデルに含めることができます。各 Model ブロックは "モデル参照"、つまり別のモデルへの参照です。モデルは何度でも参照できるので、同じものを繰り返しコピーする必要がなく、同じモデルを複数の異なるモデルから参照できます。これらの参照は、"モデルの階層構造" を作成します。
モデルは、モデルやその派生エンティティに変更を加えなくても、"参照モデル" やスタンドアロン モデルとして機能します。参照モデルをスタンドアロン モデルとして使用するには、参照モデルは上位モデルからしか取得できないデータに依存してはなりません。
各参照モデルは独立してコンパイルされます。このスタンドアロンの動作により、モデルの階層構造のパフォーマンスを改善し、モデル化の目的を達成できます。
モデル参照のメリット
サブシステムと同様に、モデル参照を利用すると大規模なモデルを階層的に構成できます。ライブラリと同様に、モデル参照を利用すると、ブロックのセットを一度定義し、それを繰り返し使用することができます。サブシステムやライブラリとは異なり、モデル参照では、参照モデルが独立してコンパイルされることから得られる利点が提供されます。モデル コンポーネントを実装する最適な手段は要件によって異なります。
コンポーネントがモデルの階層構造で複数回再利用され、多数のブロックを含んでいる場合は、コンポーネントをモデル参照として実装すると、シミュレーションおよびコード生成の速度を向上させることができます。たとえば、モデル参照を使用すると、以下から利点を得ることができます。
インクリメンタルな読み込み処理
参照モデルが必要になった時点で読み込まれるため、モデルの読み込みが速くなります。
高速シミュレーション
参照モデルがアクセラレータ モードでシミュレートされた場合、参照モデルはコードに変換されます。その後、そのコードを実行することによってモデルがシミュレートされます。これは、ノーマル モードのシミュレーションを実行するより高速です。
インクリメンタル ビルド
参照モデルのコードは、最後にコード生成が行われてからモデルに変更が加えられた場合にのみ生成されます。チーム メンバーまたは継続的インテグレーション システムが参照モデルのコードを生成すると、Simulink® キャッシュ ファイルによって再利用のためにそのコードがパッケージ化されます。これらのファイルのローカル コピーにより、シミュレーションとコード生成を高速化できます。
ローカル ソルバー (R2022a 以降)
参照モデルでローカル ソルバーを使用すると、モデル参照は別個の微分方程式セットとして解かれます。ローカル ソルバーでは、より小さい (R2024a 以降)または大きい別のステップ サイズを使用できます。ソルバーとソルバー設定の選択には、シミュレーションの速度と精度とのトレードオフがあります。詳細については、Use Local Solvers in Referenced Modelsを参照してください。
並列計算 (Parallel Computing Toolbox™ のライセンスを使用)
大きなモデル参照階層では、モデル参照ターゲットを並列でビルドすることにより、ブロック線図の更新の速度を上げることができます。参照モデルを並列でビルドするには、アクセラレータ モードで実行されるように参照モデルを構成する必要があります。詳細については、並列ビルドを使用した参照モデルの更新時間の短縮を参照してください。
モデル参照では、チーム メンバーおよびサードパーティとのコラボレーションがサポートされています。たとえば、モデル参照は以下の要件を満たすのに役立ちます。
モジュール開発
参照モデルはそれを使用するモデルとは独立して開発できます。たとえば、モデルの階層構造のコンテキストなしで参照モデルを開くことができます。その後、参照モデルをシミュレートしてそのコードを生成できます。参照モデルは、アセンブリで使用して他のコンポーネントに統合できるスタンドアロンのコンポーネントです。
知的所有権保護 (Simulink Coder™ または HDL Coder™ のライセンスを使用)
参照モデルの内容を不明瞭化して、知的財産を開示することなく保護モデルとしてモデルを配布できます。保護モデルの表示、シミュレート、そのコードの生成を実行する権限を保護モデルの受信者に付与できます。詳細については、コンテンツを隠すためのモデルの保護 (Simulink Coder)または保護モデルを作成し内容を隠して HDL コードを生成する (HDL Coder)を参照してください。
モデル参照は、分離された環境を提供し、コンポーネントの動作を検証するのに役立ちます。たとえば、モデル参照では、以下によってテスト要件および認定要件がサポートされます。
単体テスト
参照モデルを最上位モデルとしてシミュレートしてその動作を分離することで、参照モデルを独立してテストできます。さまざまなテスト シナリオを使用してテスト環境で参照モデルを実行するテスト ハーネスを作成することもできます。単体テストにより、変更されていないコンポーネントの再テストを排除し、検証にかかるコストを削減できます。詳細については、コンポーネント検証を参照してください。業界標準やガイドラインへの準拠を検証できるようにするには、モデル アドバイザーを使用したモデルのチェックを参照してください。
SIL/PIL テスト (Embedded Coder® のライセンスを使用)
ターゲット環境を再現する環境で参照モデルを検証するには、ソフトウェアインザループ (SIL) モードまたはプロセッサインザループ (PIL) モードで参照モデルをシミュレートできます。これらのシミュレーションを使用することで、SIL シミュレーションではホスト プラットフォーム、PIL シミュレーションではターゲット プラットフォーム用にコンパイルして実行される量産コードを生成してテストできます。詳細については、SIL シミュレーションおよび PIL シミュレーション (Embedded Coder)を参照してください。
単一ソースの生成コード
各参照モデルには、モデルの階層構造にその参照モデルが含まれている回数に関係なく、1 つのソース コード セットが含まれます。単一ソースのコードにより、検証にかかるコストを低減できます。
生成コードの独立したトレーサビリティ
参照モデルの生成コードを他のモデルとは独立してトレースできます。ベースラインの等価性テストおよび 100% のコード カバレッジを目標にする追加のテスト ベクトルを使用して生成コードが参照モデルに逆トレースすることを確認するとします。親モデルへの変更はこの検証テストに影響しないため、検証にかかるコストが削減されます。
Simulink Code Inspector™ のライセンスがあれば、各参照モデルのトレーサビリティ マトリクスを作成できます。トレーサビリティ マトリクスは、モデル オブジェクト、生成コード、およびモデル要件間のトレーサビリティを提供します。詳細については、Generate Traceability Matrices (Simulink Code Inspector)を参照してください。
モデル参照、サブシステム参照、サブシステム、およびライブラリを比較するには、モデル コンポーネントのタイプの検討を参照してください。
モデル参照階層
モデルの階層構造では複数のコンポーネント化手法を使用できます。たとえば、モデルではサブシステム、参照モデル、および Stateflow® チャートを組み合わせて使用し、階層を作成できます。
モデルの階層構造に参照モデルが含まれている場合、Simulink ウィンドウでは "最上位モデル" が最上位レベルのモデルです。たとえば、sldemo_mdlref_basic
モデルを開くとします。次に、CounterA
という名前の Model ブロックを介して参照モデルに移動します。
ウィンドウのタイトルには 2 つの要素が含まれています。
sldemo_mdlref_basic
— 最上位モデルの名前CounterA
— Model ブロックの名前
エクスプローラー バーには 3 つの要素が含まれています。
sldemo_mdlref_basic
— 最上位モデルの名前CounterA
— Model ブロックの名前sldemo_mdlref_counter
— 参照モデルの名前
モデル ブラウザーでは、最上位モデル、参照モデル、およびその他のモデル コンポーネントからなる階層が表示されます。
各参照モデルでは他のモデルを参照できます。循環継承を避けるために、Model ブロックは、モデルの階層構造内で上位にあるモデルを参照できません。たとえば、モデルは、そのモデルを参照するモデルである "親モデル" を参照できません。
モデルには、同じモデルを参照する Model ブロックを複数含めることができますが、その参照モデルにグローバル データが定義されていないことが条件です。たとえば、sldemo_mdlref_basic
モデルには sldemo_mdlref_counter
モデルを参照する 3 つの Model ブロックが含まれています。
同じ参照モデルを任意のレベルの別のモデルに含めることもできます。
参照モデルを最上位モデルとして開くには、Model ブロック アイコンで をクリックします。参照モデルが、現在のモデルの階層構造のコンテキスト外で開きます。
モデルを編集すると、モデルが参照モデルと最上位モデルのどちらとして開かれているのかに関係なく、変更は同じモデル ファイルに影響します。
モデル参照インターフェイス
Model ブロック上の端子は参照モデルの最上位レベルのブロックに対応します。端子は、入力端子、出力端子、または制御端子にすることができます。
たとえば、sldemo_mdlref_basic
モデルでは、各 Model ブロックは sldemo_mdlref_counter
モデルを参照し、以下を含んでいます。
upper、input、および lower という名前の 3 つの入力端子
output という名前の 1 つの出力端子
sldemo_mdlref_counter
参照モデルには以下が含まれています。
upper
、lower
、およびinput
という名前の 3 つの Inport ブロックoutput
という名前の 1 つの Outport ブロック
Model ブロックの端子に信号を接続する際には、参照モデルの対応する端子に信号を接続します。Model ブロックの出力は、参照モデルが同じであるのにもかかわらず、異なることがあります。
たとえば、sldemo_mdlref_basic
では、各 Model ブロックの [input] という名前の端子は固有の Pulse Generator ブロックから信号を受け取ります。各 Pulse Generator ブロックからの入力信号は異なるサンプル時間を使用するため、参照モデルが同じであるのにもかかわらず、各 Model ブロックからの出力信号は異なります。
各 Model ブロックの出力信号がどのように異なるかを確認するには、シミュレーション データ インスペクターを使用します。
参照モデルの信号属性は、Model ブロックのコンテキストとは独立しています。たとえば、信号次元とデータ型は Model ブロック境界で伝播されません。参照モデルの信号属性を定義するには、ルートレベルの Inport ブロックと In Bus Element ブロックのブロック パラメーターを使用します。
モデル ワークスペースとデータ ディクショナリ
各モデルには、変数値を保存するための独自のワークスペースが用意されています。モデルの階層構造内で、各モデル ワークスペースは一意の名前空間として機能します。このため、同じ変数名を複数のモデル ワークスペース内で使用できます。
モデル間でデータを共有するには、データ ディクショナリを使用します。
データ定義の重複は、以下の条件において、モデル参照階層内で存在することができます。
階層内の各モデルが 1 つの定義のみ参照できる。
階層内ではモデル間で定義は同じでなければならない。
変数やオブジェクトの格納場所の詳細については、Simulink モデルの変数とオブジェクトの保存場所の決定を参照してください。
モデル参照の動作と実行
シミュレーションおよびコード生成中は、Model ブロックは単一ブロックまたはアトミック単位のように動作します。Model ブロックが実行されると、親システム内のブロックから割り込まれることなく、参照モデル内のブロックで現在のタスクが実行されます。
参照モデルの動作および実行タイミングを変更する場合は、以下の機能を考慮します。
独立したコンフィギュレーション セット
参照モデルが使用するコンフィギュレーション セットはその親や他の参照モデルと同じである必要はありません。詳細については、モデル階層のコンフィギュレーション パラメーターの設定を参照してください。
インスタンス パラメーター
既定では、再利用可能な参照モデルの各 Model ブロック インスタンスでブロック パラメーターに同じ値が使用されます。再利用可能な参照モデルのインスタンスごとに異なるブロック パラメーター値を指定するには、モデル引数を作成します。たとえば、Gain ブロックをモデル
sldemo_mdlref_counter
に追加すると、モデル引数によりこのモデルの 3 つのインスタンスはそれぞれ異なるゲイン値を使用します。再利用可能な参照モデルのインスタンスのパラメーター化を参照してください。モデル マスク
モデル マスクでは、Model ブロックの外観を制御し、ブロックでのモデル引数の表示をカスタマイズできます。モデル マスク要件については、モデル マスクを参照してください。
条件付き実行
外部信号により、シミュレーション中に Model ブロックを実行するかどうかを制御できます。詳細については、参照モデルの条件付き実行を参照してください。
動的な起動と終了の動作
Model ブロックの動的な起動と終了の動作をモデル化するには、カスタム ルーチンを Model ブロックの既定の初期化ルーチンおよび終了ルーチンに追加します。詳細については、初期化関数、再初期化関数、リセット関数および終了関数の使用を参照してください。
バリアント
複数の Model ブロックを使用して、システム コンポーネントの複数の設計バリエーションを表すことができます。条件式により、アクティブなバリアントが決定されます。詳細については、What Are Variants and When to Use Themを参照してください。
モデル参照シミュレーションとコード生成
モデルの階層構造をシミュレートすると、最上位モデルがシミュレートされます。たとえば、sldemo_mdlref_basic
モデルを開くとします。次に、CounterA
という名前の Model ブロックを介して参照モデルに移動します。
sldemo_mdlref_basic
モデルが最上位モデルです。[実行] をクリックすると、sldemo_mdlref_basic
モデルがシミュレートされます。
別の例として、新しいウィンドウで sldemo_mdlref_counter
モデルを最上位モデルとして開くとします。
新しいウィンドウでは、sldemo_mdlref_counter
モデルが最上位モデルです。[実行] をクリックすると、sldemo_mdlref_counter
モデルがシミュレートされます。
スタンドアロンの最上位モデルとして参照モデルをシミュレートするには、スタンドアロンのコンテキストで実行するために必要なデータが参照モデルに含まれている必要があります。たとえば、参照モデルには、パラメーターおよび信号を定義する変数およびデータ型が含まれている必要があります。
参照モデルをインタープリターによってシミュレーションすることも (ノーマル モード)、参照モデルをコードにコンパイルし、そのコードを実行してシミュレーションすることもできます (アクセラレータ モード)。詳細については、モデルの階層構造内のシミュレーション モードの選択を参照してください。
モデル参照階層向けのコード生成の詳細については、モデル参照階層向けのコードの生成 (Simulink Coder)を参照してください。
ヒント
シミュレーションを高速化し、インクリメンタルなコード生成を行うには、Simulink キャッシュ ファイルの使用を検討してください。Simulink キャッシュ ファイルには、シミュレーションとコード生成を高速化できるビルド アーティファクトが含まれています。詳細については、シミュレーションを高速化するための Simulink キャッシュ ファイルの共有およびインクリメンタルなコード生成用の Simulink キャッシュ ファイル (Simulink Coder)を参照してください。