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