メインコンテンツ

モデル参照を使用したコンポーネントベースのモデル化

この例では、別のモデルを複数回参照するモデルのシミュレーションとコード生成について詳しく説明します。この例では、Simulink® ソフトウェアがアクセラレータ シミュレーション向けのコードを生成し、Simulink® Coder™ ソフトウェアがスタンドアロン アプリケーションに展開できるコードを生成します。

モデル参照には、サブシステムを使用する場合に比べ、以下のような複数の利点があります。

  • 余計なコピーを作成することなく同じモデルを別のモデルで参照できます。

  • 同一のモデルを複数のモデルから参照できます。

  • 参照モデルは必要になるまで読み込まれません。このプロセスは、"インクリメンタルな読み込み処理" と呼ばれます。モデルをインクリメンタルに読み込むことで、モデルの読み込み時間が短縮します。

  • モデルがアクセラレータ モードでシミュレートされる場合、シミュレーションで使用するバイナリが作成されます。これらのバイナリが作成されてから参照モデルが変更されていない場合には、これらのバイナリを使用するモデルのシミュレーションまたはコンパイルの際にコード生成は行われません。このプロセスは、"インクリメンタルなコード生成" と呼ばれます。バイナリを使用すると、モデル更新およびシミュレーションのパフォーマンスが向上し、コード生成のモジュール性が高まります。

  • Model ブロックを含むモデル用のコードを生成する際にも、インクリメンタルなコード生成を利用します。

モデル コンポーネントの定義と選択のヘルプについては、コンポーネントベースのモデル化のガイドラインを参照してください。

インクリメンタルな読み込み処理

ModelReference プロジェクトを開きます。このプロジェクトは起動時に sldemo_mdlref_basic という名前のモデルを開くように設定されているため、このモデルも開きます。

openProject("ModelReference");

sldemo_mdlref_basic model

sldemo_mdlref_basic モデルには、CounterACounterB、および CounterC という名前の Model ブロックが含まれています。各 Model ブロックは sldemo_mdlref_counter モデルを参照しています。参照モデルはスタンドアロン モデルであり、sldemo_mdlref_basic のサブシステムではありません。

どのようなモデル ファイル、ライブラリ ファイル、およびサブシステム ファイルがメモリに読み込まれているのかを判別するには、find_system関数を使用します。

find_system("type","block_diagram")
ans = 2×1 cell
    {'SignalEditorBlockLib'}
    {'sldemo_mdlref_basic' }

開いているモデルがメモリに読み込まれているため、sldemo_mdlref_basic モデルが表示されます。

sldemo_mdlref_basic モデルには SignalEditorBlockLib ライブラリにリンクされている Signal Editor ブロックが含まれているため、このライブラリが表示されます。

参照モデルは読み込まれていないため表示されません。

参照モデルを開くには、Model ブロックをダブルクリックします。

sldemo_mdlref_counter model

あるいは、参照モデルを開かずに読み込むには、load_system 関数を使用します。

load_system("sldemo_mdlref_counter")

メモリに読み込まれたモデルを再度クエリします。

find_system("type","block_diagram")
ans = 3×1 cell
    {'sldemo_mdlref_counter'}
    {'SignalEditorBlockLib' }
    {'sldemo_mdlref_basic'  }

参照モデルが表示され、モデルが必要に応じてインクリメンタルに読み込まれることが示されます。

継承サンプル時間

最上位モデルに戻ります。

sldemo_mdlref_basic モデルはコンパイル時にサンプル時間の色を表示するように設定されています。Simulink ツールストリップの [デバッグ] タブで、[モデルの更新] をクリックします。あるいは、以下のコマンドを入力します。

set_param("sldemo_mdlref_basic",SimulationCommand="Update")

sldemo_mdlref_basic with different sample time colors for each Model block

参照モデル sldemo_mdlref_counter でサンプル時間が明示的に指定されていないため、Model ブロックは異なるサンプル時間を継承します。

コード生成を介したシミュレーション (Simulink Coder ライセンスが不要)

最上位モデルを Normal モードでシミュレートする場合、Model ブロックの [シミュレーション モード] パラメーターで参照モデルのシミュレーション方法を制御します。

  • Model ブロックの [シミュレーション モード] パラメーターが [Normal] に設定されている場合、参照モデルのシミュレーションはインタープリター モードで実行されます。

  • Model ブロックの [シミュレーション モード] パラメーターが [Accelerator] に設定されている場合、参照モデルのシミュレーションはコード生成を介して実行されます。このプロセスでは、アクセラレータ モードでシミュレートされる一意のモデルごとに "シミュレーション ターゲット" と呼ばれるバイナリ ファイルを使用します。シミュレーション ターゲットの生成に Simulink Coder ライセンスは必要ありません。

このモデルでは、CounterACounterBsldemo_mdlref_counter をノーマル モードで参照します。このことを示すために、Model ブロック アイコンの四隅が白と灰色になっています。他のインスタンス CounterC は、sldemo_mdlref_counter をアクセラレータ モードで参照します。このことを示すために、Model ブロック アイコンの四隅が黒になっています。

sldemo_mdlref_counter モデルのシミュレーション ターゲットをビルドするには、sldemo_mdlref_basic を更新またはシミュレートします。[モデル化] タブで、[モデルの更新] または [実行] をクリックします。あるいは、特定の参照モデルのシミュレーション ターゲットをビルドするには、slbuild関数を使用します。

slbuild("sldemo_mdlref_counter","ModelReferenceSimTarget")
### Searching for referenced models in model 'sldemo_mdlref_counter'.
### Total of 1 models to build.
### Starting serial model build.
### Model reference simulation target for sldemo_mdlref_counter is up to date.

Build Summary

0 of 1 models built (1 models already up to date)
Build duration: 0h 0m 2.2624s

シミュレーション ターゲットがビルドされた後に sldemo_mdlref_basic のシミュレーションまたは更新を行っても、sldemo_mdlref_counter が変更されていなければ、sldemo_mdlref_counter のシミュレーション ターゲットはリビルドされません。

参照モデルの 3 つのすべてのインスタンスがノーマル モードでシミュレーションするように設定されている場合、シミュレーション ターゲットはビルドされません。

シミュレーション モードの選択のヘルプについては、モデルの階層構造内のシミュレーション モードの選択を参照してください。

スタンドアロン アプリケーションに対するコード生成 (Simulink Coder ライセンスが必要)

sldemo_mdlref_basic に対するスタンドアロン実行可能ファイルを作成するときに、sldemo_mdlref_counter "モデル参照 Coder ターゲット" に対するコードとバイナリが最初にビルドで生成されます。モデル参照 Coder ターゲットの生成には Simulink Coder ライセンスが必要です。

sldemo_mdlref_basic に対するスタンドアロン実行可能ファイルと sldemo_mdlref_counter に対するモデル参照 Coder ターゲットをビルドするには、[アプリ] タブで [Simulink Coder] をクリックします。[C コード] タブが開いたら、[ビルド] をクリックします。あるいは、"Ctrl+B" を押すか以下のコマンドを入力します。

slbuild("sldemo_mdlref_basic")
### Searching for referenced models in model 'sldemo_mdlref_basic'.
### Total of 2 models to build.
### Starting serial code generation build.
### Successfully updated the model reference code generation target for: sldemo_mdlref_counter
### Starting build procedure for: sldemo_mdlref_basic
codeInterfacePackaging: Nonreusable function
codeInterfacePackaging: NonReusable
### Successful completion of build procedure for: sldemo_mdlref_basic

Build Summary

Model reference code generation targets:

Model                  Build Reason                                     Status                        Build Duration
====================================================================================================================
sldemo_mdlref_counter  Target (sldemo_mdlref_counter.c) did not exist.  Code generated and compiled.  0h 0m 7.013s  

Top model targets:

Model                Build Reason                                         Status                        Build Duration
======================================================================================================================
sldemo_mdlref_basic  Information cache folder or artifacts were missing.  Code generated and compiled.  0h 0m 10.922s 

2 of 2 models built (0 models already up to date)
Build duration: 0h 0m 19.194s

sldemo_mdlref_counter のモデル参照 Coder ターゲットが既に存在する場合に sldemo_mdlref_basic をビルドしても、sldemo_mdlref_counter が変更されていなければ、モデル参照 Coder ターゲットはリビルドされません。代わりに、sldemo_mdlref_counter に対して生成されたコードが再使用されます。

sldemo_mdlref_basic のコード生成レポートが開きます。sldemo_mdlref_counter のコード生成レポートを表示するには、[現在のモデル] の横にある矢印をクリックします。次に、sldemo_mdlref_counter を選択します。

参考

トピック