У меня есть входной порт для моей CMEX S-Function, на который я установил NOT Direct Directthrough. Однако, когда я пытаюсь использовать сигнал из входного порта в mdlUpdate
функции 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
вызывается только на основных временных шагах