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

0

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

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

  • 0
    Нет, это не так. mdlUpdate используется для обновления дискретных состояний, которые в общем случае могут быть функцией входов, и не имеет никакого отношения к тому, является ли выход функцией входов.
  • 0
    Спасибо @PhilGoddard. Означает ли это, что я должен иметь возможность использовать mdlUpdate для обновления векторных значений PWork? Это то, что я пытаюсь сделать, но получаю ошибку. Я мог бы опубликовать код и ошибку, если это поможет.
Показать ещё 4 комментария
Теги:
simulink
s-function

1 ответ

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
    Почему вы используете вектор PWork? То, что вы описываете, является стандартным использованием для дискретного состояния или вектора DWork.
  • 0
    Привет, Фил. Нет веских причин. Недостаточное понимание тонкостей Симулинка. Я буду смотреть на наличие состояний в моей функции

Ещё вопросы

Сообщество Overcoder
Наверх
Меню