1. 项目背景与核心挑战
六层电梯控制系统是工业自动化领域中一个经典的控制逻辑实现案例。在西门子TIA Portal V15(博途)环境下使用SCL语言开发1500系列PLC的电梯控制程序,既考验工程师对结构化文本编程的掌握程度,又需要深入理解电梯运行的安全规范和效率优化。
这个项目的核心难点在于:
- 多楼层呼叫的优先级处理(包括内呼与外呼)
- 运行方向判断逻辑与最优路径规划
- 安全保护机制的全面实现(超载、急停、故障检测等)
- 状态机的合理设计与各状态间的平滑切换
- 与HMI界面的数据交互与实时状态显示
2. 硬件配置与软件环境
2.1 硬件选型说明
实际项目中我们采用以下配置:
- 控制器:S7-1516-3 PN/DP(6ES7 516-3AN01-0AB0)
- 数字量输入模块:6ES7 521-1BH50-0AA0 ×2(用于按钮信号采集)
- 数字量输出模块:6ES7 522-1BH00-0AB0 ×2(控制电梯门机、楼层指示灯等)
- 模拟量输入模块:6ES7 531-7KF00-0AB0(用于称重传感器信号采集)
关键提示:1516系列CPU自带的工作内存(1MB)和装载内存(5MB)完全足够处理六层电梯的逻辑运算,但实际配置时需要预留20%余量应对后期功能扩展。
2.2 软件环境搭建
TIA Portal V15.1的安装需要注意:
- 必须安装"S7-SCL"选件包
- 建议勾选"LAD/FBD/STL/SCL语言支持"组件
- 需要安装对应版本的HSP硬件支持包(针对1516-3 PN/DP)
项目创建时应选择:
- 设备类型:SIMATIC S7-1500
- 编程语言:SCL(后续可添加LAD视图用于辅助调试)
3. 核心控制逻辑实现
3.1 状态机设计
电梯运行包含6个主要状态:
scl复制TYPE ELEVATOR_STATE : (
IDLE, // 待机状态
DOOR_OPENING, // 开门中
DOOR_OPEN, // 门已开
DOOR_CLOSING, // 关门中
ACCELERATING, // 加速上升/下降
CRUISING, // 匀速运行
DECELERATING // 减速停止
);
状态转换条件示例(开门过程):
scl复制IF currentState = IDLE AND targetFloor = currentFloor THEN
doorTimer(IN := TRUE, PT := T#2S);
IF doorTimer.Q THEN
currentState := DOOR_OPENING;
doorMotor(OPEN := TRUE, CLOSE := FALSE);
END_IF;
END_IF;
3.2 呼叫调度算法
采用双向扫描算法处理呼叫请求:
- 记录所有楼层的内呼(轿厢按钮)和外呼(上行/下行按钮)
- 根据当前运行方向优先响应同方向请求
- 无同方向请求时判断最近的反方向请求
核心代码片段:
scl复制FUNCTION_BLOCK CallScheduler
VAR_INPUT
currentFloor : INT;
currentDirection : INT; // 1=up, -1=down, 0=idle
callUp : ARRAY[1..6] OF BOOL;
callDown : ARRAY[1..6] OF BOOL;
carCall : ARRAY[1..6] OF BOOL;
END_VAR
VAR_OUTPUT
targetFloor : INT;
END_VAR
VAR
i : INT;
END_VAR
// 同方向优先检测
FOR i := currentFloor + currentDirection TO
IIF(currentDirection > 0, 6, 1) STEP currentDirection DO
IF callUp[i] OR callDown[i] OR carCall[i] THEN
targetFloor := i;
RETURN;
END_IF;
END_FOR;
// 反方向检测(仅当无同方向请求时)
IF currentDirection <> 0 THEN
FOR i := 1 TO 6 DO
IF (callUp[i] AND i > currentFloor) OR
(callDown[i] AND i < currentFloor) OR
carCall[i] THEN
targetFloor := i;
currentDirection := 0; // 需要改变方向
RETURN;
END_IF;
END_FOR;
END_IF;
3.3 安全保护机制
必须实现的保护功能包括:
- 门锁回路检测(安全继电器反馈)
- 超载保护(通过称重传感器)
- 运行超时监控(防止卡层)
- 急停按钮处理
- 极限位置保护(上下端站开关)
安全逻辑实现示例:
scl复制// 急停处理(最高优先级)
IF emergencyStop THEN
driveMotor(UP := FALSE, DOWN := FALSE);
brakeRelease := FALSE;
currentState := IDLE;
alarm := TRUE;
RETURN;
END_IF;
// 门锁检测
IF NOT doorLocked AND (currentState = ACCELERATING OR
currentState = CRUISING OR
currentState = DECELERATING) THEN
driveMotor(UP := FALSE, DOWN := FALSE);
brakeRelease := FALSE;
currentState := IDLE;
alarm := TRUE;
END_IF;
4. HMI界面设计与数据交互
4.1 WinCC RT Advanced配置
关键界面元素:
- 楼层按钮矩阵(1-6层)
- 运行方向指示灯(上/下箭头)
- 当前楼层数字显示
- 电梯门状态动画
- 报警信息显示区
变量连接示例:
scl复制// HMI按钮事件脚本
Sub OnCarCall(floor)
IF SmartTags("ELEVATOR_ALARM") = 0 THEN
SmartTags("CAR_CALL_" & floor) = 1
END IF
End Sub
4.2 数据刷新策略
采用事件驱动+周期刷新的混合模式:
- 楼层变化、运行方向改变等关键事件立即触发HMI更新
- 次要状态(如门开度百分比)采用500ms周期刷新
- 报警信息采用最高优先级立即显示
优化技巧:
scl复制// PLC侧数据变化检测
IF currentFloor <> lastFloor THEN
HMI_Update_Flag := TRUE;
lastFloor := currentFloor;
END_IF;
// HMI侧接收处理
IF SmartTags("UPDATE_FLAG") THEN
RefreshAllDisplays();
SmartTags("UPDATE_FLAG") = 0;
END_IF;
5. 调试技巧与问题排查
5.1 在线调试方法
-
使用Watch Table监控关键变量:
currentState(状态机当前状态)callUp[1..6](各层上行呼叫)currentFloor(实时楼层)
-
强制功能慎用建议:
- 强制门锁信号时务必确认电梯处于检修模式
- 禁止同时强制运行方向和楼层信号
-
断点设置技巧:
- 在状态转换处设置条件断点
- 在报警触发逻辑处设置永久断点
5.2 典型故障处理
| 故障现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 电梯不响应呼叫 | PLC运行模式错误 | 1. 检查CPU模式指示灯 2. 确认未处于STOP模式 3. 查看诊断缓冲区 |
| 运行到错误楼层 | 编码器信号干扰 | 1. 检查编码器接线屏蔽 2. 测试脉冲计数稳定性 3. 添加软件滤波 |
| 门反复开关 | 光幕信号抖动 | 1. 清洁光幕传感器 2. 调整检测灵敏度 3. 增加去抖延时 |
5.3 性能优化建议
-
扫描周期控制:
- 主OB块循环时间控制在10ms以内
- 运动控制相关功能块放在快速循环OB中
-
内存优化技巧:
scl复制// 使用临时变量替代全局变量 VAR_TEMP tempFloor : INT; END_VAR // 数组访问优化 FOR i := LBOUND(callUp,1) TO UBOUND(callUp,1) DO // 比固定范围1..6更安全 END_FOR; -
代码复用策略:
- 将通用功能封装为FC/FB(如楼层判断、方向控制)
- 使用"#include"指令管理常用代码段
6. 项目扩展方向
在实际工程应用中,可以考虑以下功能增强:
-
群控功能(多台电梯协同调度):
- 增加CANopen通信模块实现PLC间数据交换
- 开发基于负载预测的智能分配算法
-
能耗监测:
- 通过模拟量输入采集电机电流
- 计算运行能耗并生成日报表
-
预测性维护:
- 记录电机启动次数和运行时间
- 基于振动传感器数据分析机械磨损趋势
-
手机APP监控:
- 通过PROFINET转MQTT网关接入物联网平台
- 开发跨平台监控应用(需额外安全验证)
这个项目的核心价值在于展示了如何用SCL实现复杂的顺序控制逻辑。通过结构化编程方法,我们构建了一个可维护、可扩展的电梯控制系统框架。在实际部署时,建议先用仿真器全面测试所有异常场景,特别是安全相关逻辑必须100%覆盖。