В Simulink mdlUpdate также считается прямым проходом?

У меня есть входной порт для моей S-функции CMEX, для которого я установил НЕ иметь прямой ввод. Однако, когда я пытаюсь использовать сигнал с входного порта в mdlUpdate при вызове функции происходит сбой при нарушении сегментации и информирует меня о том, что наиболее вероятной причиной является неправильно установленное состояние прямого прохода входного порта.

Использует ли входной сигнал в mdlUpdate ТАКЖЕ как прямой проход?

0

Решение

Для тех, кто может заняться этим вопросом в будущем, я нашел ответ. mdlUpdate не считается прямым прорывом. Однако, если вы попытаетесь получить доступ к сигналу входного порта на первом этапе времени, это приведет к нарушению сегментации (документация Mathworks предполагает, что ошибка может отличаться для разных компьютеров).

Хитрость заключается в использовании ssIsFirstInitCond(S) узнать, находится ли компилятор на первом временном шаге или нет, и избежать выполнения какого-либо присваивания на первом шаге.

Мой код выглядит так:

#define MDL_UPDATE
#if defined(MDL_UPDATE)
static void mdlUpdate(SimStruct *S)
{UNUSED_ARG(tid);
if(!ssIsFirstInitCond(S))
{
real_T *u1 = (real_T *) ssGetInputPortSignal(S)[0];
double *P1 = (double *) ssGetPWork(S)[0];
// assign values here
}
}
#endif

Также обратите внимание, что mdlUpdate вызывается только в основных временных шагах

0

Другие решения


По вопросам рекламы [email protected]