干我们这一行的,最怕听到"一条线全包"这四个字。前阵子刚调完一套项目,立体库、码垛机器人、伺服定位、视觉引导、AGV搬运全串在一起,主控用的是1200系列PLC。乍一看这台设备那台机器人,程序又多又乱,其实拆开来看就是一个"交通系统加几台专机加两只眼"的事。这篇文章就围绕这套系统的PLC程序展开,讲清楚堆垛机定位、码垛机器人坐标生成、视觉对位补偿、AGV站台握手这几大块到底怎么写、怎么调、有哪些坑。做产线集成、想碰立库和AGV联动的朋友,这篇对你应该有点用。
1. 系统级程序架构:先分块,再谈联动
1.1 这套系统由哪些"角色"组成
一套完整的立库码垛AGV系统,设备上至少包含四层:最上层是WMS或调度系统,负责"该生产什么、该送哪一托";中间是主控PLC,也就是1200系列PLC,负责调度所有设备按节拍动作;底层是执行机构,包括堆垛机、输送线、码垛机器人、伺服定位台、AGV以及地面安全设备。程序上如果把所有逻辑都塞进主PLC的OB1里,那调试时基本是灾难,因为改一个输送电机启停都可能把堆垛机的位置互锁搞乱。
我在这个项目里就把程序拆成了五个功能域:立库存储域、输送搬运域、码垛机器人工位、视觉检测工位、AGV站台对接域。每个功能域都有独立的数据块和状态字,功能块之间只通过数据块里的交换区通信,不直接调用对方的输出点。这么做的好处是:单机调试时互不干扰,联调时出了问题能按域定位,不会出现"动了甲、乙莫名其妙停了"的情况。
1.2 主循环与中断分配的思路
基于这段时间的调试经验,我建议主程序OB1只做三件事:调用各功能域的"周期扫描块"、处理全局报警汇总、刷新状态到人机界面。时间中断OB10用来处理高速计数和视觉结果锁存。别小看这个划分,码垛机在高速抓取时,伺服定位和视觉拍照的结果必须在同一个周期内保持一致性,如果用主循环里的扫描边沿去锁存,一旦扫描周期抖动,视觉坐标就会偶尔"跳点"。
通信方面,这套系统里PLC要同时跟机器人、视觉控制器、AGV调度系统、变频器、分布式IO打交道。我的做法是在PLC内部建一张"通信映射表",把所有第三方设备的状态字映射到同一片DB区。比如机器人的交互区从DB100开始,视觉结果在DB200,AGV状态在DB300。这样写梯形图时不用到处查从站地址,直接看映射表就行。
1.3 为什么通信映射表这么重要
实际调试时最烦的就是"查一个信号翻半天图纸"。建好映射表后,每条线的信号含义、地址、数据类型都固定下来。我在项目开工第一天就把这张表发给参与调试的几位同事,后续不管谁都按这张表做点位核对。这是整个程序的地基,地基歪了后面全歪。
2. 堆垛机与输送线的程序核心细节
2.1 堆垛机控制:从货位表到轴运动
堆垛机是立库最核心的执行设备,通常是三轴:行走、升降、货叉伸叉。运动方式常见有两种:伺服绝对定位和变频+编码器定位。我们项目里因为货架高度不高,用的是"变频加编码器"方案,行走轴靠编码器做位置闭环,升降轴靠接近开关加编码器做粗定位。这种方案成本低,但程序里必须处理好"目标位置换算"和"轴安全互锁"。
程序里最重要的一张表是"货位坐标表",可以理解为一个数据块DB_HOME_POS:条目号就是货位编号,条目内容包含X坐标、Y坐标、Z坐标、载货状态、锁定标志。当上位系统给PLC下发"入库到A区03列02排01层"时,PLC第一步不是让电机动,而是先查表,把货位号换算成三个轴的目标坐标。如果当前坐标和目标坐标在同一行,程序会判断"只需要升降,不需要行走",这样能省掉一次行走动作,节拍能快不少。
2.2 轴运动的步进控制逻辑
堆垛机的动作顺序我一般写成步进字(S_STEP):0空闲、1行走中、2升降中、3伸叉、4取货、5缩叉、6升降回中、7行走回待机位。每一步的跳转条件都必须是"上一动作已到位且允许"。这些条件在梯形图里看起来很啰嗦,但少一个就会出大问题。比如伸叉动作的允许条件里,必须同时包含"行走轴已到位"和"升降轴已到位",而且货叉的伸叉命令只能用脉冲保持,不能一直置位,否则会顶到货架。
调试中最常见的事故是手动操作时货叉还没完全缩回就启动行走,结果货叉撞到货架立柱。为了防这个,我在程序里加了一条全局互锁:只要货叉不在"缩回原位"状态,行走和升降的使能信号一律被切断。这条互锁放在最底层,优先级高于任何手动自动切换信号。
2.3 输送线辊筒逻辑:状态机比自锁电路强
输送线电机的梯形图很多老工程师习惯用启保停电路,但多段输送线联在一起时,自锁电路改起来非常痛苦。我在这套系统里全部改成"条件+触发"的方式:每个输送电机的运行条件是一个PLC地址(BOOL),这个地址由输送状态机统一刷新,电机输出模块只做"条件为真就运行、为假就停止"。这样调整输送逻辑时,你只需要改状态机,不需要翻继电器回路。
输送线上的货物移动,程序里用"光眼+延时"去跟踪。两个工位之间,货物到达目标位后要停够稳定时间(一般300到500ms)再触发下一步动作,否则惯性滑动会导致货物歪斜,视觉拍照就难以识别。项目里初始参数设的是200ms,实际测试发现抓取时偶发偏位,后来改到400ms,问题消失。
3. 码垛机器人接口与垛型数据管理
3.1 PLC和机器人之间到底交互什么
码垛机器人一般有自己的控制器,PLC不做机器人轨迹规划。PLC要处理的只是"告诉机器人现在该用什么垛型、去哪个工位抓取、抓几次放几次"。我们项目里PLC和机器人交互区有16个字:
- 第1字:PLC到机器人的任务号(比如101表示取箱放到托盘L1)
- 第2字:PLC到机器人的垛型编号
- 第3字:PLC到机器人的抓取坐标偏移量X(单位0.1mm)
- 第4字:偏移量Y
- 第5字:偏移量R(角度,单位0.01度)
- 第6字:PLC到机器人的指令字(0无命令、1请求抓取、2请求码放、3请求复位)
- 第8字:机器人到PLC的状态字(0空闲、1运行中、2完成、3报警、4急停)
- 第9字:机器人到PLC的当前循环次数
3.2 握手协议的防误触发处理
这里必须强调:PLC给机器人发"请求抓取"信号时,不能只发一个脉冲然后等机器人动作,因为一旦机器人通信抖动或者快扫描周期错过这个脉冲,整条线就停在那里。我的做法是:请求信号保持置位,机器人执行完动作后回一个"完成",PLC收到完成后才复位请求信号。这是最稳妥的握手方式,也方便排查问题——看交互字就知道卡在哪一端。
垛型数据的管理也要上心。码垛机器人内部的垛型不是PLC算出来的,机器人厂家会在示教器里预定义好。PLC只负责把"当前产品对应的垛型编号"发给机器人。但节拍计算上,PLC要自己知道每个垛型能码多少箱,这样才能决定什么时候补托盘、什么时候请求AGV拉走满托。所以我建了另一个数据块DB_PALLET_TYPE:每个垛型编号对应一行,里面有额定箱数、当前箱数、满托标志位。当前箱数的累计由机器人完成信号去加1,达到额定箱数时置位满托标志,同时向AGV调度系统发送搬运请求。
3.3 混合码垛里的"等待子程序"
我们项目里偶尔会出现两种产品混码的情况,这时候机器人程序里有一个"等待PLC选择"的子程序。PLC要做的不是把两种产品的坐标直接发给机器人,而是根据当前进料口的产品类型,把对应的垛型编号重新发一遍,并重新触发请求信号。实际测试时这里出过一次问题:两种产品快速切换时,机器人上一个动作还没完成,PLC已经刷新了垛型编号,导致机器人用新垛型去码放了旧产品。解决方案是在PLC里加一个"垛型锁定"逻辑:产品类型改变后,必须先等机器人空闲,再清空计数器,最后更新垛型编号,整个过程要半秒到一秒的间隔。
4. 视觉定位与伺服轴的深度配合
4.1 视觉系统到底在解决什么问题
上了视觉工位,不是为了高大上,是因为箱体在输送线上停稳后的位置有偏差,偏差来源包括输送链的累积公差、箱体本身尺寸公差、挡停机构的回弹量。视觉就是每次来料时拍一张照,算出这个箱子相对于基准位置偏移了多少、旋转了多少,然后把偏移量补偿给机器人抓取坐标。视觉系统输出的原始坐标是像素值,程序里必须转换到机器人坐标系。
标定环节是所有问题的核心。我们在现场用的是"九点标定加角度校验":把一块带圆孔的标定板放在机器人抓取平面上,机器人末端走九个点位,视觉拍九个圆孔,PLC内部算出像素坐标到机器人坐标的仿射变换系数。标定时有两点容易忽略:一是标定平面必须和实际抓取平面同高度,否则X/Y补偿方向会漂;二是标定板不能只放一个位置,最好左上、中心、右下都试拍,确认坐标变换矩阵在全视野范围内都收敛。
4.2 视觉结果如何安全送到机器人
视觉控制器算完偏移后,会把结果写到PLC的DB_VISION区。PLC程序里要有"拍照完成"标志和"数据有效"标志两个信号,调试时我吃过亏,只看了"完成"信号,没看"有效"信号,结果视觉在漏检时给出一组全零数据,机器人差点把箱子抓到半空。从那以后,我要求视觉工程师把"漏检"状态也写到通信区:0正常、1漏检、2未到位、3通信错误。PLC拿到结果后先判断状态字,状态字不是0就直接进入异常处理流程——重新请求拍照或者报警停机,绝不能让机器人带着假坐标动作。
给机器人的偏移量也需要做一次限幅处理。正常偏差一般在±15mm以内,超过这个范围大概率是箱子没放正或者视觉误检。我在程序里写死了偏移量上限:X/Y超过±25mm按25mm处理并触发报警,R角度超过±3度按3度处理。这样即使视觉有偶尔的异常读数,也不会让机器人走飞。
4.3 伺服轴的定位控制:回零、扭矩与节拍
伺服定位台是输送线和码垛机器人之间的"转运手"。整条输送线把箱子送到定位台,伺服轴带着箱子精确移动到机器人抓取位置,移动到位后挡停动作和侧向夹紧动作同时执行。伺服控制程序里有三个关键点:
第一,绝对式还是增量式编码器。增量式系统断电后会丢失位置,程序上电时必须强制回零。我们在程序里做了"未回零"标志位,只要伺服驱动器报异常或者PLC重新上电,这个标志就置位,系统不允许进入自动模式,直到操作员完成一次手动回零。安全回路里也串了这个标志,防止回零没做就自动联动。
第二,扭矩限制。伺服定位台在夹紧箱子时,如果直接以位置模式顶住箱子,容易把箱子挤坏甚至把电机堵转。我在伺服驱动器的配置里加了扭矩限制,位置到位后进入"保持模式"的扭矩设为额定扭矩的60%。这样既保证夹紧力,又不会硬顶坏箱子。PLC程序侧不要频繁修改伺服的速度和加速度参数,最好在驱动器里预先设好三组速度参数,PLC只负责切换设定值组号。
第三,节拍计算。伺服定位台一个往复动作大概3秒,视觉拍照加运算大概1.2秒。这两者可以并行:箱子在定位台移动的过程中,相机已经抓拍完成,等箱子停稳后视觉结果也出来了,PLC直接取结果发给机器人,省掉拍照前的等待时间。我在程序里就是这样安排触发的:定位台移动中段发"预触发"信号给视觉,而不是等完全停止后再触发。这套组合下来,整线节拍比原先快了两秒多。
5. AGV对接与站台调度的编程关键点
5.1 PLC在AGV系统里承担的角色
很多人以为AGV调度是上位系统的事,PLC只是给个信号让它走。实际上如果PLC接口设计不好,AGV和输送线对接时会出现各种互相等待甚至撞车。这套系统里,AGV调度系统负责全局路径规划和多车调度,PLC负责站台级别的安全确认和任务节拍。两者之间通过TCP网口通信,交换数据包括:任务号、目标站台号、允许装货信号、允许卸货信号、当前站台状态、AGV到位反馈、任务完成确认。
PLC里最核心的是"站台状态机":站台空闲、AGV预到、AGV到位锁定、输送线允许装载、装载完成释放、AGV离位。每个站台有一份状态字。当输送线码满一托,PLC把站台状态切成"空闲但有待运任务",然后把任务号和站台号发送给调度系统。调度系统收到后,分配一台空闲AGV去这个站台,同时告诉PLC"车辆已分配,预计到达时间"。PLC收到这个信息后就开始准备:输送线减速、码垛机暂停补料、站台入口闸门打开。
5.2 物理到位判别要比通信到位更可靠
通信到位只是"AGV说它到了",物理到位要靠站台下面的地坑开关或者RFID读码器确认。我在程序里做的是"双确认":必须同时收到调度系统的到位指令和站台地坑开关的接通信号,PLC才允许后续的装载动作。这样能防止通信延迟或漂移导致AGV还没停稳就提前放行。
装载完成后的释放逻辑也要谨慎。AGV给出"装载完成"信号后,PLC不能立刻复位站台状态,而是要等AGV驶离、地坑开关断开后再复位。我在项目里加了个小延时,确认AGV完全离开站台区域后,才把站台标志切回空闲。不然调度系统会认为站台还是占用的,后续任务就一直堵在那里。
5.3 多站台排队与防搬空逻辑
如果现场不止一个AGV站台,站点分配不能靠调度系统单方面决定,PLC侧要有"排队表"。我的排队表DB里每一行代表一个站台:预约任务号、任务状态、小车编号、时间戳。调度系统下发任务前,会先查询PLC的预约状态:如果某个站台已经被占用但还没开始装载,调度系统会把新任务派给另一个空闲站台,而不是在同一个站台上排两辆车。这种设计简化了AGV的路径规划,不会出现两台车在同一个站台前你等我我等你。
防搬空逻辑也很重要。如果AGV驶入站台后,输送线上没有货物,程序要能判断出"空任务",然后给调度系统返回一个任务作废指令。我在PLC里做的是装载计数校验:站台收到装载请求时,比较输送线区段的光眼计数和任务单上的数量,不一致就禁止AGV进入。这个校验在试运行阶段抓出过几次数据错乱,相当实用。
6. 程序调试与现场踩坑实录
6.1 通信超时:心跳位是救命稻草
多设备联调阶段,最容易出问题的就是通信。机器人控制器偶尔会重启、视觉控制器偶尔会死机,AGV调度系统偶尔会断线重连。我给每台从站设备都做了一个"心跳字":设备每100ms翻转一次心跳位,PLC在500ms内没收到翻转就置位对应的通信故障标志。程序里在自动模式下如果发现心跳超时,除了报警,还会自动把全线动作暂停,防止设备在半失控状态下硬跑。
这个心跳机制在排查故障时特别有用。有一次站台下方的AGV到了但PLC死活收不到到位信号,查下来发现是通信线被叉车压断了,PLC的心跳位已经翻红,一下子就定位到的问题,不用再去翻一堆IO点。
6.2 视觉偶发读数为零:状态字优于数据值
前面讲过视觉的"有效信号"问题,这里再补充一个排查案例。试运行有一周时间,码垛机器人偶尔会停在取料位不动,报警显示"抓取坐标异常"。排查发现视觉结果里X/Y坐标正常,但角度R偶尔是0。原因不是相机问题,而是视觉程序里初始化变量时没把角度值清零,导致某次视觉处理内部异常时角度被当成0输出。后来在PLC侧加了角度变化率判断:相邻两次拍照角度差超过1.5度就认为是无效数据,重新拍照并报警。从那之后这个故障再没出现过。
6.3 急停恢复后的重新回零
伺服和堆垛机在急停恢复后都必须重新确认原点。我把"重新回零"合并成一条"复位序列":操作员按一次复位按钮,PLC按顺序执行堆垛机回零、伺服定位台回零、码垛机器人回原点、AGV复位到待命区。这个序列每一步都有完成反馈,全部完成后才允许重新启动自动模式。这条序列调试时要多加验证,因为有次发现堆垛机升降轴回零后没把货叉缩回,后续自动运行货叉直接撞上了货架横梁。
6.4 联调时间必须留足
最后说点经验层面的东西。整套系统的程序其实不是最难的部分,最难的是把所有设备按一个节拍凑到一起。我一般把调试分成三轮:第一轮单机手动,验证每台设备的运动和安全互锁;第二轮空车自动运行,验证输送线、堆垛机、机器人之间的状态流转;第三轮带料联动,验证视觉补偿和AGV节拍。三轮都过了才敢让系统开始小批量生产。项目收尾时,我还会把所有DB块的变量表导出一份,连同通信映射表、货位坐标表一起整理成技术附件,交给现场维护的人,这套文档的价值比程序本身还大。
做一个多设备联动的程序,我的实际体会是:程序里70%是互锁和状态切换,20%是运动控制,10%才是业务逻辑。只要把各设备的交互状态字和握手协议定得清清楚楚,整套程序就能像齿轮一样咬合起来。码垛、视觉、AGV这些概念单独看都不算新奇,但把它们拧在一个PLC框架里时,细节全在接口里面。希望这篇拆解能帮到正被立库和AGV对接折磨的朋友,调试顺利、少走弯路。