外部模式记录深层内部信号可能是不可靠的。
问题描述
今天,在使用Simulink外部模式连接C2000实验设备进行仿真的时候,发现电机的iq_ref信号在运行过程中存在一个很奇怪的现象:

整体的运行图如下:可以看到iqreal大致正常的

很诡异,iqref按理来说是速度控制器的输出,不应该是这么诡异的图啊?这看起来更像是某个Park / inverse Park 里的中间变量,或者某个周期性角度函数,主要我现在总的记录信号也不多。
而且纯仿真的情况下是完全正常的。
为了验证问题所在,我在外环断开速度控制器到电流环的输入,接入一个开关,令其在0-0.5之间选择。结果出现了更为诡异的现象:

这。。。但是此时,iq_real依然是好好的。这就有点。。。
之后我怀疑是内存出错的问题,之前我的iq_ref记录信号是接在第四层的Simulink模型的一个MUX模块输出下的如下图。

现在我将其移至第一层模型下,再次外部模式实验,结果发现问题消失:

我还留着内层的信号,发现两者的差别了。之前那个乱波形大概率是 内部信号被代码生成优化、复用、条件执行子系统影响、或者信号命名混乱导致的外部模式观测错误。
分析原因1:
我的4层Simulink模型,分别经历了一个 控制速率换算模块 条件执行/Action Subsystem 等等,这种复杂结构在代码生成之后,内部信号不是每个采样周期都像普通 Simulink 仿真那样被完整保留。它可能只在某个 action 分支执行时更新;未执行分支的信号可能保持旧值、被复用,或者在外部模式中无法稳定映射到我所看到的那根线。
分析原因2:
C2000 外部模式运行的是生成后的 C 代码。为了节省 RAM,Simulink Coder 会优化内部信号,例如:
|
|
也就是说,第四层内部那根 iq_ref 线在代码里可能没有独立内存。它可能和别的变量共用同一块内存。
于是我在 Data Inspector 里看到的 iq_ref,可能不是纯粹的 Constant 0.5,而是某个被复用的临时变量。这个变量可能某些时刻存的是 iq_ref,某些时刻存的是 iq_real、Park 变换中间量、甚至别的控制中间变量。
这就解释了为什么我之前看到的 iq_ref 像噪声和尖峰,而不像常数。
搭建模型建议
建议你把所有要用于论文和实验分析的信号都在最外层统一拉出来。
例如建立一个专门的 debug bus,这是最专业的搭建方案。
不要在第四层、第五层里随手点一根线记录。
尤其论文要用的数据,一定要记录这些“接口级信号”:
如果确实要记录内部信号,建议拉到最上层。
对于关键 debug 信号,可以定义成 Simulink.Signal,设置 storage class。