讨论

搬运程序里信号太多 触发逻辑老是打架 求个靠谱写法

唐彬
唐彬
2026/05/15 11:24

ABB IRB6700 配的IRC5,搬运码垛项目,夹具那边光DI就有8个 DO也有6个,再加工件检测、到位信号、安全门、连锁,急停复位等等全揉在一起。我现在用中断+TriggIO去搞触发,但现场跑起来发现几个信号之间互相打架,夹具张开的同时工件检测也来一个上升沿,机器人直接报错停机。

各位平时写这种多信号搬运程序是用啥套路?是一股脑塞到主程序里走顺序执行,还是单独抽出来做成后台例程?我感觉自己的写法越改越乱,求个比较稳的结构,最好能给段伪代码或者思路参考一下。

17 3

全部回复 (3)

730626
730626#1

你这问题说白了就是信号没分级。我做汽车冲压搬运线的时候,DI信号按"触发类"和"状态类"分开,触发类用单次上升沿或者中断,状态类纯走轮询不参与跳转。8个DI不算多,关键是每个信号必须能溯源到唯一动作——夹具张开就是一个动作,工件检测是另一个动作,俩动作绝不在同一个Trigg里并行。你回去查一下那个报错停机的瞬间是哪个信号先到、哪个后到,问题基本就在触发顺序上。

结构上建议这样:主程序只管路径和顺序动作,所有I/O信号扔到一个独立的后台例程routine里处理,用Persistent变量做中间状态。主程序只看状态变量,不管原始IO。这样改起来也方便,IO换个接线不用动主程序。

2026/05/15 14:33
a639468
a639468#2

直接说一点不一样的看法:中断+TriggIO在这种场合本来就容易打架,ABB官方手册里TriggIO的响应延迟在20-50ms之间,多个信号叠加时序根本控不住。干了这么久我反而倾向于用最笨的写法,主程序里一个个WaitDI,夹具信号用WaitDI DI01=1这种,稳得一逼,虽然代码长了点但现场调起来心里踏实。你们非要用中断的是不是被KUKA那一套带偏了?

2026/05/16 06:30
平常心
平常心#3

你那个工件检测和夹具张开的信号,是同一个PLC给的还是机器人自己DI采集的?如果是PLC那边发出来时序就已经重叠了,你在机器人这层怎么写都白搭。我之前碰到过类似情况最后查出来是PLC扫描周期和机器人通讯周期错位,把PLC那边改成边沿触发单次脉冲就好了。你先确认下信号源头。

2026/05/16 16:11