做停车场收费系统,我从一开始用单片机自己搭板子,到后来换成PLC加组态软件,整套方案的稳定性和开发效率完全是两个级别。单片机折腾到半夜还在调协议、查头文件,换到PLC之后,现场接线、逻辑调试、界面开发都有成熟套路。今天这篇就把基于PLC和组态软件的智能停车场收费系统完整拆一遍,从为什么选这套方案,到PLC怎么选型、IO怎么分配、组态软件怎么配置、梯图怎么编、联调怎么测,最后再把我这几年调试现场踩过的坑挨个列出来。
这套系统解决的核心问题,是“车辆进出识别、计费收费、道闸控制、车位统计”四个环节自动联动。适合刚入行准备做PLC毕业设计或非标自动化项目的新手,也适合正在给客户接停车场项目的工程师参考。核心关键词就是PLC、组态软件、智能停车场收费系统这三件事,本质上是把工业级的PLC控制逻辑和上位机组态的监控能力结合起来,替代原来人工抬杆、手工计费的小区停车场管理模式。
1. 系统整体设计与方案选型
1.1 为什么不是单片机、不是纯上位机,而是PLC加组态软件
先想清楚一个基本问题:停车场收费系统到底需要什么?“检测到车来了”、“抬杆放行”、“记录车辆入场时间”、“出场时算钱”、“收费后抬杆放行”,这个流程看起来简单,但实际上牵扯到大量输入输出信号和现场条件。
单片机方案的痛点很明显。停车场现场环境复杂,地感线圈附近有大功率设备,道闸电机启停有强烈干扰,单片机IO口很容易被误触发,一个电平抖动就能让道闸乱开乱关。而且单片机一旦程序跑飞,没有看门狗和可靠的恢复机制,现场人员根本没法处理。更致命的是,单片机方案的上位机通常要自己写协议、自己处理界面、自己设计数据存储,一套系统下来开发周期极长,调试起来全是眼泪。
纯上位机方案也有问题。如果用一台工控机直接控制道闸和读取地感信号,那这块工控机就是全系统的单点,一旦程序卡死、系统蓝屏,整个停车场进出口就瘫痪了。而且操作系统本身的响应时间不确定,现场IO信号不可能都通过上位机直接采,接线成本和故障风险都高。
PLC加组态软件的组合正好把两层分开:PLC负责现场控制和逻辑连锁,包括地感信号检测、道闸升降控制、防砸雷达联锁、车位计数、手动应急操作等,这些是硬实时逻辑;组态软件负责监控和业务层,包括车辆信息显示、收费金额计算、数据记录、报表生成、二维码支付对接等,这些是软业务逻辑。这样划分之后,哪怕上位机死机了,道闸依然能靠PLC的本地逻辑手动抬起,车辆不会卡在门口出不去。
1.2 系统架构与数据流走向
整套系统的架构可以分成四层,每一层职责清楚:
| 层级 | 组成部分 | 核心职责 |
|---|---|---|
| 现场设备层 | 地感线圈、车辆检测器、道闸电机、防砸雷达、LED提示屏、手动按钮 | 物理信号检测与执行动作 |
| 控制层 | PLC控制器及扩展模块 | IO逻辑处理、道闸联锁、计数、手自动切换 |
| 监控层 | 组态软件、工控机、数据库 | 界面显示、收费计算、数据存储、支付对接 |
| 管理/支付层 | 收费管理端、扫码支付平台、ETC系统 | 支付结算、远程对账、系统管理 |
数据流的走向是这样:车辆压到入口地感线圈,车辆检测器输出一个脉冲信号给PLC的数字量输入端子,PLC检测到上升沿之后进行滤波确认,然后向上位机组态软件发出“有车入场请求”的状态位。组态软件收到这个状态位后,调用车牌识别系统获取车牌信息,记录当前时间,并把车牌、入场时间写入数据库。与此同时,组态软件通过PLC变量控制道闸输出模块,PLC驱动中间继电器,中间继电器再控制道闸电机抬杆。
车辆完全通过后,出口地感或道闸位置的雷达会给出信号,PLC自动执行关闸逻辑。出场时反向重复这个流程:地感触发、车牌识别、组态软件调取数据库中的入场记录和时间,计算应收金额,车主扫码支付或现金支付,支付成功后组态软件往PLC写一个“允许开闸”的位变量,PLC再驱动出口道闸抬杆。整个过程里,PLC不需要理解“这块车牌该收多少钱”,它只负责执行“给哪个输出口通电”“什么时候断电”,这就是分层设计的意义。
2. 硬件层:PLC选型与IO分配
2.1 PLC型号怎么选才不坑
停车场项目里PLC的主任务就是开关量处理,输入点输出点加起来并不多。按一套标准的一进一出停车场来算,入口需要:地感检测输入、按钮输入、开到位输入、关到位输入,输出有:抬杆、落杆、LED屏亮起、报警灯。出口比入口多一个收费联动输出,再加一个防砸雷达输入,两进两出的大停车场则需要翻倍。算下来每套进出口大概8到12个输入点、4到8个输出点,再预留20%到30%的备用点,选一台紧凑型PLC完全够。
市面上停车场项目出现最多的几款型号:西门子S7-200 SMART、西门子S7-1200、三菱FX3U、三菱FX5U、汇川H3U/H5U。西门子S7-200 SMART在中小型项目里特别常见,自带以太网口,支持Modbus TCP和Modbus RTU从站协议,组态软件对接非常顺手,程序下载用Step 7 Micro/WIN SMART就能搞定。三菱FX3U的优势是便宜、梯形图指令熟的人多,但要注意FX3U的D0到D8这些普通寄存器默认断电不保持,掉电后数据直接清零,做车位计数时必须在PLC参数里设置保持范围,否则第二天开机车位数据就是乱的。
如果你用的是汇川PLC,大概率是基于Codesys平台,程序写法和西门子三菱都不一样,但通信思路一致,都是把PLC当Modbus从站或者OPC UA服务器。选型时别只盯着CPU本体,还要看现场有没有额外IO需求,比如防砸雷达的模拟量反馈、车牌识别摄像头的开关量输入等,有就需要加扩展模块,选型时提前留出模块槽位。
2.2 IO分配表和现场接线要点
IO分配这事最容易在图纸阶段被忽略,到现场接线时发现输入点不够用,或者输出口带不动道闸电机,全都晚了。下面是一套标准一进一出停车场的IO分配表,可以直接抄着用:
| 信号说明 | PLC地址 | 类型 | 备注 |
|---|---|---|---|
| 入口地感检测 | I0.0 | 数字输入 | 上升沿有效,检测车辆入场 |
| 入口开闸到位 | I0.1 | 数字输入 | 常闭信号,抬杆到顶后断开 |
| 入口关闸到位 | I0.2 | 数字输入 | 常闭信号,杆落平后断开 |
| 入口防砸雷达 | I0.3 | 数字输入 | 有车/有人时保持高电平 |
| 入口手动开闸按钮 | I0.4 | 数字输入 | 紧急情况下人工抬杆 |
| 出口地感检测 | I0.5 | 数字输入 | 上升沿有效,检测车辆出场 |
| 出口收费开闸联动 | I0.6 | 数字输入 | 来自上位机或支付终端 |
| 出口手动开闸按钮 | I0.7 | 数字输入 | 与入口按钮同理 |
| 入口道闸抬杆 | Q0.0 | 数字输出 | 控制道闸电机上升 |
| 入口道闸落杆 | Q0.1 | 数字输出 | 控制道闸电机下降 |
| 出口道闸抬杆 | Q0.2 | 数字输出 | 控制道闸电机上升 |
| 出口道闸落杆 | Q0.3 | 数字输出 | 控制道闸电机下降 |
| LED提示屏亮起 | Q0.4 | 数字输出 | 显示“欢迎光临”或“请扫码” |
| 系统报警灯 | Q0.5 | 数字输出 | 故障或非法闯入时亮起 |
接线上有三个坑必须提醒。第一个坑是道闸电机不能直接接PLC输出端,PLC输出只是控制信号,电流带载能力有限,道闸电机属于大功率感性负载,必须通过中间继电器过渡,继电器线圈接到PLC输出,继电器触点驱动道闸电机。第二个坑是感性负载关断时会产生反向电动势,如果不做处理会打坏PLC的晶体管输出或继电器触点,建议在道闸电机、继电器线圈两端反向并联一个续流二极管,型号根据负载电流选,比如1N4007,二极管负极接电源正极。
第三个坑是地感线圈的铺设质量直接决定系统会不会误触发。地感线圈一定要埋在减速带前约2到3米的位置,让车辆完全停在检测区域后再进行车牌识别和抬杆动作。线圈用耐高温的专用线,绕2到3圈,埋设深度3到5厘米,线圈到车辆检测器的引线要双绞,屏蔽层单端接地,引线长度越短越好。如果线圈埋得离金属井盖或大铁管太近,检测器会直接失灵,这个在外面马路边的停车场特别容易踩坑,现场勘验时先用检测器测试,再开挖施工。
3. 组态软件与上位机:选型与通信配置
3.1 常用组态软件怎么选
组态软件在这个项目里承担的是监控和业务逻辑,市面上主流的是西门子WinCC、亚控组态王、力控ForceControl、LabVIEW。停车项目最常见的是组态王和WinCC,两者定位不同。
组态王在中小型项目里优势非常明显,支持的设备驱动特别全,西门子、三菱、汇川、Modbus各种驱动都有,画面编辑简单,历史数据记录自带数据库,不需要额外装SQL Server就能跑起来。收费规则、车牌记录、报表查询这些功能在组态王的脚本里都能实现,开发周期短。WinCC强在大型系统集成和多客户端访问,适合那种十几个停车场联网统一管理的场景,但WinCC安装和授权比较麻烦,小项目用起来配置成本反而高。
选型建议很直接:一两套进出口的小型停车场,就选组态王;要做多停车场集中监控、数据汇总,或者现场还有大量第三方设备要通过OPC UA接入,那就直接上WinCC配SQL Server。不管选哪款,有一个不能忽视的前提:这个组态软件必须带你要的那款PLC的通信驱动,并支持Modbus RTU、Modbus TCP或OPC UA中的至少一种。下单前先问厂家要驱动列表,别等装机到现场才发现驱动都没有。
3.2 通信协议选择:Modbus RTU、Modbus TCP还是OPC UA
PLC和组态软件的通信是整个系统的心脏,协议选错后面全白搭。停车场这个场景基本就三种选择。
第一种是Modbus RTU,走串口RS485,PLC做从站,组态软件做主机。这种方案实现最简单,S7-200 SMART自带Modbus从站库,三菱FX3U可以用扩展的Modbus指令。接线少,一对屏蔽双绞线就能通信,距离能到几百米。缺点是串口只能一对主从,组态软件再要接第二个设备就得加扩展串口卡。
第二种是Modbus TCP,走以太网,这个是我的首选方案。现在几乎每款PLC都带以太网口,组态软件通过局域网直接访问PLC,不用额外布线,速度比串口快得多。Modbus TCP的端口号固定502,组态软件里添加设备时填PLC的IP地址和端口即可,剩下的参数基本不用改。S7-200 SMART、S7-1200、FX5U这些型号都支持多个以太网连接,意味着你可以同时接组态软件、触摸屏和调试电脑,互不影响。
第三种是OPC UA。如果你不仅要读取PLC数据,还要把现场的传感器、数控机床、变频器这些设备的运行状态数据统一采集,OPC UA就是标准答案。OPC UA的好处是跨平台、自带安全认证和数据模型,西门子S7-1200以上版本内置OPC UA服务器,组态软件作为OPC UA客户端去订阅数据。停车场的PLC主逻辑用不上这么高端的协议,但如果你这个项目还要兼顾设备运行状态监测,或者后期要做数字孪生、远程运维,那么一开始就规划好OPC UA接口会省很多事。
3.3 地址映射与变量建立
通信通了之后,下一步是建立组态软件变量和PLC寄存器的映射关系。这块最容易糊涂,因为不同PLC在不同协议下的地址映射规则不一样。
以西门子S7-200 SMART走Modbus TCP为例,Modbus协议里的保持寄存器地址从40001开始,对应PLC的V区,映射关系是40001对应VW0,40002对应VW2,以此类推。线圈地址从00001开始,对应PLC的Q区或M区,比如00001对应Q0.0,00033对应M0.0这种映射需要看具体的地址偏移表。你在组态软件里新建IO变量时,设备地址填40001就是访问VW0,填00001就是访问Q0.0。如果不清楚偏移,拿ModScan工具扫一遍PLC地址,扫描结果和PLC里的变量表对照,很快就能摸清规律。
组态软件里的变量分两类:IO变量和设备变量。IO变量直接对应PLC地址,是实时通信的;中间变量只存在组态软件内部,用来存车牌、金额、临时状态这些PLC不需要知道的数据。我的习惯是:所有与道闸控制、车位计数相关的状态都做成IO变量,让PLC掌握最终决定权;所有收费规则、车牌信息、支付结果都做成中间变量,由组态脚本处理,这样即使上位机重启,现场控制逻辑也不会乱。
4. 实操流程:从梯形图到联调
4.1 PLC梯形图核心功能块写法
PLC程序这块我按功能块拆开讲,实际写梯形图时也是一块一块往上加,不要一上来就想写完整个流程。
第一个功能块是入口地感脉冲检测。地感检测器的输出是一个开关量,车辆压过线圈时继电器闭合,车离开后断开。这个闭合信号在PLC里不能直接用来计数,因为车辆抖动或线圈灵敏度偏高会产生多个脉冲,直接数会飘。正确做法是把输入信号加一个延时滤波,比如用TON指令延时200毫秒,确认稳定之后再触发计数值加一。网络1的逻辑大概是地感I0.0闭合后,置位一个中间标志M0.0作为入场请求,同时启动防抖定时器T37。
第二个功能块是道闸控制。道闸升和降是两个独立的输出,但绝对不能同时置位,否则道闸电机堵转甚至烧毁。梯形图里要做互锁:Q0.0(抬杆)的线圈回路里串上Q0.1的常闭触点,Q0.1(落杆)的线圈回路里串上Q0.0的常闭触点。抬杆动作到位后,开到位开关I0.1断开,PLC检测到后复位Q0.0;落杆同理。如果抬杆10秒后还没开到位,说明道闸机械卡住或电机故障,置位报警灯Q0.5。
第三个功能块是防砸雷达联锁。出口和入口的防砸雷达主要防止落杆时砸到车或人,联锁逻辑是在落杆回路里串一个雷达信号的常闭触点,雷达检测到有遮挡物时这个常闭触点断开,落杆输出被切断。等雷达信号消失,再延时1到2秒后继续落杆。这块不要只依赖雷达,开到位和关到位的限位开关也必须可靠,这样才能有两种保护机制。
第四个功能块是车位计数。入场时计数值加一,出场时减一,这个计数寄存器的值要给组态软件读取显示。三菱FX3U要注意D0到D8普通寄存器默认断电不保持的问题,在PLC参数里把D0到D8设置为电池保持区间,或者把计数值写到EEPROM保持型寄存器里。西门子S7-200 SMART的V区变量默认本身就支持掉电保持,但如果变量用在组态里频繁读写,也要确认掉电保持属性是否已勾选。计数防超范围处理也很重要,等于0时减一可能减成负数,等于最大值时加一可能溢出,这些边界在梯形图里要做上限下限判断。
4.2 组态画面设计与收费逻辑实现
组态软件的界面设计可以按四个画面来做:入口监控画面、出口监控画面、收费管理画面、数据报表画面。
入口监控画面主要显示当前进入车辆的车牌、入场时间、场内总剩余车位数、LED屏状态和道闸状态。车牌识别系统一般是独立设备,通过HTTP接口把识别结果传给组态软件,组态软件通过脚本定时请求车牌数据。画面布局别搞得太花哨,停车场管理员就喜欢一眼看到关键信息:车牌、时间、车位剩余数、道闸状态,四个大字够用。
收费逻辑放在组态脚本里实现,这是核心业务。收费规则按停车场运营方的标准设定,常见的是首小时免费、首小时后每小时5元、单日封顶30元这类阶梯计费。组态脚本里写一个类BASIC的函数,输入参数是入场时间、出场时间和当前时间,输出应收金额。逻辑不复杂但必须考虑跨天、跨月甚至跨年的情况,日期计算要用标准时间函数,不能自己手写天数判断,否则闰年、月末会算错。
支付对接方面,组态怎么和扫码支付终端联动流程是:出场车辆识别后,组态软件计算金额并把金额推送给支付终端或生成二维码,车主扫码支付后支付平台回调结果给组态软件,组态软件确认支付成功后写一个“允许开闸”的布尔变量给PLC,PLC收到后置位出口抬杆输出Q0.2。这个流程中,PLC任何时候都不能直接接收支付终端的IO信号来开闸,必须在组态软件层做业务校验,防止有人通过触发信号直接抬杆逃费。这是安全性的底线。
4.3 联调实训:现场调试顺序与测试用例
联调最忌讳的就是一上来就整套跑,控制逻辑、通信、收费搅在一起,出了问题都不知道先从哪儿查。我实践下来的调试顺序是四步走。
第一步是纯PLC单体调试,不接组态软件。用PLC的编程软件在线监控程序,强制IO信号模拟车压地感、按钮按下、雷达遮挡,看道闸输出是否正确,抬杆落杆是否互锁,计数器是否加减正常。这一步把所有逻辑问题吃掉。
第二步是组态软件通信调试。组态软件里新建IO变量,启动设备测试,看能否读到PLC的输入输出点和寄存器值。先用组态软件自带的诊断工具,比如组态王的设备通信状态监视,确认通信正常了再进图形画面。通信不通过,画面做得再漂亮也没用。
第三步是半联动调试。组态软件和PLC连接正常后,让组态软件发指令控制道闸开合,或者修改PLC里的数值看组态画面是否实时更新。这步用来验证变量映射和脚本逻辑。
第四步是整体业务测试。按下列测试用例逐一执行:车辆入场、车牌识别、显示入场时间、计费、付费、抬杆、通过后落杆、场内车位数量变化;连续两辆车同时入场;车辆出场但未缴费直接冲闸;断电后重新上电系统恢复;收费金额跨天计算。
我认为联调中最实用的工具是ModScan。厂家调试串口通信时经常遇到“ModScan能读取串口数据但组态软件不能读”的情况,ModScan就是一个验证通信参数的标准工具,它能读到数据说明物理链路、参数设置都正确,问题就出在组态软件本身的配置或变量地址映射上,缩小排查范围特别有效。
5. 常见问题与排查技巧实录
5.1 ModScan能读到串口数据,但组态软件读不到是怎么回事
这个问题在串口通信项目里出现的频率极高,绝不是个例。ModScan能读到数据,说明物理层是通的,PLC没问题,串口线没问题,波特率、数据位、停止位都没问题。那组态软件为什么读不到?
排查顺序我固定为四条。第一条,关掉ModScan工具。ModScan打开串口时是独占的,组态软件再去打开同一个COM口就会失败,两个软件不能同时占一个串口。这是最常见的低级错误,先排除。
第二条,对比ModScan里的从站地址和组态软件里的从站地址。ModScan测试时从站地址填的1,组态软件IO设备配置里从站地址却是0,或者反过来,都会直接读不到。注意很多组态软件的从站地址是从0开始编号的,而PLC程序里Modbus从站库的地址往往是从1开始,这个偏移最容易踩。
第三条,检查功能码和地址映射范围。ModScan读到的可能是保持寄存器40001到40010,组态软件里建变量却用了输入寄存器30001的地址,功能码不同,当然读不到。打开PLC程序里Modbus从站库的配置,看清楚映射的V区起始地址和寄存器类型,再去组态软件里填对应地址。
第四条,检查串口参数是否完全一致。ModScan默认可能是9600、8、N、1,但PLC程序里配置成了19200、8、E、1,哪怕只有一个校验位不同也读不了。把两边都改为一致,再试。
5.2 PLC程序下载失败或搜索不到CPU
用Step 7 Micro/WIN SMART连接S7-200 SMART时,经常出现“搜索不到CPU,但通过添加IP地址可以连接上”的现场情况。这是因为软件默认的搜索方式是广播搜索,在跨网段或启用了AP隔离的现场网络环境里,广播请求根本到达不了PLC,自然搜不到。解决办法是直接在软件里添加CPU的IP地址,不依赖搜索。这个前提下,把电脑网卡IP和PLC的IP设成同一网段,比如PLC是192.168.2.1,电脑就设192.168.2.100,子网掩码255.255.255.0,直接连网线测试。
如果连了IP还是下载失败,检查PLC的物理地址是否有冲突。停车场现场往往电脑、摄像头、收费终端都在同一个局域网,IP冲突很容易发生。把PLC断开,用电脑ping一下PLC的IP,如果通,说明有别的设备占用了这个IP,换个空闲IP再设进去。还有一个隐蔽坑是网线中间经过了交换机或路由器,路由器开启了端口隔离,PLC和电脑处在不同VLAN里,下载自然失败,现场布线时尽量让调试网口和PLC直连。
5.3 车位计数漂移、断电后数据丢失
车位计数漂移在所有停车场项目中几乎都遇到过。车没进场,剩余车位却在减少,或者出场一次减了两位。原因一般有三个。
第一个是地感信号没做滤波,两个线圈信号窜扰导致PLC误判多来了一辆车。解决方法是加防抖延时,而且要在PLC程序里做脉冲宽度检测,太窄的脉冲直接滤掉。
第二个是计数值在断电后丢失。前面提到的三菱FX3U普通寄存器D0到D8默认断电不保持,如果没在参数里设置保持区,断电再上电时车位计数可能直接清零。S7-200 SMART的V区变量默认掉电保持,但要确认组态读写频繁修改的变量是否被勾选为非保持,西门子的掉电保持区是独立区域,需要手动配置范围。现场调试时,做一次完整的断电重启测试,确认数据还在,再交付给客户。
第三个是道闸开到位、关到位的信号与地感信号联动判定出了问题。有些项目是地感触发就加计数,不管车是不是真的进去了。我的建议是入场计数以下一个地感信号为准,最简单的可靠方案是用两套地感,一个在道闸前,一个在道闸后,车同时压过两个线圈的那个瞬间才是入场的有效记录。预算不足的单地感方案,至少要在PLC做时间窗口判断,地感触发后30秒内没有再次触发,就不计为有效入场。
5.4 一个PLC到底能不能接两台触摸屏
这个问题在停车场项目里也经常被问到,因为现场可能入口一个屏,出口一个屏,想用同一个PLC控制。答案是能,但要看PLC型号和通信方式。老款三菱FX3U只有自带一个编程口,如果编程口被组态软件占了,再想接触摸屏就得加通信扩展板。西门子S7-200 SMART就宽松得多,支持以太网连接最多8个客户端,可以同时接组长态软件、一个入口触摸屏、一个出口触摸屏和一台调试电脑,各自都能正常访问PLC。
但要注意,多台设备同时读写PLC变量时存在数据竞争问题。解决方法是把变量区拆分:触摸屏主要读状态位和控制开关,组态软件主要读写收费业务区,两组变量在PLC程序里做好区域划分,别让两个主站同时往同一个寄存器写不同的值。如果触摸屏只是显示数据,不写PLC寄存器,那就完全没有冲突问题。
另外如果系统里有ABB变频器、施耐德PLC、伺服驱动器这些第三方设备,通信还需要加一层隔离设计。比如PLC通过Modbus RTU读变频器状态,组态软件直接通过OPC UA读取变频器运行数据,两路并行,互不干扰。这也是OPC UA协议相比传统私有协议的优势所在。
做完整套系统之后,我自己最大的体会是,智能停车场收费系统的核心难点从来不在硬件有多高级,而是在于现场信号处理的细节。地感抖动脉冲、断电数据丢失、道闸限位失效、上位机通信瞬时断开,这些看着不起眼的小问题,才决定一个系统在客户那边到底是稳定跑一年还是每周报修三次。所以如果你准备自己动手做一套,建议从PLC逻辑先入手,把道闸控制和计数做扎实了,再上组态软件搭配收费逻辑,最后再对接支付和车牌识别。基础打牢之后,这套系统往智能化方向扩展的路就会顺很多。