Main Content

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

起動、リセット、シャットダウン関数インターフェイス

アプリケーションでは、システムの初期化、リセット、終了シーケンス中に、ロジックの実行が必要な場合もあります。モデルの起動、リセット、シャットダウン処理をモデル化するには、Initialize FunctionReset Function (データ インターフェイス構成のみ)、および Terminate Function ブロックを使用します。ブロックはモデルの階層構造の任意の場所で使用できます。

Initialize FunctionReset Function、および Terminate Function ブロックは、初期化イベント、リセット イベント、終了イベントに応答してアプリケーションまたはコンポーネントの実行を制御できます。これらのイベントに応答するコードを生成するのは、次のような状況です。

  • アプリケーションまたはコンポーネントの開始および停止。

  • 初期条件の計算。

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

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

これらのブロックは、モデルの階層構造のさまざまなレベルに配置できます。非バーチャル サブシステムは、それぞれ独自の初期化関数、リセット関数、終了関数をもつことができます。下位のモデルでは、Simulink® は親モデル内の対応するインスタンスで関数の内容を集約します。

Initialize Function ブロックと Terminate Function ブロックには、それぞれ 1 つの Event Listener ブロックが含まれます。関数のイベント タイプ ([初期化][リセット]、または [終了]) を指定するには、Event Listener ブロックの [イベント タイプ] パラメーターを使用します。関数ブロックは、その他のブロックの状態を読み取り、書き込みします。既定では、Initialize Function ブロックは、State Writer ブロックを使用して、ブロックの状態を初期化します。Terminate Function ブロックは、State Reader ブロックを使用して、ブロックの状態を保存します。初期化イベントまたは終了イベントによって関数がトリガーされると、関数によって、状態変数の値が指定されたブロックから読み取られるか、指定されたブロックに書き込まれます。

アプリケーション モデルおよびコンポーネント モデルは、Initialize FunctionReset Function (データ インターフェイス構成のみ)、および Terminate Function ブロックを使用して、複雑な起動、リセット、シャットダウン シーケンスをモデル化できます。これらのサブシステムは、さまざまなモデリング スタイルで動作します。初期化、リセット、終了関数のソフトウェアインザループ (SIL) シミュレーションは、エクスポート関数モデリングのみで動作します。

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

たとえば、次の要素を含むコンポーネント モデルを考えます。

  • Initialize Function ブロック

  • イベント名 tooHighReset および tooLowReset を指定する 2 つの Reset Function ブロック

  • Terminate Function ブロック

このシナリオでは、コード ジェネレーターは、イベントによってトリガーされるターゲット プラットフォームの関数呼び出しに応答する 4 つのエントリポイント関数を生成します。

  • model_initialize - 初期化関数

  • model_tooHighReset - tooHighReset イベントのリセット関数

  • model_tooLowReset - tooLowReset イベントのリセット関数

  • model_terminate - 終了関数

Embedded Coder® を使用している場合、ターゲット環境の関数スケジューラによって開始される関数呼び出しと一致するようにエントリポイント関数名をカスタマイズできます。そのためには次のいずれかの方法を適用します。

  • モデルについて、コード マッピング エディターで、またはコード マッピング プログラミング インターフェイスを使用して、モデルの初期化、リセット、終了関数の関数名を個別に構成します。

  • Embedded Coder ディクショナリで、関数カスタマイズ テンプレートを定義します。次に、モデルについて、コード マッピング エディターで、またはコード マッピング プログラミング インターフェイスを使用して、モデル イベントでトリガーされる関数のテンプレートを使用するようにコード ジェネレーターを構成します。

起動、リセット、シャットダウンの動作のモデル化の詳細については、初期化関数、再初期化関数、リセット関数および終了関数の使用を参照してください。コンポーネント モデルの起動とシャットダウンの動作のモデル化のガイドラインについては、cgsl_0404: コンポーネント展開用の Initialize Function ブロックと Terminate Function ブロックを使用した起動イベントとシャットダウン イベントのモデル化を参照してください。

初期化、終了、リセット イベント用のコードの生成

この例では、初期化、終了、リセット イベントに応答するモデルのコードを生成する方法を示します。

モデルを開く

モデル例 StartupResetShutdown を開きます。

open_system('StartupResetShutdown'); 

既定の初期化エントリポイント関数と終了エントリポイント関数

モデル StartupResetShutdown から Initialize Function ブロック、Terminate Function ブロック、および Reset Function ブロックを除外した場合、コード ジェネレーターは、他のコードがインターフェイスをとることができる初期化エントリポイント関数と終了エントリポイント関数を生成します。

void StartupResetShutdown_initialize(void)
void StartupResetShutdown_terminate(void)

これらの関数のコードは、生成されたファイル StartupResetShutdown.c に表示されます。非有限数のサポートと MAT ファイルのログを無効にしている場合、生成されたコードは次のようになります。

void StartupResetShutdown_initialize(void)
{
  rtmSetErrorStatus(StartupResetShutdown_M, (NULL));

  (void) memset((void *)&StartupResetShutdown_DW, 0,
                 sizeof(DW_StartupResetShutdown_T));   
      
  StartupResetShutdown_Y.Out1 = 0.0;

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

初期化関数 StartupResetShutdown_initialize は以下を実行します。

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

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

  • 出力値を設定する。

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

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

起動イベントおよび終了イベント用のコードの生成

起動イベントおよび終了イベント用のコードを生成するには、Initialize Function ブロックと Terminate Function ブロックをモデルに追加します。Initialize Function ブロックと Terminate Function ブロックが含まれるモデル用にコードを生成する場合、コード ジェネレーターは次を行います。

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

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

Initialize Function ブロックは State Writer ブロックを使用して Discrete Integrator ブロックの初期状態を設定します。Terminate Function ブロックは Discrete Integrator ブロックの状態を読み取る State Reader ブロックを含めます。

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

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

void StartupResetShutdown_initialize(void)
{
  rtmSetErrorStatus(rtwdemo_irt_initterm_M, (NULL));
		
  (void) memset((void *)&StartupResetShutdown_DW, 0,
	          sizeof(DW_StartupResetShutdown_T));
	
  StartupResetShutdown_Y.Out1 = 0.0;

  StartupResetShutdown_DW.DiscreteIntegrator_DSTATE = 10.0;
}

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

コンポーネント モデルの起動とシャットダウンの動作のモデル化のガイドラインについては、cgsl_0404:コンポーネント展開用の Initialize Function ブロックと Terminate Function ブロックを使用した起動イベントとシャットダウン イベントのモデル化を参照してください。

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

データ コード インターフェイスを使用するように構成されているモデルの場合、Initialize Function ブロックまたは Terminate Function ブロックを含めることで、リセット イベントに応答するコードを生成できます。Event Listener ブロックの [イベント タイプ] パラメーターを Reset に設定し、リセットにブロックを構成します。また、[イベント名] パラメーターを設定します。既定の名前は reset です。

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

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

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

モデル StartupResetShutdown の Reset Function ブロックは、Initialize Function ブロックから派生します。Event Listener ブロックの [イベント タイプ] および [イベント名] パラメーターは、それぞれ Resetreset に設定されます。この関数は State Writer ブロックを使用して Discrete Integrator ブロックの入力値を 5 にリセットします。

この Reset Function ブロックに対して、コード ジェネレーターはリセット関数 StartupResetShutdown_reset を生成します。

void StartupResetShutdown_reset(void)

{
  StartupResetShutdown_DW.DiscreteIntegrator_DSTATE = 5.0;
}

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

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

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

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

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

.
.
.
void StartupResetShutdownShared_reset(void)
{
  StartupResetShutdownShared_DW.SubIntegrator2_DSTATE = 5.0;

  StartupResetShutdownShared_DW.Integrator2_DSTATE = 5.0;
} 
.
.
.
void StartupResetShutdownShared_initialize(void)
{
  rtmSetErrorStatus(StartupResetShutdownShared_M, (NULL));

  (void) memset(((void *)&StartupResetShutdownShared_DW), 0,
                sizeof(DW_StartupResetShutdownShared_T));

  StartupResetShutdownShared_Y.Out1 = 0.0;

  StartupResetShutdownShared_DW.Integrator1_DSTATE = 0.0;

  StartupResetShutdownShared_DW.SubIntegrator2_DSTATE = 2.0;

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

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

void StartupResetShutdownShared_reset(void)
{
	  StartupResetShutdownShared_DW.SubIntegrator2_DSTATE = 5.0;
}
 
void StartupResetShutdownShared_reset_02(void)
{
   StartupResetShutdownShared_DW.Integrator2_DSTATE = 5.0;
}

制限

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

  • サービス コード インターフェイスで構成されているコンポーネント モデルのリセット処理をモデル化することはできません。

参考

| |

関連するトピック