У меня есть входной порт для моей S-функции CMEX, для которого я установил НЕ иметь прямой ввод. Однако, когда я пытаюсь использовать сигнал с входного порта в mdlUpdate
при вызове функции происходит сбой при нарушении сегментации и информирует меня о том, что наиболее вероятной причиной является неправильно установленное состояние прямого прохода входного порта.
Использует ли входной сигнал в mdlUpdate ТАКЖЕ как прямой проход?
Для тех, кто может заняться этим вопросом в будущем, я нашел ответ. 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
вызывается только в основных временных шагах