Main Content

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

この例は、Triggered Subsystem Amplifier を含み、経過時間カウンターを使用する Discrete-Time Integrator ブロックで構成されるモデルを示しています。モデル ex_elapseTime は、フォルダー matlab/help/toolbox/rtw/examples 内にあります。

ex_elapseTime モデル

Model that includes a triggered subsystem that consists of a Discrete-Time Integrator block that uses an elapsed time counter

Amplifier サブシステム

Model's amplifier subsystem

モデルの生成ヘッダー ファイル ex_elapseTime.h 内のコードは、64 ビットを使用して、基本レートのタイマー (clockTick0 および clockTickH0) を実装します。

/*
 * Timing:
 * The following substructure contains information regarding
 * the timing information for the model.
 */
struct {
  time_T taskTime0;
  uint32_T clockTick0;
  uint32_T clockTickH0;
  time_T stepSize0;
  time_T tFinal;
  boolean_T stopRequestedFlag;
} Timing;

コード ジェネレーターは、Amplifier サブシステム (Amplifier_PREV_T) の前の時間値と経過時間値のストレージを ex_elapsedTime.hD_Work(states) 構造体に割り当てます。

/* Block states (auto storage) for system '<Root>' */
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_ex_elapseTime_T;

経過時間の計算は、関数 ex_elapseTime_step 内で次のように実行されます。

/* ---
   Outputs for Triggered SubSystem:
      '<Root>/Amplifier' incorporates:
         TriggerPort: '<S1>/Trigger'
 --- */
 zcEvent = rt_ZCFcn(RISING_ZERO_CROSSING,
        &ex_elapseTime_PrevZCX.Amplifier_Trig_ZCE,           
        ((real_T)rtb_PulseGenerator));
	if (zcEvent != NO_ZCEVENT) {
   elapseT_H = ex_elapseTime_M->Timing.clockTickH0 -
	    ex_elapseTime_DW.Amplifier_PREV_T[1];
	  if (ex_elapseTime_DW.Amplifier_PREV_T[0] >
       ex_elapseTime_M->Timing.clockTick0) {
     elapseT_H--;
	  }

   ex_elapseTime_DW.Amplifier_ELAPS_T[0] = 
      ex_elapseTime_M->Timing.clockTick0 
      - ex_elapseTime_DW.Amplifier_PREV_T[0];
   ex_elapseTime_DW.Amplifier_PREV_T[0] = 
      ex_elapseTime_M->Timing.clockTick0;
   ex_elapseTime_DW.Amplifier_ELAPS_T[1] = 
      elapseT_H;
   ex_elapseTime_DW.Amplifier_PREV_T[1] = 
      ex_elapseTime_M->Timing.clockTickH0;

上記のように、経過時間は、Triggered Subsystem の状態として維持されます。最後に、Discrete-Time Integrator ブロックは、経過時間を使用して、出力と更新の計算を実行します。

/* ---
DiscreteIntegrator: '<S1>/Discrete-Time Integrator' 
--- */
OUTPUT = ex_elapseTime_DW.DiscreteTimeIntegrator_DSTATE;

/* --- 
Update for DiscreteIntegrator: 
   '<S1>/Discrete-Time Integrator' incorporates:
      Constant: '<Root>/Constant'
--- */
   ex_elapseTime_DW.DiscreteTimeIntegrator_DSTATE += 0.3 * (real_T)
     ex_elapseTime_DW.Amplifier_ELAPS_T[0] * 1.5;

関連するトピック