在三年前投入运行的汽车焊装夹具控制系统中,汇川H5U PLC频繁出现无规律CPU复位,故障记录仅显示'Watchdog Timeout',无其他错误代码。设备停机时间每次均超过10分钟,严重影响产线节拍。工程师最初怀疑电源干扰或接地问题,更换了开关电源并重新敷设屏蔽电缆,但故障依旧。
通过在线监控程序内存变量,发现每次复位前,某个自定义功能块内的数组索引值异常跳变至2000以上,而数组定义上限仅为100。进一步追溯,该功能块用于处理视觉系统发送的工件坐标队列,使用指针偏移量读取数据。当视觉通信偶发丢帧时,数据长度字段未被正确更新,导致功能块内循环遍历越界,覆盖了相邻的看门狗刷新标志位,最终引发CPU复位。
解决措施分三个层次:第一,在功能块入口处增加边界断言,使用IF语句检查索引值范围,一旦越界立即置故障位并触发报警,而不是继续执行;第二,利用汇川的'参数自校验'功能,将数组索引与数据有效标志打包成一个结构体,每次写入前进行CRC校验,防止垃圾数据写入;第三,调整看门狗刷新位置,将其从主程序末尾移到每个任务块结束处,确保即使某段逻辑卡死,后续任务也能及时刷新看门狗。
这个案例给我们的启示是,数组越界并非C语言特有的危险,PLC的ST语言中同样需要警惕。特别是当使用FOR循环与可变长度数据交互时,建议采用WHILE循环并显式设置最大迭代次数,同时将看门狗刷新指令作为循环体内的强制第一步,这样即使在死循环中,CPU也能及时被外部监控机制接管。