Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

初期化イベント、リセット イベントおよび終了イベントに応答するコードの生成

実行中に初期化イベント、リセット イベントおよび終了イベントに応答するモデリング コンポーネントからコードを生成するには、Initialize Function ブロックと Terminate Function ブロックを使用します。これらのブロックの使用方法の詳細については、初期化関数、再初期化関数、リセット関数および終了関数の使用を参照してください。ブロックはモデルの階層構造の任意の場所で使用できます。

初期化イベント、リセット イベントおよび終了イベントに応答するコードを生成するのは、次のような状況です。

  • コンポーネントの開始および停止。

  • 初期条件の計算。

  • 不揮発性メモリからの状態の保存および復元。

  • 外部イベントに応答するリセット エントリポイント関数の生成。

非バーチャル サブシステムと参照モデルはそれぞれ、初期化関数、リセット関数および終了関数の独自のセットをもつことができます。

コード ジェネレーターは、初期化コードと終了コードをリセット コードとは異なる方法で生成します。初期化コードと終了コードの場合、コード ジェネレーターはコンポーネントの初期化コードと終了コードを既定のエントリポイント関数 model_initialize および model_terminate に含めます。リセット動作をモデル化する場合にのみ、コード ジェネレーターはリセット コードを生成します。

初期化イベントおよび終了イベント用コードの生成

Initialize Function ブロックと Terminate Function ブロックが含まれるコンポーネント用にコードを生成する場合、コード ジェネレーターは次を行います。

  • 既定の初期化コードをもつ初期化イベント コードをエントリポイント関数 model_initialize に含める。

  • 既定の終了コードをもつ終了イベント コードをエントリポイント関数 model_terminate に含める。

rtwdemo_irt_base モデルを考えます。

このモデルでは、コード ジェネレーターは、他のコードがインターフェイスをとることができる初期化エントリポイント関数と終了エントリポイント関数を生成します。

void rtwdemo_irt_base_initialize(void)
void rtwdemo_irt_base_terminate(void)

このコードは生成された rtwdemo_irt_base.c ファイルに表示されます。初期化関数 rtwdemo_irt_base_initialize は以下を実行します。

  • エラー ステータスを初期化する。

  • ブロック I/O パラメーターと状態パラメーターにメモリを割り当てる。

  • 出力値を設定する。

  • 離散積分器の初期条件を設定する。

終了関数 rtwdemo_irt_base_terminate にはコードは必要ありません。

このコードは、非有限数のサポートと、MAT ファイルのログが無効になっていることを前提とします。

void rtwdemo_irt_base_initialize(void)
{
  rtmSetErrorStatus(rtwdemo_irt_base_M, (NULL));

  (void) memset((void *)&rtwdemo_irt_base_DW, 0,
                 sizeof(DW_rtwdemo_irt_base_T));   
      
  rtwdemo_irt_base_Y.Out1 = 0.0;

  rtwdemo_irt_base_DW.DiscreteIntegrator_DSTATE = 0.0;
}
	
void rtwdemo_irt_base_terminate(void)
{
  /* (no terminate code required) */
}

Initialize Function ブロックと Terminate Function ブロックをモデルに追加します (rtwdemo_irt_initterm を参照)。Initialize Function ブロックは State Writer ブロックを使用して Discrete Integrator ブロックの初期状態を設定します。Terminate Function ブロックは Discrete Integrator ブロックの状態を読み取る State Reader ブロックを含めます。

初期化関数および終了関数の Event Listener ブロックのパラメーター [イベント タイプ] を、[初期化][終了] にそれぞれ設定します。初期化関数は State Writer ブロックを使用して Discrete Integrator ブロックの入力値を 10 に初期化します。終了関数は State Reader ブロックを使用して Discrete Integrator ブロックの状態を読み取ります。

コード ジェネレーターは、標準の初期化コードと終了コードをもつ Initialize Function ブロックと Terminate Function ブロックに対して生成したイベント コードを、エントリポイント関数 rtwdemo_irt_initterm_initializertwdemo_irt_initterm_terminate に含めます。このコードは、非有限数のサポートと、MAT ファイルのログが無効になっていることを前提とします。

void rtwdemo_irt_initterm_initialize(void)
{
  rtmSetErrorStatus(rtwdemo_irt_initterm_M, (NULL));
		
  (void) memset((void *)&rtwdemo_irt__initterm_DW, 0,
	          sizeof(DW_rtwdemo_irt__initterm_T));
	
  rtwdemo_irt_initterm_Y.Out1 = 0.0;

  rtwdemo_irt_initterm_DW.DiscreteIntegrator_DSTATE = 10.0;
}

void rtwdemo_irt__initterm_terminate(void)
{
  /* (no terminate code required) */
} 

リセット イベント用コードの生成

Initialize Function ブロックまたは Terminate Function ブロックをモデリング コンポーネントに含めることで、リセット イベントに応答するコードを生成します。Event Listener ブロックの [イベント タイプ] パラメーターを [リセット] に設定し、リセットにブロックを構成します。また、[イベント名] パラメーターを設定します。既定の名前は reset です。

リセット動作をモデル化する場合、コード ジェネレーターはリセット エントリポイント関数 "のみ" を生成します。1 つのコンポーネントに複数のリセット仕様が含まれる場合、コード ジェネレーターが生成するコードはリセット関数が 1 つのイベント名を共有するかどうかによって異なります。特定のコンポーネント階層では、以下が適用されます。

  • 固有のイベント名をもつリセット関数の場合、コード ジェネレーターは名前の付いた各イベントに個別のエントリポイント関数を生成する。各関数の名前は対応するイベントの名前です。

  • イベント名を共有するリセット関数の場合、コード ジェネレーターはリセット コードを 1 つのエントリポイント関数に集約する。リセット関数のコードは、コンポーネント階層の最下位レベル (最も内側) で開始してルート (最も外側) で終了する順序で表示されます。関数の名前は model_reset です。詳細については、イベント名およびコードの集約を参照してください。

モデル rtwdemo_irt_reset を考えます。このモデルには、Initialize Function ブロックから派生する Reset Function ブロックが含まれます。

Event Listener ブロックの [イベント タイプ] および [イベント名] パラメーターは [リセット][reset] にそれぞれ設定されます。この関数は State Writer ブロックを使用して Discrete Integrator ブロックの入力値を 5 にリセットします。

コード ジェネレーターはリセット関数 rtwdemo_irt_reset_reset を生成します。

void rtwdemo_irt_reset_reset(void)

{
  rtwdemo_irt_reset_DW.DiscreteIntegrator_DSTATE = 5.0;
}

イベント名およびコードの集約

Initialize Function ブロックと Terminate Function ブロックを使用し、コンポーネント階層に複数の初期化関数、リセット関数および終了関数を定義します。階層レベルごとに初期化関数と終了関数をそれぞれ 1 つのみ定義します。1 つの階層レベルに複数のリセット関数を定義できます。各レベルで関数に設定するイベント名は固有でなければなりません。

コードを生成する際に、コード ジェネレーターはコンポーネント階層全体で指定のイベント名をもつ関数のコードを 1 つのエントリポイント関数に集約します。リセット関数のコードは、コンポーネント階層の最下位レベル (最も内側) で開始してルート (最も外側) で終了する順序で表示されます。コード ジェネレーターはイベント名を使用して関数に名前を付けます。

たとえば、モデル rtwdemo_irt_shared に含まれるサブシステムには、親モデル内の初期化関数、リセット関数および終了関数が複製されます。

モデルには初期化関数、リセット関数および終了関数の複数のコピーが含まれますが、コード ジェネレーターはリセット (rtwdemo_irt_shared_reset)、初期化 (rtwdemo_irt_shared_initialize)、終了 (rtwdemo_irt_shared_terminate) にそれぞれ 1 つのエントリポイント関数を生成します。各エントリポイント関数内では、初期条件 (model_P.block_IC) で構成されたブロックのコードを一覧表示した後、コード ジェネレーターは階層の最下位レベルで開始してルートで終了する順序でコンポーネントのコードを並べ替えます。

.
.
.
void rtwdemo_irt_shared_reset(void)
{
  rtwdemo_irt_shared_DW.SubIntegrator2_DSTATE = 5.0;

  rtwdemo_irt_shared_DW.Integrator2_DSTATE = 5.0;
} 
.
.
.
void rtwdemo_irt_shared_initialize(void)
{
  rtmSetErrorStatus(rtwdemo_irt_shared_M, (NULL));

  (void) memset(((void *)&rtwdemo_irt_shared_DW), 0,
                sizeof(DW_rtwdemo_irt_shared_T));

  rtwdemo_irt_shared_Y.Out1 = 0.0;

  rtwdemo_irt_shared_DW.Integrator1_DSTATE = 0.0;

  rtwdemo_irt_shared_DW.SubIntegrator2_DSTATE = 2.0;

  rtwdemo_irt_shared_DW.Integrator2_DSTATE = 10.0;
.
.
.
void rtwdemo_irt_shared_terminate(void)
{
   /* (no terminate code required) */
   }

サブシステムのリセット関数に構成したイベントの名前を reset_02 に変更する場合、コード ジェネレーターは 2 つのリセット エントリポイント関数 rtwdemo_irt_shared_reset および rtwdemo_irt_shared_reset_02 を生成します。

void rtwdemo_irt_shared_reset(void)
{
	  rtwdemo_irt_shared_DW.SubIntegrator2_DSTATE = 5.0;
}
 
void rtwdemo_irt_shared_reset_02(void)
{
   rtwdemo_irt_shared_DW.Integrator2_DSTATE = 5.0;
}

制限

ハーネス モデル (初期化、リセットおよび終了の各関数端子を表示する Model ブロックを含むルート モデル) からコードを生成することはできません。

関連するトピック