経過時間カウンターのコードの生成
この例は、Triggered Subsystem Amplifier
を含み、経過時間カウンターを使用する Discrete-Time Integrator ブロックで構成されるモデルを示しています。モデル ex_elapseTime
は、フォルダー matlab/help/toolbox/rtw/examples
内にあります。
ex_elapseTime モデル
Amplifier サブシステム
モデルの生成ヘッダー ファイル 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.h
の D_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;