| 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.mdlcombine_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プロセッサのサポート | ![]() |