複数のモデルで生成されたコードの結合
コード ジェネレーターで複数のモデルまたはモデルの複数のインスタンスに対して生成されたコードを 1 つの実行可能プログラムに結合するには、以下の手法を使用します。
モデル参照階層。モデル参照の基礎およびモデル参照階層向けのコードの生成を参照してください。
Embedded Coder® ソフトウェアがある場合は、複数のモデルのコードを共通のハーネス プログラムにインターフェイスします。ハーネス プログラムから、各モデル用に生成されたエントリポイント関数を呼び出します。
ert.tlc
システム ターゲット ファイルには組み込み処理に関連する制限があるため、アプリケーションとの互換性がない可能性があります。再呼び出し可能なマルチインスタンス コードを生成します。複数のモデルまたはモデルの複数のインスタンスに対して生成されたコードの結合を参照してください。
メモ
S-Function システム ターゲット (rtwsfcn.tlc
) は、複数のモデルに対して生成されたコードの結合をサポートしません。
シミュレーションおよびコード生成用にモデルを結合するには、モデル参照の使用を検討してください。モデル参照は、以下で役に立ちます。
シンボルの名前の整合性
アルゴリズム全体の必須スケジュール
モデル コンフィギュレーションの整合性
異なるモデル用にコードを結合するときの考慮事項
異なるモデルに対して生成されたコードを結合する (つまり、参照モデルを使用しない) 場合は、次の点について考慮してください。
データはグローバルです。シンボル (名前) の競合が生じる可能性があります。
モデルのコンフィギュレーション パラメーターの設定は、ハードウェアのワード サイズなどの設定を含め、一致しなければなりません。
コードの再利用と共有は準最適である可能性があります (共有のユーティリティ関数、スケジューリング、ソルバーの複製コードなど)。
スケジューリングはより複雑になる可能性があります (たとえば、モデルにそれぞれの倍数ではない定期的なサンプル時間が含まれ、共通のタイマー割り込みからのスケジューリングがさらに複雑になる可能性があります)。
連続時間と状態を使用するプラント モデルでは、モデルを接続する連続時間信号は、モデル内の連続時間信号のように単一のソルバーで処理されず、数値のわずかな差が生じる可能性があります。
モデル間でのデータの共有
モデル間では一方向の信号接続を使用します。これらの接続はモデルの呼び出し順に影響します。たとえば、modelA
からの出力信号を modelB
への入力として使用する場合、modelA
出力の計算が最初に呼び出されます。
タイミングの問題
複数のモデルまたはモデルの複数のインスタンスに対して生成されたコードを結合する場合は、以下を実行します。
同じソルバー モード (シングルタスクまたはマルチタスク) を使用してモデルを構成する。
モデルで連続状態を使用する場合、同じソルバーを使用してモデルを構成する。
モデルの基本レートが異なる場合、メイン プログラム (rt_malloc_main.c
など) はモデルの最大公約数レートでタイマー割り込みが起こるように設定しなければなりません。メイン プログラムはそれぞれのモデルを一定の時間間隔で呼び出します。
データのログ作成とエクスターナル モードに関するサポート
マルチ モデル プログラムはモデルごとに別々の MAT ファイルにデータのログを作成できます。
マルチ モデル プログラムのモデルの 1 つだけがエクスターナル モードを使用できます。
データの所有権の制御
Embedded Coder ソフトウェアがある場合、信号、パラメーター、状態などの個々のデータ項目に対して、オーナーを指定できます。データ項目のオーナーはデータ項目の定義、メモリ割り当ておよび初期化を生成します。たとえば、生成コードでグローバル変数として表示されるように、ストレージ クラスを Simulink.Signal
オブジェクトに適用する場合、組み合わされたモデルのいずれかをオブジェクトのオーナーとして指定します。そのモデルに対して生成されたコードにより、変数が定義されます。
モデル参照を使用する場合、生成コードをモジュール化し、チームで作業する際のデータの所有権を明確にすることができます。
モデル参照を使用しない場合、データ項目の定義が重複して生成されるのを回避できます。たとえば、Simulink.Parameter
オブジェクトをベース ワークスペースに保存して、ストレージ クラス ExportedGlobal
を適用するとします。このオブジェクトを使用する 2 つの個別のモデルからコードを生成すると、各モデルは対応するグローバル変数に対して定義を生成します。代わりに、オブジェクトのオーナーを指定し、定義を生成するのはそのオーナーのみにすることができます。
データ項目のオーナーを指定するには、次を行います。
ストレージ クラスをデータ項目に適用します。Struct ストレージ クラスを使用してパラメーター データを構造体に整理する (Embedded Coder)を参照してください。
[オーナー] プロパティの値を指定して、データ項目のオーナーを設定します。
モデル コンフィギュレーション パラメーター [データ定義の配置にデータ オブジェクトからオーナーを使用する] を選択します。
データ定義と宣言の所有権およびファイル配置の詳細については、Control Placement of Global Data Definitions and Declarations in Generated Files (Embedded Coder)を参照してください。
複数のモデルまたはモデルの複数のインスタンスに対して生成されたコードの結合
コードを結合している各モデルに対して、コードを生成します。
システム ターゲット ファイルを GRT ベースまたは ERT ベースのシステム ターゲット ファイルに設定します。結合するモデルのシステム ターゲット ファイルは同じでなければなりません。
アプリケーションにそのモデルの複数のインスタンスを含める場合は、モデル コンフィギュレーション パラメーター [コード インターフェイスのパッケージ化] を
[再利用可能な関数]
に設定します。ERT ベースのシステム ターゲット ファイルを指定した場合は、オプションで、モデルの各インスタンスへのメモリの割り当てを静的または動的どちらで実行するかによって、モデル コンフィギュレーション パラメーター [モデルの初期化に動的メモリ割り当てを使用] を設定できます。ソース コードを生成します。コード ジェネレーターは、生成されたファイル
に割り当て関数を含めます。割り当て関数は、モデルの各インスタンスにモデル データを動的に割り当てます。model
.c
各モデルのソース コードを生成した後に、以下を実行します。
結合している各モデルのコードをコンパイルします。
モデル用に生成された makefile を 1 つの makefile に結合します。
rt_malloc_main.c
などのメイン プログラムを変更して、結合されたシミュレーション エンジンを作成します。メイン プログラムは各モデルに対して生成されたコードを初期化して呼び出します。makefile を実行します。makefile はオブジェクト ファイルとメイン プログラムを実行可能プログラムにリンクします。