Наследованный шаг расчета для моделей, на которые ссылаются,

Для получения информации о наследовании шага расчета блока 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);