0

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

我有使用 CMEX S-Function 调用的 C++ 代码(使用 编译legacy_code)。我手动修改了包装文件以使 S-Fn 在次要时间步中连续。这很重要,因为当它在次要步骤中修复时,我会在函数输出中看到类似楼梯的变化,而不是平滑线。自从让它连续,这个问题已经解决了。

不幸的是,我后来发现输入信号和 S-Function(我用来解决代数环)之间的内存块在次要时间步中是固定的。我之前问过一个问题(这里)关于是否有任何连续的替代方案,但似乎这个问题被埋没了

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

本质上,我在内部复制了内存块功能。我想我现在可以删除 Memory 块并用 Initial Condition 块替换它们。不幸的是,这样做会出现代数循环的警告。现在,我的模型有时会解决,有时不会。

这两种情况如下图所示:

在此处输入图像描述

S-Function是CMEXS-Function2对象。

我想也许 CMEX 函数对代数循环诊断代码很密集,而 Simulink 无法意识到实际上没有真正的代数循环,而只有一个人工循环?

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

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

4

0 回答 0