プログラムによるタイマーへのアクセス
タイマー API について
ここで説明される API では、絶対時間および経過時間タイマーの提供する効率性を、S-Function が利点として活用しています。SimStruct マクロはシミュレーションで使用し、TLC 関数はインライン コード生成で使用します。次の点に注意してください。
上記のように新しいタイマーを生成して使用するため、S-Function では、関数
mdlInitializeSampleTime
で関数ssSetNeedAbsoluteTime
または関数ssSetNeedElapseTime
を呼び出し、絶対時間または経過時間のタイマーを使用する必要性を登録しなければなりません。既存の S-Function は、これらのマクロを使用して絶対時間を読み取り、登録しない場合も、期待どおりの動作を続けます。ただし、効率的なコードを生成しません。
S-Function の C API
このトピックで説明した SimStruct マクロを使用すると、シミュレーション中に S-Function の絶対時間および経過時間のタイマーにアクセスできます。
以下の関数では、SimStruct *S
引数は、呼び出し側 S-Function の simstruct
のポインターです。
void ssSetNeedAbsoluteTime(SimStruct *S, boolean b)
:b
がTRUE
の場合、呼び出し側 S-Function が絶対時間データを要求していることを登録し、絶対時間カウンターを S-Function 実行時のレートに割り当てます (カウンターが割り当てられていない場合)。int ssGetNeedAbsoluteTime(SimStruct *S)
: S-Function が絶対時間を要求していることが登録されている場合、1 を返します。double ssGetTaskTime(SimStruct *S, tid)
: タスク識別子tid
をもつ指定のタスクの絶対時間を読み込みます。関数ssGetTaskTime
は、新しいタイマーの機能を使用するか否かにかかわらず、透過的に動作します。関数ssGetTaskTime
については、Simulink® ドキュメンテーションの関数 SimStruct の章を参照してください。void ssSetNeedElapseTime(SimStruct *S, boolean b)
:b
がTRUE
の場合、呼び出し側 S-Function が経過時間データを要求していることを登録し、経過時間カウンターを S-Function 実行時のトリガーされたサブシステムに割り当てます (カウンターが割り当てられていない場合)。Triggered Subsystem の経過時間カウンターも参照してください。int ssGetNeedElapseTime(SimStruct *S)
: S-Function が経過時間を要求していることが登録されている場合、1 を返します。void ssGetElapseTime(SimStruct *S, (double *)elapseTime)
:elapseTime
によって示された場所に S-Function に関連付けられた経過時間カウンターの値 (double
として) を返します。void ssGetElapseTimeCounterDtype(SimStruct *S, (int *)dtype)
: S-Function に関連付けられた経過時間カウンターのデータ型をdtype
によって示された場所に返します。この関数は、関数ssGetElapseTimeCounter
によって使用されることを意図しています (以下を参照)。void ssGetElapseResolution(SimStruct *S, (double *)resolution)
: S-Function に関連付けられた経過時間カウンターの分解能 (すなわち、サンプル時間) をresolution
によって示された場所に返します。この関数は、関数ssGetElapseTimeCounter
によって使用されることを意図しています (以下を参照)。void ssGetElapseTimeCounter(SimStruct *S, (void *)elapseTime)
: この関数は、固定小数点演算の経過時間の値が必要なブロックを使用するために提供されています。関数ssGetElapseTimeCounter
は、elapseTime
によって示された場所に S-Function によって関連付けられた経過時間のカウンターの整数値を返します。カウンター サイズが 64 ビットの場合、この値は、2 つの 32 ビットワードの配列として返され、低順位ワードはより小さなアドレスで格納されます。返されたカウンター値にアクセスする方法を特定するには、次のコードのように、関数
ssGetElapseTimeCounterDtype
を呼び出して、カウンターのデータ型を取得します。int *y_dtype; ssGetElapseTimeCounterDtype(S, y_dtype); switch(*y_dtype) { case SS_DOUBLE_UINT32: { uint32_T dataPtr[2]; ssGetElapseTimeCounter(S, dataPtr); } break; case SS_UINT32: { uint32_T dataPtr[1]; ssGetElapseTimeCounter(S, dataPtr); } break; case SS_UINT16: { uint16_T dataPtr[1]; ssGetElapseTimeCounter(S, dataPtr); } break; case SS_UINT8: { uint8_T dataPtr[1]; ssGetElapseTimeCounter(S, dataPtr); } break; case SS_DOUBLE: { real_T dataPtr[1]; ssGetElapseTimeCounter(S, dataPtr); } break; default: ssSetErrorStatus(S, "Invalid data type for elaspe time counter"); break; }
実際の経過時間を使用する場合は、関数
ssGetElapseTime
の呼び出しを発行して、経過時間に直接アクセスします。カウンター値を取得して、経過時間を計算する必要はありません。double *y_elapseTime; . . . ssGetElapseTime(S, elapseTime)
コード生成の TLC API
次の TLC 関数は、S-Function の TLC スクリプトを書き込んで S-Function をインライン化する場合、生成コードの経過時間カウンターをサポートします。
LibGetTaskTimeFromTID
(block)
:block
が実行されるタスクの絶対時間を読み込むコードを生成します。関数
LibGetTaskTimeFromTID
は、『Target Language Compiler』ドキュメンテーションの TLC 関数ライブラリ リファレンス ページの他のサンプル時間関数を使用して記述されています。メモ:
関数
LibGetT
は、この目的で使用しないでください。関数LibGetT
は、常に基本レート (tid 0
) タイマーを読み取ります。関数LibGetT
がサブレートで実行中のブロックに呼び出された場合、誤ったタイマーが読み取られ、重大なエラーが発生します。LibGetElapseTime
(system)
:system
の経過時間カウンターを読み込むコードを生成します (system
は呼び出し側ブロックの親システムです)。この関数によって生成されるコードの例は、経過時間カウンターのコードの生成を参照してください。LibGetElapseTimeCounter
(system)
:system
の経過時間カウンターの整数値を読み込むコードを生成します (system
は呼び出し側ブロックの親システムです)。この関数は、関数LibGetElapseTimeCounterDtypeId
および関数LibGetElapseTimeResolution
と一緒に使用しなければなりません (上記の関数ssGetElapseTimeCounter
の説明を参照してください)。LibGetElapseTimeCounterDtypeId
(system)
:system
の経過時間カウンターのデータ型を返すコードを生成します。(system
は呼び出し側ブロックの親システムです)。LibGetElapseTimeResolution
(system)
:system
の経過時間カウンターの分解能を返すコードを生成します。(system
は呼び出し側ブロックの親システムです)。