单部四层,基于西门子1200博图v15.1版本 可直接仿真运行,视频就是真实运行画面,功能集全
凌晨三点的茶水间总是特别安静,我盯着屏幕上跳动的梯形图突然笑出声——这电梯程序怕不是被咖啡因腌入味了。用S7-1200做的四层电梯控制,说简单是真不简单,说难吧又比谈恋爱容易得多。
硬件组态里藏着个小彩蛋,OB35中断组织块设置的50ms周期像极了电梯按钮的脾气,急得要命又得端着架子。给大家看个热乎的定时器配置:
//楼层扫描定时 #FloorScanTimer(IN:=NOT #ScanDone, PT:=T#500MS, Q=>#ScanDone);这货每半秒扫一次楼层信号,比物业查水表还准时。重点在PT参数的时间格式,T#500MS这种写法新手容易掉坑,写成500ms直接给你甩脸子报错。
状态机才是灵魂所在,我管它叫电梯的七情六欲。看看这枚举类型定义:
TYPE E_ElevatorState : ( IDLE := 0, //摸鱼状态 DOOR_OPENING := 1, //开门中 DOOR_CLOSING := 2, //关门中 MOVING_UP := 3, //向上撒欢 MOVING_DOWN := 4, //向下溜达 EMERGENCY := 5 //急眼了 ); END_TYPE紧急状态留着对付熊孩子拍急停按钮的情况。状态切换时记得用上升沿触发,不然你的电梯能给你表演量子波动——同时存在于多个楼层。
单部四层,基于西门子1200博图v15.1版本 可直接仿真运行,视频就是真实运行画面,功能集全
调度算法像极了渣男的选择困难症,这里用了双向扫描算法:
IF #CurrentDirection = UP THEN FOR #i := #CurrentFloor + 1 TO 4 DO IF #CallUp[#i] OR #CallDown[#i] THEN #TargetFloor := #i; EXIT; END_IF; END_FOR; ELSE FOR #i := #CurrentFloor - 1 DOWNTO 1 DO IF #CallDown[#i] OR #CallUp[#i] THEN #TargetFloor := #i; EXIT; END_IF; END_FOR; END_IF;这代码完美诠释了"吃着碗里看着锅里",上行时连楼上召唤都不放过,下行时连楼下招呼都惦记。EXIT语句用得讲究,像极了找到目标就收手的聪明人。
仿真时HMI画面里的电梯门总让我想起螃蟹——开合速度得调教得刚刚好。门机控制里这个线性插值算法是精髓:
#DoorPosition := REAL_TO_INT(LIMIT(0.0, #DoorPosition + (0.05 * (REAL(#TargetDoorState) - REAL(#DoorPosition))), 100.0));用0.05这个阻尼系数控制门运动曲线,改大了门能给你表演瞬移,改小了比老太太过马路还慢。REALTOINT转换是防手抖的保险丝,毕竟小数点位运算容易闹脾气。
最后说个血泪教训:FB里的静态变量比初恋还难忘,调试时记得在监控表里把它们都揪出来。哪天发现电梯层显乱跳,八成是哪个静态变量在闹情绪。仿真跑起来的时候,看着那蓝色小方块在HMI里上下窜动,恍惚间觉得自己养了只电子仓鼠——这大概就是工控人的浪漫吧。