Real-Time Workshop User's Guide | ![]() ![]() |
複数のモデルの統合
複数のモデル(あるいは複数の同じモデル)を1つの実行ファイルに統合したい場合、Real-Time Workshopはいくつかのオプションを提供します。
1つの方法は、S-Functionターゲットを使ってモデルを1つのモデルに統合し、その後grt
またはgrt_malloc
ターゲットを使って実行ファイルを生成することです。Simulink およびReal-Time Workshopは、モデル、モデルに対する連続する呼び出し、複数のサンプルレート間の接続を暗示的に取り扱います。これは、多くの場合において、最も簡単な方法です。詳細は、第10章「S-Functionターゲット」を参照してください。
組み込みシステム開発に対する2番目のオプションは、組み込みリアルタイム(ERT)ターゲットを使ってモデルからコードを生成することです。各モデルのエントリポイントを直接呼び出すことによって、モデルコートと共通のハーネスプログラムとのインタフェースを取ることができます。ERTターゲットには、アプリケーションによっては適切ではない制約があります。詳細は、第9章「組み込みリアルタイムターゲット」の「必要条件と制約」を参照してください。
grt_malloc
ターゲットは、3番目のオプションです。下記のうちのいずれか、またはすべてを行いたい場合に適しています。
この節では、grt_malloc
ターゲットを使ってモデルを1つのプログラムに統合する方法を説明します。この節をお読みになる前に、Real-Time Workshopのプログラムでのモデルの実行を習得しておいてください(第6章「プログラムアーキテクチャ」と第7章「複数のサンプルレートをもつモデル」を参照)。これらの章を読むとgrt_malloc_main.c
の参照に役立ちます。
複数モデルの実行ファイルのビルドに対する手順は、かなり簡単です。最初のステップは、統合されるモデルの各々からコードを生成してコンパイルします。つぎに、各モデルに対するmakeファイルは、最終的な複数モデルの実行ファイルの作成用に1つのmakeファイルに統合されます。つぎのステップは、grt_malloc_main.c
を変更して、統合されたシミュレーションエンジンを作成し、モデルを正確に初期化して呼び出します。最後に、統合されたmakeファイルがモデルからのオブジェクトファイルとメインプログラムを実行ファイルにリンクします。「複数モデルのプログラムの例」では実現例を説明しています。
モデル間でデータを共有する
モデル間での一方向の信号接続の利用を推奨します。これは、モデルが呼び出される順番に影響を与えます。たとえば、modelA
からの出力信号がmodelB
の入力として使われる場合、modelA
の出力の計算が最初に呼び出されます。
タイミングの問題
統合するすべてのモデルを同じソルバモードで生成することを推奨します(すべてシングルタスクまたはすべてマルチタスク)。さらに、モデルが連続状態をもつ場合は、同じソルバをすべてのモデルに対して利用します。
統合されるすべてのモデルが同じサンプルレートと同じレート数ともつ場合、モデルは同じタイミングエンジンデータ構造体を共有することができます(TimingData
構造体は、matlabroot
/rtw/c/src/mrt_sim.c
で定義されています)。あるいは、モデルは下記の例題プログラムのように、別々のタイミングエンジンデータ構造体を保持することができます。
モデルが同じベースレートをもち、異なるサブレートをもつ場合、各モデルは別々のタイミングエンジンデータ構造体を保持します。各モデルは、同じベースレートのタイマ割り込みを利用します。
モデルに対するベースレートが同じでない場合は、(grt_malloc_main
のような)メインプログラムは、モデルのレートの最大公約数でタイマ割り込みが発生するように設定しなければなりません。メインプログラムは、適切な時間間隔で各々のモデルの呼び出しを行います。
データロギングとExternalモードのサポート
複数モデルのプログラムは、(下記の例題プログラムのように) 各モデルに対する別々のMAT-ファイルにデータをロギングできます。
複数モデルのプログラム内で1つのモデルだけがexternalモードを利用することが可能です。
複数モデルのプログラムの例
Real-Time Workshopに付属する複数モデルのプログラムの例は、matlabroot
/rtw/c/grt_malloc/demos
にあります。この例題は、2つのモデルfuelsys1
とmcolon
を統合します。両方のモデルは、同じベースレートと、同じサンプル時間数をもちます。簡単にするため、(共通の構造体を共有することも可能ですが)各モデルは別々のタイミングエンジンデータ構造体を作成し、保持します。各モデルは、状態、出力、シミュレーションファイルを別々のmodel
.mat
ファイルにロギングします。
fuelsys1.mdl
とmcolon.mdl
combine_malloc_main.c)
と変更されたソルバ(ode5combine.c)
model
.bat
とmodel
.mk
ファイルランタイムインタフェースコンポーネント. メインプログラムcombine_malloc_main.c
は、grt_malloc_main.c
の変更されたバージョンです。combine_malloc_main
は、モデルに対して2つの#defines
を使います。MODEL1()
とMODEL2()
は、それぞれfuelsys1
とmcolon
に対してSimstructs
のポインタを出力するマクロです。コードは、下記のように、これらのポインタを通してモデルを参照します。
SimStruct *S1; SimStruct *S2; ... S1 = MODEL1(); S2 = MODEL2(); ... sfcnInitializeSizes(S1); sfcnInitializeSizes(S2); sfcnInitializeSampleTimes(S1); sfcnInitializeSampleTimes(S2); ...
combine_malloc_main.c
は、各モデルに対して1回、初期化、実行、クリーンアップ関数を呼び出します。
combine_malloc_main.c
は、下記の#defines
を使います。
NCSTATES1
とNCSTATES2
は、各モデル内の連続状態数を表わします。MATFILEA
とMATFILEB
は、各モデルによってロギングされたMAT-ファイルを表わします。メインプログラムのすべての変更点を確認するには、grt_malloc_main.c
とcombine_malloc_main.c
を比較します。
ソルバode5combine.c
は、複数モデルを取り扱うために変更されます。UpdateContinuousStates
関数は、実行時に各モデルのSimstruct
から連続状態数を取得するために変更されます。Simstruct
は、リファレンスとして渡されます。
制御ファイル. combine.bat
は、生成された制御ファイル fuelsys1.bat
とmcolon.bat
から作成されました。これらは、makeファイル、combine.mk
を呼ぶために変更されました。
combine.mk
は、生成されたmakeファイル、fuelsys1.mk
とmcolon.mk
からパラメータを統合します。つぎの変更に注意してください。
combine.mk
は、モデル固有の定義MODEL1
, MODEL2
, NCSTATES1
, NCSTATES2
をもちます。これらの定義は、CPP_REQ_DEFINES
のリストに含まれます。SOLVER
パラメータは、ode5combine.c
を指定します。REQ_SRCS
リストは、combine_malloc_main.c
を含みます。make
がビルドサブディレクトリfuelsys1_grt_malloc_rtw
とmcolon_grt_malloc_rtw
でのソースファイルの位置を特定するために、2つのルールが追加されています。fuelsys1
とmcolon
モデルに対するコートを生成し、オブジェクトファイルをコンパイルします。
combine.mk
のMATLAB_ROOT
とMATLAB_BIN
パスの情報を、インストールに対して適切になるように変更します。combine.bat
(PC)
または
make -f combine.mk
(UNIX)
これは、統合された実行ファイルをビルドします。
![]() | トランスポート層の実現のためのガイドライン | DSPプロセッサのサポート | ![]() |