Main Content

プログラムによるタイマーへのアクセス

タイマー 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): bTRUE の場合、呼び出し側 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): bTRUE の場合、呼び出し側 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 は呼び出し側ブロックの親システムです)。

関連するトピック