S-функции, которыми управляет наследование Настройки времени выборки

Для механизма Simulink®, чтобы определить, может ли модель наследовать шаг расчета от родительской модели, S-функций в потребности модели задать, как они используют шаги расчета. Можно указать эту информацию путем вызова макроса ssSetModelReferenceSampleTimeInheritanceRule от mdlInitializeSizes или mdlSetWorkWidths. Использовать этот макрос:

  1. Проверяйте ли S-вызовы-функции любой из них макросы:

  2. Проверяйте на них в своем коде S-function TLC:

    • LibBlockSampleTime

    • CompiledModel.SampleTime

    • LibBlockInputSignalSampleTime

    • LibBlockInputSignalOffsetTime

    • LibBlockOutputSignalSampleTime

    • LibBlockOutputSignalOffsetTime

  3. В зависимости от ваших результатов поиска использовать ssSetModelReferenceSampleTimeInheritanceRule как обозначено в этой таблице.

    Если...Использование...Пример
    Ни одни из макросов или функций не присутствуют, S-функция не устраняет модель от наследования шага расчета.
    ssSetModelReferenceSampleTimeInheritanceRule
        (S, USE_DEFAULT_FOR_DISCRETE_INHERITANCE)
     

    Любые из макросов или функций используются для:

    • Бросок ошибок, если шаг расчета наследован, непрерывен, или постоянный

    • Проверка ssIsSampleHit

    • Проверка, наследован ли шаг расчета в также mdlSetInputPortSampleTime или mdlSetOutputPortSampleTime перед установкой

    ssSetModelReferenceSampleTimeInheritanceRule...
    (S,USE_DEFAULT_FOR_DISCRETE_INHERITANCE)

    Рассмотрите этот 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];
    }
    
    S-функция использует свой шаг расчета для вычислительных параметров, выходных параметров, и так далее.
    ssSetModelReferenceSampleTimeInheritanceRule
    (S, DISALLOW_SAMPLE_TIME_INHERITANCE)

    Рассмотрите mdlOutputs код из примера S-функции sfun_multirate.c:

    static void mdlOutputs(SimStruct *S, int_T tid)
    {
        InputRealPtrsType enablePtrs;
        int               *enabled = ssGetIWork(S);
        int enableTid = ssGetInputPortSampleTimeIndex(S,ENABLE_IPORT);
        int signalTid = ssGetInputPortSampleTimeIndex(S,SIGNAL_IPORT);
        real_T enableTs       = ssGetInputPortSampleTime(S,ENABLE_IPORT);
        real_T enableTsOffset = ssGetInputPortOffsetTime(S,ENABLE_IPORT);
        if (enableTs == CONTINUOUS_SAMPLE_TIME && enableTsOffset == 0.0) {
            if (ssIsMajorTimeStep(S) && ssIsContinuousTask(S,tid)) {
                if (signalTid == enableTid ||
                    ssIsSpecialSampleHit(S, signalTid, enableTid, tid)) {
                    enablePtrs = ssGetInputPortRealSignalPtrs(S,ENABLE_IPORT);
                    *enabled = (*enablePtrs[0] > 0.0);
                }
            }
        } else {
            int enableTid = ssGetInputPortSampleTimeIndex(S,ENABLE_IPORT);
            if (ssIsSampleHit(S, enableTid, tid)) {
                if (enableTid == signalTid || 
                    ssIsSpecialSampleHit(S, signalTid, enableTid, tid)) {
                    enablePtrs = ssGetInputPortRealSignalPtrs(S,ENABLE_IPORT);
                    *enabled = (*enablePtrs[0] > 0.0);
                }
            }
        }
    
        if (ssIsSampleHit(S, signalTid, tid) && (*enabled)) {
            InputRealPtrsType uPtrs  = ssGetInputPortRealSignalPtrs(S,SIGNAL_IPORT);
            real_T            signal = *uPtrs[0];
            int               i;
            
            for (i = 0; i < NOUTPUTS; i++) {
                int outTid = ssGetOutputPortSampleTimeIndex(S,i);
                if (outTid==signalTid || 
                    ssIsSpecialSampleHit(S, outTid, signalTid, tid)) {
                    real_T *y = ssGetOutputPortRealSignal(S,i);
                    *y = signal;
                }
            }
        }
    
    } /* end mdlOutputs */

Примечание

Если S-функция не устанавливает ssSetModelReferenceSampleTimeInheritanceRule макрос, по умолчанию механизм Simulink принимает, что S-функция не устраняет модель, содержащую ту S-функцию от наследования шага расчета. Однако механизм выдает предупреждение, указывающее, что модель включает S-функции, для которых не установлен этот макрос.

Можно использовать настройки в Параметрах конфигурации на Diagnostics> панель Sample Time, чтобы управлять, как механизм Simulink отвечает, когда это сталкивается с S-функциями, которые имеют незаданные правила наследования шага расчета. Переключите диагностику Unspecified inheritability of sample time к noneПредупреждение, или error. Значением по умолчанию является warning.

Для получения информации о наследовании шага расчета блока Model смотрите Шаги расчета Модели, на которые Ссылаются.

Похожие темы