单部四层基于西门子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里上下窜动恍惚间觉得自己养了只电子仓鼠——这大概就是工控人的浪漫吧。