故障现象
生产抽检的时候,发现仪表的PT,CT变比会出现错误值,例如PT1会出现65537(正确的应该是400),CT1会出现63(正确的是100)。进一步检查发现,设置参数的有些参数被改动了,如下图红色部分标注的。
故障分析
- 开始时只发现一台仪表出现这个情况,试验了同批次另外10台仪表,均没有出现错误。出问题的仪表在重复操作10次以后,故障复现了。后来将铁电补焊一下以后,重复上下电100次,均没有再出现错误。所以当时判定是虚焊导致的读参数不稳定导致的。
- 后来在生产过程中,又发现一台,情况与上次的类似。但是这次无法复现故障,对故障仪表重复上下电几百次,进入设置菜单查看参数,参数均正常。这样的话,前一次分析的原因就可能是错的。需要进一步分析其他原因。
- 对错误数据进行进一步分析,并结合代码里出错数据的存储位置,判断可能是堆栈溢出导致参数被覆盖。进行试验验证。对仪表进行快速通讯,100ms发送一帧长数据读写命令01 03 10 00 00 44 41 39,同时用按键进入设置菜单查看参数,这样经过几轮操作以后,参数就会被改动。
- 代码里被误改动的数据的存储地址就放在栈空间的上面,这样的话,如果栈空间溢出就会导致与栈相连的空间里的数据被误改动。如下图所示,PT,CT等参数就放在空间M1_PADRam里,紧挨着栈空间,当栈空间溢出后就导致数据错误。