做了四五年自动化项目,洗车这种非标设备其实比想象中更有意思。市面上成品洗车机贵,控制逻辑还不一定贴合场地需求,很多做汽服、车队、甚至个人搞自助洗车棚的,最后都绕回PLC自己攒一套。用S7-200配合组态王做自动洗车控制系统,属于工程上非常经典、也特别适合拿来入门到进阶的组合。这套方案不挑人,不管是刚接触工控的现场电工,还是想给自家洗车房升级的老板,顺着这条线捋一遍,基本就能心里有底。
先说这套系统能干什么。它通过S7-200 PLC采集现场的传感器信号(车辆到位、红外防砸、水压、泡沫液位等),执行洗车流程的每一个动作;组态王则充当“人机交互窗口”,在电脑屏幕上画出动态工艺流程,实时显示设备状态、执行操作指令、记录历史数据。简单说:PLC负责干活,组态王负责让你看得见它怎么干活、你指挥它怎么干活。
我们项目里的自动洗车机是经典的龙门往复式架构,包含喷淋预洗、泡沫清洗、刷辊刷洗、高压冲洗、风干五个工序。整机控制围绕这个工艺流程展开,PLC是西门子S7-200 CPU226,上位监控用的组态王6.55,触摸屏没用,直接PC。下面我按设计思路、硬件选型、组态实现、通讯配置、问题排查一条线拆开讲,尽量把当初踩过的坑也说出来。
1. 系统整体设计与控制思路拆解
1.1 为什么选S7-200和组态王这套组合
现在市面上小型PLC选择很多,国产的、日系的、欧系的,但S7-200在这个场景里依然有一席之地。原因很实在:一是继电器输出加晶体管混搭型号好找,采购渠道成熟;二是价格透明,CPU226二手翻新件价格便宜,即便项目预算紧也压得住;三是指令集非常直观,梯形图转一圈基本能懂,程序调试门槛低。洗车控制不是高速运动控制,对扫描周期要求不高,对脉冲精度的要求也远低于伺服,S7-200的运算能力完全够。
组态王这边,它和S7-200的适配性出奇好。组态王内置的设备驱动里西门子S7-200系列是单独分出来的,走PPI协议。工程师不需要手写底层通讯帧,组态的时候选择对应设备、填好COM口和波特率基本就能通。这一点对于现场快速调试特别关键,省下的时间拿来优化画面和逻辑,而不是死磕通信格式。如果是三菱FX系列,组态王也能连,但需要额外加卡或者模块;S7-200用原装PC/PPI电缆或者USB-PPI电缆,即插即用的程度很高。
1.2 自动洗车流程的分段逻辑
以龙门往复式洗车机为例,整机动作可以切成几个状态机:复位态、唤醒/待机态、自动运行态、故障态、手动/检修态。
自动运行态内部再按“工位”拆解,我写程序时习惯给它拆成五个工步:
- 车辆到位检测,红外对射或者地磁感应都行,信号来了延时确认,防止飞鸟或者人走动误触发。
- 喷淋预洗,这时候水泵低频启动,避免直接高压水柱打碎车衣或者伤漆面。
- 泡沫喷淋,泡沫泵和空压机同时工作,把预洗液打成泡沫覆盖车身,等泡沫浸润几秒。
- 刷辊洗刷,这个阶段最关键,刷辊升降由位置传感器和电流双重判断。如果刷辊电机过流,不是立刻急停,而是先抬升刷辊,防止把后视镜掰折。
- 高压冲洗和风干,程序里是分两段走的,先冲后吹,到出口前有测速传感器,检测车辆是否移位太远,如果跑偏就报警。
状态机用步进指令实现,按下启动后按顺序跳转。手动模式则是一对一控制每个电机和水阀,方便检修排查。整套逻辑的核心思想是“安全永远优先,流程次之”,任何传感器故障或超时未到位,都进故障态而不是继续执行。
1.3 为什么把上位机监控作为标配
有人觉得,不就是洗车机,面板上加几个按钮和指示灯不就完了?确实能跑,但跑起来你就知道痛苦了。洗车机不像机床,现场水雾大、操作工手泡在水里,普通按钮非常容易坏,而且出了故障没有任何记录,只能两眼一抹黑去查。
组态王这里发挥的是“黑匣子”作用。实时画面上能看到哪个阀在动作、当前跑到第几步、温度压力是否异常,历史报表还能记录每次洗车的设备数据变化。最实用的是报警功能,比如水泵过载,组态王直接把报警弹出来并记录时间戳,方便事后复盘。我们这套系统还做了一键强制急停按钮,串PLC的硬接线,不依赖组态王,任何情况下都能物理切断输出。
2. 硬件选型、I/O分配与电气设计要点
2.1 关键元器件清单与选型逻辑
核心硬件选型不能只看价格,要从操作环境出发。洗车房水汽重、温差大,控制柜虽然放在设备间,但柜内潮湿问题根本躲不掉。选型有以下讲究:
| 元器件 | 选用方案 | 原因说明 |
|---|---|---|
| PLC主机 | S7-200 CPU226 | 自带40点I/O(24输入/16输出),扩展模块需求少 |
| 数字量扩展 | 可选EM223 16DI/16DO | 如果现场传感器和阀组多,预留扩展余地 |
| 传感器 | 红外对射、接近开关、液位浮球 | 红外用于车辆位置,金属接近开关用于限位,浮球用于泡沫液位 |
| 执行机构 | 接触器+热继电器控制电机,电磁阀控制水路 | 避免大电流直接进PLC输出点 |
| 上位机 | 工控机(或性能可靠的PC)+组态王6.55 | 长期运行稳定,6.55在老硬件上兼容性最好 |
| 通讯电缆 | USB-PPI或原装PC/PPI电缆 | 直接连COM口或USB,PPI协议通讯 |
电源部分强调一点,S7-200供电建议单独走开关电源,不要和电机共用同一路,否则大功率电机启动瞬间电压跌落,直接导致PLC重启,洗到一半停机是最常见的事故。我们项目里PLC用24V 2A的明纬开关电源,传感器也从这路取电,接触器线圈单独用220V控制回路。
2.2 I/O地址分配背后的逻辑
I/O分配表面看就是给每个信号编号,其实分配得好不好直接影响程序读写的效率。我的习惯是输入信号按“功能分区”去编,而不是按物理位置去编:
- I0.0-I0.3:急停、复位、启动、停止(主令)
- I0.4-I0.7:车辆检测传感器(入位、等待、出位、防砸)
- I1.0-I1.3:液位(泡沫罐低、水罐低、循环水、排水堵)
- I2.0-I2.3:电机热继电器过载(水泵、泡沫泵、刷辊升降、风机)
- I3.0-I3.3:刷辊上位、下位、前进限位、后退限位
输出点Q按动作功能分:
- Q0.0-Q0.3:喷淋泵1、泡沫泵、高压泵、风机
- Q0.4-Q0.7:刷辊电机正转/反转、刷辊升降、行走电机
- Q1.0-Q1.3:各个电磁阀(泡沫阀、冲水阀、风干阀、喷蜡阀)
按功能分区的好处是,程序里调用定时器或者计数器时,一眼就能通过地址判断是哪个工序的件,排故障也方便。比如Q0.5是刷辊电机反转,发现刷辊不动,先查这个输出点是否有信号,没有就看前面的条件,梯度清晰。
2.3 电气设计与接线避坑经验
这套系统最大的坑是水汽和弱电干扰。一开始我们用的普通端子排,结果氧化很快,传感器信号断断续续,排查了两天发现端子发绿了。后来统一换成镀金端子,控制柜门加装密封条,并在柜内底部放了干燥剂,问题彻底解决。
另外,PLC输出端不能直接驱动接触器线圈,必须经过中间继电器过渡。原因有两个:一是PLC继电器输出触点容量有限,直接通断接触器线圈容易拉弧烧点;二是线圈在断电瞬间会产生反电动势,冲击PLC内部电路。中间继电器选DC24V线圈的,接线时线圈两端反向并一个续流二极管,这样做非常标准。
传感信号和动力线在走线槽里必须分开走,间隔至少20公分,传感器用屏蔽线,屏蔽层单端接地。第一次项目图省事全部走一个线槽,干扰导致输入点频繁误动作,后来重新理线才解决。
3. 组态王工程搭建与画面开发实战
3.1 新建工程与设备配置
组态王的使用第一步是建工程,双击组态王图标后选择新建,填工程名称和存储路径。工程建成后在左侧双击“设备”,选择“新建”,驱动列表里找到“PLC”下的“西门子S7-200系列(PPI)”。
这里有几个关键项:
- 设备名称随意,但建议用拼音或英文,方便后续变量引用,比如shebei1。
- 串口参数选COM1(或实际COM口号)。
- 通讯参数要和PLC侧一致。S7-200默认波特率9.6kbps,但改PG参数可以设成19.2k。组态王侧必须对应,不一致就直接通讯失败。
我调试时遇到过波特率设置不一致,现象是组态王设备状态显示“失败”,所有变量值都是“***”。检查半天才发现PLC里的SMB30设置为2(PPI从站模式、19.2k速率),组态王里却填的9.6k,改成19.2k后一切正常。
3.2 数据词典与变量定义技巧
组态王中变量就是画面的“神经”,所有显示、操作、动画连接都基于变量。双击“数据词典”新建变量。变量分内存变量和I/O变量,I/O变量关联设备;
对于洗车系统,常见的I/O变量包括:
| 变量名 | 数据类型 | 连接设备 | 寄存器地址 | 读写属性 |
|---|---|---|---|---|
| 启动命令 | Bit | shebei1 | M0.0 | 读写 |
| 停止命令 | Bit | shebei1 | M0.1 | 读写 |
| 急停状态 | Bit | shebei1 | I0.0 | 只读 |
| 车辆到位 | Bit | shebei1 | I0.4 | 只读 |
| 喷淋泵运行 | Bit | shebei1 | Q0.0 | 只读 |
| 当前工步 | Byte | shebei1 | VB100 | 只读 |
这里有个易错点,S7-200的寄存器地址和组态王里的“寄存器”填写格式不同。比如PLC里Q0.0,在组态王寄存器里填“Q0.0”,必须是“Q0.0”,大小写不敏感,但中间的小数点不能省略。而M0.0填“M0.0”,VB100填“VB100”。如果填成“VW100”且PLC里也是16位整数,那能对上;填错了变量值永远是0或者显示异常。
定义I/O变量时注意采集频率,默认1000毫秒就行。洗车机工艺动作节奏没快到毫秒级,1000毫秒足够,采集太频繁反而会给PPI通讯链路增加负担,电脑CPU也白费。
3.3 画面设计——从静态到动起来
组态王的画面不是画完就完了,关键是动起来。我的方案是底图用CAD画好框架,导出成图片后作为背景,再在上面叠加控件。这样画出来的图漂亮,而且底图你随时能替换。
具体操作要点如下:
- 冲洗机、水泵、风机、阀门等元件,用图库里的标准图元,没找到的自己画一个矩形、圆和几个线条组合,然后按F10键(动画连接)绑定变量。
- 管道的流动效果:用一条蓝色粗线表示水管,把它的“水平移动”或“线属性”关联到泵的运行变量,变量为1时颜色变绿,或者做一个闪烁效果。
- 阀门开闭:绑定到Q点变量,值为1时显示“开”的状态图片,为0时显示“关”。
- 按钮:选择“按钮”控件,弹起和按下时发送不同命令,比如置位/复位M0.0,并把按钮文本设置成“启动洗车”,字体大小在属性里直接改。
组态王7.5和6.55在画面上最大的区别是字体渲染和自带控件数量。7.5对高分屏支持更好,老电脑上界面缩放也不容易糊,但6.55足够稳定,老项目全部用的6.55,新项目建议7.5,毕竟图标和控件大了不少。再说组态王怎么修改按钮字体:双击按钮进入属性对话框,找到“字体”项点开,里面有个“宋体”下拉框,选择字体和字号即可。这个选项藏得比较深,好多人找不到,其实右键按钮选“字符串替换”,也能批量修改。
3.4 报表系统与报警记录的实用配置
组态王报表有两个方向:实时数据报表和历史数据报表。实时报表就是你在画面上放一个表格控件,绑定你关心的变量,每秒钟刷新一次,适合现场调试时观察数据变化。历史报表则依赖组态王的数据存储功能,需要在“数据词典”里对每个变量勾选“记录”,并设置保存条件。保存条件一般选“变化时保存”或“定时保存”,我习惯用定时保存,周期30秒,这样数据不会太占硬盘,又能还原整个过程。
关于组态王报警记录时间不对这个问题,非常经典。报警记录的时区其实是取电脑系统时间的,如果你发现报警时间比实际时间快了8小时,那就是“时区”没选对。组态王默认时区是在工程属性里设置的,默认“北京时间”应该是UTC+8,但如果电脑系统本身是UTC时间,组态王会把系统时间当成UTC再转一次,就多出来8小时。解决方法是:打开工程浏览器,在“系统配置”的“报警配置”里,把时区选成GMT+08:00,同时保证Windows系统时间和时区正确。另一个坑是组态王内置数据库时间字段为字符串格式,如果用SQL访问,排序时会出现“1、10、11、2”这种乱序,这是个老毛病,最好的办法是格式化成YYYY-MM-DD HH:MM:SS后依旧按字符串排,但要求位数对齐,否则容易踩坑。
4. 控制程序编写与调试实录
4.1 梯形图程序框架与步进逻辑实现
S7-200编程软件老版本是Micro/WIN V4.0,新版本叫STEP 7-Micro/WIN SMART,两者指令集稍有差别,但步进逻辑写法是一样的。S7-200没有高级语言状态机写法,只能用置位/复位配合中间位的思路。
核心框架如下:
Network 1 // 启动条件判断 LD I0.2 // 启动按钮 O M10.0 // 或者在运行状态 AN I0.0 // 急停未按下 AN M20.0 // 无故障 = M10.0 // 主控继电器Network 2 // 工步1:车辆到位检测 LD M10.0 A I0.4 // 车辆到位 AN M10.1 AN M10.2 S M10.1, 1 // 进入工步1Network 3 // 工步1转2 LD M10.1 TON T37, 500 // 喷淋预洗5秒 LD T37 S M10.2, 1 R M10.1, 1 // 退出工步1这种写法本质上是把置位/复位当跳转用。所有工步共用一个状态字节MB10,M10.1-M10.5分别对应五个工步。这样编程的好处是思路清晰,查故障时直接看哪个位是1,就知道卡在哪个工序。
4.2 关键功能块的编写心得
刷辊升降的控制逻辑值得单独说,因为这里最容易出事故。
刷辊下降到洗刷位置后,如果车顶有行李架,或者车身高度超过设定值,直接下压会把车顶压塌。我们做法是:刷辊下降不是直接输出,而是带延时比较的电流判断。刷辊电机运行电流实时采样到AIW0,如果电流持续2秒超过设定值(比如额定电流的1.3倍),就认为刷辊碰到了障碍物,立即停止下降并抬升刷辊,同时置位故障位,组态王弹窗报警“刷辊过流保护”。
另一个经验是风机启动要延时错开。两台7.5kW风机如果同时启动,启动电流叠加,变压器直接压降。我们在程序里做了错相启动:风机1启动后延时3秒,风机2再启动,虽然总启动时间长了,但对电网冲击小了很多,晚上洗车邻居也不会投诉灯闪。
4.3 联机调试与通讯问题的经典场景
联机调试是翻车率最高的环节。代码写好了,仿真也过了,一上真机发现组态王连不上。常见原因无外乎几个:COM口选错、波特率不一致、地址不对、PPI电缆质量差。
USB-PPI电缆一定要买带隔离的,虽然贵一些,但耐操,现场强电干扰多,便宜电缆很容易丢包,导致组态王变量闪烁。另外S7-200的地址默认是2,如果PLC和组态王里都填2没问题。如果PLC后面被编程器占用了,地址会变,组态王会一直连不上。解决办法是给PLC断电重启,让它释放PPI总线资源。
组态王设备连接状态,在设备树里能看到,绿色就是正常,红色说明通讯断了。实际操作中我一般在组态王里建一个只读变量连续读VB0,如果这个变量能正常跳动,说明通讯是通的,再排查画面逻辑。
4.4 组态王与MySQL连接的一些经验
这个属于进阶玩法,但客户经常问。组态王自带报表和SQL访问功能,能把历史数据写进数据库。组态王与Navicat for MySQL连接,其实不是组态王直接和Navicat连,而是组态王通过ODBC连MySQL,Navicat只是用来查看和管理的客户端。
操作步骤:
- 电脑上装好MySQL和ODBC驱动,MySQL Connector/ODBC版本和MySQL位数要匹配,64位系统装64位驱动。
- 在Windows的ODBC数据源管理器里新建一个系统DSN,填好服务器地址、用户名密码,测试连接成功。
- 组态王里在SQL访问管理器中新建表格模板,字段类型要对应。组态王对数据类型敏感,日期类型填不好就会报错。
- 画面里用SQL函数按钮,绑定查询条件,把结果显示到表格控件里。
组态王7.5和6.55在这个环节也有差异:6.55通过ODBC连MySQL容易时断时续,7.5的SQL功能稳定一些。我当时是客户要求每次洗车记录一行的流水账,刚开始用组态王自带报表,导出麻烦,后来直接用SQL功能把记录写进MySQL,Navicat远程一看,一目了然。
5. 常见问题与排查技巧实录
5.1 故障速查表
根据我们现场半年的运行记录,整理一份高频故障表,基本都是实际遇到的问题:
| 故障现象 | 可能原因 | 排查方法 | 解决办法 |
|---|---|---|---|
| 组态王显示“设备失败” | 串口号不对/波特率不一致/电缆坏 | 查看设备管理器确认COM号,PLC端确认SMB30 | 重新设置串口和波特率,换电缆 |
| 启动后没有任何动作 | 急停回路断开/主控继电器没得电 | 检查I0.0是否为1,M10.0是否为1 | 复位急停按钮,检查中间继电器 |
| 洗到一半突然停机 | 热继电器动作/传感器误动作 | 查看组态王报警和历史记录 | 手动复位热继,排查干扰源 |
| 刷辊碰到车顶 | 超声传感器未校准/升降限位失灵 | 手动模式单步测试升降 | 重新校准传感器,加固限位 |
| 水泵频繁启停 | 水管内有空气/压力开关抖动 | 排气,检查压力开关触点 | 加缓冲罐,设置延时 |
| 报警记录时间差8小时 | 组态王时区设置错误 | 检查系统时区和组态王配置 | 统一设为GMT+08:00 |
| 报表日期排序错乱 | 日期格式位数不对 | 检查SQL语句格式 | 统一格式YYYY-MM-DD |
很多故障通过组态王的历史数据回放都能定位。这里我特别推荐在组态王里建立单独的“调试变量”页面,把M、Q、I的所有关键位都放上去,一般故障看一遍就能定位是哪个回路的问题。
5.2 干扰问题的一个典型案例
项目调试中有一件印象深刻的事:现场洗车机一启动,组态王画面里液位传感器的值就开始跳,一会满水一会空。刚开始以为是传感器坏了,换了新的还是跳。后来用手持万用表量传感器信号,发现信号线上的电压在电机启动时有明显的毛刺。
排查到最后,是控制柜I/O接线槽里传感器信号线和刷辊电机动力线走了同一个槽,电机的变频器输出不仅给电机供电,还通过寄生电容耦合到了信号线上。处理办法是把信号线单独拉出来走屏蔽管,屏蔽层靠近PLC侧接地,再把传感器的负端在PLC侧做了等电位连接。之后问题再也没有出现。
类似这种干扰问题,组态王没有任何报警,纯靠排查,所以建议项目设计与接线从源头做好干净隔离,远比事后补强高效。
5.3 组态王操作上的几个小坑
修改按钮字体这个功能看似简单,实际操作有个细节:如果你在“画面开发系统”里直接双击按钮改字体,有时候不生效,因为默认字体被系统主题锁死了。我的建议是,选中按钮后按Ctrl+1打开属性列表,找到Text的Font属性,点开里面的“宋体”直接改,字体名和字号都能改。如果按钮是图库里的,建议换成“标准按钮”控件,字体设置更自由,还支持透明背景。
组态王里画面切换时,全局变量和局部变量的状态可能冲突。如果你用了画面自动启动命令,切换画面时可能会把某些变量重置,导致PLC侧已经运行了,组态王这边显示还没启动。这种情况建议把画面的“显示时”脚本里不要放初始化语句,改用按钮触发初始化。
项目上线时客户反映组态王开机启动慢,是因为组态王默认加载了所有历史记录,打开文件较大。解决方法是把历史记录定期清理,或者把“运行系统”里“数据库”存储周期改成“不保存”。非必要不记录变量,记录多了磁盘满了画面自然卡。
6. 从项目落地看这套系统的扩展空间
6.1 给已有系统加装远程监控
这套系统最容易被客户二次追加的需求就是远程监控。S7-200本身不带网口,老款CPU更不用提,要想远程监控可以加CP243-1以太网模块,或者用一个廉价的串口服务器,把PPI协议封装成TCP/IP。组态王7.5支持以太网设备驱动,直接填IP地址就能通讯。
我们做的一个升级案例是:在洗车房现场放一台4G工业路由器,串口服务器接PLC,远端办公室电脑上装组态王,通过IP直连,实现了远程启停、查看故障、导出日报。客户很满意,在办公室就能知道洗车房设备状况,不用每天跑过去看。
这条路线的成本并不高,一个串口服务器几百块,4G路由器加流量卡也不贵,但关键是要做主备切换。万一网络断了,现场PLC还能手动运行,组态王只是监控,不能反控现场导致事故。
6.2 无人值守自助洗车模式的思考
最近两年自助洗车特别火,这种模式对控制系统的要求是:要能识别车辆、自动计费、无人干预完成洗车。底层的PLC逻辑还是那套,但上位机需要增加支付接口、摄像头识别车牌、订单计费等模块。
这种场景用组态王可能有点吃力,因为它本质上是组态软件,不是业务平台,对接支付还需要写第三方接口。我们当时的做法是用一个Python脚本做中间层,接收微信支付回调,成功后通过Modbus TCP给PLC发启动指令。但S7-200不支持Modbus TCP,只能通过PPI转Modbus网关实现,多了一层复杂度。
如果真要做无人值守,更推荐用支持网口的S7-1200或者国产支持Modbus的PLC,上位机用Python写好业务逻辑后,只把组态王作为监控小助手。不过话说回来,如果只是小规模自助洗车棚,S7-200+组态王完全够用,人工确认支付后按启动键,成本低,稳定性高,没什么不好。
6.3 数据积累的价值:从“能洗”到“会洗”
最后再说说组态王报表和数据库的实际价值。除了故障追溯,数据积累还能反哺优化洗车工艺。
我统计了一个月的数据,发现大部分车辆的高压冲洗时间都是设定值20秒,但实际车辆脏污程度差异很大。如果能在入口处加一个浊度传感器,检测预洗后的水浊度,动态调整高压冲洗时间,就能节水20%-30%。这套算法用组态王的脚本就能实现,只是需要在PLC侧预留模拟量输入通道。类似的还有泡沫用量优化,如果液位下降速度异常,就说明泡沫比例没调对,系统可以提前预警。
我自己的体会是,自动化项目做到后期,拼的不是谁的控制逻辑更花哨,而是谁的数据更完整、更能指导实际运行。S7-200这套老平台虽然技术不新,但只要设计合理,数据记录做扎实,它的服务寿命和维护成本依然非常可观。
这个项目做完验收的时候,客户问了一句话让我印象很深:“这机器以后万一坏了怎么办?”我说,有PLC在,有组态王在,所有运行记录都在电脑里,拿着记录单,就算我不来,任何一个懂PLC的电工都能上手排查。这就是这套系统最大的底气。