基于西门子1200PLC两部四层电梯HMI仿真最近在折腾西门子1200PLC的双电梯仿真项目发现HMI联调环节特别有意思。两部电梯在四层楼之间跑既要处理楼层呼叫又要协调运行方向这逻辑可比单电梯复杂多了。先说个有意思的现象当两台电梯同时到达同一楼层时开门动作居然会出现抢门的鬼畜效果后来发现是方向标志位没处理好...先看核心的楼层扫描程序。用循环移位指令处理外呼信号简直不要太方便L Ext_Call_Up //外部上行呼叫 SRD 4 //循环右移4位 T Call_Reg //保存到呼叫寄存器这操作相当于把1-4层的上行呼叫打包处理每个位对应一个楼层。比如Call_Register的第三位置1就表示三楼有上行呼叫。实际调试发现用循环移位比逐个判断省了至少30%的扫描时间。方向判断逻辑是重灾区。当两部电梯处于不同状态时调度算法得根据距离和运行方向分配任务。用了个取巧的方法——给每个楼层分配权重值IF #Elevator1_Floor #Elevator2_Floor THEN #Priority : 100; ELSIF #Elevator1_Direction #Call_Direction THEN #Priority : 80 - ABS(#Elevator1_Floor - #Call_Floor); ELSE #Priority : 50 - ABS(#Elevator1_Floor - #Call_Floor); END_IF;优先级计算这块用绝对距离差配合方向标志生成权重值。调试时发现当权重相同时随机分配会导致电梯扎堆后来加了时间戳变量才解决。基于西门子1200PLC两部四层电梯HMI仿真HMI上的动画效果用VBS脚本实现更灵活。比如电梯门的开关动画Sub Button_1F_Click() SmartTags(HMI_Elevator_Call).Write 1,1 SetAnimationState Door1_Open, 1 Delay 200 SetAnimationState Door1_Close, 0 End Sub这里用Write方法直接操作PLC的DB块变量配合200ms延时模拟真实电梯门的机械延迟。实际测试发现HMI脚本执行速度比PLC扫描周期快得加同步等待逻辑。最抓狂的是两部电梯的防碰撞逻辑。当两部电梯同时向中间楼层移动时用了个状态机来强制改变运行方向A Elevator1_Position L 2 I JC M001 A Elevator2_Position L 2 I M001: S Emergency_Stop //两梯同时在2楼时触发急停后来发现这种硬编码方式不灵活改成了动态距离检测算法。现在两梯间距小于两层时会自动降速实测响应时间控制在300ms以内才算达标。仿真时用PLCSIM Advanced配合WinCC Runtime强制修改楼层信号时经常遇到通信不同步的问题。后来发现要在OB1里加个同步脉冲CALL SYNC_PLC_HMI IN : Sync_Signal CYCLE : T#1s RET_VAL : #Temp_Val这个同步块让HMI和PLC的数据刷新率保持一致动画卡顿问题立马消失。不过要注意别在高速处理环节用容易引发看门狗超时。搞完这个项目最大的收获是电梯控制看似简单实际要考虑的边界条件多得吓人。光是两部电梯同时响应三层下行呼叫的情况就衍生出七种处理方案。下次要是再做可能试试用GRAPH语言实现状态转换应该比梯形图更直观。