Skip to main content

 

引言

电梯是现代建筑中不可或缺的交通工具,其安全和高效运行对于人们的日常生活至关重要。随着自动化技术的发展,越来越多的电梯系统开始采用 PLC(可编程逻辑控制器)进行智能控制。本文将介绍一个基于 PLC 的电梯控制程序,旨在实现楼层呼叫、智能开关门以及超载保护等功能,使电梯运行更加安全、便捷。

 

1

   

程序代码及介绍

下面是完整的 PLC 程序代码(代码基于 CodeSys 平台的 ST 语言):

FUNCTION_BLOCK FB_ElevatorControl
VAR_INPUT    
    CallButtons : ARRAY[1..cMaxFloors] OF BOOL;  // 楼层呼叫按钮    
    FloorSensors : ARRAY[1..cMaxFloors] OF BOOL; // 楼层传感器    
    DoorOpenBtn : BOOL;           // 开门按钮    
    DoorCloseBtn : BOOL;          // 关门按钮    
    DoorObstacle : BOOL;          // 门障碍物传感器    
    Overload : BOOL;              // 超载传感器
END_VAR
VAR_OUTPUT    
    MotorUp : BOOL;               // 电机上升    
    MotorDown : BOOL;             // 电机下降    
    DoorOpen : BOOL;              // 开门   
    DoorClose : BOOL;             // 关门    
    CurrentFloor : INT;           // 当前楼层    
    Direction : INT;              // 方向:0=停止,1=上升,2=下降
END_VAR
VAR    
    State : (IDLE, MOVING, DOOR_OPENING, DOOR_OPEN, DOOR_CLOSING);    
    TargetFloor : INT;    
    DoorTimer : TON;    
    MoveTimer : TON;    
    LastFloorSensor : ARRAY[1..cMaxFloors] OF BOOL;    
    I : INT;
END_VAR
VAR CONSTANT    
    cMaxFloors : INT := 5;
END_VAR
// 检测楼层传感器变化,更新当前楼层
FOR i := 1 TO cMaxFloors DO    
    IF FloorSensors[i] AND NOT LastFloorSensor[i] THEN        
        CurrentFloor := i;    
    END_IF    
    LastFloorSensor[i] := FloorSensors[i];
END_FOR
CASE State OF    
    IDLE:        
        // 检查是否有呼叫        
        TargetFloor := 0;        
        FOR i := 1 TO cMaxFloors DO            
            IF CallButtons[i] THEN                
                TargetFloor := i;                
                EXIT;            
            END_IF        
        END_FOR        
        IF TargetFloor > 0 THEN            
            IF TargetFloor > CurrentFloor THEN                
                Direction := 1;  // 上升            
            ELSIF TargetFloor < CurrentFloor THEN                
                Direction := 2;  // 下降            
            ELSE                
                State := DOOR_OPENING;                
                Direction := 0;                
                RETURN;            
            END_IF            
            State := MOVING;        
        END_IF    
    MOVING:        
        IF Direction = 1 THEN            
            MotorUp := TRUE;            
            // 模拟运行时间,实际中应由楼层传感器触发            
            MoveTimer(IN := TRUE, PT := T#3s);            
            IF MoveTimer.Q OR (TargetFloor = CurrentFloor) THEN                
                MotorUp := FALSE;                
                State := DOOR_OPENING;                
                Direction := 0;            
            END_IF        
        ELSIF Direction = 2 THEN            
            MotorDown := TRUE;            
            MoveTimer(IN := TRUE, PT := T#3s);            
            IF MoveTimer.Q OR (TargetFloor = CurrentFloor) THEN                
                MotorDown := FALSE;                
                State := DOOR_OPENING;                
                Direction := 0;            
            END_IF        
        END_IF    
    DOOR_OPENING:        
        DoorOpen := TRUE;        
        DoorTimer(IN := TRUE, PT := T#2s);        
        IF DoorTimer.Q THEN            
            State := DOOR_OPEN;            
            DoorTimer(IN := FALSE);        
        END_IF    
    DOOR_OPEN:        
        // 开门状态保持,等待关门命令或超时        
        DoorOpen := TRUE;        
        IF DoorCloseBtn AND NOT DoorObstacle THEN            
            State := DOOR_CLOSING;        
        END_IF        
        // 超时自动关门        
        DoorTimer(IN := TRUE, PT := T#10s);        
        IF DoorTimer.Q THEN            
            State := DOOR_CLOSING;            
            DoorTimer(IN := FALSE);        
        END_IF    
    DOOR_CLOSING:        
        DoorClose := TRUE;        
        DoorTimer(IN := TRUE, PT := T#2s);        
        IF DoorTimer.Q THEN            
            DoorOpen := FALSE;            
            DoorClose := FALSE;            
            State := IDLE;            
            DoorTimer(IN := FALSE);        
        END_IF        
        // 关门过程中遇到障碍物,重新开门        
        IF DoorObstacle THEN            
            State := DOOR_OPENING;            
            DoorClose := FALSE;        
        END_IF
END_CASE
// 超载时不能关门
IF Overload AND State = DOOR_CLOSING THEN    
    State := DOOR_OPENING;    
    DoorClose := FALSE;
END_IF

 

2

   

程序结构解析

该程序主要由以下几个部分组成:

输入变量

  • CallButtons数组用于接收各楼层的呼叫按钮信号。

  • FloorSensors数组用于检测电梯当前所在的楼层。

  • DoorOpenBtnDoorCloseBtn用于手动控制电梯门的开关。

  • DoorObstacle用于检测门口是否有障碍物。

  • Overload用于检测电梯是否超载。

输出变量

  • MotorUpMotorDown用于控制电梯电机的上升和下降。

  • DoorOpenDoorClose用于控制电梯门的开关状态。

  • CurrentFloor表示电梯当前所处的楼层。

  • Direction表示电梯的运行方向。

内部变量

  • State枚举表示电梯的当前状态,包括空闲(IDLE)、移动(MOVING)、开门中(DOOR_OPENING)、开门(DOOR_OPEN)和关门中(DOOR_CLOSING)。

状态机逻辑

  • 程序通过状态机设计控制电梯的运行流程,确保每个环节的状态转换清晰且高效。

 

3

   

应用场景

该电梯控制程序适用于以下场景:

住宅小区:为居民提供方便快捷的上下楼服务,确保安全性和舒适性。

办公大楼:高效管理多层建筑内的人员流动,提高工作效率。

商场和公共场所:在大型商场或公共建筑中,电梯系统能够有效调度客流,提升顾客体验。


4

   

拓展思考

在实际应用中,该程序可以进一步扩展以满足更多需求,例如:

智能调度:结合人工智能算法,实现电梯智能调度,根据实时客流量优化运行策略。

远程监控:通过网络实现远程监控与故障诊断,提高运维效率。

紧急响应:在火灾等紧急情况下,电梯能够自动响应,迅速转移到安全楼层。

 

总结

本文介绍了一种基于 PLC 的电梯控制程序,通过智能化的控制方式实现了楼层呼叫、智能开关门及超载保护等功能。该程序不仅提高了电梯的运行安全性和效率,也为未来电梯系统的智能化发展奠定了基础。随着技术的不断进步,电梯控制系统的智能化程度将会进一步提升,为人们的出行带来更多便利。

图片

你来出题 我来答图片图片图片

欢迎大家在评论区提一些标准功能块的需求,如果合适,我们会在以后的文章中与大家分享。

图片

往期回顾


 

每周一个编程小例子 :Bit 到 Word 转换的两种实现方案对比

每周一个编程小例子:记录设备运行时间

每周一个编程小例子:基于长按检测的启动控制系统

每周一个编程小例子:探秘 PLC 数据记录功能块

每周一个编程小例子:心跳检测与 PLC 应用

每周一个编程小例子:斜坡发生器

每周一个编程小例子:旋转速度计算

每周一个编程小例子:计算 PLC 循环周期|例程需求征集!

每周一个编程小例子:如何优雅的分割字符串

每周一个编程小例子:带反馈的阀门控制程序

每周一个编程小例子:西门子 LGF 库中的脉冲继电器功能块

每周一个编程小例子:曲线加减速的控制应用

每周一个编程小例子:轻松去除字符串前导字符

每周一个编程小例子:根据阈值更新输入

每周一个编程小例子:官方模拟量输入处理模块

每周一个编程小例子:主从电机的时序控制

每周一个编程小例子:基于一阶滞后滤波的优化方案

每周一个编程小例子:16 进制到浮点数的神奇转换

每周一个编程小例子:PLC 长按控制程序

每周一个编程小例子:PLC 程序实现多位整数拆分

每周一个编程小例子:流量累积计算器

每周一个编程小例子:用于连锁的电机标准控制模块

每周一个编程小例子:PID 控制算法在 PLC 系统中的实现与应用

每周一个编程小例子:自定义种子生成随机数

每周一个编程小例子:可调时间的脉冲生成器

每周一个编程小例子:带滤波的标准模拟量输入功能块

每周一个编程小例子:使用 PLC 将字符串转换为日期格式

每周一个编程小例子:PLC 配方管理

每周一个编程小例子:比较两个 DB 块(STL)

每周一个编程小例子:如何使用 PLC 实现数组逆序

每周一个编程小例子:流量累计与批次控制

每周一个编程小例子:自定义循环执行控制程序

每周一个编程小例子:步进控制功能块

每周一个编程小例子:PLC 权重比例分配器

每周一个编程小例子:数字量输入组监控

每周一个编程小例子:实时数据分析

每周一个编程小例子:PLC 多轴同步控制的理解与应用

每周一个编程小例子:PLC 波形生成器 (正弦 方波 三角波)

每周一个编程小例子:模拟量信号报警

每周一个编程小例子:组合数概率的实现

每周一个编程小例子:多传感器信号融合与优化方案

每周一个编程小例子:监控模拟信号的健康状态

每周一个编程小例子:PLC 程序实现模拟信号的线性校准

每周一个编程小例子:智能报警过滤器:优化报警系统的 PLC 程序

每周一个编程小例子:使用 PLC 程序让灯光呼吸

每周一个编程小例子:自适应性滤波器:动态调整以平衡响应与稳定性

每周一个编程小例子:卡尔曼滤波器在自动化中的简单应用

每周一个编程小例子:多模式定时器

每周一个编程小例子:基于 PLC 的编码器速度计算器

每周一个编程小例子:电机顺序启动与停止程序

图片

2026年5月

Tags