在Simulink中,mdlUpdate是否也算作Direct Feedthrough?

时间:2014-08-21 20:08:22

标签: c++ matlab simulink s-function

我有一个输入端口到我的CMEX S-Function,我设置为没有Direct Feedthrough。但是,当我尝试在mdlUpdate函数调用中使用来自输入端口的信号时,它会因分段违规而崩溃,并通知我最可能的原因是输入端口的直接馈通状态设置不正确。

使用mdlUpdate中的输入信号是否算作直接馈通?

1 个答案:

答案 0 :(得分:0)

对于那些将来可能会研究这个问题的人,我找到了答案。 mdlUpdate不算作直接Feedthrough。但是,如果您尝试在第一个时间步骤访问输入端口信号,则会导致分段违规(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仅在主要时间步骤中被调用