三菱FX2N PLC与组态王洗衣机控制系统开发实践

发布时间:2026/10/10 8:34:44
三菱FX2N PLC与组态王洗衣机控制系统开发实践
做自动化项目这么多年经常有人问我想入门PLC和上位机监控第一步该做什么项目我一般会推荐做一个带完整流程控制的设备而洗衣机控制系统恰好是最合适的那种——它规模不大逻辑却不简单正好把开关量输入、定时、计数、步进控制、上位机画面全串起来了。这篇文章就来聊聊我用三菱FX2N PLC和组态王KingView做的一套洗衣机控制系统怎么选型、怎么分I/O、怎么写步进程序、怎么用组态王做监控画面以及联调时那些文档里不会写的坑。不管你是刚学PLC的学生还是想上手组态王的工程师这套思路都能直接搬走。1. 为什么是“FX2N组态王”方案选型的心路历程1.1 先把洗衣机的控制需求拆开家用全自动洗衣机的流程一句话就能概括进水→洗涤→排水→漂洗→脱水→结束。但这只是表象真正落地到PLC控制要拆成更细的“动作条件”进水阀打开的前提是水位还没到设定值而不是无脑进水洗涤电机必须按“正转—停止—反转—停止”的时序循环若干次每次动作的时长取决于洗涤模式排水要等水位低于低水位开关之后再额外延时几秒否则桶内泡沫会让浮球反复跳动误判水位漂洗要再次进水、转动、排水脱水时必须确认门已关好、水位已经排干不然一启动就是安全事故。把这些需求列成一二三条控制点数就清楚了。对PLC来说输入信号无非是按钮、水位开关、门开关输出信号无非是进水阀、排水阀、电机正转、电机反转、脱水、报警。整台设备大概只需要十几个I/O点属于典型的小型开关量控制项目特别适合用来练手。1.2 三菱FX2N好在哪为什么不选别的方案市面上PLC型号很多为什么我建议用三菱FX2N最直接的原因是它足够经典用户量大资料和现成案例到处都是。你去任何一个工控论坛搜“FX2N 洗衣机”都能翻出一堆参考程序。更重要的是FX2N的STL步进指令把顺序控制写得很顺手逻辑清晰、调试方便非常适合洗衣机这种“状态按顺序跳转”的工艺。有人会问现在FX3U、FX5U不是更好吗答案是从纯性能上看确实更好但从学习和教学角度FX2N反而更能逼你把每一步逻辑手动走清楚。FX2N的指令表结构、通信协议都是最“原型化”的用它把流程控制吃透换到其他机型只需要改一改硬件配置和个别指令即可核心思路完全通用。那为什么不直接用单片机加继电器纯继电器电路做洗衣机逻辑当然可以但改逻辑就要改硬线改了之后还得重新查线调试痛苦不说运行数据一点都拿不出来。单片机做逻辑控制也不难可你要在上位机显示水位曲线、统计运行时间、做报警记录就得从头写通信协议、画界面、搞数据库开发周期一下拉长好几倍。PLC加组态王是这类需求里性价比最高的组合PLC负责可靠逻辑组态王负责把数据可视化各干各的活儿谁都不越界。1.3 组态王在整套系统里扮演的角色很多第一次接触组态王的人以为它只是“画个好看界面的软件”其实这个理解低估它了。组态王的核心价值在于实时数据库、变量绑定、报警历史和趋势记录。它能把PLC里的每一个位、每一个寄存器映射到画面上的颜色、填充、旋转动画上还能把这些数据按时间落盘变成历史文件方便事后导出。具体到洗衣机项目操作人员不需要蹲在控制柜旁边看PLC指示灯直接看组态王画面就能知道当前系统处于“进水还是洗涤、洗涤到第几遍、电机正在正转还是反转、水位有多高”。如果再加点脚本还能统计一天跑了多少个周期、每次周期多少分钟、报警出现过几次。这些信息靠PLC自身的指示灯和万用表测量是无论如何都拿不到的。2. 硬件搭建与I/O分配动手前先把点表画明白2.1 系统构成与器件清点做这套系统先要把硬件清单列全避免做到一半发现少个继电器。我的建议配置如下三菱FX2N-32MR-001 PLC一台16点输入、16点继电器输出洗衣机十几个点完全够用还留了裕量SC-09编程电缆一根或者USB-SC09-FX用于下载程序和连接组态王工控机或普通电脑一台安装组态王6.60SP424V直流电源一个给传感器和中间继电器供电交流接触器和中间继电器若干PLC的输出触点容量有限不能直接驱动电机和220V电磁阀线圈浮球式水位开关三个分别对应高水位、中水位、低水位门开关一个干接点用于判断洗衣机门是否关好启动按钮、停止按钮、模式选择旋钮等。器件选型里最容易犯的错误是直接用PLC输出点去带接触器线圈。FX2N的继电器输出触点标称能带2A负载但接触器线圈是感性负载吸合瞬间的反电动势和冲击电流很容易烧触点。我的做法是PLC输出先驱动中间继电器中间继电器再驱动接触器线圈接触器再去带电机。多一级隔离触点上再并联RC灭火花吸收运行半年都不会出问题。2.2 I/O点表与接线难点动手接线之前一定要先把I/O点表画出来并在纸上把每个点的电气属性标清楚。下面是我用的点表可以直接参考输入点元件功能说明输出点元件功能说明X0启动按钮常开按一下启动Y0进水阀1进水X1停止按钮常闭断开即停止Y1排水阀1排水X2高水位开关浮球到位闭合Y2接触器KM1电机正转X3中水位开关漂洗水位到位闭合Y3接触器KM2电机反转X4低水位开关有水时闭合Y4脱水接触器电机高速脱水X5门开关门关好闭合Y5蜂鸣器/报警灯故障报警X6模式选择A标准/轻柔切换Y6运行指示灯指示运行状态X7模式选择B强力洗选择接线时要特别注意三点。第一X0启动按钮用常开X1停止按钮用常闭这样一旦急停线路断线PLC会检测为“停止状态”而不是“假装正常”。这是安全回路的基本功。第二水位开关是干接点直接接到PLC输入端即可但浮球在水里晃动时触点会有抖动接线时建议在输入端并联一个RC滤波或者在程序里加定时器消抖否则偶尔会发生误判。第三PLC输入端 X0 到 X7 的公共端COM接线方式要根据是NPN还是PNP传感器决定三菱FX2N默认支持漏型输入大多数教学项目里直接用按钮干接点把COM接到DC24V的正极或负极要看说明书接反了输入信号死活采不到。2.3 供电、接地和电气互锁供电方面整套系统分三路PLC控制回路用DC24V传感器信号用同一路24V执行机构电机、电磁阀用AC220V两路之间不要共用零线避免干扰串扰。控制柜里动力线和信号线要分开走线槽信号线尽量用屏蔽双绞线屏蔽层单端接地。电气互锁是最不能省略的一步。电机正转和反转的接触器KM1、KM2必须在硬件回路上做互锁——把KM1的常闭触点串进KM2线圈回路再把KM2的常闭触点串进KM1线圈回路。这样即使PLC程序跑飞、两个输出同时给1接触器也不可能同时吸合从根本上防止电机主回路三相短路。程序里也要再加一层软件互锁Y2和Y3不能同时输出。硬件互锁是保命的软件互锁是日常工作的“两道保险”一个都不能少。3. PLC程序设计与STL步进控制3.1 用STL把流程拆成状态洗衣机最合适的编程方式是三菱的STL步进顺控指令。FX2N的状态继电器S0到S499其中S0到S9用来做初始状态S20以上做普通流程状态。STL写顺序控制的优势是让程序变成一条清晰的“状态流水线”当前状态执行完满足转移条件就跳到下一个状态每个状态的输出和转移条件都写在一个独立的块里排查问题时直接看当前停在哪个S编号一眼定位。我的流程状态分配如下S0待机等待启动信号S20进水达到高水位后跳S21S21正转洗涤定时结束跳S22S22暂停定时结束跳S23S23反转洗涤定时结束跳S24S24暂停判断洗涤次数有没有到没到跳回S21到了就跳S25S25排水确认水位排干后跳S26S26漂洗进水达到中水位后跳S27S27漂洗转动结束后跳S28S28排水水流尽后跳S29S29脱水脱水时间到跳S30S30结束蜂鸣器提示复位回S0。这个流程看起来简单但它已经包含了几乎所有顺序控制的常见要素定时器、计数器、水位条件判断、循环跳转、安全保护。以后做更复杂的清洗设备、喷涂线、烘干线流程框架换汤不换药。3.2 关键状态转移条件怎么定状态转移条件是整个程序的核心设计的时候要反复问自己这个条件会不会误动漏掉什么情况进水段的转移条件是“高水位开关接通”。但我在S20入口处加了一个判断低水位开关必须是断开的不然可能桶里有残留水却直接启动进水造成溢水。这个“启动前检查”是很多人会漏掉的地方。洗涤段的转移条件主要靠定时器和计数器。标准洗我做的是正转8秒、停3秒、反转8秒、停3秒循环3遍轻柔洗改成正转5秒、停5秒、反转5秒、停5秒循环2遍强力洗改成正转10秒、停2秒、反转10秒、停2秒循环5遍。不同模式用同一个状态流程只是定时器的设定值不同计数器的比较值不同。模式选择旋钮通过X6、X7输入程序里用CMP指令把设定值写进对应的寄存器后续状态直接用寄存器里的值流程本身不必重复写三遍。排水段的转移条件要特别小心。如果只看低水位开关断开就认为水排完了经常会出现误判。因为含泡沫的水会让浮球反复波动浮球一沉一浮程序可能误以为水位已排干。我加了一个排水确认延时低水位开关断开后再延时5秒且这5秒内低水位开关始终保持断开才真正进入下一步。这个小延时换来的是整机运行稳定非常值得。脱水段的转移条件关系到人身安全我做得比较严门开关必须闭合、低水位开关必须断开、排水阀已经关闭三个条件同时满足才允许启动脱水。脱水结束的条件是时间到标准洗2分钟强力洗3分钟。3.3 核心程序片段解析GX Developer里用STL写程序指令表看起来是这样的。先说上电复位和启动LD M8002 ; 上电瞬间闭合一次 ZRST S20 S30 ; 复位所有流程状态 RST M10 ; 复位运行标志 LD X0 ; 启动按钮 PLS M0 ; 上升沿脉冲避免长按重复触发 LD M0 ANI X1 ; 停止按钮有效时不允许启动 AND X5 ; 门关好才允许启动 SET M10 ; 置位运行标志 SET S20 ; 进入进水状态启动按钮用PLS转成脉冲信号是很关键的小细节。组态王下发按钮指令时如果PLC用长电平判断扫描节奏不同会产生“按一下结果执行了两遍”的鬼畜现象。用脉冲触发加置位/复位就不会有这个问题。进水段和洗涤段的状态块STL S20 ; 进水状态 OUT Y0 ; 进水阀打开 LD X2 ; 高水位到了 SET S21 ; 跳到洗涤 STL S21 ; 正转洗涤 OUT Y2 ; 电机正转 OUT T0 K80 ; 正转8秒 LD T0 SET S22 ; 时间到跳暂停 STL S22 ; 暂停状态 OUT T1 K30 ; 暂停3秒 LD T1 SET S23 ; 跳反转注意STL状态块之间用LD读取转移条件用SET跳转目标状态整个STL区域结束时必须有RET指令。我记得第一次写STL程序时忘了在结尾写RETGX Developer编译不报错但PLC运行时状态乱跳输出乱动排查了很久才发现是RET缺失。这个问题论坛里经常有人问值得特别注意。每个状态里我还做了一个“状态上报”把当前状态编号MOV到D0寄存器LD S20 MOV K20 D0 ; 状态号20表示进水组态王直接读D0就知道当前处于什么状态画面显示“正在进水”“正在洗涤”全靠这个值。3.4 手动/自动切换与故障保护整机调试阶段手动模式是必须的。我在程序里用M1做“自动/手动”标志组态王画面上放一个切换开关。手动模式时自动流程状态全部暂停输出改由画面按钮点动控制自动模式时手动点动按钮失效。最稳妥的做法是所有Y输出回路都串一个“总运行允许”M10信号自动程序和手动点动都经过它避免两种模式同时操作造成输出冲突。故障保护是洗衣机控制系统的安全底线。我在程序里做了几个典型的故障检测排水超时报警排水开始60秒后水位仍未排干、进水超时报警进水开始后10分钟水位没到设定值、电机过载保护热继电器的常闭点串进PLC输入过载时断开立即停止所有输出。故障发生时置位M100关闭所有输出报警灯Y5亮组态王画面弹报警框操作人员查清故障后按复位按钮或画面上的复位键M100复位系统回到待机状态。4. 组态王工程开发画面、变量和脚本4.1 安装和建工程的几个注意点组态王6.60SP4在工控现场和教学环境里用得很多网上关于这个版本的资源和教程非常丰富图库、例程都能找到。安装时我有几个实操经验第一系统最好用Windows 7或Windows 10专业版安装前把杀毒软件暂时关闭否则组态王的驱动DLL很容易被杀软误报拦截第二安装路径不要带中文工程保存路径也建议用纯英文加拼音比如“WashCtrl_2025”项目名称用拼音或者英文很多莫名奇妙的“运行系统打不开画面”问题都是中文路径惹的祸第三第一次运行开发系统时用右键“以管理员身份运行”否则加载设备驱动容易失败。新建工程的步骤不复杂工程管理器里选择“新建工程”填工程名称和保存路径进入开发系统后第一步不是画画面而是先配置设备。设备配置不对后面所有变量都读不到数据。4.2 I/O变量定义与地址格式组态王和三菱FX2N通信走的是三菱FX2N串口协议连接线用SC-09编程电缆或者带通信功能的USB-SC09-FX。在组态王里新建设备时驱动路径选“PLC→三菱→FX2N(串口)”然后设置串口参数波特率9600数据位8停止位1无校验。这些参数要和PLC侧的通信设置一致FX2N出厂默认就是9600、8、1、无校验所以基本不用改。定义变量是画面和数据之间的桥梁。我的变量定义表如下变量名变量类型寄存器地址数据类型读写属性启动按钮I/O离散M0Bit读写停止按钮I/O离散M1Bit读写进水阀I/O离散Y0Bit只读电机正转I/O离散Y2Bit只读电机反转I/O离散Y3Bit只读当前状态号I/O整数D0SHORT只读洗涤模式I/O整数D10SHORT读写水位值I/O整数D3SHORT只读三菱FX2N的寄存器地址在组态王里格式很直接输入点写X2输出点写Y0中间继电器写M0数据寄存器写D0定时器当前值写T0。有一点容易迷糊的是寄存器类型和变量类型要匹配读Y0、M0这类开关量变量类型选“I/O离散”数据类型选Bit读D0这种数值量变量类型选“I/O整数”数据类型选SHORT。如果选错组态王不会报错但画面上永远显示不出正确数据。通信联调时可以在组态王开发系统的“信息窗口”里看驱动加载日志确认设备是否连上、读写是否成功。4.3 页面组态图库、动画连接和按钮脚本组态王自带一个图库管理器里面有电机、阀门、泵、管道、液位罐这些工业元件图片直接拖到画面上就能用。想要更好看的效果去网上找“组态王图库”资源包下载后把图片文件放进工程目录下的Picture文件夹在画面里通过“插入图片”导入即可。很多第三方图库是带透明背景的PNG配合状态属性做切换效果不比商业组态界面差。我做洗衣机画面时的思路是这样的用椭圆加填充矩形画一个洗衣机桶体桶体填充的“填充百分数”关联水位值变量D3水位上升时填充高度跟着涨进水阀图标的“颜色变化”关联Y0变量Y0为1时阀门变绿色为0时恢复灰电机图标做两组一组正转显示、一组反转显示分别关联Y2和Y3用“隐含”动画让对应的图标显示出来底部放一个“当前状态”文本关联“当前状态号”D0配合脚本显示“进水”“洗涤”“排水”“脱水”等文字。按钮脚本在组态王里用的是类C语言。启动按钮“按下”事件里写\\本站点\启动按钮 1; \\本站点\停止按钮 0;这里要注意我PLC程序里启动用的是上升沿触发所以组态王这边只需要把M0写1再写0形成一个脉冲。如果用保持电平PLC会误以为你要反复启动。实际做联调的时候我经常演示这个现象给同事看组态王按钮一直按住PLC流程就反复重启换成脉冲触发后一切正常。画面上的“返回待机”按钮脚本是\\本站点\停止按钮 1; \\本站点\启动按钮 0;同时PLC里的停止逻辑会复位流程状态回到S0待机。4.4 报警、趋势曲线和报表组态王的报警功能值得多花点时间配置。我给水位传感器故障、排水超时、进水超时三个情况定义了变量报警报警类型设为“开关量报警”或者“数值越限”报警优先级分高中低。运行时组态王报警窗控件会自动弹出报警信息并记录报警时间、恢复时间。趋势曲线是我个人非常喜欢的功能。我在画面上放了一个“实时趋势曲线”控件绑定水位值D3和当前状态号D0运行时能清楚看到进水段曲线上升、排水段曲线下降、洗涤段曲线波动整个过程一目了然。这套画面拿来做教学演示或者给不懂PLC的客户展示效果远胜过对着指示灯解释。报表方面组态王支持实时报表和历史报表。我做过一个简单的“运行记录”报表每天统计总运行周期数、总进水时间、总排水时间。这个统计主要靠PLC侧加计数器把数据存到D20、D21、D22组态王按天生成报表。对于想深入了解上位机系统的读者这是很好的进阶练习。5. 联调流程与排障实录5.1 从仿真到整机老化的四步联调整个系统做完不要急着把电合上就跑。我习惯按下面四步走每一步都能把问题拦住一大半。第一步PLC离线仿真。用GX Developer自带的仿真器跑一遍程序用强制按钮模拟X0启动、X2水位到位把逻辑循环都走一遍看看状态转移有没有死路。这一步能发现大部分逻辑漏洞比如某些条件下两个状态会同时激活、某个状态跳不出去等。第二步PLC实物单机调试。把上位机断开PLC单独上电用短接线手动模拟输入点导通观察输出继电器动作顺序是否和设计一致。这个环节重点检查输出回路的硬件接线尤其是正反转互锁是否真正生效。第三步通信联调。打开组态王运行系统看信息窗口确认“打开设备成功”然后逐个变量强制读写确认画面数字、颜色、动画跟随PLC状态变化。这个环节常见问题最多的就是通信连不上具体原因看下文速查表。第四步整机联动与老化测试。接上真实的水位开关、阀门和电机跑满一个完整洗涤流程。我要求至少连续跑5个周期中途不得有人工干预期间记录每个周期时间、有无跳变、通信是否中断。出现任何一次异常都要找到原因才能继续下一轮否则问题会攒到交付后爆雷。5.2 通信问题排查速查表联调过程中组态王通信问题出现的概率最高我把典型的现象和处理办法整理成了一张表现象可能原因处理办法信息窗口提示“打开串口失败”COM口被占用或串口线类型不对关闭GX Developer在线监视和其它串口工具确认用的是SC-09编程线而非普通直连线设备管理器里看COM口是否正常变量一直无数据提示“设备不存在”PLC未拨到RUN或驱动型号选错或地址格式错误把PLC运行开关拨到RUN驱动选型确认是FX2N(串口)核对寄存器地址是否写成Y0、M0、D0的格式数值能读但画面不动作动画连接里关联的变量名写错或变量类型定义成内存变量双击图形对象检查动画连接确认变量名和画面脚本一致变量定义改成“I/O变量”通信时好时坏数据跳动干扰大、波特率过高、屏蔽不好信号线用屏蔽双绞线并可靠接地波特率降到9600适当加大组态王的采集周期按钮下发没反应变量读写属性没设成“读写”或PLC逻辑用的是电平保持而组态王给了脉冲变量属性改为“读写”PLC启动信号改PLS脉冲触发或置位/复位指令这几种问题我在项目里几乎都碰到过。最经典的是第一种PLC和组态王用的是同一个串口调试时GX Developer还开着在线监视组态王那边一直报“打开串口失败”。当时绕了大半天才反应过来关掉GX Developer的在线监控串口立刻释放组态王秒连。从此我给自己定了个规矩用组态王连FX2N之前先把所有可能占串口的软件全部关掉。5.3 我踩过的几个坑除了通信问题还有一些硬件和程序上的坑值得单独拿出来说。第一个坑是PLC输出触点烧黑。最初图省事进水阀线圈直接接在PLC的Y0触点上。电磁阀是感性负载开关瞬间的反电动势把触点烧得发黑运行半个月后Y0偶尔就不吸合了。后来把所有执行机构都改成中间继电器过渡继电器线圈两端并RC吸收问题再没出现过。对于接触器、电磁阀这类感性负载中间继电器隔离加RC灭弧是基本操作千万不要贪图省事直接接PLC触点。第二个坑是浮球开关抖动引起的误动作。低水位排水阶段桶内泡沫多的时候低水位开关信号一跳一跳的程序差点把“排水完成”的假信号当成真信号。后来我不仅加了5秒排水确认延时还在程序里对水位开关做了定时器滤波水位信号从ON变成OFF后延迟0.5秒才认为真的断开。这一步做完洗衣机再也没有因为浮球抖动而乱跳状态。第三个坑是STL程序里缺少RET导致的“运行灯亮但输出乱跳”。前文提过一次这里再强调一下STL区域必须以RET结尾多个STL块可以共用一个RET但绝对不能漏。漏了RETGX Developer不报编译错误PLC下载后RUN灯正常亮但状态切换像喝醉一样毫无规律。遇到这种“程序看着没问题运行却全乱”的现场第一件事就是检查STL是否完整闭合。第四个坑是组态王工程路径里有中文。某次把工程放在D:\项目\洗衣机\下面运行系统偶尔启动后画面空白重装组态王都没用。后来把工程迁移到D:\WashCtrl_2025全英文路径运行立刻稳定。组态王对中文路径的兼容性一直一般老版本尤其明显新建工程时直接用拼音命名最省心。做完这套系统我最大的体会是PLC和组态王谁都能学会但真正拉开差距的是“把流程想清楚”的能力。洗衣机看起来简单真到了现场水位浮球怎么防抖、正反转怎么互锁、串口怎么分配、感性负载怎么灭弧每一个细节都是经验的积累。希望这套从选型到联调的全过程能帮你少走一点弯路。如果你也在做类似的小项目可以拿这套思路去做延伸——把洗衣流程换成物料清洗、喷淋、烘干这套PLC加组态王的骨架基本不用大改换个工艺参数而已。