做自动化这些年,分拣是我接触最多的应用场景之一。不管是包装线上的次品剔除、物流中心的小件分拨,还是装配线的物料分配,说到底就是一件事:让控制器知道“来了个什么东西、它该去哪、什么时候推”,然后把动作精确地做出来。这篇我就拿一个三菱FX系列的分拣程序来拆解,从I/O规划、梯形图逻辑到现场调试的坑,完整走一遍工业自动化的控制思路。适合正在学PLC的工程师,也适合准备做小型分拣设备的开发者。
1. 项目全景与设计思路
1.1 这个分拣项目要解决什么问题
很多教材会把分拣程序讲得很抽象,但实际设备是有物理边界的。我们假设一个典型的场景:一条皮带输送线,入口处有一个光电传感器,皮带沿线分布三个分拣工位,每个工位有一个推料气缸。工件依次进入输送线,系统需要将每3个工件分成一组,组内第1个在A工位推出,第2个在B工位推出,第3个在C工位推出,然后自动开始下一组。
这个场景非常经典,因为它涵盖了PLC编程里最难培养的两种能力:一个是“状态记忆”,你得让PLC记住当前进来的这个工件是本组第几个;另一个是“动作时序”,工件从入口走到对应工位需要时间,气缸推出早了或晚了都会失败。
再说直白一点,这套逻辑一旦吃透,常见的一进多出分拣、批处理控制、包装计数这些程序,你基本都能套用同样的思路去写。这也是我建议初学者不要一上来就碰视觉识别、伺服定位这些花活的原因——先把光电计数和气缸动作玩明白,工业自动化的地基就打牢了。
1.2 为什么用三菱FX系列PLC
这个项目选用三菱FX3U,不是因为什么先进,而是因为FX系列在小型分拣设备里实在太常见了。小型皮带输送机、简易包装机、送料装置,十个里面有六七个就是FX3U配一个触摸屏,成本可控,供货稳定,会维护的人也容易找。
从技术上分析,FX3U的指令系统完整度对于这个项目来说是“恰到好处”。它支持普通的计数器、定时器,也支持INC自增指令、比较指令、SET/RST置位复位指令,这些刚好覆盖分拣逻辑需要的所有操作。再往上一档的FX5U,功能更强但成本高;往下一档的FX1N,虽然也能写,但在程序容量上就比较局促。所以综合下来,FX3U是这类分拣设备性价比和性能比较平衡的选择。
有人会问,为什么不用单片机或者继电器回路?单片机的逻辑灵活性确实高,但面对工业现场的电磁干扰、电压波动、接线端子松动这些恶劣条件,可靠性远不如专门为工业环境设计的PLC。继电器回路就更不用说了,分拣逻辑里有大量“记住当前是第几个”的状态锁存,用继电器搭出来就是一个巨型蜘蛛网,改一个动作等于重新布线。这就是PLC在这个场景下不可替代的原因。
1.3 I/O点表先于程序:电气设计的一次到位
写程序之前,第一件事永远是列I/O点表。很多零基础的朋友一上来就拖梯形图,结果写完才发现输入输出分配不合理,返工成本非常高。点表不是为了凑字数,它是整个设备的“接线地图”,也是以后别人维护你程序的第一手资料。
我做这个小项目时,点表这样定:
| 地址 | 功能 | 说明 |
|---|---|---|
| X0 | 启动按钮 | 常开触点,按下启动 |
| X1 | 停止按钮 | 常开触点,按下停止运行 |
| X2 | 入口检测光电 | 工件进入输送线的瞬间给出信号 |
| X3 | A工位到位光电 | 工件到达A工位推出位置 |
| X4 | B工位到位光电 | 工件到达B工位推出位置 |
| X5 | C工位到位光电 | 工件到达C工位推出位置 |
| X6 | A工位气缸缩回到位 | 磁性开关,判断气缸是否归位 |
| X7 | 急停按钮 | 常闭触点,断开即急停 |
| X10 | 手动/自动切换 | 用于调试维护 |
| X11 | 报警复位 | 清除故障标志 |
| Y0 | 皮带电机 | 控制输送线运行 |
| Y1 | A工位推料气缸 | 单线圈电磁阀,得电推出、断电磁簧缩回 |
| Y2 | B工位推料气缸 | 同上 |
| Y3 | C工位推料气缸 | 同上 |
| Y4 | 三色灯绿灯 | 运行指示 |
| Y5 | 三色灯红灯 | 报警指示 |
| Y6 | 蜂鸣器 | 报警声音 |
这个点表有几个细节值得展开。第一,急停按钮用了常闭触点而不是常开触点,这是安全回路的基本常识——急停线断了PLC能立刻知道,如果用的是常开,线掉了急停等于没接。第二,气缸选了单线圈电磁阀,靠弹簧复位,这样断电时气缸自动缩回,避免设备停机后气缸还顶在外面挡住工件。第三,所有输入都留了余量,X6、X10、X11这种位置以后要加传感器或者按钮,不需要重新规划点表。
2. 控制逻辑的分层拆解
2.1 启动、停止与复位链路
分拣程序的第一个逻辑块是主控回路,梯形图里最典型的“启保停”电路。它看起来简单,但里面藏着两个容易被忽略的工程细节。
启动按钮X0接到M100运行标志,同时M100的常开触点并联到自身,形成自保。停止按钮X1用常闭输入串联,报警标志M50的常闭触点也串在这个回路里。这样设计的结果是:按下启动线圈得电,松开启动按钮运行状态保持;按下停止按钮或报警发生,运行状态立刻断开。
这里要说一个关键点:报警串联到运行回路,是为了保证故障时设备不可能继续自动动作。但复位按钮X11不能直接接在运行回路上,因为报警消除后设备应该处于待机状态,而不是自动重新跑起来。安全的逻辑是“报警后必须人工干预、重新启动”,这是自动化设备的一条铁律。
实际编程里,这个回路我还会加一个“上电初始状态”的处理。有些程序员不考虑PLC上电瞬间的初始状态,导致设备一上电就自己开始跑,这在现场是很吓人的。我在程序初始化里用一段特殊寄存器逻辑,强制清零所有输出中间变量和气缸状态,确保设备上电永远处于停止待命状态。
2.2 计数与批次识别的核心逻辑
分拣逻辑的心脏在入口计数这一段。入口光电X2每次被工件遮挡后恢复,实际上产生了一个脉冲上升沿。如果直接把X2的常开触点接到计数器上,会出现一个严重问题——光电信号保持的几十毫秒内,PLC的每个扫描周期都会认为“来了一个工件”,计数会爆炸式增长。
所以要取上升沿。三菱FX里可以用PLS指令把任意接点信号转成一个扫描周期的微分脉冲。程序这样写:
LD X2 AND M100 PLS M10M10每检测到一个工件只在ON的状态保持一个扫描周期,后面的计数逻辑必须用M10来驱动,而不能直接接X2。这个细节是新手最容易犯错的地方,也是“为什么我的计数一次跳几十个”这类问题的最常见根源。
计数逻辑本身,我用了INC自增指令配合D0寄存器:
LD M10 AND M20 // 批次空闲标志 INC D0 // D0 = 当前批次内第几件这里又出现了一个M20,它的作用是“批次空闲”。也就是说,只有上一组三个工件全部处理完毕、所有标签都消费掉了,新来的工件才允许开始新的计数。没有这个限制,第二个批次还没处理完,第三批工件就已经混进计数了,整个分拣顺序全部打乱。
接下来是项目里最有意思的部分——给工件“贴标签”。D0计数只是知道“来了第几个”,但工件要走到各自工位还需要时间,D0的值会变。比如第一批第1件还在输送路上,第二批第1件可能已经进来了,D0又变成了1。所以光靠D0判断意义不大,必须把“这一件是第几个”这个信息锁存下来,跟随这件工件“走”。
用SET指令实现标签锁存:
LD = D0 K1 SET M1 // 第1件:贴上1#标签 LD = D0 K2 SET M2 // 第2件:贴上2#标签 LD = D0 K3 SET M3 // 第3件:贴上3#标签M1、M2、M3就是三张“标签”。工件在皮带上走的时候,标签跟着它,不会因为后续工件进来而改变。等到这件工件走到对应工位的到位光电处,标签才被RST复位,同时触发气缸推出。这个“状态锁存”思想,是PLC程序从入门到进阶的分水岭。
2.3 工位推出与互锁条件
工位A的推出逻辑可以这样拆:A工位到位光电X3检测到有工件,同时M1标签为ON,说明来的正是本组第1件,这时置位Y1气缸推出。程序如下:
LD X3 AND M1 AND M100 SET Y1 // 气缸推出 RST M1 // 1#标签消费完成,复位这里用SET置位Y1,是因为气缸推出需要保持动作,不能只维持一个扫描周期。气缸推出后,需要延时再缩回,我用T0定时器做了0.5秒的推出时间:
LD Y1 OUT T0 K50 LD T0 RST Y1 // 时间到,电磁阀断电,弹簧拉回这个“置位推出、定时复位”的模式在气动控制里很常见,也可以改用气缸磁性开关来触发复位——Y1推出到位后磁性开关动作,马上复位Y1缩回。两种方式都能跑,用定时器的好处是结构简单,用到位开关的好处是能检测气缸是否真的推出成功了。
B、C两个工位的逻辑与A完全一致,只是把X3换成X4/X5,M1换成M2/M3,Y1换成Y2/Y3。写程序时直接复制再改地址,但一定要注意软元件不要改重复,我就见过有人复制了三段程序结果三个工位都在操作M1,导致所有工件都在A工位推出的鬼故事。
还需要补充一个互锁条件:气缸推出的瞬间,皮带最好继续运行还是停止,取决于工艺。我这个项目里皮带不停止,因为气缸推出动作极快,而且靠弹簧缩回,不会影响皮带上的其他工件。但在某些需要精确定位的场合,会在推出前先停皮带,这就需要在逻辑里加一个皮带停止标志和推出标志的互锁,道理是一样的。
2.4 报警与急停:安全逻辑的兜底设计
分拣设备最危险的故障是气缸卡阻。电磁阀得电了,但气缸因为气压不足或者机械卡住没推到位,工件没有被推出,后面第二件工件又顶上来了,设备就会堆料甚至损坏。所以分拣程序必须对气缸动作做“超时监控”。
我在A工位气缸推出指令Y1得电的同时,启动一个定时器T1,设定时间为1秒。如果1秒后Y1还在ON状态(说明气还没缩回),就置位报警标志M50:
LD Y1 OUT T1 K100 LD T1 AND Y1 SET M50这个报警标志M50一旦置位,主控回路里M50的常闭触点断开,M100运行标志立刻掉电,皮带停止、气缸停止动作,同时红灯Y5和蜂鸣器Y6输出,提示操作员处理。操作员检查完成、清除故障后,需要按X11复位按钮,然后重新按启动按钮才能恢复生产。
再有就是急停。我在点表规划时把X7接了急停按钮的常闭触点。程序里只要X7断开,就用它的常闭触点切断所有输出。但必须强调,真正的急停不能只靠PLC程序,还需要在电气硬接线上把急停触点串接到主接触器线圈回路里。PLC程序里的急停只是为了安全联锁,电气硬件的断电保护才是最后一道防线,这个意识必须建立。
3. 程序段落的落地实现
3.1 从指令表看计数器自复位技巧
前面我们用INC配合D0做计数器,这是比较现代、比较灵活的做法。但如果用三菱传统的计数器C0,还有一个常见的自复位技巧值得了解。
传统计数器写法是:
LD M10 OUT C0 K3意思很直接:M10每来一个脉冲,C0的当前值加1,加到3时C0线圈得电,C0的常开触点闭合。但这个触点闭合后会一直保持,必须用RST C0手工复位才能清零。于是就有了自复位计数器:
LD M10 OUT C0 K3 LD C0 RST C0M10脉冲第3次到来时,C0触点闭合,这个闭合信号立刻驱动RST C0,C0清零,同时C0的闭合状态只维持了一个扫描周期,正好可以用来触发“一批处理完成”的动作。这种自复位计数器在包装计数、流量累加、重复次数统计里非常常用,用熟了会有一种“一段指令解决一类问题”的爽快感。
但也有一个要注意的地方:C0在计数到达设定值后,如果用它的触点去驱动后面的逻辑,要注意这个触点还驱动了自己的复位指令,那么同一个扫描周期里,依赖这个触点的其他逻辑可能也会被复位掉。所以如果你要在计满3件时同时触发一个处理动作,建议用C0常开触点去置位一个M标志,然后再用这个M标志驱动后续动作和复位C0,避免一群逻辑挤在一个扫描周期里抢时间。
3.2 气缸时序:定时器与到位开关的选择
气缸的推出时序,是这项目里最需要根据现场调整的参数。我把A工位的完整动作时序捋一遍:
第1件工件经过入口光电X2,D0变成1,M1被SET置位。之后工件在皮带上以一定速度输送,经过一段距离后到达A工位的到位光电X3。X3刚一检测到工件,M1又是ON,Y1立即置位,气缸电磁阀得电,推杆伸出,把工件从皮带上推进A道。0.5秒后T0定时器时间到,Y1复位,电磁阀断电,气缸靠弹簧缩回。如果推杆在1秒内没有缩回到位,T1超时报警触发,设备停机。
这里两个定时器的参数怎么定?T0的0.5秒是推出保持时间,它的依据是气缸从电磁阀得电到活塞完全推出的时间,典型的小型气缸在0.2~0.4秒之间,加上工件被推出皮带的机械过程,给0.5秒是留了余量的。T1的1秒是超时报警判断,一般取“正常缩回时间”的2~3倍,既不会误报,又能及时暴露卡料问题。
如果换用磁性开关做缩回确认,逻辑会更可靠,因为定时器不会骗人,但机械系统会。使用磁性开关时,只要X6(A气缸缩回到位信号)为ON,就可直接复位Y1,不需要T0参与。这样气缸的缩回状态的确认来自实际机械位置,而非估算时间。代价是多一根传感线和一个输入点,但对于比较关键的工位,值得。
我个人的做法是:普通分拣工位用定时器,快速又够用;对有精度要求或容易卡料的工位,改用磁性开关做位置确认。两种方案在程序里只是差了几行,现场效果差异却很大。
3.3 手自动模式切换的编程细节
手动模式是很多人写程序时完全不重视,设备调试时才发现没有它寸步难行的功能。装调阶段要一个人站在设备尾端推动限位、单独试气缸,如果没有手动模式,就只能一遍遍切自动、观察、停,效率低得吓人。
手自动切换我用X10控制。X10断开是自动模式,闭合是手动模式。手动模式下,皮带和气缸分别由按钮控制,不经过自动逻辑。关键点是:自动模式下PLC直接输出Y口,手动模式下也直接输出Y口,这会产生“双线圈”冲突,而且必须用输出收口模式来规避。
不规范的写法是自动逻辑输出一个Y1,手动逻辑又输出一个Y1。这样PLC内部会执行两次OUT Y1,最后一次执行的结果覆盖第一次。比如自动逻辑要推气缸,但扫描到手动逻辑那个OUT Y1时条件不满足,Y1就被关掉了,设备动作完全乱套。
规范做法是:自动逻辑和手动逻辑都各自驱动中间标志M,最后用这些中间标志统一驱动物理输出,并且物理输出线圈在程序中只出现一次:
LD M11 // 自动模式下的中间输出 OR M12 // 手动模式下的中间输出 OUT Y1 // 物理输出,整个程序只写一次这样哪怕自动和手动逻辑有多个条件,只要最后收口到这一个输出线圈,运行结果就可预测。手动模式还有一个好处:调试气缸时可以直接在触摸屏上做按钮,不用去电控柜里临时接线,安全性也更高。
3.4 注释、软元件分配和维护性
聊完逻辑,说一个决定程序口碑的细节——注释和软元件分配。很多人觉得注释是给别人看的,自己写的程序自己能看懂就行,这是不成熟的艺德。设备投入使用三个月后,你自己回头改程序,看着一整页没有任何注释的软元件,也得靠猜。
我的习惯是:M10到M19留作微分中间信号,M50到M59留作报警标志,M100以上留作运行控制标志,D0到D9留作计数和数据寄存器。每类软元件的作用范围固定,后面加功能时不需要打乱原有分配。
三菱GX Works2里可以给软元件加注释,注释名用中文也支持。我写每一段逻辑都会在开头加一个标签注释,例如“入口计数与标签分配”“A工位推出控制”“报警超时监控”,别人看程序时完全不需要从线圈追到触点反推用途。程序加注释这件事花不了半小时,但它能把设备维护时间从半天压缩到十分钟,是真正的投入产出比最高的一步。
4. 现场调试常见问题与排查实录
4.1 计数乱跳:信号抖动与滤波处理
我之前调试一个分拣机时遇到过奇怪问题:入口光电没检测到任何东西,计数却在自动增加。一开始怀疑光电坏了,换了一个新的还是跳。后来用万用表量信号线,发现是皮带电机启动瞬间的电磁干扰串进了传感器信号线,每启动一次,计数就跳几次。
这个案例说明三个道理。第一,传感器信号线必须用屏蔽线,且屏蔽层要单端接地,绝对不要把传感器线和电机动力线走在同一个线槽里。第二,PLC输入端对高频干扰敏感时,可以在程序里给计数信号加软件滤波:取信号后延时几个毫秒再确认电平。第三,简单粗暴但有效的办法是改用常闭型传感器接法,让信号线平时带电,检测物到位时断开,这样外部断线也会被识别成“有信号”,不至于漏检。
程序里的软件滤波,可以用定时器做一个消抖:M10上升沿产生后,延时20毫秒再次读取X2状态,如果仍然有信号,才确认这个脉冲有效。这个笨办法在低速分拣线上很好用,但在高速线上不要用,因为它会损失检测实时性。
4.2 气缸慢半拍:传送带速度与动作时序
另一个常见问题是“工件明明到了工位,气缸推的时候却扑空了”。排查下来几乎都是时序问题:入口光电到工位光电之间的距离是固定的,但皮带速度可能因为变频器频率、物料重量变化而产生波动,导致工件到达工位的时间不固定,气缸按定时器设定时间去推,总差了那么一两百毫秒。
解决办法有几种。最可靠的是在工位口增加到位光电,让气缸的动作由“工件真实到位”触发,而不是由“入口计数推导的时间”触发。只要到位光电检测可靠,气缸就不可能扑空。这也说明了我前面点表里为什么要给每个工位都配独立的到位光电,这不是浪费点数,而是稳定性的保障。
还有一种情况:气缸动作本身没问题,但推杆伸出期间,工件还在皮带上往前走,推出瞬间工件的中心已经偏离了推杆轴线,导致推歪。解决办法是调低皮带速度,或者把到位光电的位置往气缸上游挪一点,让气缸在工件中心还没完全过推杆时开始推出。这个调整没有公式,纯靠现场观察,多试几次就能找到最佳点。
4.3 上电就乱:掉电保持区的设置
分拣设备最怕的事情之一,是半夜停电再来电,第二天一上班发现计数器D0里残留了一个不明数值,工件分组全乱,第一批推到了C工位,第二批又推到了A工位。
三菱FX3U的D区默认按区划分,部分数据寄存器在断电后保持,部分在断电后清零。计数器当前值也一样。如果要让设备断电后记住计数状态(当然一般不建议自动恢复,最好停机后重新复位),或者反过来确保上电时计数值一定是0,就必须明确这些软元件是否掉电保持。
我建议在项目里做上电初始化:用PLC的特殊辅助继电器M8002或者M8039做一个开机脉冲,把D0、M1、M2、M3、M20这些关键软元件统一复位。这样即使断电重启,PLC也是从干净状态开始。分拣设备本质上不需要“断电续跑”,自动恢复反而有安全风险,不如让操作员确认后重新启动。
4.4 调试工具与强制输出使用心得
最后说一个几乎所有PLC工程师都用过,但用不好就会出大事的功能——强制输出(Force)。在GX Works2里,你可以强制Y1为ON,让气缸直接推出去,这在装调阶段检查接线和气路非常高效。但你一定要记住:强制输出不经过程序逻辑,它直接改写PLC输出映像区。如果在自动运行状态下强制打开了某个输出,程序读到这个输出状态时可能触发一堆你意想不到的连锁动作,甚至设备乱动造成危险。
我的经验是强制输出只用在以下两种情况:一是设备完全停机、程序不运行时,用来检测接线和负载;二是手动模式下单独验证某个机构动作。用完强制输出后,必须手动把所有强制位释放,再从触摸屏或PLC上确认输出状态恢复正常。我见过工程师调试完忘记释放强制信号,结果设备一上电,气缸直接弹出来把料顶飞了。这种事情发生一次,就足够让你养成“调试完必查强制释放”的习惯。
另外一个调试好习惯,是善用GX Works2的软元件监控表和时序图。把X2、X3、D0、M1、M2、M3、Y1同时拉进监控表,运行设备时盯着这些状态的跳变,分拣逻辑哪里出了问题一眼就能定位。相比在梯形图上一段段翻逻辑,用监控表“看数据流”的效率高出一个数量级。
调试行当干久了,你会越来越认同一件事:逻辑写得再漂亮,都不如现场多测几轮。分拣程序的坑,往往不在指令本身,而在于信号抖动、机械时序、硬件接线这些程序之外的地方。每次写完梯形图,我习惯先在脑子里把扫描顺序过一遍——从输入信号采集,到中间逻辑计算,再到输出刷新——像看电影一样把整个流程走一遍,能发现很多逻辑漏洞。这个习惯,比任何调试工具都管用。