C++ 我如何处理Simulink检测到的人工代数循环?

C++ 我如何处理Simulink检测到的人工代数循环?,c++,matlab,simulink,mex,s-function,C++,Matlab,Simulink,Mex,S Function,这是一个有点复杂的问题,涉及一个稍微开放的问题。我意识到StackOverflow不赞成这种做法,但正如您将看到的,我很难将其分解为更小的部分 我有一个C++代码,它使用的是使用LeaCyyx代码编译的CMEX S函数。我手工修改了包装文件,使S-Fn在较小的时间步长内连续。这一点很重要,因为当它在小步中固定时,我会看到函数输出中出现阶梯状的变化,而不是平滑的线条。自从将其连续化以来,这个问题已经得到了解决 不幸的是,我后来发现输入信号和用来求解代数循环的S函数之间的内存块在较小的时间步长内是固

这是一个有点复杂的问题,涉及一个稍微开放的问题。我意识到StackOverflow不赞成这种做法,但正如您将看到的,我很难将其分解为更小的部分

我有一个C++代码,它使用的是使用LeaCyyx代码编译的CMEX S函数。我手工修改了包装文件,使S-Fn在较小的时间步长内连续。这一点很重要,因为当它在小步中固定时,我会看到函数输出中出现阶梯状的变化,而不是平滑的线条。自从将其连续化以来,这个问题已经得到了解决

不幸的是,我后来发现输入信号和用来求解代数循环的S函数之间的内存块在较小的时间步长内是固定的。我之前问过一个问题,关于是否有持续的替代方案,但这个问题似乎被掩盖了

因此,我参考了Mathworks文档。他们声称PWork向量可用于在连续调用S函数之间保持值在内存中的持久性。我可以用这个向量来做这个: 1.为下一步存储当前时间步长的值 2.在下一步中,使用旧值 3.计算后,将旧值更新为当前值 4.重复

本质上,我在内部复制了内存块功能。我想我现在可以移除内存块并用初始条件块替换它们。不幸的是,在执行此操作时,出现代数循环警告。现在,我的模型有时能解决问题,有时不能

这两种情况如下图所示:

S-Function和S-Function2是CMEX对象

我认为也许CMEX函数对于代数循环诊断代码来说是密集的,Simulink无法意识到实际上没有真正的代数循环,而只有一个

我的问题是:我能做些什么来告诉Simulink实际上没有代数循环?在这种情况下,有什么样的最佳实践吗


*编辑:原理图不准确,不能正确表示我的模型。更新了它

检查直接馈通和ssSetInputPortDirectFeedThrough的文档。我不熟悉这个主题,但是关闭它会停用这个端口的代数循环检测。嗨,丹尼尔。谢谢你的回复。文档表明,如果我们将直接馈通设置为0,但仍在mdlOutputs中使用信号,则可能导致不可预测的错误。我曾经尝试过这个,但是我得到了分段冲突错误。如果你的mdloutput使用输入信号,它根本不能解决代数循环。代数循环只能通过在获取输入之前生成输出的块来解决。如果S函数需要访问mdlOutputs中的输入信号,则不应关闭直接馈通。不需要直接馈通的块应在mdlUpdate中处理输入,并根据需要更新内部状态。然后,mdlOutputs将使用此内部状态填充输出信号。此外,Simulink只需检查S函数的直接馈通设置,即可检测代数循环。为了解决这个循环,在必要时插入内存块和单元延迟,假设S函数需要直接馈通。这里必须有比图中所示更多的内容。由于环路中的积分器,上述两种模型都没有代数环路。另外,当上下信号初始化为积分器的状态时,内存块实际上什么也不做,使用输入端口上的内存块,您只需在t=0时更改输入信号的值。这两种情况都不会导致或解决代数循环。另外,说我的模型有时能解决,有时不能解决,这是一个明确的迹象,表明除了代数循环之外,其他的东西是你的模型的一个问题。