このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
再呼び出し可能なマルチインスタンス コードの生成
この例では、再呼び出し可能なマルチインスタンス コード生成用のモデルを設定する方法を示します。複数のプログラムで再呼び出し可能なコードを同時に使用できます。再入用のモデルを設定すると、実行 (step) エントリポイント関数では、グローバル データ構造体ではなく、ルートレベルの入力引数と出力引数が使用されます。コンフィギュレーション設定を検査した後に、コードを生成し、生成されたコードを確認します。
モデルを開く
モデル Reusable
を開きます。このモデルには、ルートの Inport ブロックが 2 つとルートの Outport ブロックが 1 つ含まれます。
model='Reusable';
open_system(model);
関連するモデル コンフィギュレーション パラメーター設定の確認
1. Embedded Coder アプリを開きます。
2. [モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。
3. モデル コンフィギュレーション パラメーター [システム ターゲット ファイル] は ert.tlc
に設定されています。[システム ターゲット ファイル] を grt.tlc
に設定して構成したモデルに対して再呼び出し可能なコードを生成できますが、ERT および ERT ベースのシステム ターゲット ファイルでは、コード内のルートレベル I/O の受渡し方法をより細かく制御できます。
4. [コード生成]、[インターフェイス] ペインを開き、関連するモデル コンフィギュレーション パラメーター設定を確認します。
[コード インターフェイスのパッケージ化] が [
Reusable function
] に設定されていることを確認する。このパラメーター設定は、コード ジェネレーターに対して再利用可能なマルチインスタンス コードを生成するよう指示します。Reusable function
の設定にパラメーター [マルチインスタンス コードのエラーの診断] が表示されます。このパラメーターはError
に設定されます。この値は、モデルがマルチインスタンス コードを生成するための要件に違反した場合、コードジェネレーターが中断することを示します。[ルートレベル I/O を以下として渡す] が [
Part of model data structure
] に設定される。この設定では、ルートレベルのモデル入力と出力をリアルタイム モデル データ構造体 (rtModel
) にパッケージ化します。この構造体は、SimStruct
をモデルの最上位データ構造体として置き換える最適化されたデータ構造体です。[リアルタイム モデル データ構造のエラー ステータス フィールドを削除] が選択されている。このパラメーター設定では、生成されたリアルタイム データ モデル構造体からエラー ステータス フィールドを削除することでメモリ使用量を削減します。
コードの生成とレビュー
slbuild(model);
### Starting build procedure for: Reusable ### Successful completion of build procedure for: Reusable Build Summary Top model targets built: Model Action Rebuild Reason ========================================================================================== Reusable Code generated and compiled. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 9.0929s
生成コードのレビュー
ert_main.c
はモデル用の main プログラムの例 (実行フレームワーク) を示す。このコードは、エントリポイント関数Reusable_step
を呼び出してモデルのコード実行を制御します。このファイルを、実行フレームワークのコーディングの開始点として使用します。Reusable.c
には、モデルのアルゴリズムを実装するコードのエントリ ポイントが含まれる。このファイルには、レート スケジューリング コードが含まれています。Reusable.h
は、モデル データ構造体、およびモデルのエントリ ポイントとデータ構造体へのパブリック インターフェイスを宣言する。rtwtypes.h
は、生成コードが必要とするデータ型、構造体およびマクロを定義する。
コード インターフェイス
コード インターフェイス レポートを開いてレビューします。このレポートの情報を使用して、実行フレームワークのインターフェイス コードを記述します。
1. 命令 #include Reusable.h
を追加することによって、生成されたヘッダー ファイルをインクルードします。
2. モデルの Inport ブロックの生成コードへの入力データを記述します。
3. 生成されたエントリポイント関数を呼び出します。
4. モデルの Outport ブロックの生成コードからデータを読み取ります。
入力端子:
<Root>/In1
: 次元 1 のデータreal_T
<Root>/In2
: 次元 1 のデータreal_T
エントリポイント関数:
初期化エントリポイント関数、
void Reusable_initialize(RT_MODEL *const rtM)
。開始時にこの関数を一度呼び出します。出力と更新 (step) エントリポイント関数、
void Reusable_step(RT_MODEL *const rtM)
。この関数を、モデルの最速レートで定期的に呼び出します。このモデルでは、関数を毎秒呼び出します。リアルタイムの実行を実現するには、この関数をタイマーに接続します。
出力端子:
<Root>/Out1
: 次元 1 のデータ型real_T
ステップ関数の確認
Examine the |Reusable_step| function code in |Reusable.c|.
cfile = fullfile('Reusable_ert_rtw','Reusable.c'); coder.example.extractLines(cfile,'/* Model step function', '/* Model initialize function ', 1, 0);
/* Model step function */ void Reusable_step(RT_MODEL *const rtM) { D_Work *rtDWork = rtM->dwork; ExternalInputs *rtU = (ExternalInputs *) rtM->inputs; ExternalOutputs *rtY = (ExternalOutputs *) rtM->outputs; /* Outport: '<Root>/Out1' incorporates: * UnitDelay: '<Root>/Delay' */ rtY->Out1 = rtDWork->Delay_DSTATE; /* Gain: '<Root>/Gain' incorporates: * Sum: '<Root>/Sum' * UnitDelay: '<Root>/Delay' */ rtDWork->Delay_DSTATE = (rtU->In1 + rtU->In2) * rtP.k1; }
コード ジェネレーターはモデル データをリアルタイム モデル データ構造体の一部として関数 Reusable_step
に渡します。モデル コンフィギュレーション パラメーター [コード インターフェイスのパッケージ化] と [ルートレベル I/O を以下として渡す] の設定を変えて、コードを再生成してみてください。関数プロトタイプがどのように変化するか確認します。
モデルとレポートを閉じる
モデルおよびコード生成レポートを閉じます。
bdclose(model)