Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

再呼び出し可能なマルチインスタンス コードの生成

この例では、再呼び出し可能なマルチインスタンス コード生成用のモデルを設定する方法を示します。複数のプログラムで再呼び出し可能なコードを同時に使用できます。再入用のモデルを設定すると、実行 (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)

関連するトピック