去年接朋友一个洗车房的单子,对方丢过来一句话:“就几个水泵、几台电机,按个按钮能洗车就行。”当时我就知道这事没那么简单。洗车现场水汽大、电磁干扰多、操作的人也不是电气专业出身,一台自动洗车控制系统要是按普通小产线那种“能跑就行”的思路做,后期大概率天天修。后来整套系统从工艺拆解、PLC 选型、I/O 规划到梯形图编程、现场调试完整走了一遍,才发现这种“看着简单”的顺序控制项目,恰恰是最能锻炼 PLC 基本功的题目。这篇就把整套基于 PLC 的自动洗车控制系统设计过程整理出来,包括状态机思路、I/O 分配表、关键梯形图逻辑和调试阶段的坑。正在做 PLC 毕业设计的朋友、准备接小项目锻炼自己的初学者,或者想把手动洗车房升级成自动化的经营者,都可以拿这份内容做底稿。
1. 洗车工艺拆解:把“洗车”翻译成控制需求
很多人拿到这种项目第一反应是画梯形图,其实不对。PLC 程序写得顺不顺畅,九成取决于前面有没有把工艺流程拆清楚。洗车这个动作,人来做很简单,拿水枪冲一冲、擦一擦,但要让 PLC 自动执行,就必须先把每一步“翻译”成输入信号、输出动作、转换条件。
1.1 从洗车流程到控制目标的映射
常见隧道式或龙门式自动洗车的完整工序大概是:车辆到位检测、车辆定位、预冲洗、喷洒泡沫、滚刷刷洗、高压冲洗、风干、完成提示放行。不同洗车房会加减步骤,但主干流程就是这样。每一道工序落到控制系统里,本质就是“某个传感器满足条件后,启动某个输出设备,运行一段时间后切换到下一道工序”。
以我做的这套为例,工艺流程拆解后变成下表:
| 工序 | 检测/触发条件 | 执行设备 | 输出动作 |
|---|---|---|---|
| 车辆到位 | 地感线圈/光电开关 X0 | 无 | 触发程序进入待清洗状态 |
| 车辆定位 | 前轮限位开关 X1 | 定位挡块 | 挡块升起,通知司机停车 |
| 预冲洗 | 定位完成 + 启动按钮 | 低压水泵 Y0 | 水泵运行 8 秒 |
| 泡沫喷洒 | 预冲洗定时到 | 泡沫泵/泡沫阀 Y2 | 泡沫泵运行 5 秒 |
| 滚刷刷洗 | 泡沫喷洒结束 | 顶刷、侧刷电机 Y3-Y6 | 正反转交替刷洗 15 秒 |
| 高压冲洗 | 刷洗定时到 | 高压水泵 Y1 | 水泵运行 20 秒 |
| 风干 | 高压冲洗结束 | 风机 Y7 | 风机运行 30 秒 |
| 完成放行 | 风干定时到 | 指示灯/蜂鸣器 Y10/Y11 | 声光提示,挡块落下 |
这里最关键的一点是:不要把工艺步骤背下来就当控制需求,要看“每一步之间靠什么切换”。比如“预冲洗结束”是靠 PLC 内部的定时器,那定时器就是转换条件;车辆到位如果没有传感器,程序就不知道什么时候开始,这就是一个硬件的输入点。把表格里的检测条件和动作对应关系整理清楚,后面的 I/O 分配表自然就出来了。
1.2 需要采集哪些信号、驱动哪些设备
从上面表格里我能整理出两组清单。输入信号大致有:车辆到位信号、定位信号、启动按钮、停止按钮、急停信号、泡沫液位低报警、水压正常信号。输出设备大致有:低压水泵、高压水泵、泡沫泵或泡沫阀、顶刷电机、侧刷电机、风机、挡块升降电机、指示灯、蜂鸣器。
这里我特别提醒一点:刷洗电机通常需要正反转,这是洗车设备最常见的控制需求之一。顶刷和侧刷如果各自占两个输出点控制正反转,点数会上去,但换来的是控制灵活。如果只要求单方向旋转,可以省掉反转输出,但实际洗车效果往往打折。很多人做毕设时为了省点数,把正反转省略了,结果答辩时被问“滚刷怎么退回起点”,场面会很尴尬。所以 I/O 点数的规划一定是在工艺拆解后逐一匹配出来的,不是拍脑袋定 16 点还是 24 点。
做完这一步,我已经能大概估算出需要的输入和输出点数,然后再进入选型阶段。
2. 硬件选型与 I/O 分配:先别急着接线
硬件选型是很多刚入门的朋友容易“翻车”的地方。我见过不少项目,程序写得挺好,结果现场传感器选型不对,或者继电器没加续流措施,调试时三天两头出故障。这一章把选型逻辑、I/O 分配和接线要点一次说清。
2.1 为什么选三菱 FX3U 而不是其他型号
做这套自动洗车控制系统,我选的是三菱 FX3U 系列 PLC。原因不复杂:第一,项目以顺序控制为主,FX3U 的 STL 步进指令在流程类控制里非常顺手;第二,它的定时器、计数器、辅助继电器资源充足,哪怕是 64 点的配置也完全够用;第三,资料多、教学成本低,后面维护或接手的人容易上手。这个项目的控制对象以开关量为主,不涉及复杂模拟量运算,用 FX3U 不浪费。
当然,市面上同级别的选择不少,我整理了一个简单的对比表供参考:
| 品牌型号 | 适合场景 | 优势 | 需要注意的地方 |
|---|---|---|---|
| 三菱 FX3U | 小型顺序控制、毕设教学 | 指令丰富,STL 写流程直观,资料多 | 模拟量扩展模块价格稍高 |
| 西门子 S7-200 SMART | 同类小型项目 | 以太网口标配,博途格式熟悉的人多 | 逻辑严密但初学者上手稍陡 |
| 汇川/信捷等国产 | 预算敏感的现场项目 | 性价比较高,售后响应快 | 部分指令体系与三菱不通用,换品牌要重学 |
在这个项目上,如果换成 S7-200 SMART 也没问题,思路完全一致,只是编程语言的组织方式有差异。所以我的建议是:选你熟悉的品牌,别在项目中途换平台。做毕设选学校实验室现有的型号,做商业项目选当地售后方便的品牌,比单纯比参数重要得多。
2.2 I/O 点位规划与接线要点
选型确定后,我把上一章的信号清单落成具体的 I/O 分配表。这里直接给出我当时的分配方案,供参考:
| 输入点 | 功能说明 | 输出点 | 功能说明 |
|---|---|---|---|
| X0 | 车辆到位光电开关 | Y0 | 低压水泵 |
| X1 | 前轮定位限位开关 | Y1 | 高压水泵 |
| X2 | 启动按钮 | Y2 | 泡沫泵/泡沫阀 |
| X3 | 停止按钮(常闭) | Y3 | 顶刷电机正转 |
| X4 | 急停(硬回路,同时接入) | Y4 | 顶刷电机反转 |
| X5 | 泡沫液位低(常闭) | Y5 | 侧刷电机正转 |
| X6 | 水压正常(常开) | Y6 | 侧刷电机反转 |
| X7 | 车辆超宽光幕(常闭) | Y7 | 风机 |
| Y10 | 定位挡块升起 | ||
| Y11 | 完成指示灯/蜂鸣器 |
这里有几个接线层面的要点,都是现场踩坑后才明白的。第一,PLC 输出点驱动的是继电器线圈,不是直接带电机和水泵。水泵、风机这类感性负载启动电流大,直接接输出点容易烧触点,所以输出点一律外接中间继电器或接触器。第二,直流继电器线圈两端要反向并联一个续流二极管,不然断电瞬间产生的反电动势会顺着线路干扰 PLC 内部电路。交流负载则加阻容吸收。很多初学者把这两点忽略了,结果出现“PLC 无缘无故重启”的诡异故障,排查到最后才发现是感性负载干扰。
第三,急停按钮绝对不能只进 PLC 靠程序处理。要单独串接在控制主回路的接触器线圈回路中,形成硬断路。一旦急停按下,接触器全部断开,水泵、风机、电机全部掉电,PLC 程序层面的响应反而没那么快。这个属于安全设计底线,不能省。
3. 状态转换与控制逻辑:顺序控制的灵魂
自动洗车这种项目,如果脑子一热把所有动作都堆在梯形图里,写出来就是一锅粥:定时器满天飞、线圈反复置位复位、稍微改一个参数就得翻好几页程序。所以第一步不是写代码,而是把流程抽象成状态机。
3.1 状态机如何划分清洗阶段
我把洗车过程分成若干个“状态”,每个状态里只有对应的输出在执行。状态之间靠明确的“转换条件”切换。用三菱的术语来说,就是用状态继电器或者辅助继电器来描述当前走到哪一步。
套到本项目的状态大致是:S0 初始待机 → S20 车辆到位等待 → S21 预冲洗 → S22 泡沫喷洒 → S23 刷洗 → S24 高压冲洗 → S25 风干 → S26 完成放行。状态与状态之间靠“定时器计时结束”或者“传感器信号”切换,不会出现多个状态同时激活的情况。
这种状态机思路最大的好处是程序逻辑直白:任何时候只要看当前状态,就知道系统在干什么,下一步缺什么条件。不像堆叠式梯形图那样,一个输出可能同时被多处条件控制,排查起来绕来绕去。后面如果客户要求“把泡沫时间从 5 秒改成 8 秒”,也只需改一个定时器的设定值,不会牵一发而动全身。
3.2 基于 STL/SFC 的程序实现
在三菱 FX3U 里,状态机有一个专门的实现方式叫 STL 步进梯形图。它跟 SFC 顺序功能图是同一个底层思想,但用梯形图直接表达。核心要领是:每个状态用一条 STL 指令激活,状态内的动作写在 STL 步下面,转换条件满足后用 SET 指令跳到下一个状态,同时当前状态自动复位。
用指令表可以大概描述一个片段的思路:
STL S20 ; 车辆到位等待状态 LD X2 ; 启动按钮 SET S21 ; 跳转到预冲洗状态 STL S21 ; 预冲洗状态 OUT Y0 ; 低压水泵运行 OUT T0 K80 ; 预冲洗定时 8 秒 LD T0 ; 定时到时 SET S22 ; 跳转到泡沫喷洒状态看起来很简单,但写的时候要注意两点。第一,STL 程序执行到 RET 指令之前,所有被 STL 步激活的输出都受该步控制,所以不需要额外自锁回路,这在很大程度上减少了输出重复驱动的风险。第二,每一步的转换条件一定要考虑“卡死”的情况。如果某一步的传感器坏了或信号一直不来,程序就会停在那里不动,现场表现是“洗到一半停了”。所以我在每个转换条件上都做了超时保护,用总运行时间判断,如果某一步超过设定时间还没完成切换,就输出报警同时自动回到安全状态。
还有一种实现方式是纯用辅助继电器 M + SET/RST 指令做状态标志。这种方式的好处是不依赖 STL 指令体系,换到其他品牌 PLC 嫁接也容易。缺点是状态一多,SET 和 RST 容易写乱。如果项目超过 10 个状态,我还是推荐用三菱的 STL 或者西门子的 SFC 类思路,更稳。
4. 梯形图核心模块编写:自锁、互锁与定时链条
状态机搭好框架后,写每个状态内部的具体逻辑就不会跑偏了。但有几个基础模块无论用什么状态机都绕不开,值得单独讲透:启停回路怎么设计才可靠、定时器怎么组成链条、正反转怎么互相锁定。这三个模块写好了,整个程序的地基就稳了。
4.1 启动、停止与急停回路的可靠设计
自动洗车系统里“启动”和“停止”看起来是一对最基础的指令,但设计上有讲究。启动按钮要能保持状态,通常就做自锁:按下启动,辅助继电器得电并自保持;松开按钮,线圈仍保持。停止按钮则要“断开优先”,通常使用常闭触点加串联的方式,断开即停。
核心逻辑可以这样描述:
LD X2 ; 启动按钮 OR M0 ; 自锁回路 ANI X3 ; 停止按钮(常闭) ANI X4 ; 急停输入 OUT M0 ; 运行允许标志这个“运行允许标志 M0”后面会作为所有流程启动的总开关。这样设计的好处是,只要停止或急停动作,M0 立刻断开,后续状态机全部复位,设备直接停在安全位置。这里我要提醒一个常见错误:有人喜欢把停止按钮编程为“暂停”,即让 PLC 停在当前状态而不是回初始状态。自动洗车的场景里车辆已经进了隧道,如果暂停时刷卡机停在中间,车卡在里面,反而麻烦。所以整套系统的停止逻辑我做的是一次急停后所有输出断开,程序回初始状态,需要人工确认后重新走流程。这个要根据实际工艺需求来决定,不要盲目照搬。
4.2 定时器链条实现工序自动切换
自动洗车最核心的“自动”就体现在定时器链条上。所谓链条,就是前一个定时器计时结束,触发下一个定时器开始计时,像链条一样一环扣一环。这样写的好处是所有时间点都串在一起,后续改成“时间参数可调”时,只需要把定时器设定值接到数据寄存器上,而不是改几十行梯形图。
以我项目中的流程为例,大致是这样的定时链条:
LD M0 ; 运行允许 ANI M20 ; 不在清洗流程中 OUT M10 ; 待机状态 LD X0 ; 车辆到位 AND M10 SET M20 ; 进入清洗流程 LD M20 OUT T0 K80 ; 预冲洗 8 秒 LD T0 SET M21 ; 切换到泡沫喷洒 ...每个定时器的时间参数我直接存放在 D 寄存器里,比如 D0 存预冲洗时间、D1 存泡沫时间、D2 存刷洗时间,方便现场调试时不用插电脑就能调参。洗车现场的用水情况和泡沫浓度会影响理想时间参数,所以把时间参数外置到寄存器,比硬编码在梯形图里聪明得多。
定时器链条要注意的一个问题是:不要在一个状态里同时启动多个“不相关”的定时器。因为一旦状态切换,旧状态里的定时器会被复位,还没到的时间直接清零,容易造成工序跳变。正确的做法是一个状态一个主定时器,计时到就切换,下一个状态再启动新的定时器。
4.3 报警与安全联锁
安全联锁是哪怕程序再简单都不能省略的部分。这个项目里我做了三个层面的联锁。第一个是刷洗电机的正反转互锁:顶刷电机正在正转时,绝对不允许反转线圈得电。这个不能只用软件互锁,还要在硬件接触器上做电气互锁,双重保险。软件里就是正转输出和反转输出互相串常闭触点。
第二个是车辆超宽检测。如果光幕检测到车太宽,刷洗程序不允许启动,同时报警指示灯闪烁提醒司机。否则硬挤进去,车、设备都会受损。
第三个是泡沫液位低和水压不足检测。这两个属于“条件不满足就不允许进入对应工序”的联锁。我用常闭和常开触点做了条件串联,液位低时泡沫工序被跳过,水压不足时高压冲洗不启动。这种保护逻辑听着简单,但实际项目里常见的情况是:只顾流程跑,不管设备能不能扛住,最后烧了泵才回来加保护。
5. 调试阶段:从仿真到带水运行的完整链路
程序写完不等于项目结束,真正的挑战在调试。我见过有人写完程序直接上电带负载,结果冒烟了再回头查线。正确做法是一层一层递进:先仿真,再空载试 PLC,再带部分负载,最后带水全流程运行。每一步都有自己的坑。
5.1 模拟调试的步骤
第一步是在 GX Works 或者仿真软件里跑程序。把外部输入信号用软原件强制的方式模拟一遍:强制 X0 为 ON,模拟车辆到位,观察状态机是否从 S0 跳到 S20;强制 X2 为 ON,观察状态是否进入预冲洗;再检查 T0 定时到时是否切换到下一个状态。这一步能发现大部分状态转换逻辑错误。
第二步是把程序下载到 PLC,但输出回路先不接负载。用短接线或按钮手动触发输入信号,观察 PLC 输出指示灯的变化。这一步主要确认接线没有接错位:Y3 亮的时候,是不是就是程序里定义“顶刷正转”的那个输出口。不要小看这一步,很多现场故障是“程序对、线错位”造成的。
第三步是接上中间继电器和接触器,空载测试。此时还没有水、没有车,只测试各接触器是否能正常吸合和释放。同时也验证急停硬回路的有效性:按下急停,所有接触器全部释放。
5.2 现场试运行遇到的问题与解决
带水运行阶段,问题开始集中爆发。我这里列几个我在本项目中真实遇到并解决的:
| 问题现象 | 根因 | 解决方法 |
|---|---|---|
| 预冲洗水泵启动瞬间,PLC 偶尔重启 | 大功率泵启动冲击干扰 | 增加电源滤波器,PLC 和控制回路独立供电,接触器线圈加续流吸收 |
| 光电开关在泡沫水雾大时误触发 | 传感器选型不当,受水雾遮挡 | 换成对射式抗水雾光电,外加防溅罩,调整安装角度 |
| 刷洗电机正转切反转时接触器“打架” | 软件切换时间太短,接触器释放不及时 | 正反转切换中间插入 0.5 秒延时,保证一个接触器完全释放再吸合另一个 |
| 某天洗到一半系统停住,状态卡死 | 定位传感器松动,信号抖动丢失 | 更换为金属接近开关,并在程序里增加传感器信号持续确认逻辑 |
| 高压冲洗时水压波动大,洗不干净 | 时间控制一刀切,进水压力不稳定 | 用压力开关信号代替单纯定时,水压达到再计时,超时则报警 |
这些问题的共性是什么?就是程序层面的逻辑在仿真时已经验证过了,真正出问题的是“现场环境和理想假设的差异”。水汽、振动、电压波动、电磁干扰,这些在仿真环境里都不存在,但真实项目里一个都躲不过。所以现场调试一定要预留时间,至少要留出 3 到 5 天反复跑流程,观察设备在一天中不同时段的稳定性。
这里我额外提一句“大功率水泵的启动方式”。如果水泵功率超过 4 千瓦,直接启动的冲击已经比较明显。这个项目里我用了软启动器配合 PLC 的一拖三接线方式,PLC 输出控制软启动器的启停端子,软启动器内部完成平滑启动和短接旁路。做类似项目时,大功率电机务必考虑降压启动或软启动方案,否则电网波动和设备机械冲击都会成为隐患。
程序调试完成后,还有一件容易被忽略的事:备份程序并写简单操作说明。现场的操作工不是 PLC 工程师,他们只需要知道“启动怎么按、急停在哪里、常见报警灯什么意思”。一份简单的图文操作卡,能省掉后面无数个半夜打来的求助电话。这个过程我至少帮客户做过五次,每次都觉得这些琐事比代码本身更受客户认可。
最后说点个人体会。自动洗车控制系统看起来只是“水泵、电机、风机、定时器”的大杂烩,但它把 PLC 项目里最常用、最核心的能力全练到了:工艺拆解、I/O 规划、顺序控制、安全联锁、现场调试。把这套流程吃透了,再去看三菱定位控制、触摸屏组态、变频器通讯,思路都是通的。现在 AI 辅助生成 PLC 代码的工具也开始出现了,但别指望 AI 替你搞定现场,它的作用是帮你更快写出初稿,而真正决定项目成败的,永远是你对工艺流程和设备边界条件的理解。这套设计里的状态机、I/O 表和调试清单,你可以直接拿去当底稿,再根据自己的设备和现场条件改。