先交代下背景:我平时的正经工作是做工业自动化方案,PLC、HMI、伺服、变频器才是日常打交道的东西。前阵子家里老洗衣机退役,我本来是想直接扔的,但转念一想——这台机器里有电机、有加热管、有进水阀、有排水泵、有水位开关,简直就是一台缩水版的工业控制对象。于是我做了一个决定:不拆了卖废铁,直接把它改成一套以西门子S7-1200为大脑、博途V16作为编程平台的魔改洗衣机,顺便当一次PLC实战项目来练手。
这个项目本身并不复杂,但胜在覆盖面广。你写梯形图、做SCL状态机、调PID、组态HMI、处理变频器通信,甚至排查强电干扰,全都能在这台洗衣机上练一遍。所以最终的文章不光是“怎么给洗衣机写程序”,更偏向一套“零风险版工业自动化入门实战方案”。不管你是刚学PLC想找项目练手,还是想把手里的老旧家电废物利用,这篇内容应该都能给出不少可复现的思路。
1. 项目整体设计思路与方案选型
1.1 为什么选“洗衣机”当PLC实验对象
很多想练PLC的人会陷入一种困境:没有实际设备。只能用仿真软件、只能写写练习程序,但PLC最核心的竞争力在于“接上真实传感器、驱动真实执行机构”,而洗衣机天然具备这一点。
普通波轮洗衣机内部的执行机构包括:进水电磁阀、排水电磁阀(或排水泵)、洗涤电机、加热管(滚筒机型常见)、蜂鸣器,以及门锁开关、水位传感器、温度传感器等输入设备。这些东西和工业设备的构成几乎一一对应:电机就是变频电机,水位开关就是液位开关,加热管就是温度控制负载。换句话说,洗衣机是一台“五脏俱全”的微型工业设备。
另一个好处是安全风险相对可控。洗衣机的功率一般几百瓦到两千瓦,电压是220V交流,工业上大功率设备动不动就是380V、几十千瓦,相比之下洗衣机的电流和功率小得多,只要用规范的断路器和漏保做保护,调试风险在可接受范围内。这让我这种喜欢折腾的人能放心下手。
1.2 改造方案怎么定:保留机械,替换控制
改造前我先通电试了一下老洗衣机,机械部分没问题,电机能转,只是老式电脑板出了故障。这就给了我一个非常明确的思路:整机机械结构不动,只把原来那块电脑控制板替换成PLC,用一个工业人机界面来操作它。
我把方案拆成了三条主线:
第一是硬件通道:你需要清楚原来洗衣机的控制板分别把哪些信号接进了什么负载。比如进水阀是不是220V驱动,电机是单向还是双向,有没有测速装置。这些都直接决定PLC的输出模块选型以及要不要额外加电柜里的中间继电器。
第二是控制程序:洗衣逻辑从“厂家固化在单片机里的代码”移植到“自己写的PLC程序”中。这里最关键的是设计一个完整的洗涤流程状态机。进水、洗涤、排水、脱水、漂洗、再脱水,每一步之间都有严格的转换条件,和工业自动化里常见的灌装线、包装线流程控制如出一辙。
第三是人机交互:原来的旋钮+指示灯改成触摸屏。西门子Smart 700 IE或者KTP系列都行,配博途V16也能直接组态。触摸屏能显示剩余时间、当前流程,还能调整洗涤时间、漂洗次数,对这个项目来说体验感提升明显。
方案确定后,我列出了物料清单:
| 部件 | 型号/规格 | 用途 |
|---|---|---|
| PLC | S7-1200 CPU 1214C DC/DC/DC | 主控制器,自带14DI/10DO |
| HMI | KTP700 Basic 或 Smart 700 IE | 状态显示、参数设置 |
| 变频器 | 0.75kW单相220V输入 | 驱动洗涤电机(旧机器使用串激电机时需要额外考虑) |
| 中间继电器 | 24V线圈,220V触点 | PLC输出带强电负载时隔离 |
| 开关电源 | 24V/2A | 给PLC、HMI、传感器供电 |
| 断路器、漏保 | 2P 10A、30mA漏电 | 整机电源保护 |
| 水位传感器 | 原机拆机 | 检测水位 |
| 温度传感器 | 原机拆机(热敏电阻) | 水温检测 |
实际选型时我用的CPU是1214C DC/DC/DC,选DC输入DC输出的原因很简单:一方面它可以直接拿开关电源的24V做输入检测,另一方面我用中间继电器转接220V负载,PLC输出端子不直接碰强电,安全系数高很多。
注意:如果你的洗衣机电机是变频电机(现在很多滚筒洗衣机都是),那可以省掉变频器的选型,直接用原机驱动板配合PLC的启停信号来做。但老式波轮洗衣机大多是串激电机,直接用可控硅调速或变频器驱动需要看电机类型,这个后面会详细说。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 博途V16环境准备与程序架构设计
2.1 博途V16的安装与基本配置
博途V16是西门子TIA Portal较经典的版本,支持S7-1200/S7-1500的固件4.0以上版本,也能组态WinCC面板。相比V15,V16在编译速度、SCL语言支持、HMI变量表集成方面都有明显改进,对中小型项目体验很好。
安装博途V16时我踩过一个坑:安装包默认会一块儿装很多功能,如果你只做S7-1200项目,完全没必要全选,否则安装时间会拉得非常长。正确做法是在安装组件里只勾选“STEP 7 Professional”和“WinCC Professional(或WinCC Basic)”,其他通讯驱动按需勾选。系统要求是Windows 10 64位专业版,建议至少16GB内存,8GB跑大型项目可能会卡到怀疑人生。
项目创建好之后,第一个动作是添加设备和网络。在左侧项目树里选择“添加新设备”,控制器选“SIMATIC S7-1200”,我用了CPU 1214C DC/DC/DC,固件版本选V4.4。HMI添加KTP700 Basic。
组态时最容易被忽略的是PLC和HMI之间的连接。博途里需要在“设备和网络”视图中把PLC的以太网口和HMI的以太网口用一条“网络连线”连起来,或者都加到同一个子网里。如果没做这一步,哪怕后面变量表配好了,HMI也读不到PLC的数据。这个操作很多人第一次搞都会漏,连不上时先回这里看一眼。
2.2 程序架构:把洗衣服拆成“状态机”
有了环境,第二步就是程序架构设计。对于这种流程型控制项目,我强烈建议不要把所有逻辑全部堆在OB1里用梯形图硬写,那样后期调试会非常痛苦。
洗衣机的工作流程是典型的顺序控制:待机 → 进水 → 洗涤 → 排水 → 脱水 → 漂洗 → 排水 → 脱水 → 结束。这种流程用“状态机”来表达再合适不过。我在博途里建了这些程序块:
| 程序块 | 类型 | 作用 |
|---|---|---|
| OB1 | 组织块 | 主循环,调用所有FB和FC |
| OB100 | 启动组织块 | 初始化状态字、标志位、时间值 |
| FB1 “Laundry_Main” | 功能块 | 洗衣主流程状态机 |
| FB2 “Temp_Control” | 功能块 | 水温PID控制 |
| FB3 “Motor_Control” | 功能块 | 电机启停、正反转、脱水逻辑 |
| FC1 “Alarm” | 功能 | 故障报警汇总 |
| DB1 “Recipe” | 全局数据块 | 存放洗涤参数(时间、水位、次数) |
| DB2 “Status” | 全局数据块 | 存放状态字、运行模式、报警字 |
之所以区分这么细,是因为后期调试时可以单独监控某一个FB的输入输出,快速定位问题。比如脱水转不起来,只看FB3里的状态变量就够了,不需要在一大堆梯形图指令里翻。
状态机的核心是一个整型变量“Step_No”,每个值对应洗衣流程中的一步。我在FB1里用SCL写状态跳转,用梯形图写输出逻辑,两种语言配合用:
scl复制IF #Run_Command AND NOT #Step_Running THEN
#Step_No := 10; // 进入进水阶段
#Step_Running := TRUE;
END_IF;
CASE #Step_No OF
10: // 进水
#Valve_Inlet := TRUE;
IF #Water_Level_High THEN
#Step_No := 20; // 水位到位,进入洗涤
END_IF;
20: // 洗涤
#Valve_Inlet := FALSE;
#Motor_Command := #Wash_Mode;
IF #Wash_Timer.Q THEN
#Step_No := 30; // 洗涤完成,进入排水
END_IF;
30: // 排水
#Motor_Command := 0;
#Valve_Drain := TRUE;
IF #Water_Level_Low THEN
#Step_No := 40;
END_IF;
40: // 脱水
#Valve_Drain := FALSE;
#Motor_Command := #Spin_Mode;
IF #Spin_Timer.Q THEN
#Step_No := 50;
END_IF;
END_CASE;
这个结构最大的优势是逻辑清晰、易于排查。状态转换条件全部集中在同一个CASE语句里,哪个环节不动,直接看Step_No卡在哪个值,再排查对应条件即可,不用整页整页翻梯形图。
梯形图在这个项目里的定位是输出驱动。比如把“进水阀”、“排水阀”、“电机正转”、“电机反转”这些输出单独用梯形图写,根据Status里的标志位来置位,这样在监控表里一目了然。SCL适合写流程,梯形图适合写触点输出,两者结合是工程上常见的做法。
3. 硬件接线与PLC选型实操
3.1 硬件选型与IO分配
我最终用的IO分配如下表:
| PLC地址 | 注释 | 信号类型 |
|---|---|---|
| I0.0 | 启动按钮 | DI |
| I0.1 | 停止按钮 | DI |
| I0.2 | 高水位开关 | DI |
| I0.3 | 低水位开关 | DI |
| I0.4 | 门锁反馈(门关好) | DI |
| I0.5 | 温度传感器(PT100/热敏电阻) | AI |
| Q0.0 | 进水阀 | DO |
| Q0.1 | 排水阀 | DO |
| Q0.2 | 洗涤正转继电器 | DO |
| Q0.3 | 洗涤反转继电器 | DO |
| Q0.4 | 脱水变频器启动 | DO |
| Q0.5 | 加热管继电器 | DO |
| Q0.6 | 蜂鸣器 | DO |
这里有个细节要特别说明:为什么用“PLC DO + 中间继电器 + 负载”的三级结构,而不是PLC输出直接驱动220V负载?虽然S7-1200晶体管输出本身也能接一定的负载,但考虑到洗衣机的进水阀、排水泵、电机这类强电感性负载在通断瞬间会产生很高的反向电动势,如果不做隔离,轻则干扰PLC程序跑飞,重则直接击穿输出晶体管。中间继电器在这里不仅解决电平转换,还天然提供了一个物理隔离层。
如果你手里是继电器输出的PLC(比如S7-200 SMART的继电器版本),理论上可以直接驱动220V负载,但我依然建议加一级中间继电器。原因很简单:PLC输出继电器触点容量有限,频繁通断大电流感性负载会缩短寿命,换一个中间继电器几块钱,换一个PLC输出模块就不是这个价了。
关于“PLC输出端接隔离二极管怎么接”这个热搜问题,在这类项目里很常见。接法是在感性负载(比如继电器线圈、接触器线圈)两端反向并联一个续流二极管,注意方向:二极管的阴极接电源正极,阳极接电源负极。当线圈断电时,反向电动势会通过二极管形成回路消耗掉,保护输出触点和驱动三极管。实际接线时许多人会接反,一旦接反等于短路,上电就烧管子,所以这一步要格外谨慎。
3.2 接线改造完整记录
洗衣机的原始接线相对简单:一根电源线进去,控制板分别接到进水阀、排水阀、电机、门锁等部件。我的改造流程分四步:
第一步:断电拆机,标记原线。 把洗衣机控制板拆掉之前,用标签纸把每根线接到哪里、什么颜色、什么功能都记下来。这一步是最容易被忽略但最关键的。老洗衣机线束颜色经过多年使用可能已经褪色,不标记后面绝对会接错。我标记的时候会连接线端子的插针位置也拍照存档。
第二步:搭建强电回路。 220V电源进来先经过2P断路器和漏电保护器,再分给各负载支路。每个支路都用一个中间继电器的常开触点来控制通断。我把这些继电器安装在一块小DIN导轨上,导轨固定在一块绝缘板上,再放进一个小的仪表电柜里。虽然占地方,但裸露的强电端子全部被电柜挡住,安全性高得多。
第三步:部署弱电控制系统。 PLC、24V开关电源、HMI安装完毕。PLC端子的接线顺序我习惯按IO表来,输入一类、输出一类分开走,每一根线都用线号管打上标签。博途里组态时的IO地址和标签必须和实际接线一一对应,这点尤其在调试时能省大量时间。
第四步:连接变频器(如电机是交流异步电机)。 如果洗衣机电机是单相异步电机,可以直接用继电器切换电容方向实现正反转;如果换成三相电机加变频器,那么可以通过变频器数字量端子来控制启停,PLC就只给干接点信号,转速给定则通过模拟量输出。这个方案的好处是可以实现洗涤和脱水阶段不同的转速,用起来更接近工业设备。
我这次用的是原机串激电机,所以做了个调整:保留原机可控硅调速板,PLC通过继电器控制它的电源通断和方向切换。这个方案比较务实,串激电机直接上变频器会有很多兼容性问题,强行搞投入产出比太低。如果你对电机调速有更高要求,建议直接换一台三相异步电机配一个0.75kW变频器,成本大概在六七百块,调试难度也不高。
重要提示:整个强电部分操作时必须断电进行,接线完成先用万用表挨个检查通断,确认没有短路再接电源。洗衣机内部空间狭小,所有接线端子要固定好并做好绝缘,裸露铜线是绝对不允许的。
4. 核心程序与HMI组态实现
4.1 洗衣流程状态机实现细节
刚才说了程序用状态机,现在展开讲一下每个环节的实现细节。
进水阶段(Step_No=10):进水阀输出置位,同时监控“高水位开关”和“进水超时”。如果从开始进水后10分钟内高水位开关还没动作,说明水管没开或者水位开关故障,程序要进入报警状态,停止进水并蜂鸣器提醒。这个超时保护在工业设备里叫“安全联锁”,在洗衣机逻辑里同样必要,防止地面积水成河。
洗涤阶段(Step_No=20):洗涤电机正转5秒,停2秒,反转5秒,形成一个循环。这不是简单的电机一直转,而是模仿波轮洗衣机的揉搓动作。我用了两个TON定时器:一个设定正转时间,一个设定停歇时间,两个定时器各自的输出控制正转和反转的“允许标志”。注意:正转和反转绝不能同时激活,电气逻辑上我在梯形图里加了互锁:
ladder复制// 正转输出条件
正转允许 AND NOT(反转允许) => Q0.2
// 反转输出条件
反转允许 AND NOT(正转允许) => Q0.3
这段互锁逻辑在PLC程序里必须有,继电器硬接线上也要做互锁。双保险就是为了防止哪怕只有一个条件异常时,电机上下绕组不会同时通电烧毁。
洗涤次数的计数用了CTU计数器,每个洗涤循环结束加1,计数值达到设定时跳出洗涤阶段进入排水。
排水阶段(Step_No=30):进水阀关闭,电机停止,排水阀打开,等待低水位开关信号。低水位开关的安装位置一般在洗衣机桶底部,水排干净后动作。如果排水阀打开5分钟后低水位还没动作,需要考虑排水管堵了,程序报“排水故障”。
脱水阶段(Step_No=40):这部分是安全要求最高的。脱水时电机高速旋转,这时候门锁必须处于闭合状态。我在程序里加了一道保护:门锁反馈信号I0.4必须为TRUE,否则不允许进入脱水,并报警。这是模拟工业设备上的“安全门联锁”逻辑,和冲床安全门、机器人围栏门的原理完全一致。
脱水电机启动前,程序还加了3秒的“启动延时”——先让电机以中速启动,等到稳定后再切高速。这个思路来自变频器启动方式的启发,防止衣物偏心导致剧烈晃动。对串激电机方案来说,启动延时就等于先给可控硅一个较小的导通角,让电机慢慢转起来。
整个状态机跑起来后,我用博途的“监控表”功能观察每一步的状态位,Step_No从10到40按顺序跳转,和设计完全一致。
4.2 温度PID控制与触摸屏联动
洗衣机加热功能是这个项目里最有“工业味”的部分。滚筒洗衣机在洗涤阶段需要把水温加热到设定值(比如40℃),这与工业上恒温控制非常相似。我用了PID控制方案,这样做的不只是“到温度就断电”,而是让水温平滑靠近目标值,避免温差波动大。
S7-1200里调用PID控制很方便,博途的指令列表里有PID_Compact,组态时选择温度作为过程值,输出给加热管继电器的PWM信号。我设置PID参数时用了经验法整定:先设P=10、I=0、D=0,观察温度曲线,发现超调较大;然后增大I到0.5消除静差,最终得到一个比较平缓的升温曲线。
温度反馈用的是洗衣机原机里的热敏电阻,通过分压电路接到CPU的AI 0(0-10V输入)。热敏电阻在不同温度下阻值变化明显,我在博途的“缩放”指令里做了线性换算,把采样电压转换成实际温度值。如果用的是PT100,就需要配一个热电阻变送器,将电阻变化转成4-20mA标准信号,再接AI模块。
HMI的联动是个重点。为了让触摸屏能设置洗涤温度,我在DB里定义了一个变量“Set_Temp”,HMI画面里添加IO域绑定这个变量。用户在触摸屏上输入目标温度,PID控制块就直接读取更新值。同样,洗涤时间、漂洗次数、正反转周期这些参数都定义为DB变量,全部在HMI上可调。
这个“PLC程序内参数全部变量化、HMI负责可视化设置”的做法,本质上就是工业设备的人机交互界面开发方式。调试时不用反复改PLC程序下载,只改HMI上的数值就能调整整机行为,后期维护方便太多。
HMI画面我设计了四页:主页面(显示当前流程、剩余时间、状态指示)、参数设置页(洗涤时间、漂洗次数、温度等)、手动调试页(强制控制每个阀门和电机)、报警页(显示故障代码)。KTP700在博途V16里的组态也很顺,直接把DB变量拖到画面绑定即可,比老版本方便很多。
4.3 关于“TON定时时间如何通过触摸屏设置”的处理
很多人会在PLC讨论群里问“TON定时器的时间怎么用触摸屏来改”,这个问题在这个项目里正好碰到。正常情况下,你在FB里写一个TON的定时器,它的PT值是固定写死或者从某个内部变量读取的,如果想要HMI随时修改,主要有两种做法。
第一种是简单的“每次启动时复制”:在定时器启动前,把HMI设置的数值传送到定时器PT端,比如:
scl复制#Wash_Timer(IN := #Wash_Running,
PT := #HMI_Wash_Time * 1000,
Q => #Wash_Done);
这里#HMI_Wash_Time是从触摸屏读取的秒数,乘以1000转成毫秒给TON。注意TON的PT单位是毫秒,变量类型是TIME,直接赋值时要用乘法转换,否则会出现编译错误或数值对不上。
第二种是“运行中使用”:如果定时中途改时间希望立即生效,就不能用TON自带的PT,你需要用累计计时方式,比如自己累加一个毫秒计数器,每100ms加一次,再和目标值比较。这个方式更灵活,适合对时间精度要求高、支持中途改参数的场合。
实际项目里我用的是第一种,洗衣机流程中中途改时间的场景不大,在参数设置页改完保存,下次进水前就会用新值。如果你做的是输送线、喷涂设备之类需要实时整定时间的场合,建议用第二种。
5. 调试实录与常见问题排查
5.1 第一次上电碰到的问题
这个项目调试过程我攒了不少教训,挑几个典型的说。
第一个问题是电机抖动。 刚开始把程序下进去,启动洗涤模式后,电机抖动但不转动。当时我第一反应是程序正反转切换有问题,检查发现逻辑正常。后来用万用表量电压,发现可控硅调速板输出只有几十伏——原因是我把调速板的“公共端”接线方式和PLC输出接反了。原洗衣机控制板的公共端是220V火线,而PLC的公共端是24V直流,两者必须分开走,不能混用。我把电机回路改成“PLC输出 → 中间继电器 → 可控硅调速板控制端”之后,问题彻底解决。
这个问题的本质是“弱电控制强电的电气隔离设计没想清楚”。PLC的24V输出不能直接去开关220V回路,必须通过继电器或者其他隔离器件转接。初学者特别容易在这个环节犯迷糊,总想着“反正是开关信号,一样能通断”。不一样,电压等级和安全隔离决定了它们不能混接。
第二个问题是触摸屏时间不信任。 项目里我在HMI上放了当前时间显示,结果KTP700显示的时间老是不对,而且会提示“不信任PLC”。这个问题的实质是HMI和PLC的时钟不同步。博途里的处理方法是在HMI的“区域指针”中启用“日期/时间”功能,把它连接到PLC中的一个数据区,由PLC定时写入正确时间,HMI显示一律以PLC时间为准。另外如果KTP面板系统时间是初始时间,也需要在面板设置里手动校一次。
第三个问题刚开始最让我头疼:博途上传PLC程序提示设备不响应。 这个问题本质是PG/PC接口设置不对。第一次连S7-1200时,博途默认走PLCSIM虚拟接口,导致没法识别到真实PLC。解决办法是在“在线访问”里选择正确的网卡(比如Realtek的物理网卡),并把电脑IP和PLC IP设置在同一个网段,关闭Windows防火墙再试一次。还有一个小坑是S7-1200默认启用了防护等级设置,有时候上传会提示没有权限,这种需要在项目里先“在线访问 → 在线与诊断 → 防护与安全”里查看,如果启用了最高级保护,首次连接时得用原始的PLC访问保护配置来解除或调整。
5.2 常见问题速查表
我把调试过程中遇到并解决过的问题整理成了表格,方便以后做类似项目时直接翻:
| 问题现象 | 可能原因 | 处理办法 |
|---|---|---|
| PLC连接不上,下载程序超时 | 网卡选错/IP不在同一网段/防火墙拦截 | 查看在线访问选物理网卡,修改电脑IP为192.168.0.x,关闭防火墙 |
| 程序已下载,电机不转 | 输出接线错/中间继电器线圈坏/公共端混接 | 先看PLC输出灯是否亮,再看继电器是否动作,逐级排查 |
| 触摸屏读不到PLC变量 | 未组态网络连接/变量表连接错误 | 检查“设备和网络”中的子网连线,确认HMI变量连接到PLC的DB |
| 加热温度超调大 | PID参数不合适 | 减小P或增大I,先跑一次温度曲线再调 |
| 正反转同时动作 | 程序互锁没加/输出继电器粘连 | 梯形图加互锁,必要时在硬接线中加接触器互锁 |
| 进水超时报警 | 水压不足/进水阀卡住/水位开关坏 | 检查进水阀是否得电,用万用表量水位开关通断 |
| 脱水时剧烈振动 | 衣物偏置/转速升得太快 | 减少单次洗涤量,启动延时阶段适当延长 |
| 输出点烧毁 | 负载电流过大/感性负载无续流二极管 | 检查负载电流是否超PLC输出规格,感性负载两端加续流二极管 |
| HMI显示时间不准 | 时钟未同步 | 组态区域指针,开启日期时间同步,手动校准面板时钟 |
| 排线干扰导致PLC偶尔死机 | 强电弱电线束未分开 | 重新布线,强弱电分离并保持距离,必要时用屏蔽线 |
5.3 关于“博途上传PLC程序”和“PLC程序保护”的补充提示
博途V16除了上传下载,还有一个容易踩的坑就是程序保护。S7-1200从固件4.0开始支持“访问保护”和“防拷贝保护”。如果你从别人手里拿到一个上传的PLC项目,下载程序时提示报错,先看一下“在线与诊断”里是否设置了访问级别。而且博途下载程序到PLC时默认会要求“编译检查”,如果原程序和在线程序不一致,有时候会提示“模块未准备好下载”或“版本不兼容”。这种事在工业现场特别常见,处理顺序无非是:先“在线”读取设备信息,确认固件版本是否匹配,再到“下载”界面勾选“覆盖PLC上的所有数据”,如果还不行就做“恢复出厂设置”再重新下载。
这个项目里我用的是全新PLC,所以没遇到密码保护问题,但如果你拿着闲置的二手PLC试一试,大概率会遇到。切记不要试图破解密码,正规渠道是联系原项目所有方获取权限,或者更换PLC。安全上要强调:任何破解、绕过保护的行为,在工业环境和商业项目里都是不合规的,自己练手我更建议买一个全新的CPU,别在二手设备上折腾密码。
6. 项目扩展与个人体会
6.1 从洗衣机能延伸到哪些项目
这套系统改完,它就不再只是一台洗衣机,而是一台能反复折腾的PLC实验平台。基于同样的架构,你可以往很多方向扩展,这也是我当时做这个项目的初衷。
方向一:运动控制。 洗衣机的洗涤电机正反转控制,本质上就是最简单的位置/时间控制。如果换用步进电机或伺服电机,加上编码器反馈,就能做一个小型机械手或搬运装置的雏形,对应网上热门的“基于PLC的工业搬运机器人设计”“PLC控制气缸机械手”等方向。洗衣机的机架也可以作为机械手的底座,装一个小型气动夹爪就能演示取放料逻辑。
方向二:变频器通信。 把原来的串激电机换成三相异步电机,用变频器驱动,PLC通过Modbus RTU或者USS协议和变频器通信。改变频器频率实现不同转速,还能做“追剪”这类运动控制实验——洗衣机的滚筒回转可以模拟主轴,再加一根丝杆轴就能模拟追剪切割场景。热搜里有关“支持追剪的PLC”和“汇川PLC正弦运动”,实际上这个平台加一个编码器就能练习正弦加减速控制。
方向三:DCS/SCADA概念。 如果你再买一块西门子的IoT网关或者搭建一个OPC UA通信,就能让洗衣机的运行数据上传到上位机,用C#写一个采集程序或者在WinCC里做SCADA画面。我可以直接访问PLC里的DB块,读取洗涤温度、当前模式、累计运行时间等数据。这就是工业互联网里“设备数据上云”的本地版,概念完全一致。
方向四:安全逻辑练习。 把门锁开关、水位传感器、超时报警组合起来,你可以尝试按照国际安全标准设计一套安全回路。比如排水阀动作时禁止脱水、加热管工作时水位必须高于某个值、任何报警状态必须手动复位才能继续运行。这些逻辑在化工、食品设备里是刚需,在洗衣机上练好,面试时能直接讲出项目经验。
6.2 我做这个项目的几点实在感受
做完这个项目回头总结,我最想说的不是“博途V16有多强”,也不是“PLC学起来多简单”,而是几个更接地气的点。
第一,控制对象比软件重要得多。给洗衣机写程序,比纯练梯形图场景理解深太多。因为每一步控制背后都有物理对象在响应,你写完进水逻辑能听到电磁阀“咔哒”一声,写完排水逻辑能看到水真的被泵走。这种实感反馈是仿真软件给不了的,会让你的编程思路从“写指令”转变成“控制系统”。
第二,接线和程序是五五开的事情。很多初学PLC的人把90%精力花在编程语言上,忽略电气接线,结果一到实际项目就抓瞎——分不清公共端、不知道要加中间继电器、搞不定强电干扰。这个项目把接线和程序强制绑在一起,逼着你把整个信号链路打通,对综合能力的提升非常明显。
第三,多利用模块化思维。我在项目里把每个功能都封装成独立FB,最后主循环OB1只有几行调用代码。很多人写PLC程序喜欢全塞在OB1里,那时候你没觉得有什么问题,等你写第二个项目、第三个项目,想把之前的状态机逻辑复用过来时,才会发现没有模块化设计的代码根本没法复用。这个洗衣机的FB1、FB2、FB3完全可以整体复制到下一个项目中,改成水泵控制、传送带控制等类似的顺序控制项目,只修改IO映射即可,复用性极高。
最后分享一个实用小技巧:在这个项目里,我单独建了一个“手动调试”页面,可以在HMI上强制打开或关闭每一个输出点。调试时先手动操作,确认每个执行机构的接线、方向都正确,再切换到自动运行模式。这一步看起来简单,但能帮你区分“硬件问题”还是“程序问题”,在工业项目调试中属于必做动作,养成习惯后会非常受益。
如果你手头也有一台退役的旧洗衣机和一套闲置的PLC,不妨试试这个改造方案。整机投入不算高,但能让你把博途V16编程、HMI组态、电气接线、变频器调试、PID整定这些技能一次性串起来实践一遍。真把这套项目做完、做透,再回头看市面上的PLC培训课程,你会觉得很多内容其实都已经被你实操过了。
