Этот пример показывает модель, которая включает триггируемую подсистему, Amplifier, состоя из блока Discrete-Time Integrator, который использует счетчик прошедшего времени. Модель ex_elapseTime находится в папке matlab/help/toolbox/rtw/examples.
Модель ex_elapseTime

Подсистема усилителя

Код в сгенерированном заголовочном файле 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) в D_Work(states) структура в ex_elapsedTime.h.
/* 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;
Как показано выше, прошедшее время обеспечено как состояние триггируемой подсистемы. Блок 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;