exponenta event banner

S-функции, определяющие правила наследования образца времени

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

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

  2. Проверьте их в коде TLC функции S:

    • 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-функции, для которых этот макрос не задан.

С помощью параметров конфигурации на панели «Диагностика» > «Время образца» можно управлять реакцией модуля Simulink при обнаружении S-функций с неопределенными правилами наследования времени образца. Переключить неуказанную наследуемость диагностики времени выборки на none, warning, или error. Значение по умолчанию: warning.

Сведения о наследовании времени образца блока модели см. в разделе Ссылочное время образца модели.

Связанные темы