モデル参照を使用したコンポーネントベースのモデル化
この例では、別のモデルを複数回参照するモデルのシミュレーションとコード生成について詳しく説明します。この例では、Simulink® ソフトウェアがアクセラレータ シミュレーション向けのコードを生成し、Simulink® Coder™ ソフトウェアがスタンドアロン アプリケーションに展開できるコードを生成します。
モデル参照には、サブシステムを使用する場合に比べ、以下のような複数の利点があります。
余計なコピーを作成することなく同じモデルを別のモデルで参照できます。
同一のモデルを複数のモデルから参照できます。
参照モデルは必要になるまで読み込まれません。このプロセスは、"インクリメンタルな読み込み処理" と呼ばれます。モデルをインクリメンタルに読み込むことで、モデルの読み込み時間が短縮します。
モデルがアクセラレータ モードでシミュレートされる場合、シミュレーションで使用するバイナリが作成されます。これらのバイナリが作成されてから参照モデルが変更されていない場合には、これらのバイナリを使用するモデルのシミュレーションまたはコンパイルの際にコード生成は行われません。このプロセスは、"インクリメンタルなコード生成" と呼ばれます。バイナリを使用すると、モデル更新およびシミュレーションのパフォーマンスが向上し、コード生成のモジュール性が高まります。
Model ブロックを含むモデル用のコードを生成する際にも、インクリメンタルなコード生成を利用します。
モデル コンポーネントの定義と選択のヘルプについては、コンポーネントベースのモデル化のガイドラインを参照してください。
インクリメンタルな読み込み処理
ModelReference
プロジェクトを開きます。このプロジェクトは起動時に sldemo_mdlref_basic
という名前のモデルを開くように設定されているため、このモデルも開きます。
openProject("ModelReference");
sldemo_mdlref_basic
モデルには、CounterA
、CounterB
、および 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 ブロックをダブルクリックします。
あるいは、参照モデルを開かずに読み込むには、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_counter
でサンプル時間が明示的に指定されていないため、Model ブロックは異なるサンプル時間を継承します。
コード生成を介したシミュレーション (Simulink Coder ライセンスが不要)
最上位モデルを Normal
モードでシミュレートする場合、Model ブロックの [シミュレーション モード] パラメーターで参照モデルのシミュレーション方法を制御します。
Model ブロックの [シミュレーション モード] パラメーターが
[Normal]
に設定されている場合、参照モデルのシミュレーションはインタープリター モードで実行されます。Model ブロックの [シミュレーション モード] パラメーターが
[Accelerator]
に設定されている場合、参照モデルのシミュレーションはコード生成を介して実行されます。このプロセスでは、アクセラレータ モードでシミュレートされる一意のモデルごとに "シミュレーション ターゲット" と呼ばれるバイナリ ファイルを使用します。シミュレーション ターゲットの生成に Simulink Coder ライセンスは必要ありません。
このモデルでは、CounterA
と CounterB
が sldemo_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
を選択します。