这是一个令人费解的问题,处理一个稍微开放的问题。我意识到StackOverflow对这种做法不满意,但正如你将看到的那样,我很难将它分解成更小的部分。
我有使用CMEX S-Function调用的C ++代码(使用legacy_code
编译)。我手动修改了包装文件,使S-Fn在次时间步中连续。这很重要,因为当它在次要步骤中固定时,我会看到功能输出中的阶梯状变化而不是平滑线。由于它是连续的,这个问题已经解决了。
不幸的是,我后来发现输入信号和S-Function(我用来解决代数循环)之间的内存块在次要时间步骤中是固定的。我之前曾问过一个问题(here),关于是连续的替代方案是否存在,但似乎问题已被埋没。
相反,我提到了this Mathworks文档。他们声称PWork向量可用于在S函数的连续调用之间保持值在内存中持久。我能够使用这个向量来做到这一点: 1.存储下一步的当前时间步长值 2.在下一步中,使用旧值 3.计算完成后,将旧值更新为当前值 4.重复
本质上,我在内部复制了内存块功能。我想我现在可以删除内存块并用初始条件块替换它们。不幸的是,在执行此操作时,会出现代数循环警告。现在,我的模型有时会解决,有时也不会。
这两种情况如下图所示:
S-Function
和S-Function2
是CMEX对象。
我认为CMEX函数可能密集代数循环诊断代码,并且Simulink无法意识到实际上不是一个真正的代数循环但只有一个artificial?
我的问题是:我能做些什么来告诉 Simulink实际上ISN'代数循环?在这种情况下,有什么样的最佳做法可以做什么?
*编辑:原理图不准确,并没有正确代表我的模型。更新了它