1. 项目背景与需求分析
作为一名在工业自动化领域摸爬滚打多年的工程师,我最近接到一个六层办公楼电梯控制系统的改造项目。业主方明确要求采用西门子S7-1500系列PLC和博途V15平台进行开发,这让我想起了十年前第一次接触电梯控制时的青涩经历。电梯控制系统看似简单,实则暗藏玄机,特别是当需要兼顾效率与安全时,编程逻辑的严谨性就显得尤为重要。
六层电梯的控制核心需求可以归纳为以下几个关键点:
-
楼层响应:必须准确识别并响应轿厢内选层按钮和楼层外呼梯信号。这里需要特别注意外呼信号的优先级处理,比如当电梯上行时,应该优先响应同方向的外呼信号。
-
运行控制:需要实现电梯的平稳启停、加减速控制以及精确的平层停靠。根据我的经验,平层精度最好控制在±5mm以内,这对编码器选型和PLC程序响应速度都提出了较高要求。
-
安全保护:必须包含门锁检测、超载保护、急停等安全回路。在实际项目中,我曾遇到过因门锁信号抖动导致的电梯异常停运,后来通过硬件滤波和软件去抖双重措施才彻底解决。
-
状态显示:需要实时显示电梯当前楼层、运行方向及轿厢内外的呼叫状态。显示延迟应控制在200ms以内,否则会给用户带来不好的体验。
2. 硬件配置与软件环境搭建
2.1 硬件选型建议
基于项目需求,我推荐以下硬件配置方案:
| 设备类型 | 型号 | 数量 | 备注 |
|---|---|---|---|
| PLC主机 | S7-1511-1PN | 1 | 基本型CPU,满足控制需求 |
| 数字量输入模块 | SM521 | 2 | 处理按钮和传感器信号 |
| 数字量输出模块 | SM522 | 1 | 控制电机和指示灯 |
| 编码器模块 | SM338 | 1 | 高精度位置检测 |
| HMI面板 | KTP700 Basic | 1 | 人机交互界面 |
特别提醒:编码器建议选择绝对值型,分辨率至少1000脉冲/转。我曾在一个项目中使用增量式编码器,结果停电后需要重新寻址,给维护带来不少麻烦。
2.2 博途V15工程配置
在博途V15中新建项目时,有几个关键设置需要注意:
-
PLC设备添加:在项目树中右键点击"添加新设备",选择"S7-1500"系列下的具体CPU型号。这里容易犯的错误是选错CPU版本,务必确认固件版本与实物一致。
-
硬件组态:按照实际硬件配置添加IO模块。添加SM521输入模块时,记得设置输入滤波时间(建议4ms),这样可以有效消除按钮抖动带来的误信号。
-
SCL编程环境:在OB1组织块中右键选择"插入SCL段",这是我们编写电梯控制逻辑的主要区域。我习惯先在全局DB中定义所有变量,再在SCL中调用,这样程序结构更清晰。
提示:博途V15对硬件配置的校验非常严格,组态完成后务必执行"编译"操作,确保没有硬件冲突或参数错误。
3. SCL程序架构设计
3.1 变量定义规范
良好的变量命名习惯能极大提高程序可读性。我采用匈牙利命名法,前缀表示变量类型:
scl复制// 电梯状态变量
VAR_GLOBAL
// 当前楼层(1-6)
iCurrentFloor : INT := 1;
// 运行方向(0-停止,1-上行,2-下行)
iDirection : INT := 0;
// 各楼层呼叫状态
aCallUp : ARRAY[1..6] OF BOOL := [6(FALSE)]; // 上行呼叫
aCallDown : ARRAY[1..6] OF BOOL := [6(FALSE)]; // 下行呼叫
aCarCall : ARRAY[1..6] OF BOOL := [6(FALSE)]; // 轿厢呼叫
// 安全信号
bDoorClosed : BOOL; // 门已关闭
bOverload : BOOL; // 超载信号
bEmergency : BOOL; // 急停信号
END_VAR
经验之谈:数组索引最好从1开始,这样aCallUp[1]就对应1楼的上呼信号,更符合人类直觉。我曾见过从0开始索引的电梯程序,调试时经常出现楼层错位的尴尬情况。
3.2 主控制逻辑实现
电梯的核心控制逻辑可以采用状态机模式,我将其分为以下几个状态:
- 空闲状态:电梯待机,等待呼叫
- 加速阶段:电机启动,速度逐渐提升
- 匀速运行:保持恒定速度移动
- 减速阶段:接近目标楼层时减速
- 平层停靠:精确停止并开门
scl复制CASE iState OF
// 状态1:空闲待机
1:
IF CheckCall() THEN
iState := 2; // 转入加速状态
SetDirection(); // 确定运行方向
END_IF;
// 状态2:加速阶段
2:
IF bAccelComplete THEN
iState := 3; // 转入匀速状态
END_IF;
// 其他状态处理...
END_CASE;
实际调试中发现,状态切换的条件判断要特别小心。比如从加速到匀速的转换,不能仅靠定时器,最好结合编码器反馈的速度值进行双重判断。
4. 关键功能实现细节
4.1 呼叫登记与分配算法
电梯效率很大程度上取决于呼叫分配算法。我采用经典的"LOOK"算法,其核心逻辑是:
- 记录所有呼叫信号
- 按当前运行方向顺序响应同方向呼叫
- 到达最远端呼叫后反向运行
scl复制FUNCTION CheckCall : BOOL
VAR_INPUT
iCurrent : INT;
iDir : INT;
END_VAR
VAR
i : INT;
BEGIN
// 上行方向检查
IF iDir = 1 THEN
FOR i := iCurrent TO 6 DO
IF aCallUp[i] OR aCarCall[i] THEN
RETURN TRUE;
END_IF;
END_FOR;
// 下行方向检查
ELSE
FOR i := iCurrent DOWNTO 1 DO
IF aCallDown[i] OR aCarCall[i] THEN
RETURN TRUE;
END_IF;
END_FOR;
END_IF;
RETURN FALSE;
END_FUNCTION
在某个商业综合体项目中,这个算法相比传统的SCAN算法使平均候梯时间减少了约15%。但要注意,在高峰时段可能需要加入负载均衡逻辑。
4.2 平层控制精准实现
平层精度是电梯舒适度的关键指标。我的实现方案是:
- 粗定位:通过旋转编码器计算楼层位置
- 精定位:在距离目标楼层±100mm时切换为低速运行
- 最终停止:当平层光电开关触发时立即制动
scl复制// 平层控制逻辑
IF (iTargetFloor = iCurrentFloor) AND (ABS(rPosition - rTargetPos) < 100.0) THEN
// 进入精定位区域
rSpeed := 0.2; // 低速运行
IF bLevelSensor THEN
// 触发平层信号
rSpeed := 0.0;
bBrake := TRUE;
iState := 5; // 转入开门状态
END_IF;
END_IF;
这里使用的rPosition是来自编码器的实际位置值,需要通过以下公式计算:
code复制rPosition = (iEncoderCount / iEncoderResolution) * fGearRatio * fPulleyCircumference
其中,iEncoderResolution是编码器每转脉冲数,fGearRatio是减速箱速比,fPulleyCircumference是曳引轮周长。
5. 安全保护与异常处理
5.1 安全回路设计
电梯安全不容丝毫马虎。我将安全信号分为三个等级:
- A级安全(立即停止):急停、超速、门锁异常
- B级安全(完成当前服务后停止):超载、过热
- C级安全(仅报警):通讯异常、传感器故障
scl复制// A级安全处理
IF bEmergency OR NOT bDoorClosed OR (rSpeed > rMaxSpeed) THEN
// 立即切断电机电源
bMotorPower := FALSE;
// 触发机械制动
bBrake := TRUE;
// 记录故障代码
iFaultCode := 1001;
END_IF;
特别强调:安全回路必须采用硬件继电器实现,不能仅靠PLC程序。我曾经审计过一个项目,他们完全依赖PLC做安全控制,这严重违反了GB7588电梯安全规范。
5.2 信号防抖处理
机械按钮和传感器信号往往存在抖动问题。我采用软件滤波结合硬件RC电路的双重措施:
scl复制// 软件滤波算法
FUNCTION Debounce : BOOL
VAR_INPUT
bRawInput : BOOL;
tDelay : TIME := T#200ms;
END_VAR
VAR
tTimer : TON;
END_VAR
BEGIN
tTimer(IN := bRawInput, PT := tDelay);
RETURN tTimer.Q;
END_FUNCTION
对于关键信号如门锁检测,建议滤波时间设置为100-200ms;而对于呼梯按钮,50ms左右的延时就能有效消除抖动,又不会让用户感到响应迟钝。
6. 调试技巧与性能优化
6.1 在线调试方法
博途V15提供了强大的在线调试功能,我常用的几个技巧:
- 强制表监控:将关键变量添加到监控表,可以实时修改值进行测试
- 轨迹记录:记录电梯运行过程中的速度曲线、位置曲线
- 断点调试:在关键逻辑处设置断点,分析程序流程
注意:在线修改程序后,务必先下载到PLC再测试。我有次忘记下载就直接测试,浪费了半天时间找"bug"。
6.2 性能优化建议
通过以下几个措施可以提升电梯响应速度:
- 扫描周期优化:将电梯控制程序放在快速循环OB中(如OB35),设置周期为50ms
- 代码结构优化:将频繁执行的逻辑(如呼叫检查)写成FC/FB,减少重复代码
- 通信优化:HMI与PLC的通信数据区尽量使用连续的MB/SM区
在最近的一个项目中,通过优化程序结构,PLC的扫描周期从15ms降到了8ms,电梯的平均响应时间提升了40%。
7. 扩展功能探讨
基础的电梯控制实现后,可以考虑添加以下增值功能:
- 节能模式:空闲时自动关闭轿厢照明,降低待机功耗
- 高峰调度:上班高峰时段自动优先服务主要楼层
- 故障预测:通过电机电流分析,提前预警可能的机械故障
比如节能模式的实现逻辑:
scl复制// 节能模式控制
IF (tIdle.TIME > T#5min) AND NOT bEnergySave THEN
// 关闭轿厢照明
bCarLight := FALSE;
// 降低通风功率
iFanSpeed := 30;
bEnergySave := TRUE;
END_IF;
这些功能看似简单,但实际添加时需要充分考虑与原有控制逻辑的兼容性。建议先在仿真环境中充分测试,再应用到实际设备。