
做停车场收费系统我从一开始用单片机自己搭板子到后来换成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 UAPLC和组态软件的通信是整个系统的心脏协议选错后面全白搭。停车场这个场景基本就三种选择。第一种是Modbus RTU走串口RS485PLC做从站组态软件做主机。这种方案实现最简单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对应VW040002对应VW2以此类推。线圈地址从00001开始对应PLC的Q区或M区比如00001对应Q0.000033对应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的函数输入参数是入场时间、出场时间和当前时间输出应收金额。逻辑不复杂但必须考虑跨天、跨月甚至跨年的情况日期计算要用标准时间函数不能自己手写天数判断否则闰年、月末会算错。支付对接方面组态怎么和扫码支付终端联动流程是出场车辆识别后组态软件计算金额并把金额推送给支付终端或生成二维码车主扫码支付后支付平台回调结果给组态软件组态软件确认支付成功后写一个“允许开闸”的布尔变量给PLCPLC收到后置位出口抬杆输出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逻辑先入手把道闸控制和计数做扎实了再上组态软件搭配收费逻辑最后再对接支付和车牌识别。基础打牢之后这套系统往智能化方向扩展的路就会顺很多。