Для получения информации о наследовании шага расчета блока Model смотрите Образцовые Шаги расчета, на которые Ссылаются (Simulink). В сгенерированном коде можно управлять наследовавшимся шагом расчета при помощи ssSetModelReferenceSampleTimeInheritanceRule
по-разному:
S-функция, которая устраняет наследование: Если шаг расчета используется в алгоритме S-функции во время выполнения, то S-функция устраняет модель от наследования шага расчета. Например, рассмотрите следующий код mdlOutputs
:
static void mdlOutputs(SimStruct *S, int_T tid) { const real_T *u = (const real_T*) ssGetInputPortSignal(S,0); real_T *y = ssGetOutputPortSignal(S,0); y[0] = ssGetSampleTime(S,tid) * u[0]; }
Этот код mdlOutputs
использует шаг расчета в своем алгоритме, и S-функция поэтому должна задать
ssSetModelReferenceSampleTimeInheritanceRule (S, DISALLOW_SAMPLE_TIME_INHERITANCE);
S-функция, которая не устраняет Наследование: Если шаг расчета только используется для определения, имеет ли S-функция демонстрационный хит, то это не устраняет модель от наследования шага расчета. Например, считайте код mdlOutputs
от примера S-функции sfun_multirate.c
:
static void mdlOutputs(SimStruct *S, int_T tid) { InputRealPtrsType enablePtrs; int *enabled = ssGetIWork(S); if (ssGetInputPortSampleTime (S,ENABLE_IPORT)==CONTINUOUS_SAMPLE_TIME && ssGetInputPortOffsetTime(S,ENABLE_IPORT)==0.0) { if (ssIsMajorTimeStep(S) && ssIsContinuousTask(S,tid)) { enablePtrs = ssGetInputPortRealSignalPtrs(S,ENABLE_IPORT); *enabled = (*enablePtrs[0] > 0.0); } } else { int enableTid = ssGetInputPortSampleTimeIndex(S,ENABLE_IPORT); if (ssIsSampleHit(S, enableTid, tid)) { enablePtrs = ssGetInputPortRealSignalPtrs(S,ENABLE_IPORT); *enabled = (*enablePtrs[0] > 0.0); } } if (*enabled) { InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,SIGNAL_IPORT); real_T signal = *uPtrs[0]; int i; for (i = 0; i < NOUTPUTS; i++) { if (ssIsSampleHit(S, ssGetOutputPortSampleTimeIndex(S,i), tid)) { real_T *y = ssGetOutputPortRealSignal(S,i); *y = signal; } } } } /* end mdlOutputs */
Вышеупомянутый код использует шаги расчета блока, но только для определения, имеет ли там успех. Поэтому эта S-функция должна установить
ssSetModelReferenceSampleTimeInheritanceRule (S, USE_DEFAULT_FOR_DISCRETE_INHERITANCE);