做 S7?1200 项目时,有些问题看似微小,但排查起来很费时间。
分享几个实际调试中验证过的坑,希望对大家有帮助。
1.SCL 中沿指令的位置有讲究
在 SCL 中使用 R_TRIG/F_TRIG 边沿指令时,必须保证每个 OB 扫描周期都调用。若放在 IF 条件内部,条件不成立时边沿指令不执行,内部状态无法刷新,极易出现边沿漏触发、误触发。正确做法:边沿指令放在 IF 外部,用中间位(静态变量或 DB 变量)保存沿检测结果,再做条件判断。
2.数组操作注意越界风险
用自增 / 自减操作数组索引时,HMI 输入可直接写入超限索引值。HMI 上设置的变量限值仅在 HMI 端生效,PLC 内部并不执行该限制;CPU 扫描速度极快,短暂越界就会触发数组寻址错误,若未配置 OB121,会直接导致 CPU 停机。建议:在程序内对索引做上下限判断,或通过 HMI 的 ValueChange 事件做输入校验。
3.IEC 定时器的 “多重调用” 陷阱
S7?1200 的 IEC 定时器(如 TON)使用独立背景 DB,同一定时器实例的 EN 触发只能放在一处。若在多个网络中同时触发同一个 TON 实例的 EN 端,会造成计时逻辑紊乱、状态异常甚至功能失效。注意:仅读取 Q 端或 ET 端不会导致逻辑异常;但为了程序可读性和维护性,建议定时器只在单一网络中触发,Q、ET 状态用中间变量缓存,其余逻辑统一读取缓存变量。
4.预留必要的错误处理 OB 块
项目建议配置 OB82、OB86、OB121、OB122 等异步错误 OB。仅添加空 OB 即可避免 I/O 访问故障、PROFINET 站点掉线、编程错误时 CPU 停机,实现容错运行。进一步地,可读取 OB 块内的诊断信息,在 HMI 上做故障提示,便于现场快速定位问题。