Этот пример показывает модель, которая включает инициированную подсистему, 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;