Main Content

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

最上位モデルからの再呼び出し可能なコードの生成

既定では、コード ジェネレーターは、最上位モデルに対して再呼び出し可能でないコードを生成します。エントリポイント関数には void-void インターフェイスがあります。コードは、共有メモリ内にあるグローバル データ構造体へのアクセスを共有して他のコードとやりとりします。

再利用によってメリットがあり、コードの使用またはインスタンスごとに独自で固有なデータを維持する必要のあるアプリケーションの場合は、コード ジェネレーターで再呼び出し可能なコードが生成されるようにモデルを設定します。再呼び出し可能なコードを生成するには、モデル コンフィギュレーション パラメーターコード インターフェイスのパッケージ化[再利用可能な関数] に設定します。Embedded Coder® コードを使用して、C++ コードを生成している場合は、パラメーターを [C++ クラス] に設定できます。どちらの場合でも、コード ジェネレーターは以下を実行します。

  • ブロック I/O、DWork ベクトル、パラメーターなどのモデル データをリアルタイム モデル データ構造体 (rtModel) にパッケージ化する。

  • リアルタイム モデル データ構造体を入力引数として、生成されたモデルのエントリポイント関数に参照渡しする。

  • ルートレベルの入力引数と出力引数を、生成されたモデルのエントリポイント関数に個々の引数として渡す。

  • モデル データ構造体にメモリを静的に割り当てる。

  • リアルタイム モデル データ構造体を生成された model.h ヘッダー ファイルにエクスポートする。

以下のモデル コンフィギュレーション パラメーターを設定して、追加の診断およびコード生成制御を適用します。

  • モデルがマルチインスタンス コードの要件を満たしていない場合にコード ジェネレーターに表示される診断メッセージの重大度のレベルを選択するには、パラメーターマルチインスタンス コードのエラーの診断[なし][警告]、または [エラー] に設定する。モデルがマルチインスタンス コードの生成に対する要件に違反した場合に、表示される診断の重大度レベルを変更する必要がある場合を除き、パラメーターを [エラー] に設定します。

  • 生成されたコードでルートレベルのモデルの入力および出力を再利用可能な実行 (ステップ) 関数に渡す方法を制御するには (Embedded Coder が必要)、パラメーターPass root-level I/O as (Embedded Coder)[個々の引数][構造体参照]、または [モデル データ構造体の一部] に設定する。

    コード インターフェイスのパッケージ化[再利用可能な関数] に設定した場合、コード ジェネレーターはモデル データ (ブロック I/O、Dwork、パラメーターなど) をリアルタイム モデル データ構造体にパッケージ化して、生成されたモデルのエントリポイント関数にモデル構造体を渡します。Pass root-level I/O as (Embedded Coder)[モデル データ構造体の一部] に設定した場合、コード ジェネレーターはルートレベルのモデル入力と出力をリアルタイム モデル データ構造体にパッケージ化します。

  • メモリの使用量を削減するため、リアルタイム モデル データ構造体からエラー ステータス フィールドを省略して (Embedded Coder が必要)、モデル コンフィギュレーション パラメーター [リアルタイム モデル データ構造のエラー ステータス フィールドを削除] を選択します。

  • malloc を使用してモデル インスタンス データにメモリを動的に割り当てる関数を生成ファイル model.c に含めるには (Embedded Coder が必要)、モデル コンフィギュレーション パラメーター [モデルの初期化に動的メモリ割り当てを使用] を選択します。このパラメーターを選択していない場合、生成されたコードはモデル データ構造に対してメモリを静的に割り当てます。

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

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

インスタンス間でのデータの共有

コードで再呼び出し可能なモデルのエントリポイント関数を複数回呼び出す場合、各呼び出しはモデルの 1 つのインスタンスを表します。既定では、コード ジェネレーターは、各インスタンスがモデルの信号、ブロック状態、およびパラメーターの個別のコピーに対して読み込み/書き込みを実行することを前提とするコードを生成します。

  • インスタンス間でパラメーター データの一部を共有するには (再利用可能な PID 制御アルゴリズムの設定点を共有するなど)、Simulink.Parameter などのパラメーター オブジェクトを使用します。次に、Auto 以外のストレージ クラスを使用するか、またはコード マッピング エディターでパラメーターを設定し、パラメーター データの対応するカテゴリの既定のストレージ クラス [Default] (既定の設定) を [Model default] に設定します。パラメーター オブジェクトは、グローバル変数など、関数が直接アクセスするグローバル シンボルとしてコードに表示されます。詳細については、C Data Code Interface Configuration for Model Interface Elementsを参照してください。

  • インスタンス間で非パラメーター データの一部を共有するには (障害指標やアキュムレーターを共有するなど)、データ ストアを使用します。データ ストアを設定することで、関数が直接アクセスするグローバル変数のように、グローバル シンボルとしてコードに表示させるようにできます。Simulink.Signal オブジェクトを使用してグローバル データ ストアを作成するか、Data Store Memory ブロックを使用して、ブロック パラメーター [モデル インスタンス間で共有する] を選択します。詳細については、データ ストアの作成によるグローバル データのモデル化および Data Store Memory を参照してください。

関連するトピック