【问题标题】:In Simulink, does mdlUpdate count as Direct Feedthrough too?在 Simulink 中,mdlUpdate 是否也算作直接馈通?
【发布时间】:2014-08-21 20:08:22
【问题描述】:

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

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

【问题讨论】:

  • 不,它没有。 mdlUpdate用于更新离散状态,一般可能是输入的函数,与输出是否为输入的函数无关。
  • 谢谢@PhilGoddard。这是否意味着我应该也可以使用 mdlUpdate 来更新 PWork 向量值?这就是我想要做的,但得到了错误。如果有帮助,我可以同时发布代码和错误。
  • 是的,PWork 向量可以在 mdlUpdate 中更新。
  • 菲尔,也许我应该更清楚一些。我使用一个输入信号,我设置为没有直接馈通,并将其值分配给 mdlUpdate 中的 PWork 向量。这会导致分段冲突。不过,按照你说的,我应该可以做到吧?澄清一下,我的模型中既没有连续状态,也没有离散状态;只是输入和输出。
  • 在字里行间阅读,我怀疑您随后会在 mdlOutputs 中获取 PWork 向量的值,并尝试使用它来规避将您的块定义为具有直接馈通的方法。那是行不通的。您的块要么有直接馈通,要么没有。 mdlOutput 在您将任何内容存储在工作向量中之前被调用。请参阅documented flow chart,了解 S-Function 如何与 Simulink Engine 交互。

标签: c++ matlab simulink s-function


【解决方案1】:

对于那些将来可能会研究这个问题的人,我找到了答案。 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 仅在主要时间步中被调用

【讨论】:

  • 为什么要使用 PWork 向量?您所描述的是离散状态或 DWork 向量的标准用途。
  • 嘿菲尔。没有很好的理由。对 Simulink 的复杂性缺乏了解。我会考虑在我的函数中有状态
猜你喜欢
  • 2012-04-26
  • 2016-06-18
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多