18位垂直升降立体车库,西门子200Smart程序与组态王通讯,可随意选择存取。
立体车库的PLC程序调试现场永远充满惊喜。那天刚啃完最后一口煎饼果子,监控屏上的组态王突然弹出个"车位未复位"的报警——得,又得跟西门子200Smart PLC来场深入交流了。
这个18层垂直车库的硬件配置相当实在:升降机构用S7-200 Smart SR40带两个EM DR32扩展,四台1.5kW变频器负责升降动作,旋转编码器实时反馈轿厢位置。重点在于存取策略设计,车主按下按钮后,系统需要自动计算最优路径,这活儿全靠PLC里的移位寄存器配合指针寻址。
看这段存取车核心逻辑:
//车位状态寄存器初始化 MOV_B 16#FF, VB2000 //16#FF表示空车位 MOV_B 16#00, VB2001 //保留位 //自动分配车位程序 LD SM0.0 EUO VB2000.0 //检测第一个空闲位 MOVW 1, VW100 //目标层数存储 RLB VB2000, 1 //移位更新状态 MOVB 16#FE, VB2000 //置位该车位为占用状态寄存器VB2000的每个bit对应1-8层状态,VB2001对应9-16层。用移位指令找首个0位比FOR循环快三倍不止,实测扫描周期从15ms降到5ms。组态王那边用Modbus TCP协议直接读V区数据,记得在系统块里勾选"允许PUT/GET通信"。
通讯配置有个坑必须注意:组态王的设备地址要和PLC的IP网段一致。有次调试死活连不上,最后发现子网掩码设成255.255.0.0导致跨网段通信失败。正确的设备定义应该是:
[Device1] DeviceType=Modbus_TCP IPAddress=192.168.1.100 Port=502 Timeout=3000 DataBit=8 StopBit=1存取车动作的联动逻辑才是精髓。当车主在触摸屏选择存车时,PLC先检测当前轿厢位置与目标层的差值,通过高速计数器HSC0读取编码器脉冲数。这里用到了PID位置环控制,但把积分时间设长些避免震荡:
MOVR 0.8:VD500 //比例系数 MOVR 0.05:VD504 //积分时间 MOVR 0.0:VD508 //微分项禁用 BTI HC0, AC0 //当前脉冲转存累加器 SUB VW100, AC0, AC1 //计算位置偏差 MULR AC1, VD500, VD520 //比例输出调试时发现个有趣现象:当车库运行超过4小时后,定位精度会漂移约3mm。后来在升降机轨道加了温度补偿算法,读取环境温度传感器AIW0的值做动态修正,这才保证±1mm的定位精度。
最实用的还是故障诊断设计。我们在VW300开始预留了20个字的状态寄存器,组态王画面上用指示灯矩阵显示各传感器状态。有次光电开关误触发,就是通过监控V303.5位的异常变化快速定位到E03传感器故障。
项目交付前夜,业主临时要求增加VIP车位优先分配功能。灵机一动在状态寄存器前加了优先级掩码:VB1998存储VIP车位位图,分配算法里先与操作VB2000,轻松实现不修改主逻辑的功能扩展——这大概就是PLC编程的魅力所在。
凌晨三点的调试车间,看着车架平稳地停在第17层定位卡槽里,突然觉得这些天熬的夜都值了。顺手在触摸屏上加了个彩蛋:连续点击五下左下角,会弹出俄罗斯方块小游戏——反正组态王的脚本系统闲着也是闲着。