S-функции, которые задают Шаг расчета правила наследования

Для Simulink® engine, чтобы определить, может ли модель наследовать шаг расчета от родительской модели, 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-функции, для которых этот макрос не установлен.

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

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

Похожие темы