我有一个输入端口到我的CMEX S-Function,我设置为没有Direct Feedthrough。但是,当我尝试在mdlUpdate
函数调用中使用来自输入端口的信号时,它会因分段违规而崩溃,并通知我最可能的原因是输入端口的直接馈通状态设置不正确。
使用mdlUpdate中的输入信号是否算作直接馈通?
答案 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
仅在主要时间步骤中被调用