
全自动洗衣机这活儿看着不起眼真要把控制逻辑完整搬到PLC里走一遍才知道什么叫“看着简单、做着全是细节”。最近我拿GX Works2和GT Designer3搭了一套全自动洗衣机的仿真工程从梯形图到触摸屏一路折腾下来踩了不少坑也理清了很多思路。这篇文章就把整个开发过程拆开聊从需求梳理、I/O分配、梯形图实现到HMI组态和仿真调试一步不落适合正在学PLC或者想练手工控项目的人参考哪怕你刚接触梯形图跟着捋一遍也能吃透这套逻辑。1. 先把需求拆明白洗衣机到底要干什么1.1 控制对象和I/O点清单拿到“全自动洗衣机PLC程序开发”这个需求第一件事不是打开软件写梯形图而是把洗衣机的动作流程和输入输出点数列清楚。很多新手上来就写代码写到一半发现流程乱了回头改逻辑改到想删工程就是因为没先做需求拆解。全自动洗衣机核心流程就八个字进水、洗涤、排水、脱水。展开一点是启动进水到高水位后停水开始洗涤正转-停-反转-停交替洗够时间排水中停然后脱水脱完再进水漂洗重复两到三遍最后脱水结束蜂鸣提示。整个流程看起来简单但每一步都有状态切换、定时控制、安全互锁这就是PLC程序的灵魂。我先列一份通用I/O分配表实际项目里根据型号和点数微调信号方向地址功能说明备注输入X0启动按钮常开按下有效输入X1停止/暂停按钮常闭断开有效或常开取反输入X2门开关关门信号闭合有效输入X3高水位开关进水到达高水位输入X4低水位开关排水降至低水位输出Y0进水电磁阀得电进水输出Y1排水电磁阀得电排水输出Y2电机正转洗涤/漂洗正转输出Y3电机反转洗涤/漂洗反转输出Y4脱水离合器/电机高速脱水运行输出Y5蜂鸣器/指示灯流程结束或报警为什么用X和Y这两个软元件区域这是PLC最基本的输入输出映射。现场按钮、传感器接在输入端子上对应的就是X寄存器电磁阀、接触器接在输出端子上对应的就是Y寄存器。程序里只操作X和Y不直接操作物理端子这样仿真和实机切换时改动最少。1.2 状态转移思路决定程序骨架洗衣机的控制逻辑天然是一个状态机每个阶段就是一个状态状态之间靠条件触发转移。我在程序里不推荐用一堆SET/RST散弹式操作更推荐把每个阶段看作一个“步”用中间继电器M0~M20表示当前处于哪一步。为什么要用步的概念因为洗衣机流程是串行的任何时候只能处于一个步骤。如果你直接写“进水阀Y0得电条件启动且未到高水位”程序前后耦合严重比如脱水阶段误触发了进水条件阀门就会乱开。而用步标志后每个输出只属于固定的步逻辑一查就知道此时该干什么排查问题也快。我采用的转移条件是典型的“动作完成传感器反馈”双重判断。比如进水这一步一旦高水位X3闭合说明水位到位进水阀关闭立刻切换到洗涤步洗涤步靠定时器累计时间时间到了切换到排水步排水步靠低水位X4断开水位已低于低水位探头判断排空再切到脱水步。一个萝卜一个坑顺序永远不会乱。2. 梯形图实现GX Works2里一步一步搭2.1 软元件分配和程序结构规划打开GX Works2新建工程前建议先在纸上或Excel里把软元件分配表定好。这步别省省了后面调试时满屏找M100到底是干什么的纯粹给自己添堵。我的软元件规划长这样软元件用途说明M0运行总标志启动后置ON停止后复位M10当前步-进水ON代表进水阶段M11当前步-洗涤ON代表洗涤阶段M12当前步-排水ON代表排水阶段M13当前步-脱水ON代表脱水阶段M14当前步-漂洗ON代表漂洗进水阶段M15当前步-结束蜂鸣流程结束提示T0进水超时定时器防传感器失效导致一直进水T1/T2/T3洗涤正转/停/反转定时器实现正转-停-反转循环C0洗涤循环计数记录正反转循环次数D0HMI显示的当前状态号触摸屏根据D0显示对应文字D1报警代码0正常非0代表对应故障程序整体分四段写第一段是启动/停止和循环步转移逻辑第二段是进水/排水控制第三段是电机正反转和脱水控制第四段是HMI数据映射和报警处理。分段的目的是后期维护时能快速定位。别人接手程序时看到注释和分块结构就知道哪里改了影响什么这个习惯在团队项目里特别重要。2.2 关键程序片段启动自锁和步进转移启动和停止是整个程序的地基。我的写法是LD X0 // 启动按钮按下 OR M0 // 运行标志自保持 ANI X1 // 停止按钮断开则停止常闭输入 ANI M20 // 故障标志不启动 OUT M0 // 运行总标志自锁电路是PLC入门必须吃透的东西按钮按下的瞬间X0闭合M0得电松开按钮后X0断开但M0的常开触点已经闭合回路被M0自己维持住。这个自锁回路应用极广凡是启动/停止型逻辑都能套用。停止用的是常闭接法线断了或急停按下M0立刻掉电符合安全习惯。步进转移的核心我先放一小段。进水转洗涤LD M10 // 进水步标志 AND X3 // 高水位到位 SET M11 // 切入洗涤步 RST M10 // 清掉进水步这里用了SET和RST组合完成步切换。为什么不直接写OUT M11然后OUT M10不行因为OUT是线圈驱动如果程序扫描到后面某处又OUT了M10就变成双线圈冲突M10的状态取决于最后一条OUT指令调试时逻辑就会飘。SET/RST组合的优点是步状态在程序里只出现一次不会重复驱动这也是主流写法。2.3 进水、洗涤、排水、脱水的核心逻辑进水阶段除了接收M10步标志还要加定时器做超时保护。洗衣机进水口一般有4分管径正常充满到高水位大约2到3分钟。如果水位开关坏了或者水压不足程序会卡在进水步永远等水位这既不安全也费时间。加一个T0定时120秒时间到了还没到位就跳报警LD M10 OUT Y0 // 进水阀输出 LD M10 ANI X3 OUT T0 K1200 // 120秒定时器 LD T0 SET M20 // 进水超时报警洗涤阶段的正反转控制是经典的电工互锁逻辑。电机不能直接正转反转切换必须先停再反转否则接触器打架甚至烧电机。我的时间分配是正转15秒停3秒反转15秒停3秒循环计数。用两个定时器交替触发LD M11 // 洗涤步 ANI T2 // 停止定时器未到 OUT T1 K150 // 正转定时15秒 LD M11 AND T1 // 正转时间到 OUT T2 K30 // 停3秒然后电机输出要带互锁LD M11 AND T1 ANI T3 // 反转计时未到 ANI Y3 // 互锁反转 OUT Y2 // 电机正转Y2和Y3这对互锁我用了输出互锁和程序互锁双重保护梯形图里正转输出的回路串入了Y3的常闭点反转回路串入了Y2的常闭点。就算程序逻辑写错物理上也不会出现两个线圈同时吸合。这个习惯一定养成涉及电机正反转的场合双互锁是保命设计。排水和脱水也有讲究。排水步只要低水位X4变成OFF水位低于探头就可以认为排空了然后切脱水。注意水位开关是常开还是常闭要提前确认很多项目里液位传感器是“有水闭合、无水断开”那高水位X3是ON代表有水到高位但有的传感器反向接线不同程序判断就要取反这个后面仿真调试会专门说。脱水步必须串入门开关X2。洗衣机脱水时门必须关好这是安全底线。我写的脱水条件是LD M13 AND X2 // 门必须关好 OUT Y4 // 脱水离合器/高速输出如果门没关程序切到脱水步时Y4不会动作同时可以触发一个门未关报警。仿真时这步最容易看出来拔掉X2输入就能看到输出不动作。2.4 双线圈问题新手最容易翻车的坑GX Works2里双线圈不会报编译错误但程序运行时会出诡异问题。什么叫双线圈同一个Y或M地址在两段程序里分别用了OUT比如进水阶段写了一次OUT Y0漂洗阶段又写了一次OUT Y0。PLC扫描是从上到下执行的最后一条OUT会覆盖前面的状态。所以你在梯形图里看到进水时Y0亮了但漂洗时Y0反而灭着逻辑完全不可控。解决双线圈的标准做法是“中间继电器汇总输出”。我所有输出不在各步程序里直接OUT而是每个步标志控制一个中间继电器比如M30代表“需要进水”M31代表“需要排水”最后在程序末尾统一做输出映射LD M30 OUT Y0这样无论程序中间哪一步置位M30最终输出逻辑只有一处清晰且安全。这个习惯建议从学习阶段就固定下来后面做复杂设备时能省一大半排查时间。3. 触摸屏组态GT Designer3把洗衣机可视化3.1 画面布局和对象放置洗衣机控制逻辑再完美没有HMI界面就像蒙着眼睛操作调试时根本不知道程序跑到哪一步了。GT Designer3组态第一步是新建工程选择对应型号的触摸屏连接方式选仿真连接这样就可以和PLC模拟器联调。我的HMI画面分三块主监控画面、手动调试画面、报警画面。主监控画面放一个当前状态文字显示控件数值来源绑定PLC的D0再用注释列表功能把D0的数值映射成文字1对应“进水”、2对应“洗涤”……这样运行时D0一变屏幕上的文字自动切换不用写宏非常方便。再放两个指示灯一个显示“运行中”一个显示“故障”颜色绿/红区分。指示灯绑定M0和M20M0 ON灯就亮绿M20 ON灯就亮红。GT Designer3里指示灯和位开关的地址映射特别直观双击控件选择软元件输入M0或M20选好图形和颜色就行了。这里有个小技巧指示灯建议绑定PLC内部继电器M不要直接绑定Y输出因为Y输出可能被中间逻辑屏蔽而M是程序状态本身更真实反映流程走到哪。3.2 操纵控件和报警设置触摸屏上给启动和停止各放一个位开关启动开关设置为“置位M0”停止开关设置为“复位M0”。这里要留意GT Designer3的位开关有两种操作模式一种是“点动”按下ON松开OFF一种是“交替”按一次ON再按一次OFF。洗衣机启动是长保持一定要选“置位/复位”模式否则手一松就停了。手动调试画面是仿真阶段的神器。洗衣机流程是全自动跑完但调试时如果每次都要从头进水、等待、洗涤、排水半小时只能测一轮浪费时间。我加了一组手动按钮直接置位M10进水、M11洗涤、M12排水、M13脱水相当于把每个步骤做成手动强制切换。手动模式下程序自动流程被旁路只执行对应步的输出配合触摸屏就能快速验证每个输出是否正确。当然手动操作只用于调试生产环境不会开。报警画面用数据报警功能PLC侧把故障代码写入D1触摸屏根据D1的值弹出对应文本。比如D11显示“进水超时”D12显示“排水超时”D13显示“门未关”。这一步花不了多少时间但对后期维护者友善太多——不用翻梯形图猜哪里出了问题屏幕直接告诉你了。4. 仿真调试实录从逻辑错误到时序混乱4.1 仿真前要做的检查项很多人打开GX Works2的“梯形图逻辑测试”就直接点开始结果发现触摸屏连不上、输出不动作开始怀疑人生。仿真不是玄学按顺序检查几项基本不会卡壳PLC软元件仿真必须先编译通过。梯形图编译后在模拟模式下载到仿真PLC同时启动运行。GT Designer3的工程需要另开一个模拟器窗口连接方式必须设成“仿真连接”不是以太网也不是串口。触摸屏模拟器启动后要和GX Works2的仿真PLC连接成功软件会提示Online。没提示就是地址或连接没配对。I/O确认X0是常开按钮还是常闭急停在仿真器里可通过软元件监视窗口手动强制置ON/OFF先逐个强制X0、X1、X2、X3、X4观察程序输出是否正确响应再跑完整流程。我第一次仿真时门开关用了常闭接法程序里写的AND还是这个常闭点的常开逻辑结果门没关时脱水竟然也能转这要是真机直接出安全事故。检查软元件注释和接线图对不上是第一大坑。4.2 典型故障排查速查表仿真调试遇到问题不要瞎猜按表格逐项排查效率高得多故障现象可能原因排查方法按启动没反应X0接线/仿真强制没生效或M0被其他程序复位监视M0和X0状态强制X0 ON观察M0是否置位进水阀一直开不停水高水位X3条件没成立或进水步一直保持强制X3 ON看Y0是否断开、步是否跳转水位到了还在进水水位传感器常开常闭选反检查X3信号逻辑必要时程序里取反正转切反转时输出全灭互锁电路生效但停的定时器没计时检查停止定时器T2是否被复位脱水输出不动作门开关X2没闭合仿真强制X2 ON看Y4是否ONHMI数值显示异常D0地址映射错或字软元件绑定成位软元件检查触摸屏数值显示控件的地址和数据类型程序能跑但HMI画面全灰仿真连接未建立或PLC未运行看GX Simulator运行状态重新启动模拟连接其中“正转切反转时输出全灭”这个现象非常有代表性。洗涤逻辑里正转和反转中间必须有一个停止间隔否则接触器换向太快会拉弧。仿真里虽然接触器是虚拟的但定时器逻辑必须模拟真实时间。我的做法是正转定时器到点后置位一个“插拔延时”标志这个标志保持3秒后反转定时器才开始反转结束同样保持3秒再正转这样梯形图里的时序就和现场一致。4.3 仿真和实机的差异哪些坑必须提前知道仿真能帮你验证逻辑正确但替代不了真实工况。至少有三类问题仿真完全测不出来第一是输入信号抖动。实体水位开关在临界水位时会反复通断如果程序不加延时滤波进水阀会在临界点疯狂开关。仿真里X3是稳定的ON/OFF测不出这个。解决方法是程序里给水位信号加一个3到5秒的稳定判定水位信号连续2次扫描周期都为ON才认为真的到位。第二是输出继电器响应时间。程序里正反转切换中间停了3秒实际现场接触器释放时间大约几十毫秒通常够用但如果接触器老化释放变慢正转触点还没断开反转触点已经闭合照样短路。实机调试时要测一下接触器动作时间程序里的停止间隔要留余量我一般至少留2秒。第三是模拟量和干扰。洗衣机项目多数只有开关量但如果带上变频器调速强电侧的干扰可能会让X输入误触发。仿真测不出电磁干扰只能靠实机验证但布线规范和屏蔽线接地这些基本功不能省。5. 一点个人经验开发这类控制程序的通用套路回头再看这次全自动洗衣机PLC仿真的完整过程有一个体会特别深这类顺序控制程序的套路其实是通用的洗涤、脱水、漂洗换到注塑机、包装线、自动门本质上都是步进加定时加互锁。你只要把第一步的需求拆解做扎实把I/O清单和软元件表写清楚后面的梯形图不过是从表格翻译成逻辑而已。我个人的建议是做任何PLC项目都给自己建立一个模板文件夹里面放好I/O分配表模板、软元件规划表、常用程序段自锁、互锁、延时、报警的示例。第二次做类似项目时直接套模板改条件开发效率能翻倍。还有一点经验是梯形图注释一定要写全不是写给PLC看的是写给三个月后忘了细节的自己看的。我这次开发洗衣机的工程文件里每一段逻辑都加了中文注释甚至包括“为什么这里要加3秒停止延时”这种设计原因说明后期维护心情能舒坦不少。最后分享一个调试小技巧GX Works2的时序图监视功能特别适合排查定时器问题。把T1、T2、T3和Y2、Y3放到时序图窗口里启动洗涤后能直观看到三个定时器的交替波形哪里时序错乱一眼就能看出来。靠这个功能我上次排查一个“偶尔反转不启动”的问题只花了五分钟比逐行看梯形图快太多了。