Main Content

モデル参照によるコンポーネントベースのモデル化

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

モデル参照の動作

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

  • 参照モデルが使用されるモデルとは別個に、参照モデルを開発できます。

  • 1 つのモデルを別のモデルで何度でも参照できるため、余計なコピーの作成が不要です。

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

  • 参照モデルは必要になるまで読み込まれません。このインクリメンタルな読み込み処理により、モデルの読み込み時間が加速されます。

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

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

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

モデル例を開きます。

open_system('sldemo_mdlref_basic')

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

モデルの階層構造内の最上位モデルを開いた後、メモリに読み込まれるモデルを特定するには、次のコマンドを入力します。

get_param(Simulink.allBlockDiagrams,'Name')
ans =

    'sldemo_mdlref_basic'

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

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

open_system('sldemo_mdlref_counter')

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

get_param(Simulink.allBlockDiagrams,'Name')
ans =

  2x1 cell array

    {'sldemo_mdlref_counter'}
    {'sldemo_mdlref_basic'  }

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

継承サンプル時間

親モデル sldemo_mdlref_basic に戻ります。

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

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

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

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

このモデルでは、CounterA と CounterB が sldemo_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 のレポートにリンクされています。

参考

関連するトピック