Для Simulink® engine, чтобы определить, может ли модель наследовать шаг расчета от родительской модели, S-функции в модели должны определять, как они используют шаги расчета. Вы можете задать эту информацию, вызвав макрос ssSetModelReferenceSampleTimeInheritanceRule
от mdlInitializeSizes
или mdlSetWorkWidths
. Чтобы использовать этот макрос:
Проверьте, вызывает ли S-функция любой из следующих макросов:
Проверьте их в коде TLC S-функции:
LibBlockSampleTime
CompiledModel.SampleTime
LibBlockInputSignalSampleTime
LibBlockInputSignalOffsetTime
LibBlockOutputSignalSampleTime
LibBlockOutputSignalOffsetTime
В зависимости от результатов поиска, используйте ssSetModelReferenceSampleTimeInheritanceRule
как указано в этой таблице.
Если... | Использовать... | Пример |
---|---|---|
Ни один из макросов или функций не присутствует, S-функция не препятствует наследованию модели шага расчета. |
ssSetModelReferenceSampleTimeInheritanceRule (S, USE_DEFAULT_FOR_DISCRETE_INHERITANCE) | |
Любой из макросов или функций используется для:
|
ssSetModelReferenceSampleTimeInheritanceRule... (S,USE_DEFAULT_FOR_DISCRETE_INHERITANCE) | Рассмотрим это 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) | Рассмотрим 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 блока, см. Ссылочные шаги расчета модели.