1. 项目概述
这个三台十层电梯联控系统案例是我几年前用西门子TIA Portal V14开发的一个典型工控项目,采用三台S7-1200 PLC(1215C DC/DC/DC型号)分别控制三部电梯,配合WinCC RT Professional实现集中监控界面。虽然现在博途已经更新到V18版本,但这个案例中展现的联锁逻辑和HMI交互设计思路至今仍具有很高的参考价值。
项目最大的技术亮点在于电梯间的协同调度算法设计。当多部电梯同时响应同一楼层的呼叫请求时,系统需要智能分配最近的电梯前往服务。这种分布式控制逻辑在商场、写字楼等实际场景中非常实用,能够显著提升电梯系统的运行效率。
2. 硬件配置与网络架构
2.1 PLC选型与配置
我们选用的是西门子S7-1215C DC/DC/DC型号PLC,这款控制器具有:
- 14点数字量输入/10点数字量输出
- 2路模拟量输入
- 集成PROFINET接口
- 工作内存75KB
对于十层电梯控制来说,这个配置完全够用。每台PLC独立控制一部电梯,通过PROFINET网络实现PLC间的数据交换。在实际部署时,建议为每台PLC配置独立的24V电源,避免因电源故障导致多部电梯同时停运。
2.2 HMI系统设计
WinCC RT Professional作为监控系统运行在工控机上,通过OPC UA与三台PLC通信。界面设计要点包括:
- 每部电梯的独立状态显示(位置、运行方向、门状态)
- 楼层呼叫按钮矩阵
- 紧急停止和维修模式开关
- 运行数据统计区域
3. 核心控制逻辑实现
3.1 电梯方向判断算法
电梯运行方向判断是控制系统的核心逻辑之一。我们采用SCL语言编写了专门的功能块FB_ElevatorDirection,其算法原理如下:
scl复制FUNCTION_BLOCK FB_ElevatorDirection
VAR_INPUT
currentFloor : INT;
targetFloor : ARRAY[1..10] OF BOOL;
END_VAR
VAR_OUTPUT
direction : INT; //-1=下行 0=停止 1=上行
END_VAR
VAR
i : INT;
hasAbove, hasBelow : BOOL;
END_VAR
这个算法通过遍历目标楼层数组,判断当前楼层上方和下方是否有呼叫请求。特别值得注意的是中间楼层的"方向保持"逻辑:当电梯处于移动状态且上下都有呼叫时,会保持原运行方向,这符合电梯运行的实际物理特性,避免了频繁改变方向造成的机械损耗。
3.2 多电梯协同调度
当多部电梯同时响应同一楼层的呼叫时,系统采用"最近优先"原则进行分配。实现这一功能的要点包括:
- 每部电梯实时计算与目标楼层的距离
- 通过全局数据块共享各电梯的位置和状态信息
- 使用互锁信号确保只有一部电梯响应同一呼叫
互锁逻辑的实现代码如下:
scl复制IF #DoorOpenCmd[1] THEN
#DoorLock[2] := 1;
#DoorLock[3] := 1;
ELSIF #DoorOpenCmd[2] THEN
#DoorLock[1] := 1;
#DoorLock[3] := 1;
...
4. HMI界面设计与动画实现
4.1 电梯位置动态显示
WinCC界面中电梯轿厢位置的平滑移动是通过全局脚本实现的。关键代码如下:
vbs复制Dim actualFloor
actualFloor = SmartTags("Elevator1/CurrentFloor")
If actualFloor > 0 Then
PositionY = 460 - (actualFloor -1)*40 + (SmartTags("Elevator1/Moving") * 20 * Sin(Time/100))
End If
这段代码实现了两个效果:
- 根据电梯实际楼层计算基本位置(每层40像素间距)
- 通过Sin函数添加轻微晃动效果,模拟电梯运行时的真实感
4.2 操作响应优化
在HMI设计中,我们特别注意了操作响应速度的问题:
- 按钮按下后立即有视觉反馈
- 重要状态变更采用颜色高亮
- 长操作显示进度指示器
- 避免复杂动画影响界面响应
5. 调试经验与问题解决
5.1 信号丢失问题
在初期调试中发现,直接使用MOVE指令更新目标楼层数组会导致偶尔的信号丢失。这是因为:
- MOVE指令在特定扫描周期可能被覆盖
- 位操作比字操作更适合处理离散信号
最终采用SET_BIT指令解决了这个问题:
scl复制//正确写法
SET_BIT(arr:=floorRequests, bitIdx:=callFloor-1, value:=true);
5.2 索引偏移陷阱
SCL数组索引从1开始,而SET_BIT的位索引从0开始,这个差异导致了许多调试问题。建议封装统一的函数处理这类转换:
scl复制FUNCTION SetFloorRequest : VOID
VAR_INPUT
floor : INT;
value : BOOL;
END_VAR
VAR_IN_OUT
requests : ARRAY[1..10] OF BOOL;
END_VAR
SET_BIT(arr:=requests, bitIdx:=floor-1, value:=value);
6. 系统安全设计
6.1 紧急模式处理
在紧急情况下(如火警),系统需要:
- 解除所有互锁
- 将所有电梯强制运行到指定楼层(通常是1楼)
- 打开所有电梯门
- 禁用常规呼叫功能
这部分逻辑实现在专用的功能块FB_EmergencyMode中。
6.2 断电恢复处理
在OB100组织块中实现初始化逻辑,确保上电后:
- 清除所有互锁信号
- 重置电梯位置传感器
- 恢复默认运行参数
- 检查各电梯状态是否一致
7. 性能优化建议
经过实际运行测试,我们总结出以下优化经验:
- 将频繁访问的数据放在优化数据块中
- 对实时性要求高的逻辑放在循环中断OB中执行
- 避免在SCL中使用复杂的数据结构
- 合理设置PROFINET的更新时间
- 对WinCC的变量采集进行分组和优化
8. 项目扩展思路
这个基础框架可以进一步扩展:
- 增加电梯能耗监测功能
- 实现基于时间表的智能调度(如上下班高峰期模式)
- 添加远程监控和诊断接口
- 集成门禁系统(如VIP楼层控制)
- 开发手机APP呼叫功能
在实际项目中,我们后来还增加了电梯故障自诊断和预测性维护功能,通过分析运行数据提前发现潜在的机械问题。