Main Content

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

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

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

  • 参照モデルとそれを参照する最上位モデルという 2 つのモデルを個別に開発できます。

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

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

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

モデル参照プロジェクト

プロジェクトを開くには、[プロジェクトを開く] をクリックします。以下のコマンドを入力します。

openProject('ComponentBasedModelingUsingModelReference');

MATLAB® ツールストリップの [プロジェクト ショートカット] タブの [モデル] セクションおよび [参照モデル] セクションに、プロジェクト内のモデルおよび参照モデルが示されます。この例では、プロジェクトには最上位モデル sldemo_mdlref_basic および参照モデル sldemo_mdlref_counter が含まれています。

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

モデル sldemo_mdlref_basic を開きます。ツールストリップの sldemo_mdlref_basic をクリックするか、以下のコマンドを入力します。

open_system('sldemo_mdlref_basic')

sldemo_mdlref_basic モデルには、CounterACounterB、および CounterC という 3 つの Model ブロックが含まれています。これらの Model ブロックは同じ参照モデル sldemo_mdlref_counter を参照しています。参照モデルは別個のモデルであり、sldemo_mdlref_basic のサブシステムではありません。

どのようなモデルとブロックがメモリに読み込まれているのかを判別するには、関数find_systemを使用します。既定では、プロジェクトでは SignalEditorBlockLib がメモリに読み込まれています。

find_system('type','block_diagram')
ans =

  2x1 cell array

    {'SignalEditorBlockLib'}
    {'sldemo_mdlref_basic' }

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

任意の Model ブロックをクリックするか、次のコマンドを入力して参照モデルを開きます。

open_system('sldemo_mdlref_counter')

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

find_system('type','block_diagram')
ans =

  3x1 cell array

    {'sldemo_mdlref_counter'}
    {'SignalEditorBlockLib' }
    {'sldemo_mdlref_basic'  }

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

継承サンプル時間

親モデル sldemo_mdlref_basic に戻ります。

sldemo_mdlref_basic モデルはコンパイル時にサンプル時間の色を表示するように設定されています。[デバッグ] タブで、[モデルの更新] をクリックします。

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

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

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

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

以下のいずれかのアクションを実行して、sldemo_mdlref_counter モデルのシミュレーション ターゲットを作成できます。

  • sldemo_mdlref_basic の更新

  • sldemo_mdlref_basic のシミュレーション

シミュレーション ターゲットをプログラムでビルドするには、次のコマンドを使用します。

slbuild('sldemo_mdlref_counter','ModelReferenceSimTarget')

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

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

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

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

sldemo_mdlref_counter に対するモデル参照 Coder ターゲットと sldemo_mdlref_basic に対するスタンドアロン実行可能ファイルを、以下のいずれかのアクションを実行してビルドできます。

  • sldemo_mdlref_basic に対するスタンドアロン実行可能ファイルのビルド。

  • sldemo_mdlref_counter のモデル参照 Coder ターゲットのビルドと、sldemo_mdlref_basic に対するスタンドアロン実行可能ファイルのビルド。

スタンドアロン実行可能ファイルをプログラムでビルドするには、次のコマンドを使用します。

slbuild('sldemo_mdlref_basic','StandaloneCoderTarget')

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

sldemo_mdlref_basic に対するコード生成レポートは、[参照モデル] セクションの sldemo_mdlref_counter のレポートにリンクされています。

参考

|

関連するトピック