一个定时器用错了,整条产线停了半小时——PLC编程里最容易忽视的坑
几个月前的一个深夜,我手机突然震动起来,一看是一个合作了好几年的老客户打来的。接起来对方语气很急:”老X,我们三号线又停了,操作工说没改任何东西,就是操作到某个工序的时候就卡住不动了,你快看看!”
这种电话我们搞工控的都不陌生。我打开远程,连上他们现场的PLC开始排查。这一查就是两个多小时,最后找到的”元凶”说出来你们可能都不信——一个定时器的时间设错了。
先还原一下现场
这家客户是东莞一家电子元器件厂,三号线是一条自动点胶+固化生产线。大概七八个工位,传送带步进传送。PLC用的是三菱FX3U,程序是我两年前写的,一直跑得好好的。但最近一个月,操作工反映偶尔会出现”卡工位”的问题——点胶完的工件不往前走,卡在那里,整条线就停了。
操作工说没改程序、没动参数,机器莫名其妙就不走了。重启一下又好了,但过几天又犯一次。一个月下来,产量少了将近10%。
我远程连上PLC,在线监控了一遍程序。看梯形图的时候,发现一个细节让我警觉起来——某个工位的到位检测传感器信号,触发了一个T200定时器,而这个T200的设定值是K500(5秒)。定时器的输出控制着下一个工位的启动信号。
问题就出在这个K500上。
问题到底在哪
我先讲一下这条线的动作流程,你们就明白了。
传送带是步进式的,每个节拍大概3.8秒——传送带前进2秒,停止1.8秒用来做点胶和固化。每个工位都有到位传感器,检测到工件到位后,触发该工位的动作,动作完了给出”完成信号”,传送带才会走下一步。
T200这个定时器是用在某一个工位的”超时保护”上的——当工件到位后,如果该工位的动作在指定时间内没完成,就触发报警、停止传送。设计初衷是好的,防止卡料。但问题是,我把这个定时器的设定值设成了K500(5秒),而正常的工位节拍只需要3.8秒。
表面上看起来没问题:3.8秒 < 5秒,定时器不会超时,对吧?
但仔细想想——定时器的复位条件是”工件离开该工位”。正常情况是:工件到位(T200开始计时)→工位动作(3.8秒内完成)→工件离开(T200复位)。一切正常的话,T200永远计不到5秒。
然而设备跑了两年之后,传送带的链条有了磨损,步进电机偶尔会出现几毫秒的”丢步”。丢步虽然不影响传送精度,但会导致工件到位传感器的信号延迟几十到一百多毫秒。
一百毫秒能干什么?能让T200的累计计时达到3.8+0.1=3.9秒…再加上工位偶尔动作延迟一点,有时候就到了4秒多。但离5秒还有余量,对吧?
关键点在这里:我检查了程序的梯形图发现,T200这个定时器的启动条件是工件到位信号上升沿,而复位条件是工件离开信号。但这两个信号之间,还有一个中间条件——该工位的”夹紧气缸”动作信号。
程序中是这样写的:
// 伪代码示意 // 工件到位 AND 夹紧到位 → 启动T200 LD X001 (到位传感器) AND Y001 (夹紧气缸伸出到位) OUT T200 K500 // T200计时到 → 停止传送带 LD T200 SET M100 (超时报警) RST Y010 (传送带运行)
问题就出在夹紧气缸的到位信号Y001有时会闪断。气缸的磁性开关使用时间长了,灵敏度下降,在夹紧过程中偶尔会出现”已到位→短暂丢失→重新到位”的情况。虽然这个闪断只有几十毫秒,但PLC的扫描周期是10毫秒左右,闪断刚好被扫描到了。
于是发生了这种情况:T200累计计时到4.2秒的时候,Y001闪断了一下又恢复了,导致T200的”使能条件”短暂断开。而三菱FX3U的定时器有一个特性——如果在计时过程中使能条件断开,定时器会立即复位清零。
复位之后,因为工件还在工位上(到位信号X001保持),夹紧气缸也恢复了(Y001又亮了),T200又重新开始计时。从0开始!
这就是问题所在——T200永远计不到5秒,因为每次快到5秒了,Y001就闪断一下,T200归零重来,陷入死循环。
所以工序就永远卡在那里,传送带走不了,机器不报警也不停机(因为定时器没到),就是傻等着。操作工不知道发生了什么,只能重启。
怎么解决的
找到原因之后,解决起来不难。我改两个地方:
第一,把T200换成”积算定时器”。三菱FX3U里有积算型定时器(像ST200这种),它的特点是——即使使能条件断开,当前值也不会复位,只有用RST指令才能清零。这样气缸信号的闪断就不会导致定时器归零了。
第二,把定时器设定值从K500改成K450。正常节拍3.8秒,加上余量到4.5秒足够了。也给T200留了1.2秒的余量应对磨损,够用了。原来设5秒反而因为逻辑问题根本到不了。
改完之后远程下装程序,前前后后花了不到15分钟,问题解决。这之后的一个多月,我再也没接到过三号线的报修电话。
做PLC编程的几个经验教训
这件事让我反思了好几天。其实不是技术难题,说白了就是几个基础问题叠加在一起。分享出来跟兄弟们共勉:
- 定时器类型要选对。普通型(T0-T199)使能断开就复位,积算型(ST200-ST255)需要手动复位。该用哪种,取决于你的控制逻辑。如果定时条件存在闪断可能,用积算型会更可靠。
- 传感器信号老化要考虑。新设备调试的时候一切正常,不代表两年后还正常。写程序的时候,对于气缸到位、传感器触发的信号,建议加一个100-200毫秒的去抖滤波——特别是用在定时器使能条件里的信号。
- 超时保护要设”死锁”机制。正确的做法不是让机器停在原地死等,而是超时后先报警,再尝试复位一次,复位失败再停机。而不是像我写的这样——既不报警也不停机,就傻等着。
- PLC的扫描周期对定时器的影响。三菱FX3U的扫描周期大概在10-20毫秒,定时器的精度其实没那么高。如果你的应用对时间精度要求高(比如精确到10毫秒以内),建议用中断定时器(M1000-M1999)或者直接用高速计数器来做。
- 代码要留好注释,特别是这种”坑”。后来我回去翻了两年前的代码,发现当时完全没写注释为什么设5秒。现在想想如果当时写了”此处设为5秒,预留1.2秒缓冲”,遇到问题排查起来能快很多。
写在最后
搞PLC编程就是这样,很多时候不是搞不定复杂的高大上技术,而是栽在最基础的地方。一个定时器、一个传感器信号、一行逻辑顺序,就能让整条产线歇菜。所以不管是新入行的兄弟还是干了好多年的老师傅,在做程序的时候真不能马虎,测试阶段的模拟跑圈一定要做够,能在线仿真的尽量仿真。
你们编程的时候遇到过什么类似的”低级错误”?说出来让大家也避避坑呗,评论区聊聊!