1. 项目背景与核心需求
"PLC西门子杯"作为国内工业自动化领域最具影响力的赛事之一,每年都会吸引大量高校学生和企业工程师参与。今年的比赛题目聚焦于电梯控制系统设计,要求选手基于西门子TIA Portal V15.1平台,完成三部十层电梯的协同控制程序开发,并配套WinCC人机交互界面。这个题目看似传统,实则暗含了现代楼宇自动化中的多个关键技术挑战。
在实际工程中,多电梯协同调度一直是个经典难题。与单台电梯控制不同,多电梯系统需要考虑:
- 如何合理分配呼梯请求(比如当10层有人按下下行按钮时,三台电梯中哪台最应该响应)
- 如何避免电梯"扎堆"运行(即多台电梯同时响应同一区域的呼叫)
- 如何平衡能耗与响应速度(比如在非高峰时段自动让部分电梯进入节能模式)
比赛要求使用博图V15.1这个特定版本有其深意。V15.1是西门子推出支持S7-1200/1500全系列PLC的成熟版本,相比新版更稳定,特别适合教学和比赛场景。而WinCC作为监控层,需要与PLC程序深度配合,实现:
- 实时显示三部电梯的运行状态(位置、方向、开关门状态)
- 提供完整的楼层呼叫按钮模拟
- 支持运行数据记录和故障报警显示
2. 硬件架构设计与选型要点
2.1 控制器选型方案
对于三部十层电梯系统,推荐采用以下两种硬件配置方案:
方案A(经济型配置):
- 主控制器:S7-1200 CPU 1215C DC/DC/DC(6ES7 215-1AG40-0XB0)
- 理由:集成14DI/10DO,支持3台通信模块扩展
- 扩展模块:SM1223 16DI/16DO(6ES7 223-1BH30-0XB0)×2
- 每台电梯需要:
- 10个楼层呼叫输入(上下行分开计)
- 10个楼层指示灯输出
- 开关门控制及状态反馈
- 每台电梯需要:
方案B(高性能配置):
- 主控制器:S7-1500 CPU 1511-1 PN(6ES7 511-1AK00-0AB0)
- 优势:处理性能更强,适合复杂算法
- 远程IO:ET200SP接口模块+DI/DO模块
- 优点:分布式安装,减少布线
特别注意:比赛环境中通常已固定硬件配置,实际开发需先确认可用模块型号。
2.2 信号分配策略
合理的I/O地址规划是大型项目的基础。建议采用结构化命名方式:
pascal复制// 电梯1信号示例
"E1_UpCall"[1..10] // 1-10层上行呼叫
"E1_DownCall"[2..10] // 2-10层下行呼叫
"E1_FloorInd"[1..10] // 楼层指示灯
"E1_DoorOpen" // 开门命令
"E1_DoorClosed" // 门状态反馈
对于三部电梯系统,需要在PLC变量表中建立统一的前缀命名规则(如E1/E2/E3),避免信号混乱。
3. 核心控制程序设计
3.1 电梯状态机建模
每台电梯本质上是一个状态机,典型状态包括:
-
空闲状态:
- 停留在最后服务的楼层
- 持续扫描呼叫信号
- 收到呼叫后根据当前位置计算最优路径
-
运行状态:
- 根据目标楼层序列移动
- 实时监测是否到达目标楼层
- 处理同方向的顺路呼叫(即"捎带"逻辑)
-
停靠状态:
- 精确平层控制(需配合编码器反馈)
- 开门保持定时(通常3-5秒)
- 防夹检测(通过光幕或力矩监测)
在SCL中实现状态机的代码框架:
scl复制CASE #elevatorState OF
0: // IDLE
IF #newCall THEN
#targetFloor := CalcTargetFloor();
#elevatorState := 1;
END_IF;
1: // RUNNING
IF #currentFloor = #targetFloor THEN
#doorTimer := 5; // 5秒开门时间
#elevatorState := 2;
ELSE
// 电机控制逻辑
END_IF;
2: // STOPPED
#doorTimer := #doorTimer - 1;
IF #doorTimer <= 0 THEN
#elevatorState := 0;
END_IF;
END_CASE;
3.2 多电梯调度算法实现
比赛的核心难点在于三部电梯的协同调度。推荐实现以下两种算法:
1. 最短距离优先算法:
pascal复制FUNCTION "SCheduler_ShortestDistance"
VAR_INPUT
callFloor : INT; // 呼叫楼层
callDirection : BOOL; // TRUE=上行,FALSE=下行
END_VAR
VAR
distances : ARRAY[1..3] OF INT;
i : INT;
END_VAR
// 计算每台电梯到呼叫点的移动距离
FOR i := 1 TO 3 DO
distances[i] := ABS("Elevator"[i].currentFloor - callFloor);
// 方向不一致时增加惩罚值
IF "Elevator"[i].direction <> callDirection THEN
distances[i] := distances[i] + 10;
END_IF;
END_FOR;
// 选择距离最小的电梯响应
RETURN MIN(distances[1], distances[2], distances[3]);
END_FUNCTION
2. 负载均衡算法:
pascal复制FUNCTION "Scheduler_LoadBalance"
VAR_INPUT
callFloor : INT;
END_VAR
VAR
scores : ARRAY[1..3] OF INT;
i : INT;
END_VAR
// 根据各电梯当前任务数计算得分
FOR i := 1 TO 3 DO
scores[i] := "Elevator"[i].pendingCalls * 5
+ ABS("Elevator"[i].currentFloor - callFloor);
END_FOR;
RETURN MIN(scores[1], scores[2], scores[3]);
END_FUNCTION
实际项目中通常会将两种算法结合使用,并加入高峰时段的特殊调度策略。
4. WinCC人机界面开发
4.1 画面组态技巧
电梯监控画面需要清晰展示三类信息:
-
实时状态信息:
- 电梯轿厢位置(通过动态属性控制图形位置)
- 运行方向(箭头指示)
- 门状态(开/关动画)
-
呼叫状态显示:
- 楼层按钮点亮效果
- 内外呼区分显示
-
系统控制元素:
- 紧急停止按钮
- 模式切换开关(自动/手动)
在WinCC中实现动态效果的关键技巧:
- 使用"直接连接"实现简单动画
- 复杂逻辑使用VBS脚本控制对象属性
- 将重复元素(如楼层按钮)制作成智能对象
4.2 数据记录与报警配置
比赛评分通常会关注系统的完备性,建议配置:
-
运行数据记录:
- 每台电梯的启停时间
- 各楼层服务次数统计
- 平均等待时间计算
-
报警系统:
- 超时报警(电梯长时间未移动)
- 冲突报警(多台电梯同时到达同一楼层)
- 通信故障报警
配置示例(WinCC报警记录):
vbscript复制Sub AddAlarm(elevatorID, alarmType)
Dim msg
msg = FormatDateTime(Now) & " - Elevator " & elevatorID & " "
Select Case alarmType
Case 1: msg = msg & "Door Jammed"
Case 2: msg = msg & "Overload"
Case 3: msg = msg & "Communication Timeout"
End Select
SmartTags("AlarmLog") = SmartTags("AlarmLog") & vbCrLf & msg
End Sub
5. 调试与优化经验
5.1 常见问题排查
在开发过程中,我们团队遇到了几个典型问题:
问题1:电梯响应延迟
- 现象:按下呼叫按钮后,电梯需要3秒以上才启动
- 排查:
- 检查PLC扫描周期(OB1执行时间)
- 确认通信负载(HMI与PLC的数据交换频率)
- 优化程序结构:将调度算法放在循环中断OB中执行
问题2:WinCC画面卡顿
- 原因:过多动态元素同时刷新
- 解决方案:
- 将实时性要求不高的元素改为1秒刷新
- 使用"画面窗口"技术实现局部更新
- 关闭不必要的脚本调试功能
5.2 性能优化技巧
-
PLC程序优化:
- 使用"区域"指令优化数据块访问
scl复制// 不推荐 "DB_Elevator".elevator1.currentFloor; // 推荐 USING "DB_Elevator": elevator1.currentFloor; END_USING; -
通信优化:
- 将HMI需要访问的变量集中在一个DB中
- 设置合理的更新周期(通常500ms足够)
-
异常处理:
- 为所有电梯运动指令添加超时监控
scl复制IF "UpCommand" THEN #moveTimer := 10; // 10秒超时 "MotorUp" := 1; END_IF; IF #moveTimer > 0 THEN #moveTimer := #moveTimer - 1; IF #moveTimer = 0 AND NOT "FloorReached" THEN // 触发超时报警 END_IF; END_IF;
6. 扩展功能建议
对于希望获得加分项的选手,可以考虑实现:
-
智能预测功能:
- 基于历史数据预测高峰时段
- 提前调度电梯到高频楼层待命
-
节能模式:
- 在低使用率时段自动停运部分电梯
- 轿厢照明自动调节
-
手机监控接口:
- 通过Web服务器提供远程状态查看
- 使用WinCC/WebNavigator选件实现
实现Web访问的基本步骤:
- 在WinCC中启用WebNavigator
- 配置用户权限
- 设计移动端适配画面
- 设置路由器端口转发(如允许远程访问)
在开发这类复杂系统时,保持程序结构清晰至关重要。我们团队采用模块化设计:
- 每个电梯作为独立FB(功能块)
- 调度算法封装在专用FC中
- HMI事件处理使用单独的脚本文件
这种结构不仅便于调试,也方便后续功能扩展。比如要增加第四部电梯时,只需实例化新的FB实例并更新调度算法即可。
