news 2026/9/9 6:38:17

用PLC和组态王给洗衣机换脑:顺序控制系统实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用PLC和组态王给洗衣机换脑:顺序控制系统实战

很多人可能觉得洗衣机就是个日用家电,顶多拆开来换换电机电容,跟PLC八竿子打不着。但如果你把一台普通波轮洗衣机当成一套典型的顺序控制系统来看,它其实包含了电机正反转、水位检测、定时控制、状态切换这些在工业现场天天遇到的基本逻辑。我这次直接用PLC和组态王把一台旧洗衣机重新写了一套控制系统,整个过程做下来,相当于用最小成本把工业自动化的核心链路完整走了一遍。这篇手记就是把整个项目的动机、选型、编程、组态和调试过程原原本本记录下来,给正在学PLC或者想找个练手项目的朋友一个完整的参考。

1. 为什么非要用PLC给洗衣机“换脑”:项目动机与方案对比

1.1 原装控制板让我很头疼

家里那台用了七八年的波轮洗衣机,故障从偶尔不脱水发展到洗衣中途死机,拆开后盖一看,控制板上的继电器触点已经烧得发黑,单片机那块板子上有几处电容鼓包。去售后问了一圈,换一块原装控制板要两三百块,而且订货还得等。更让我不爽的是,这块板子的逻辑是封死的,洗漂脱次数、每次脱水时间全是固定参数,想调都没法调。我当时就在想,既然洗衣机本质上就是“进水-洗涤-排水-脱水”的循环状态机,为什么不用PLC把这块板子替代掉?手头正好有一台闲置的三菱FX3U系列PLC,加上组态王做一个监控画面,这样不仅能让洗衣机重新转起来,还能实时看到每一道工序的状态。

1.2 三种改造方案的取舍

在动手之前,我认真比较了三条路线。

第一种:修原板或者买通用洗衣机控制板。这条路最简单,但问题是通用板的程序逻辑同样固定,而且洗衣机控制板的接口五花八门,买到手未必能直接匹配原来的水位开关和电机,改起来也麻烦。这种方式没有任何学习和扩展价值,只能算是维修。

第二种:用Arduino或者STM32自己写控制程序。这条路灵活性很高,网上也有不少“单片机控制洗衣机”的案例。但它有几个很现实的麻烦:一是单片机系统的IO隔离和抗干扰需要自己设计,洗衣机电机启停瞬间的浪涌很容易让单片机死机;二是调试的时候没有梯形图这种直观的监视手段,程序跑到哪里全靠串口打印;三是如果想做一个人机界面,又得去折腾屏幕和触摸屏驱动,工作量直线上升。

第三种:用PLC加组态王。PLC的继电器输出直接驱动洗衣机的进水阀、排水阀和电机,梯形图把状态机逻辑写得清清楚楚,在线监视可以随时看到哪一步在执行、哪个输入信号没到位。组态王直接通过串口或者以太网和PLC通信,把水位、当前工序、剩余时间都画在电脑屏幕上,顺便还能记录历史数据。这套系统和工业现场的真实架构完全一致,做完这台洗衣机,相当于把一个微型DCS系统从头到尾跑通了一遍。

对比下来,第三条路无论从可维护性、调试便利性还是学习价值上都是最优解。成本上,PLC是现成的,组态王用开发版或者学习版,除了线材和几个开关继电器,几乎没有额外开销。

1.3 改造后的系统架构

整个系统采用典型的“上位机+下位机”两层结构:

  • 下位机:三菱FX3U-32MR,负责所有输入采集和输出驱动。输入包括启动按钮、停止按钮、水位开关(高/中/低)、门盖开关;输出包括进水阀、排水阀、洗涤电机正转、洗涤电机反转、脱水离合器。
  • 上位机:组态王,通过串口(FX3U的编程口转232)与PLC通信。组态王负责状态显示、工序流程动画、手动操作按钮、历史报表和报警记录。

结构不复杂,但五脏俱全。电气回路、PLC程序、上位机组态、通信调试、故障排查这几个方向全部涉及,作为练手项目再合适不过。

2. 硬件选型与I/O分配:动工之前必须想清楚的事

2.1 PLC型号确认与外设接口

我用的三菱FX3U-32MR是继电器输出型,这一点很关键。洗衣机里最大的负载是洗涤电机,普通波轮洗衣机的电机功率在120W到200W之间,堵转电流可能达到三四安培。FX3U继电器输出的触点容量是2A/250VAC,直接驱动电机会有触点寿命风险,所以我没有让PLC直接接电机,而是让PLC输出驱动中间继电器,再由中间继电器的触点去控制电机的运转电容切换。

这里要特别提醒:PLC的晶体管输出和继电器输出在驱动感性负载时的处理方式完全不同。继电器输出是机械触点,通断瞬间会产生电弧,感性负载(电机绕组、电磁阀线圈)断电瞬间的反向电动势会在触点上拉出火花。加中间继电器不只是为了扩流,更重要的是把PLC的触点从电机这种大电流感性负载中隔离出来,让维修和更换成本都更低。

实际接线时,我在每个PLC输出点对应的中间继电器线圈两端并联了续流二极管(直流回路)或者RC阻容吸收(交流回路),这样可以有效抑制反电动势对PLC输出触点的冲击。这一步很多初学者会忽略,等触点烧蚀了才后悔。

2.2 洗衣机原机部件的改造利用

原来的洗衣机机械部件基本都可以保留,只需要把原控制板卸下来,把各个执行器的控制线引出来接到继电器上。

进水阀。原机进水阀是220V交流电磁阀,两根线,单向导通。我把它接到一个中间继电器的常开触点上,由PLC输出控制。

排水阀。同样是220V交流电磁阀,但排水阀和离合器往往是一体的——波轮洗衣机的排水阀在排水的同时会拉动离合器,让减速离合器切换到脱水状态。这时候要特别留意排水阀的动作时序:如果排水阀没有到位,离合器没有完全切换,脱水时波轮会跟着转,衣物会绞在一起。

洗涤电机。波轮洗衣机的电机是单相电容运转异步电机,通过改变启动绕组的接法来实现正反转。原控制板用了两个双向可控硅(或者继电器)分别切换正转和反转。我保留了这个思路,用两个中间继电器的常开触点分别控制电机的正转和反转回路。要注意的是正反转切换时中间必须有一个延时,不能同时导通——一旦正转和反转继电器同时吸合,相当于电源短路。

水位开关。原机用的是机械式气压水位开关,三根线(公共端、高水位触点、低水位触点)。这个开关本质上是一个压力传感器加机械触点,当水位上升推动气囊气压变化时,内部的膜片会推动触点动作。用PLC读取时,公共端接PLC的COM端,高水位和低水位触点分别接两个输入点。因为触点是干接点,PLC这边用漏型接法(公共端接24V+,输入点接开关的一端),接法上需要注意。

门盖开关。原机门盖开关是一个常开触点,门盖合上时闭合。这个信号接入PLC输入,在脱水阶段必须检测到门盖闭合才允许启动脱水,这是安全逻辑的重要组成。

2.3 I/O分配表与接线图

输入点功能说明
X0启动按钮常开,按下接通
X1停止按钮常闭串联,断开即停
X2高水位信号水位到达高水位时接通
X3低水位信号水位低于低水位时断开
X4门盖开关门盖闭合时接通
输出点功能说明
Y0进水阀通过中间继电器控制
Y1排水阀通过中间继电器控制,同时拉动离合器
Y2电机正转通过中间继电器切换电容回路
Y3电机反转通过中间继电器切换电容回路
Y4蜂鸣器程序结束报警提示

I/O点没有占用太多,总共5个输入、5个输出,FX3U-32MR绰绰有余。剩下的大量空余点位留着以后做扩展,比如再加一个温度传感器做热水洗。接线图在这里就不画详细的了,核心原则是每一个输出点都经过中间继电器隔离,PLC的COM端和外部电源的隔离要做好,控制回路的24V直流和动力回路的220V交流在走线上要分开,不要捆在一起。

3. 洗衣机控制程序的核心逻辑:状态机是怎么在梯形图里落地

3.1 从流程到梯形图的转换思路

洗衣机的控制逻辑说复杂也复杂,说简单也简单。我拆解成如下几个状态:

  1. 待机状态:所有输出关闭,等待启动指令。
  2. 注水状态:进水阀打开,水位检测选中一个目标水位(标准洗选高水位,经济洗选中水位)。
  3. 洗涤状态:电机交替正转反转,每次正转1.5秒、停0.5秒、反转1.5秒、停0.5秒。洗涤总时间可设定(我设了标准洗15分钟、快速洗5分钟两个档位)。
  4. 排水状态:排水阀打开,等待水位降到低水位以下。
  5. 脱水状态:排水阀继续打开,离合器切换,电机单向连续旋转,转速由电机本身特性决定(波轮洗衣机的脱水转速比较低,原机电机在脱水状态通过电容切换实现高速旋转,这个在继电器接线时已经做了区分,所以PLC不需要做调速)。
  6. 漂洗状态:注水-洗涤-排水-脱水的循环,我设了两遍漂洗。
  7. 结束状态:蜂鸣器响,等待用户开门取衣。

这个流程放到梯形图里,最直观的实现方式就是“步进梯形图”,也就是三菱的STL指令(SFC编程)。STL指令本身就是为了解决这类顺序控制问题而设计的,每一步用一个状态继电器S来表示,条件满足时就从当前步跳到下一步,输出在每一步里单独控制。相比用M中间继电器加自锁互锁的“老式写法”,STL的可读性和可维护性高出很多,在线监视时直接能看到当前落在哪一步。

3.2 步进梯形图的关键设计

我用S0表示初始状态,S10-S17表示各工序步。程序里最核心的部分有三个:

第一个是启停逻辑。启动按钮X0的上升沿触发M0(运行标志),M0作为整个流程的总使能。停止按钮X1是常闭触点串联在公共回路里,一旦断开,M0复位,所有输出关闭,程序回到S0。这个设计符合工业设备的安全习惯:停止优先,急停断路。

第二个是水位判断。进水时,我根据洗涤模式选择目标水位。高水位选择X2作为跳转条件,中水位就是把高水位触点换成中水位触点。这里有个细节:机械水位开关在高水位时,低水位触点可能也是接通的,所以程序里不能只看低水位,而是要按水位到达目标水位来处理。跳转指令用AND X2或者AND X3,确保水位到了才进入下一步。

第三个是电机正反转的互锁。Y2和Y3在任何情况下都不能同时为ON。我在梯形图里把Y2的常闭触点串在Y3的输出回路里,同时把Y3的常闭触点串在Y2的输出回路里,这就是最基础的互锁。另外在STL状态切换时,即使状态步转移了,输出也可能因为线圈保持而继续导通,所以每一步的OUT指令之前都需要确认上一步的输出已经复位。STL指令本身有“跳步自动复位”的特性,也就是离开某个状态步时,该步内的线圈输出会自动复位,这一点比用M自锁的方式安全很多。

3.3 定时器和计数器的实际用法

洗涤过程需要大量的定时。三菱FX3U里有T0-T199是100ms定时器,T200-T245是10ms定时器。洗涤正转1.5秒,我用了T0(K15,100ms*15=1.5s),反转也是同样的定时。停0.5秒用T1(K5)。在STL步里,每个定时器独立使用,互不干扰。

洗涤次数的控制用了计数器C0。我设定了一个洗涤循环内的正反转次数,比如正转停转算一个周期,循环20个周期后进入排水。计数器的复位要在离开洗涤步或者进入下一步时执行,否则计数会累积到下一轮洗涤中,导致洗涤时间越来越长。

还有一个容易踩坑的地方:排水步的结束条件不能只看排水阀打开的时间,而要看水位是否真正降到了低水位以下。如果用定时器估算排水时间,一旦排水管堵塞或者排水阀卡住,程序还是会继续往下走,水就可能溢出来。所以排水步的跳转条件使用了X3(低水位信号)的常闭触点——低水位信号断开才说明水已经排得差不多,此时再延时几秒确认排空,然后进入脱水。这个逻辑虽然多花了十几秒,但可靠性提升了一大截。

4. 组态王上位机开发:从画面组态到数据联动

4.1 创建工程与设备通信配置

组态王这部分,我用的版本是6.55(6.53也可以,大体操作逻辑一致)。安装过程中最容易遇到一个坑:如果系统里装了旧版本或者杀毒软件拦截,运行时会提示“创建协议组件失败”,或者安装时提示explorer.exe与.cab不匹配。这些问题大概率是权限不够——组态王安装和运行都必须以管理员身份运行,而且最好关闭杀毒软件。解决办法是右键“以管理员身份运行”安装包,装完后同样以管理员身份运行开发系统和运行系统。

新建工程后,第一步是配置设备。在工程浏览器的“设备”节点下,选择“新建”,驱动类型选“PLC”里的“三菱FX系列编程口”。通信方式如果是FX3U自带的编程口(圆头8针),需要一根FX-USB-AW或者USB-SC09-FX的编程线,在组态王里选串口,波特率9600,数据位7,停止位1,偶校验——这是三菱编程口默认参数。如果PLC带了以太网模块(比如FX3U-ENET),组态王也可以通过TCP/IP方式通信,但编程口方式最省事,一根线就够。

设备地址的设置要格外注意。三菱FX3U的编程口协议里,设备地址默认是0,这个和PLC的站号设置无关,如果发现通信不上,先检查设备地址是不是0。

4.2 变量定义与画面组态

组态王里所有需要和PLC交换的数据都要定义成I/O变量。我定义了以下变量:

组态王变量关联PLC地址数据类型用途
运行标志M0洗衣机总运行状态
当前工序D0整型当前状态步编号,0待机/1进水/2洗涤/3排水/4脱水/5结束
洗涤剩余时间D1整型洗涤倒计时(秒)
进水阀状态Y0显示进水阀开闭
排水阀状态Y1显示排水阀开闭
电机正转状态Y2显示正转
电机反转状态Y3显示反转
手动/自动模式M100切换手动调试和自动运行

注意一点,组态王里的I/O变量要勾选“允许DDE访问”和“变化时更新”,如果变量类型选错(比如把Y0读成寄存器而不是位),画面上的状态就会一直不变或者乱跳。

画面组态这部分我的思路是这样的:画一个洗衣机的侧视图,滚筒部分用一个矩形框表示,进水阀画在左上角,排水阀画在底部,电机放在下方。正常运行时,进水阀开时,矩形框里的水位线逐渐上升(用一个垂直填充的矩形表示水位,填充高度关联到水位传感器变量或者工序状态);洗涤时电机图标交替闪烁;排水时水位下降;脱水时滚筒图标旋转。这些动画效果在组态王里都是通过“动画连接”完成的,给每个图形对象选一个属性(填充高度、旋转角度、可见性),关联到对应的I/O变量。

为了提高预警能力,我在画面里加了一个故障报警区:电机过载(通过PLC里读到的X5热继电器信号)、门盖未关(X4断开但没有启动信号)都会在画面里弹红色报警。组态王的“实时报警”功能可以直接把PLC里M100-M199范围内的报警位变量映射为报警事件,在报警窗口里显示。这样洗衣机运行过程中一旦有问题,电脑屏幕上就会弹出报警提示,不用蹲在洗衣机旁边看指示灯。

4.3 历史数据报表的实现

组态王设置历史数据报表,很多新手会卡住,我发现关键是两个地方:历史库配置和报表控件的查询脚本。

历史库配置在“工程浏览器”的“数据库-历史库”节点下。把所有需要记录的数据变量(当前工序、洗涤剩余时间、温度如果有、运行标志)都加到历史库里,记录周期设置成1秒或者5秒。如果不添加进历史库,报表控件里是查不到数据的,这是最容易忽略的一步。

报表控件方面,组态王自带了一个“KVReport”报表控件,在画面工具箱里拖出来即可。运行时通过脚本把历史库里的数据查询出来填充到报表的单元格里。最简单的做法是用“历史数据查询”菜单自带的模板,设置起止时间和查询变量,点查询就会自动填充数据。如果你需要自定义报表格式(比如加表头、汇总),可以写脚本用ReportSetHistData函数动态查询,例如:

ReportSetHistData(0, "当前工序", "2024-01-01 08:00:00", "2024-01-01 09:00:00", 2);

这个函数的意思是在0号报表里查询名为“当前工序”的变量,在指定时间段内每2秒取一个值。用类似的脚本可以自动生成一张当天运行记录表,对分析洗衣机的使用频率和单次洗涤时间很有帮助。

4.4 手动调试界面

为了调试方便,我做了一个手动调试页面。画面里放若干按钮,分别对应Y0-Y4的置位和复位。在PLC程序里,我预留了M100作为“手动/自动”模式切换。当M100为ON时,自动流程被旁路,PLC只执行手动模式下的控制指令;当M100为OFF时,执行自动洗涤流程。这个设计在调试阶段帮了大忙——电气接线完成后,先用手动模式验证每个执行器的动作是否正确,再切回自动模式跑整个流程,问题定位快得多。

5. 联调阶段的坑:问题排查链路完整复盘

5.1 启动按钮按下没反应:输入信号捉迷藏

第一次上电调试,按下启动按钮,PLC没有反应。打开在线监视,发现X0指示灯根本没亮。我用万用表量启动按钮的两端,电压有24V,但按下按钮后电压没有变化。这才意识到启动按钮那一侧是原洗衣机的老按钮,触点已经严重氧化,按下时接触电阻很大,相当于断路。换了一个新的自复位按钮后,X0指示灯正常亮了。

这个问题的排查思路是:输入信号没到PLC,先量按钮供电、再量触点通断、最后查接线和PLC输入端。顺序不能反,不然容易绕圈子。

5.2 进水阀嗡嗡响但不进水:阀芯卡滞

进水阀通电后,有交流声但水不进来。这种情况一般是阀芯被异物卡住或者阀内水垢严重。拆开进水阀的滤网,发现里面有一小块砂石,清除后恢复正常。工业现场里电磁阀卡滞也是常见故障,处理思路是一样的:先断电、拆阀、清堵、复装、试压。PLC程序里最好给进水阀加一个超时保护——如果进水超过10分钟水位还没到,就关闭进水阀并报警,防止阀卡导致漏水。

5.3 组态王读不到PLC数据:通信协议参数不匹配

组态王画面全部正常,但变量值都是0。排查环境:PLC端通信设置没问题,编程线也能下载程序,说明物理链路是通的。我到组态王的设备测试窗口去测试,提示“通信超时”。

检查设备配置,发现串口参数里选了“无校验”,而三菱编程口默认是“偶校验”。改过来后再测试,数据正常。这个问题在组态王驱动里非常常见——通信协议参数必须和PLC实际设置完全一致,差一个校验位都连不上。

还有一个很关键的点:组态王和三菱PLC通信时,设备地址默认是0。如果PLC侧的“站号设置”不是0,通信也会失败。FX3U的编程口没有本机站号的概念,但在组态王设备属性里这个“0”不能乱改。

5.4 正反转切换瞬间PLC重启:干扰问题的排查

有一次测试时,电机正转切换反转的瞬间,PLC直接重启了。这个现象非常典型,属于强烈的电磁干扰或者电源跌落。

排查的第一步是量PLC电源电压。用示波器(万用表也行)观察PLC 24V电源端,发现在电机切换瞬间电压有几十毫秒的跌落,跌到20V以下,导致PLC掉电重启。问题的根源是PLC电源和电机电源共用了同一个开关电源的24V输出,电机启停瞬间的大电流导致开关电源输出电压跌落。

处理方案:给PLC增加独立的24V开关电源,或者至少在PLC电源输入端并接一个大容量的电解电容(比如1000uF/50V)来维持电压。我在PLC的L和N端前端加了一个滤波器,同时把电机动力线和控制线分开走线,没有直接交叉,问题解决。

这个案例提醒我:控制回路的电源稳定性是所有自动化系统的生命线,宁可电源多花钱,也不能让干扰进到PLC里。

5.5 脱水时门盖开关误触发

脱水过程中,滚筒高速旋转,机身的震动导致门盖开关的触点间隙瞬间断开再闭合,程序检测到门盖断开,立即进入停止流程。这在程序逻辑上是安全的,但用户感受很差——明明门关得好好的,却经常被强制停止。

解决思路有两种。一种是在门盖开关信号上加硬件延时(并联一个小电容),但这会让安全信号变迟钝,不推荐。另一种是在程序里加“门盖信号确认延时”——门盖断开信号必须持续200ms以上才判定为真正的开门,短暂的震动引起的误触发会被过滤掉。我用T10/K2定时器做了这个延时,实测再也没出现过脱水中途停机的现象。

这个逻辑在工业安全里也有对应:急停信号或者安全门信号通常需要双通道确认,并且要采用“脉冲捕捉+持续判断”的方式来过滤抖动。不过要注意,安全相关的过滤延时不能加得太长,毕竟涉及人身安全,200ms已经是上限了。

6. 从洗衣机到工业现场:这个项目教会我的几件事

整套系统做完,洗衣机从按下启动按钮开始,自动完成进水、洗涤、排水、脱水的全流程,组态王画面上可以看到每一步的实时切换。洗衣机的“最强大脑”项目算是完整收官。回顾整个项目,除了PLC编程和组态王操作本身,我最大的收获是理解了顺序控制系统的工程化落地方法。

第一,状态机的思维方式比任何指令技巧都重要。不管是写STL程序还是在组态王里做画面,心里要始终清楚当前系统处于哪个状态、满足什么条件会进入下一个状态、异常时能回到哪个安全状态。状态清晰了,程序结构自然清晰。

第二,I/O规划的颗粒度决定了项目的可维护性。预留的每个输入输出点、每一路隔离、每一个指示灯,在调试阶段都会变成救命稻草。尤其是输出隔离,千万不要省。

第三,上位机和下位机联调时,先分了通信、再分变量、最后分逻辑。组态王通信不上就先测试设备;变量对不上就逐项核对变量名和地址;逻辑乱了就靠PLC的在线监视和组态王的动画逐条比对。

最后再说一个小技巧:做这类改造项目时,别急着把原洗衣机的接线全部剪掉。先拍照、做标记、画出原始接线图,再动手拆。我在改线过程中,就因为最开始拍了照片,后来好几处拿不准的地方都能回去翻原图对应,少走了很多弯路。这台洗衣机现在已经稳定跑了几个月,日常使用完全正常,而且通过组态王我看到它每次洗衣服的精确耗时,还能按需调整水流节奏和漂洗次数——这是原厂控制板永远给不了的自由度。

如果你手头也有闲置PLC和旧家电,完全可以照着这个思路给自己的设备升级一下。不用贪大求全,从一个简单的顺序控制开始,把状态机、定时器、通信、组态这些基本功练扎实,这套方法放到任何工业项目里都能直接套用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 6:36:40

VISA仪器控制例程详解:从环境搭建到实战排坑

简介:VISA控制仪器的例程是一份针对测试测量与自动化领域的VISA编程实例包,面向需要控制USB、LAN、GPIB、COM接口仪器的开发者。包内共15个文件,压缩后195KB,包含C源代码文件、Visual C工程文件(dsp/dsw)、…

作者头像 李华
网站建设 2026/9/9 6:35:56

大模型API报错排查指南:401/403/404/429/500状态码一次讲清

深夜两点,告警群里突然刷出一排报错日志,清一色全是401。我第一反应是API Key过期了,翻了一圈配置却发现Key根本没换,最后查出来是服务重启后环境变量没加载进来。这种场面,接过大模型API的开发者十有八九都经历过。大…

作者头像 李华
网站建设 2026/9/9 6:35:47

水洼个数:DFS、BFS与并查集三种解法详解

水洼个数,一道练DFS/BFS/并查集的好题“3378:练65.1 水洼个数”,如果你是在信息学竞赛教材或者OJ题库上看到这个编号,那大概率是经典题 Lake Counting 的变体。题目本身不复杂,给一个 N 行 M 列的网格图,每…

作者头像 李华
网站建设 2026/9/9 6:35:13

MODBUS RTU调试实战:从协议原理到freemodbus移植

1. 为什么MODBUS至今仍是嵌入式现场调试的“硬通货”?你手头那块刚焊好的STM32F103开发板,串口线一插,示波器上跳着不规则的方波,Modbus Poll发出去的0x03读寄存器请求在Wireshark里抓不到回包——这时候翻遍Keil工程里的freemodb…

作者头像 李华