1. 为什么盯上洗衣机:用PLC重写家庭设备的底层逻辑
1.1 洗衣机本身就是一台微型工业设备
先把话说在前面:我干这件事不是闲的,而是因为洗衣机这个品类的控制逻辑,几乎能覆盖PLC入门到进阶的所有核心知识点。你拆开一台滚筒洗衣机,看它的外围设备:进水阀、排水泵、门锁、水位传感器、温度传感器、加热管、主电机、变频器,甚至有些还带烘干风机。这配置放在工厂里,就是一套典型的小型自动化产线。原厂控制板里藏着的是一颗单片机加继电器,逻辑写死在固件里,你想改一个脱水转速或者漂洗次数,只能按面板上那几颗按键,更多时候根本动不了。
我当时的想法很简单:把这台洗衣机的原装控制板整个摘掉,换成一套以西门子S7-1200为大脑的PLC控制系统,用博途V16写一套属于自己的控制程序。这样洗衣机不再是一台只能按固定流程跑的家电,而是一台可以自由编程、随时监控、还能扩展外部设备的实训平台。说白了,就是让洗衣机“学会”PLC的语法,反过来也让我把PLC的语法彻底吃透。这个项目做完之后,你会发现,工厂里那些机械手、传送带、气缸控制,底层逻辑和洗衣机洗衣服是一模一样的:传感器给信号,PLC做判断,输出驱动执行机构,中间加定时器、计数器、比较指令,再加上状态机做流程切换。
1.2 改造前必须想清楚的需求边界
动手之前,最忌讳的就是上来就拆。我见过不少人把洗衣机拆得稀巴烂,结果发现连原装线序都没拍照,最后装不回去。所以第一件事是明确改造需求:我到底要做到什么程度?
我把需求分成三档:
- 基础档:能实现标准洗涤流程,包括进水、加热、洗涤、排水、脱水,并且能在触摸屏上切换程序、显示当前状态。
- 进阶档:电机用变频器驱动,实现无极调速;水位和温度用模拟量模块采集,而不是开关量;程序里面加入子程序和中断,模拟工业项目的架构。
- 扩展档:预留数字量输入输出和通讯接口,后续可以接气缸机械手、搬运机构,甚至和另一台PLC做 PROFINET 通讯,把这套系统变成一个小型工业机器人演示平台。
我最终选择把目标定在进阶档,同时预留扩展空间。这里有个很关键的取舍:原装控制板上的驱动电路、三端稳压、电源模块,能不拆就不拆,尤其是电源部分,220V转5V和24V的电路,直接沿用可以省掉很多麻烦。但继电器、晶闸管这些负载驱动部分,全部由PLC的输出来控制,中间加中间继电器隔离。这个选择是出于安全考虑,也方便后续排查故障。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件选型与接线:从原装控制板到PLC控制柜
2.1 选型思路:S7-1200配变频器是性价比之王
PLC型号我选了西门子S7-1200 CPU 1214C DC/DC/DC。为什么选它?因为博途V16对S7-1200的支持非常成熟,模拟量板卡、通讯板卡选择也多,而且CPU本体自带14路数字量输入和10路数字量输出,对于洗衣机这个规模刚好够用。如果输入输出不够,还可以加SM1231模拟量模块和SM1223数字量混合模块。我第一次组态的时候只用了本体,后面加扩展模块是因为想接模拟量水位传感器和温度传感器,本体没有模拟量输入,必须加模块。
电机驱动方案我纠结过一阵子。原装电机如果是串励电机或者普通交流异步电机,直接用变频器驱动最省事。我手上这台是变频电机,原装控制板里本身就带变频驱动模块,但那个模块不接受外部直接控制,所以我干脆单独买了一台西门子V20变频器,功率0.75kW,完全覆盖洗涤电机和脱水电机的需求。V20和S7-1200之间用USS通讯,两根线搞定,比模拟量调速更稳定,还能读回实际电流和频率。
整套系统的主要硬件清单:
| 硬件 | 型号/规格 | 作用 |
|---|---|---|
| PLC | S7-1200 CPU 1214C DC/DC/DC | 主控逻辑 |
| 变频器 | 西门子V20 0.75kW | 电机驱动与调速 |
| 触摸屏 | 西门子KTP1200 Basic | 人机交互 |
| 中间继电器 | JQX-13F 24V线圈 | 输出隔离 |
| 进水阀 | 原装220V交流电磁阀 | 进水控制 |
| 排水泵 | 原装220V交流排水泵 | 排水控制 |
| 门锁 | 原装PTC门锁 | 门状态检测与锁定 |
| 水位传感器 | 原装压力式水位传感器 | 水位检测 |
| 温度传感器 | PT100加变送器 | 温度检测 |
| 开关电源 | 明纬24V/5A | 给PLC和传感器供电 |
这里特别提醒一句:不要直接拿PLC的24V输出脚去驱动220V负载。PLC数字量输出的负载能力有限,而且感性负载断开瞬间会产生很高的反电动势,容易打坏输出点。正确做法是PLC输出驱动中间继电器线圈,中间继电器触点再去控制接触器或直接控制220V负载。如果原装负载里面有大电容或者启动电流大的元件,还要在继电器触点两端并联RC吸收回路。
2.2 关键接线与电气保护
接线是这种改造项目最容易翻车的地方。我踩过的坑,第一条就是没做电源隔离。洗衣机的变频器工作的时候,会产生很强的电磁干扰,如果PLC的24V电源和变频器共用一个开关电源,很容易出现PLC随机死机、模拟量数值跳变。后来我把PLC单独用一块明纬24V电源供电,变频器用另一块,两块电源的0V在控制柜端子排上单点连接,问题立刻消失。如果你改造时发现触摸屏和PLC通讯偶尔断开,优先怀疑电源干扰。
另外,数字量输入端子上,原装的干簧管水位开关、门锁开关都是无源触点,可以直接接PLC输入。但温度传感器如果是PT100,必须接模拟量输入模块,不能直接接到数字量输入。我用的方案是PT100加一个温度变送器,输出4-20mA信号给SM1231模拟量模块,然后在博途里做量程转换。工业现场也经常这么干,统一用4-20mA电流环抗干扰能力强。
2.3 输出端接隔离二极管到底怎么接
这个点经常有人问,我在改造时也遇到了。洗衣机里面有排水泵、进水阀、门锁这些电感负载,PLC输出点如果直接驱动中间继电器,继电器线圈是感性负载,断电瞬间会产生反向感应电动势,很可能超过PLC输出晶体管的耐压。解决办法就是在继电器线圈两端反向并联一个续流二极管,注意二极管的方向:二极管负极接电源正极,二极管正极接电源负极,也就是和线圈并联,但是方向必须反着接。如果接反了,通电瞬间就相当于短路,直接烧输出点。
具体接线就是继电器的A1接PLC输出点,A2接24V公共端,然后在A1和A2之间并联一个1N4007以上规格的二极管,负极接A1,正极接A2。别小看这个小东西,我刚开始偷懒没加,烧了两个输出点,换上去之后稳如老狗。如果你用的是继电器输出型PLC,内部是机械触点,就不需要续流二极管,但为了延长触点寿命,也可以在外部并联RC吸收电路。
3. 博途V16软件组态:从零开始建工程
3.1 创建项目与设备组态
博途V16这个软件,刚接触的时候会觉得界面很重,但只要建过一两个项目,后面就顺了。第一步是打开TIA Portal V16,选择“新建项目”,起个名,我习惯用“Washing_Machine_PLC_V1”。接下来在项目树里点击“添加设备”,选择控制器类型为CPU 1214C DC/DC/DC,这里要注意你手里CPU的版本号,固件版本和博途组态版本不一致的话,下载程序时会有提示,建议组态时直接选你实际的固件版本。
设备组态界面里,需要把扩展模块从右侧硬件目录拖到PLC左侧的槽位上。SM1231模拟量输入模块一般插在CPU左边第一个槽位,组态时它会自动分配I/O地址。我用的SM1231是4通道模拟量输入,两个通道接水位变送器,两个通道接温度变送器。组态完成后要在模块属性里把通道类型选为“电流”或者“RTD”,量程选“4-20mA”,这样程序里就能直接读到0到27648的原始值。
创建完设备和网络组态,接下来就要配置USS通讯。双击CPU,在属性里找到“接口参数”,分配一个PROFINET IP地址给PLC。V20变频器需要接一个RS485通讯模块之后,再用双绞线连到S7-1200的通信板CB1241上。在博途里需要调用USS_PORT和USS_DRV指令,这个后面细讲。这里先提醒一句:USS指令不是默认就有的,需要在全局库或者扩展指令里找到,有些版本还需要单独安装西门子驱动库。
3.2 模拟量归一化和量程转换
洗衣机的核心控制离不开水位和温度这两个模拟量。水位传感器输出的是4-20mA电流,对应0到100厘米水柱压力,而PLC模拟量模块读到的是0到27648的原始整数。程序里必须先把原始值转换成真实工程量,才能做比较和PID控制。转换公式很简单:
工程量 = (原始值 - 量程下限原始值) / (量程上限原始值 - 量程下限原始值) * (工程量上限 - 工程量下限) + 工程量下限
比如4-20mA对应原始值0-27648,工程量0-100,那么50厘米水位就是原始值13824。我在OB1里写了一个转换子程序,输入是模拟量通道地址,输出是水位百分比。这样后面写逻辑的时候,直接拿百分比比较,不用对着27648这种大数算来算去。
温度变送器输出4-20mA对应0-100摄氏度,也是同样的标定方法。这里有个细节:模拟量模块的输入接口如果不用,要给通道加上量程卡匹配,否则读数为随机值。S7-1200用的SM1231没有量程卡,直接在组态属性里选择电流类型就行,这个比S7-300简单很多。
3.3 程序块规划:主程序、子程序、中断
写程序之前,先把程序架构想清楚。我参考了工业项目的习惯,把程序分成几层:
- OB1主程序:负责调用各个功能块,相当于大脑的调度中心。
- FC功能子程序:比如“进水控制”“排水控制”“电机控制”“温度控制”,每个功能封装成一个独立的FC,输入输出定义好接口,方便调试和复用。
- OB中断组织块:用定时中断处理高速计数或模拟量采样,我这里用循环中断OB32做每100ms采一次模拟量,保证水位响应及时。
- DB数据块:把所有设备状态、设定值、报警标志集中存放在一个全局DB里,触摸屏读写也访问这个DB,避免地址满天飞。
这种架构最大的好处是:程序看起来不像一潭死水,而是像一套模块化的系统。洗衣机进水、排水、洗涤、脱水,每个阶段该调用哪个FC一目了然。以后你想把这套逻辑改成控制气缸机械手,只需要把执行机构映射到输入输出点,大部分逻辑都能复用。
4. 梯形图程序实现:把洗涤流程写成状态机
4.1 门锁与水位:安全联锁是第一步
洗衣机程序里最不能含糊的是安全逻辑。门锁没锁好,绝对不能启动脱水,否则高速旋转时甩出衣服还是小事,伤到人就是大事。这里我用了一个简单的互锁网络:门锁开关信号I0.0,当门关好并且锁舌到位时,I0.0为ON,此时才允许启动电机。门锁输出Q0.0会联动一个PTC发热元件,让门锁在洗涤过程中保持锁定,直到程序流程结束或断电。门锁没到位时,程序会置位一个报警位,触摸屏上弹窗提示。
水位控制我用的是模拟量比较。假设设定水位为60厘米,进水阀打开后,水位慢慢上升。程序里用了一个比较器:当前水位小于设定水位-5厘米时,进水阀Q0.1置ON;大于等于设定水位时,进水阀置OFF。这里加了一个5厘米的回差,避免水位在临界点反复抖导致进水阀频繁开关,这其实也是工业PID控制里防振荡思想的简化版。
4.2 电机控制:正反转、调速与变频器通讯
洗衣机主电机的控制是重头戏。洗涤时电机需要正转、停、反转、停,循环进行,脱水时则要高速连续运转。我通过USS_DRV指令控制V20变频器,程序里通过改变频率设定值来实现低速洗涤(30Hz)和高速脱水(80Hz)。
USS指令的用法其实不复杂。USS_PORT负责建立串口通讯,需要在OB100初始化块中设置波特率9600、奇偶校验等参数。USS_DRV是驱动器控制指令,需要给每个驱动器分配一个唯一的站号。每个扫描周期都要调用一次USS_PORT,不用变频器时我就让使能位为0,但通讯仍然保持。
电机正反转的实现,不是通过变频器换向,而是通过输出继电器切换电机主回路的相序。洗衣机电机的转向控制,其实有两种做法:一种是PLC输出两个中间继电器,一个接通正转接触器,一个接通反转接触器,两个接触器互锁;另一种是变频器自身带正反转端子。我选择了前者,因为更直观。程序里正反转输出绝对不能同时为ON,所以在梯形图里加了互锁:Q0.2是正转接触器,Q0.3是反转接触器,Q0.2线圈回路里串了Q0.3的常闭触点,Q0.3线圈回路里串了Q0.2的常闭触点。
4.3 定时器TON的高级用法:通过触摸屏在线修改时间
洗涤程序里的浸泡时间、正转时间、反转时间、排水时间,全都是定时器。博途里的TON定时器,默认的定时时间是在程序里写死的。但实际洗衣服的时候,你可能想根据衣服材质随时调整洗涤时间,这时候就需要把定时器的PT引脚连到一个数据块变量上,触摸屏通过这个变量在线修改。
具体做法:在全局DB里建一个变量,比如DB2.WashTime1,类型Time或者Time_Of_Day。然后在定时器TON的PT端子填“DB2.WashTime1”,这样触摸屏上改了这个变量,程序里的定时时间就会跟着变。要注意的是,博途里Time类型显示为T#5S这种格式,触摸屏上如果直接关联Time类型,会显示成整数格式,容易看花眼。我建议在DB里使用DINT类型存“毫秒数”,触摸屏上显示为整数秒,然后在PLC程序里用“毫秒除以1000”转成Time类型,这样人机交互更友好。
4.4 子程序与中断的合理使用
很多PLC学习者分不清子程序和中断的区别,这次我也特意把两者都用上了。子程序FC是“需要时被调用”,比如进水控制这个FC,只有在洗涤程序进入“进水阶段”时才会被调用。而中断OB是“到了规定时间自动执行”,比如我用OB32循环中断,每100ms刷新一次模拟量输入,并做水位、温度的超限检查。不管主程序跑到哪一步,中断都会插进来执行,这保证了模拟量采样的实时性。
中断程序里不适合写太复杂的逻辑,因为每次中断都会抢占主程序扫描周期,写多了会拖慢系统。我就在中断里做了模拟量归一化和报警判断,核心流程还是在OB1里做状态机。
5. 触摸屏与上位机联动
5.1 KTP1200与S7-1200的通讯设置
改造完PLC程序,没有触摸屏的话,调试非常痛苦。我配了一块西门子KTP1200 Basic触摸屏,通过PROFINET和S7-1200通讯。在博途里,触摸屏组态很简单:在设备树里添加一个KTP1200 Basic,设置好IP地址,和PLC的IP保持在同一网段,然后在连接属性里指定通信伙伴为CPU1214C,系统会自动建立HMI连接。
KTP1200的优点是组态方便,缺点是价格不便宜。如果你是想省钱做实验,用国产触摸屏比如威纶通或者昆仑通态MCGS,完全没问题。威纶通驱动里直接选Siemens S7-1200以太网,填上PLC的IP地址就能通讯,不需要导入GSD文件。MCGS也类似,但是要注意博途里必须勾选“允许从远程伙伴(HMI/OPC UA)进行访问”这个选项,否则触摸屏读不到PLC数据。
5.2 威纶通和MCGS的驱动配置细节
粉丝里很多人在问MCGS跟伟创PLC驱动怎么配,其实原理都一样:在设备窗口添加根设备“通用TCP/IP父设备”,再添加子设备“西门子S7_1200”,填IP和端口号102。很多新手卡在“PLC没有被远程访问激活”,这个需要在S7-1200的CPU属性里打开“防护与安全”,勾选“允许从远程伙伴进行PUT/GET通信访问”。博途V16里这个选项藏得比较深,默认是关闭的,不打开的话触摸屏和C#上位机采集程序都会连不上。
用C#写西门子PLC采集源码的时候,除了用官方库SimaticS7.Net,也可以直接用S7协议封装好的库,底层本质是PLC的S7通讯协议。如果你只是想做数据采集,比如把这个洗衣机的实时状态、温度曲线读出来存到数据库,用Sharp7或者S7.Net Plus都行。这个项目里,我预留了一个以太网口给上位机,通过OPC UA方式读取DB块里的数据,实测很稳。
5.3 博途上传PLC程序的坑
调试过程中,程序改了很多版,需要把PLC里运行的最终版本上传到电脑备份。博途V16支持在线上传,前提是硬件组态和原项目基本一致,否则会提示不兼容。我经历过一次很尴尬的事:现场调试时电脑没带,用别人电脑临时改了程序下载进去,回家想上传,发现本地项目里没有对应的硬件组态,导致上传失败。后来我学乖了,每次下载程序前,都在项目里建好版本号,并且把完整的源程序备份到网盘。上传时候选择“从设备上传备份”,如果只是要恢复程序而不是看原工程,可以直接生成一个新项目再做离线处理。
6. 调试实录与常见问题排查
6.1 博途V16在线监控技巧
博途的在线监控功能是我最喜欢的部分。把程序下载到PLC后,点击“转到联机”,梯形图里每一根线的状态就会用绿色高亮显示。调试的时候,我习惯把DB块里关键变量加到监控表里,同时开趋势视图看水位变化曲线,这样能非常直观地看到模拟量波动。
有一点必须注意:在线修改程序时,如果直接点“下载”并选择“全部覆盖”,PLC会停机一瞬。对于洗衣机这种不允许中途停机的设备,最好用“下载到设备”里的“软件(仅更改)”选项,可以在不停机的情况下修改部分程序块。我刚开始不知道这个功能,每次下载都要重新跑一遍流程,浪费了很多时间。
6.2 常见问题速查表
我把这次改造中遇到的几个典型问题整理成了表格,给准备复刻项目的朋友参考:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 变频器不启动 | USS通讯参数错误或站号冲突 | 检查USS_PORT和USS_DRV的站号、波特率;用模拟量端子手动启动排除通讯问题 |
| 水位值一直显示0或27648 | 模拟量模块通道未组态或传感器接线断路 | 用万用表测4-20mA信号;检查通道组态是否正确 |
| 触摸屏无法读取PLC数据 | CPU未开启PUT/GET访问 | 在CPU属性“防护与安全”里勾选远程访问 |
| 电机突然反向 | 正反转继电器互锁失效 | 检查程序中的互锁触点,用强制表强制输出验证 |
| 门锁打不开 | PTC门锁未断电或锁体卡住 | 检查门锁输出继电器是否断电,断电后等待冷却 |
| PLC模拟量跳动 | 电源干扰或屏蔽层未接地 | 给传感器线用屏蔽双绞线,单端接地,PLC独立电源 |
6.3 几个实操小心得
整个项目做完,我最想分享的心得是:PLC编程不是写代码,是理流程。你把洗衣机的工作过程拆成“进水-洗涤-排水-脱水-结束”这几个状态,每个状态只做一件事,状态之间靠条件和定时器切换,程序自然就清晰了。这跟工厂里控制气缸机械手的逻辑没有本质区别,无非是执行机构从电机变成了气缸和电磁阀,传感器从水位开关变成了接近开关和光电开关。如果你能把洗衣机这套状态机玩明白,后面去写搬运机器人、追剪设备,思路会非常顺。
另外,博途V16的模拟运行功能也很好用,但它只能模拟逻辑,没法模拟真实传感器的信号。所以条件允许的话,最好用一个小型PLC实验箱配合模拟按钮和指示灯做初步验证,再把程序下载到真实设备上。我这次先是在实验箱上把全部流程模拟跑通,再上洗衣机调试,整个过程只花了半天时间就完成联机。
最后一个小技巧:程序里一定要留一个“手动调试模式”。我在DB块里放了一个布尔变量ManualMode,触屏上可以切换。自动模式下,PLC按状态机跑流程;手动模式下,可以单独开关进水阀、排水泵、电机正反转、加热管,方便排查每个执行机构是否正常。这个习惯也延续到了我后来做工业项目,维修人员特别喜欢这个设计。智能维修和故障定位的时间至少省一半。
