1. 项目概述:六层二部电梯控制系统仿真
这个项目是我去年为某商业综合体设计的电梯控制系统仿真原型,采用西门子S7-1200 PLC和KTP700 HMI构建完整的控制逻辑和人机交互界面。不同于单梯控制,双电梯协同调度需要考虑更多复杂场景——比如高峰时段的负载均衡、紧急情况下的优先权分配,以及最关键的如何避免两部电梯"抢单"同一召唤信号。
在真实工程中,电梯控制系统的可靠性直接关系到人身安全。通过这个仿真项目,我们可以安全地测试各种极端工况:从模拟突发电梯困人,到测试断电后的自动平层功能,再到验证消防模式下的紧急响应。所有逻辑都经过200+次循环测试,确保在物理设备上部署前消除潜在风险。
2. 系统架构设计
2.1 硬件组态方案
核心控制单元选用S7-1215C DC/DC/DC型号PLC,该型号自带16DI/16DO,通过SB1223模块扩展至48点数字量输入。两个CM1241 RS485模块分别连接:
- 电梯轿厢的绝对值编码器(通过MODBUS RTU协议读取楼层位置)
- HMI触摸屏(采用PPI通信协议)
HMI选用KTP700 Basic PN型号,在其画面中集成:
- 双电梯三维运行状态动画
- 实时故障诊断窗口
- 维护人员参数设置界面(需密码权限)
2.2 软件功能划分
在博途V17环境中创建的项目包含以下关键OB块:
- OB1:主循环执行调度算法
- OB35:100ms定时中断处理实时位置检测
- OB82:硬件故障中断处理
- OB86:机架故障中断响应
重点FB功能块包括:
- FB1001:电梯运动控制(含S曲线加减速算法)
- FB1002:呼梯信号分配仲裁
- FB1003:安全回路监控
- FB1004:能耗统计与预测
3. 核心控制逻辑实现
3.1 双梯调度算法
采用动态分区调度策略,将6个楼层划分为两个服务区间。初始化时1-3层分配给电梯A,4-6层给电梯B。当某部电梯负载率超过70%时,系统自动调整分区边界。关键实现代码如下:
ST复制// 在FB1002中实现的调度逻辑
IF "Elevator_A".CurrentLoad > 70 THEN
"Partition_Boundary" := 2; // 将分界点下移至2层
ELSIF "Elevator_B".CurrentLoad > 70 THEN
"Partition_Boundary" := 4; // 将分界点上移至4层
ELSE
"Partition_Boundary" := 3; // 恢复默认分界
END_IF;
3.2 位置检测与平层校正
使用格雷码编码器通过MODBUS传输位置数据,在OB35中实现以下处理:
- 原始值滤波(中值平均算法)
- 速度计算(单位ms的脉冲变化量)
- 平层信号补偿(当速度<0.1m/s时触发红外校正)
关键细节:必须将编码器Z相信号接入高速输入点,用作绝对位置校准基准。普通DI点响应时间可能造成±5mm的平层误差。
3.3 安全回路设计
安全链包含8个串联触点:
- 限速器开关
- 轿厢急停按钮
- 盘车轮安全开关
- 厅门锁状态
- 轿门锁状态
- 超载传感器
- 缓冲器开关
- 紧急电源接触器
任何一路断开都会触发:
- 立即切断驱动电源
- 抱闸强制动作
- HMI弹出红色报警画面
- 通过GSM模块发送报警短信(需外接通信网关)
4. HMI界面开发技巧
4.1 三维动画实现
在WinCC中通过以下组合实现动态效果:
- 使用"符号IO域"显示电梯轿厢位置
- 用"棒图"控件表示载荷百分比
- 通过"图形列表"切换不同角度的轿厢图片
- 用"动画"功能实现开关门动作
关键参数设置:
- 垂直移动动画的"过程变量"绑定PLC发送的实时位置值(0-6000mm)
- 设置移动速度为实际运行速度的1.5倍(增强视觉流畅度)
- 添加移动加速度/减速度参数使启停更自然
4.2 故障诊断界面
开发了带时间轴的故障记录器,特点包括:
- 支持按日期/类型/严重程度过滤
- 可导出CSV格式报表
- 关联维护知识库(长按故障代码显示处理方案)
- 自动生成MTBF统计图表
5. 仿真测试方案
5.1 测试用例设计
开发了六类典型场景的测试脚本:
- 常规模式测试:随机生成呼梯信号验证响应时间
- 满载测试:模拟两部电梯同时达到额定载荷
- 故障注入测试:随机断开安全回路信号
- 电源波动测试:模拟±20%电压波动
- 紧急模式测试:触发消防开关验证优先响应
- 长时间运行测试:连续72小时无间断运行
5.2 PLCSIM Advanced高级应用
利用TIA Portal的仿真功能实现:
- 虚拟MODBUS设备模拟编码器信号
- 网络延迟注入测试通信稳定性
- 通过REST API自动执行测试序列
- 保存/加载设备状态实现快速回测
典型测试脚本示例:
python复制import requests
# 设置电梯A停靠在3层
response = requests.post(
'http://localhost:5000/api/v1/plc/inputs',
json={'address': 'IB100', 'value': 48})
# 生成4层上行召唤
response = requests.post(
'http://localhost:5000/api/v1/plc/inputs',
json={'address': 'IB50', 'value': 16})
6. 工程经验总结
6.1 关键参数整定
通过实测获得的优化参数:
- 加速度时间:1.8s(舒适模式)/1.2s(高效模式)
- 平层提前量:上行为15mm,下行为20mm(补偿机械间隙)
- 开门延时:满载时增加0.5s防止夹人
- 待机位置:非高峰时段A梯停3层,B梯停4层
6.2 常见问题排查
-
位置漂移问题:
- 现象:平层时轿厢上下晃动
- 检查:编码器联轴器是否松动
- 对策:增加机械定位销并重新校准零位
-
通信中断问题:
- 现象:HMI频繁显示"PLC无响应"
- 检查:RS485终端电阻是否匹配
- 对策:在最后一个节点并联120Ω电阻
-
调度冲突问题:
- 现象:双梯同时响应同一召唤
- 检查:分区边界更新周期是否过短
- 对策:将分区重算周期从1s调整为3s
这个项目最让我印象深刻的是安全回路的设计细节——每个触点都采用双常闭触点串联,并且在PLC程序中做"0→1→0"的跳变检测。有次测试时模拟门锁故障,系统在28ms内就完成了制动响应,这个速度比机械安全钳的触发还要快。