No.940 基于S7-200 PLC和组态王的车辆出入库管理系统停车场控制系统
刚接手停车场改造项目那会儿,甲方甩过来个奇葩需求:要在老仓库区搞智能车辆管理系统,还得用西门子S7-200 PLC配组态王。这组合搁现在看着有点复古,但胜在稳定耐造,特别适合这种灰尘大、温差猛的工业场景。
先说PLC这头的活儿。核心逻辑就仨——车辆检测、道闸控制、车位计数。地感线圈接的是I0.0输入,有车压上来就触发。当时调试时发现信号抖动厉害,后来在梯形图里加了段延时滤波才稳住:
NETWORK 1 LD I0.0 // 地感线圈输入 TON T37, 50 // 50ms延时去抖 = M0.0 // 稳定后的检测信号这T37定时器用得讲究——时间短了滤不掉工程车震动,长了又影响响应速度。实测下来50ms刚好能扛住叉车经过的震动,又不会让小车等待太久。
道闸控制这块最怕砸车,程序里必须做双重保险。除了常规的限位开关(I0.1开到位,I0.2关到位),还在组态王里做了个急停按钮联动:
NETWORK 2 LD M0.0 // 有效车辆信号 O V1.0 // 组态王远程开闸命令 AN I0.1 // 闸杆未完全开启 = Q0.0 // 启动电机正转 NETWORK 3 LD I0.2 // 关到位检测 O V1.1 // 组态王远程关闸 AN T38 // 防连续触发计时 = Q0.1 // 电机反转注意那个T38定时器,这是被三轮车司机教做人的结果——有次司机在闸杆下反复倒车,PLC疯狂收到开关信号,电机过热烧了保险。后来加了个3秒延时才解决。
转到组态王这边,重点得把停车场平面图做生动。用矢量图画出车道,车位用闪烁方块表示状态。最骚的操作是在用户权限上——不同部门的车辆用颜色区分,直接调Windows API读取刷卡器信息:
// 组态王脚本片段 OnButtonClick() { string cardID = ReadCOM(1); // 从串口1读卡 int dep = QuerySQL("SELECT department FROM vehicles WHERE id='"+cardID+"'"); if(dep == 1) SetFillColor("车位A01", RGB(255,0,0)); // 生产部红色 else if(dep == 2) SetFillColor("车位B03", RGB(0,255,0)); // 仓储部绿色 UpdateDatabase("INSERT INTO records VALUES('"+cardID+"', NOW())"); }这脚本有个坑——直接拼SQL会有注入风险,但甲方坚持用Access数据库,只能加个正则过滤车牌格式。后来果然逮到有个技术员输车牌时敲了分号,差点把记录表给删了。
调试时最头疼的是PLC和组态王的时钟同步。两边时间老对不上,记录里的入场时间总差个几秒。最后发现是西门子的时钟寄存器得用BCD码转换:
NETWORK 4 LD SM0.5 // 每秒触发 BTI VB100, AC0 // 转换BCD时间为整数 MOVW AC0, VW200 // 存储到通讯区然后在组态王里用DateAdd函数把秒数转成标准时间,这才让报表里的时间戳对齐。
现在这系统已经跑了三年多,听说连扫地的阿姨都会用组态王查车位。有时候老系统就像车间里的老师傅,可能没花哨的功能,但关键时刻绝对不掉链子。倒是最近甲方又找过来,说想加个AI识别车牌的模块——得,又要折腾C#和PLC的OPC通信了...