这个电梯控制程序是我去年参加"西门子杯"工业自动化竞赛时的参赛作品。当时组委会给出的题目是设计一个能够满足三部十层电梯联动的智能控制系统。说实话,第一次看到这个需求时,我脑子里立刻浮现出每天早高峰时写字楼里那些疯狂闪烁的电梯按钮。
在实际开发前,我特意去本市的几栋高层写字楼做了实地考察。通过观察发现,传统电梯控制系统主要存在三个痛点:首先是响应速度慢,特别是在高峰时段;其次是能耗高,空载运行的情况很常见;最后是调度算法不够智能,经常出现多部电梯同时响应同一召唤的情况。
基于这些观察,我给自己的程序设定了几个核心目标:
整个系统采用西门子S7-1200 PLC作为主控制器,这是考虑到其强大的运动控制功能和稳定的通信性能。每部电梯配备:
特别要说明的是通信模块的选择。最初考虑过用Profinet,但实测发现当三部电梯同时移动时,无线信号在电梯井内会有明显衰减。最终改用RS485有线通信,虽然布线麻烦些,但稳定性提升显著。
程序采用模块化设计,主要分为以下几个功能块:
这里重点说说调度算法的设计。我参考了银行家算法和蚁群算法的思想,开发了一套动态权重派梯机制。每个召唤请求会根据以下因素计算权重值:
重要提示:权重计算公式中的系数需要根据实际建筑特点调整。我们测试发现,医院和写字楼的最佳参数组合就完全不同。
电梯的启停控制采用S7-1200内置的PID功能块。调试时发现直接使用默认参数会出现明显的"点头"现象(停层时的晃动)。经过多次测试,最终确定的参数组合为:
每部电梯的运动状态机包含6个状态:
状态转换的逻辑特别要注意互锁保护。我们吃过亏,有一次测试时因为急停信号没处理好,导致电梯在两层之间"跳舞"。
调度算法的核心是这个权重计算公式:
code复制权重 = α*(当前楼层差) + β*(同向任务数) + γ*(预估等待时间)
其中α、β、γ是需要现场调试的系数。在写字楼场景下,我们的经验值是:
算法每200ms重新计算一次各电梯的权重,选择得分最高的派梯。这里有个优化技巧:可以设置一个权重阈值差(比如0.2),只有当最优电梯的权重比次优电梯高出这个阈值时才重新派梯,避免频繁切换。
三部电梯通过RS485组成总线网络,通信协议采用Modbus RTU。每个PLC被分配了唯一的站地址:
通信数据包包含以下关键信息:
实测发现,通信周期设置在300-500ms之间最佳。太频繁会影响运动控制性能,太慢又会导致调度延迟。
外呼按钮的信号处理有个容易踩坑的地方:必须做防抖处理。我们的方案是:
所有外呼请求都存储在全局数据块DB1中,格式如下:
code复制STRUCT
UpCall : ARRAY[1..10] OF BOOL // 每层的上行召唤
DownCall : ARRAY[1..10] OF BOOL // 每层的下行召唤
TimeStamp : ARRAY[1..10] OF TIME // 召唤时间戳
END_STRUCT
调试这种多电梯系统时,强烈建议分阶段进行:
我们当时犯过的错误是直接上三梯联调,结果一个通信问题导致三台电梯全部"罢工",排查起来特别费劲。
另一个实用技巧:在PLC中建立一个调试模式,可以手动设置电梯位置。这样测试特定场景时就不需要真的让电梯跑上跑下。
通过以下优化手段,我们最终将响应时间从最初的5.2s降到了2.8s:
能耗方面,通过以下措施降低了23%:
在实际运行中,我们遇到过这些典型故障:
除了常规的安全回路外,我们还增加了以下保护:
特别提醒:安全相关的程序段一定要放在OB35(循环中断组织块)中执行,确保即使主程序卡死也能正常工作。