Main Content

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

経過時間カウンターのコードの生成

この例では、経過時間カウンターのコードを生成できるモデルを示します。コード ジェネレーターは、経過時間データを必要とするブロックを含むトリガーされたサブシステムまたはトリガーされたサブシステム内で無条件で実行されるサブシステムに対して、経過時間カウンターを割り当て、維持します。経過時間データを必要とするブロックの例は、Discrete-Time Integrator ブロックです。

モデル例を開く

モデル例 ElapsedTimeCounter を開きます。このモデルにはトリガーされたサブシステム Amplifier. が含まれます。このモデルはデータ コード インターフェイスを使用するように構成されています。

open_system("ElapsedTimeCounter.slx");

Amplifier サブシステムを開きます。このサブシステムには、経過時間データを使用する Discrete-Time Integrator ブロックが含まれます。

コードの生成と検査

モデルのコードを生成します。

基本レート タイマー データの宣言

ヘッダー ファイル ElapsedTimeCounter.h のリアルタイム モデル データ構造体 tag_RTM_ElapsedTimeCounter_T 内で、コード ジェネレーターはタイマー情報のストレージをサブ構造体に割り当てます。そのサブ構造体内で、コード ジェネレーターは 64 ビット (フィールド clockTick0 とフィールド ClockTickH0) を使用して、モデルの基本レートのタイマー データを保存します。

struct tag_RTM_ElapsedTimeCounter_T {
  const char_T *errorStatus;
  RTWLogInfo *rtwLogInfo;

  struct {
    time_T taskTime0;
    uint32_T clockTick0;
    uint32_T clockTickH0;
    time_T stepSize0;
    time_T tFinal;
    boolean_T stopRequestedFlag;
  } Timing;
};

経過時間と前の時間のデータの宣言

ヘッダー ファイル ElapsedTimeCounter.h では、経過時間と前の時間のデータの変数も宣言します。サブシステム Amplifier の場合、コード ジェネレーターは、経過時間値と前の時間値 (フィールド Amplifier_ELAPS_T[2] とフィールド AMPLIFIER_PREV_T[2]) のストレージをモデル ブロック状態構造体 DW_ElapsedTimeCounter_T に割り当てます。

typedef struct {
  real_T DiscreteTimeIntegrator_DSTATE;/* '<S1>/Discrete-Time Integrator' */
  int32_T clockTickCounter;            /* '<Root>/Pulse Generator' */
  uint32_T Amplifier_ELAPS_T[2];       /* '<Root>/Amplifier' */
  uint32_T Amplifier_PREV_T[2];        /* '<Root>/Amplifier' */
} DW_ElapsedTimeCounter_T;

経過時間の計算

ファイル ElapasedTimeCounter.c 内のエントリポイント関数 ElapasedTimeCounter_step には、経過時間を計算するコードが含まれます。この関数では、経過時間は、トリガーされたサブシステムの状態として維持されます。

void ElapsedTimeCounter_step(void)
{
.
.
.
  zcEvent = rt_ZCFcn(RISING_ZERO_CROSSING,
                     &ElapsedTimeCounter_PrevZCX.Amplifier_Trig_ZCE,
                     ((real_T)rtb_PulseGenerator));
  if (zcEvent != NO_ZCEVENT) {
    Amplifier_ELAPS_T_tmp_tmp = ElapsedTimeCounter_M->Timing.clockTick0;
    ElapsedTimeCounter_DW.Amplifier_ELAPS_T[0] = Amplifier_ELAPS_T_tmp_tmp -
      ElapsedTimeCounter_DW.Amplifier_PREV_T[0];
    elapseT_H_tmp = ElapsedTimeCounter_M->Timing.clockTickH0;
    elapseT_H = elapseT_H_tmp - ElapsedTimeCounter_DW.Amplifier_PREV_T[1];
    if (ElapsedTimeCounter_DW.Amplifier_PREV_T[0] > Amplifier_ELAPS_T_tmp_tmp) {
      elapseT_H--;
    }

    ElapsedTimeCounter_DW.Amplifier_ELAPS_T[1] = elapseT_H;
    ElapsedTimeCounter_DW.Amplifier_PREV_T[0] = Amplifier_ELAPS_T_tmp_tmp;
    ElapsedTimeCounter_DW.Amplifier_PREV_T[1] = elapseT_H_tmp;
.
.
.

Discrete-Time Integrator での経過時間の使用

エントリポイント関数 ElapasedTimeCounter_step が経過時間を計算した後で、関数は計算された値を使用して、Discrete-Time Integrator ブロックの出力と更新の計算を実行します。

.
.
.
OUTPUT = ElapsedTimeCounter_DW.DiscreteTimeIntegrator_DSTATE;

    ElapsedTimeCounter_DW.DiscreteTimeIntegrator_DSTATE += 0.3 * (real_T)
      ElapsedTimeCounter_DW.Amplifier_ELAPS_T[0] * 1.5;
  }
.
.
.

関連するリンク