PLC编程中的IF语句:从基础到高级的全面指南(附源码例程)

前言

在工业自动化领域,PLC被广泛应用于控制机械动作和工艺流程。支持多种编程语言,ST 语言类似于高级语言,本文将详细介绍 ST(倍福)、SCL (西门子)语言中的 IF 语句,帮助大家从扫描时序角度理解和应用这一基本控制结构。

一、 IF语句基础语法与核心用法

1、单条件分支 (IF...THEN...END_IF)

  • 功能: 当条件为真时,执行特定操作。
  • 语法:
IF <条件表达式> THEN
    // 条件为 TRUE 时执行的语句
END_IF;

·示例: 当水箱水位高于高水位开关时,关闭进水阀。

IF WaterLevel > HighLevelSwitch THEN
    InletValve := FALSE; // 关闭阀门
END_IF;

2、双分支选择 (IF...THEN...ELSE...END_IF)

  • 功能: 条件为真执行A,否则执行B。
  • 语法:
IF <条件表达式> THEN
    // 条件为 TRUE 时执行的语句
ELSE
    // 条件为 FALSE 时执行的语句
END_IF;

o 示例: 根据启动按钮状态控制电机启停,按下启动电机,松开停止电机;

IF StartButton THEN
    Motor := TRUE; // 启动电机
ELSE
    Motor := FALSE; // 停止电机
END_IF;

3、多条件分支 (IF...THEN...ELSIF...ELSE...END_IF)

  • 功能: 按顺序检查多个条件,执行第一个为真的分支。
  • 语法:
IF <条件1> THEN
    // 条件1为 TRUE 时执行的语句
ELSIF <条件2> THEN
    // 条件2为 TRUE 时执行的语句
ELSIF <条件3> THEN
    // 条件3为 TRUE 时执行的语句
...
ELSE
    // 所有条件都不满足时执行的语句
END_IF;

o 示例: 根据温度范围控制加热器状态。

IF Temperature < Setpoint - 2 THEN
    Heater := TRUE;  // 低温,全速加热
    Fan := FALSE;
ELSIF Temperature < Setpoint THEN
    Heater := TRUE;  // 接近设定值,维持加热
    Fan := TRUE;     // 开启风扇辅助
ELSIF Temperature > Setpoint + 5 THEN
    Heater := FALSE; // 超温过高,停止加热
    Fan := TRUE;     // 强制散热
ELSE
    Heater := FALSE; // 温度在设定点附近±2内,仅用风扇调节
    Fan := TRUE;
END_IF;

重点说明:

IF 是首个条件判断,ELSIF 是后续的条件判断。

IF 语句和 ELSIF 语句本质上是互斥的!

也就是说,一旦 IF 语句得到了执行,程序会跳过其它 ELSIF 语句。

一段包含 IF 语句和多个 ELSIF 语句的程序,只会执行其中的一个条件(第一个满足的条件),如果都不满足,执行 ELSE ,当然ELSE条件可以不写。

二、 IF语句的高级应用技巧

1、嵌套IF语句

o 概念: 在IF、ELSIF或ELSE分支内部再嵌入完整的IF语句。

o 用途: 处理更复杂的、层次化的逻辑判断。

o 示例: 安全联锁控制 - 只有“系统就绪”且(“自动模式”按下启动按钮 或 “手动模式”按下启动按钮并确认)时才启动。

IF SystemReady THEN
    IF Mode = Auto THEN
        IF AutoStartButton THEN
            StartProcess := TRUE;
        END_IF;
    ELSIF Mode = Manual THEN
        IF ManualStartButton AND OperatorAck THEN
            StartProcess := TRUE;
        END_IF;
    END_IF;
ELSE
    StartProcess := FALSE; // 系统未就绪,强制停止
END_IF;
  • 注意: 避免过度嵌套(通常不超过3层),否则会降低代码可读性和可维护性。

2、在IF分支中调用函数块(FB)或函数(FC)

  • 概念: 根据条件决定是否调用特定的功能模块。
  • 用途: 实现模块化和条件化执行复杂功能。
  • 示例: 当需要执行校准且校准未完成时,调用校准功能块。
IF CalibrationRequest AND NOT CalibrationDone THEN
    FB_CalibrateSensor(
        Execute := TRUE,
        Sensor := Sensor1,
        Done => CalibrationDone,
        Error => CalibrationError);
ELSE
    FB_CalibrateSensor.Execute := FALSE; // 停止执行校准
END_IF;

3、实现状态机(State Machine),CASE语句后续会讲到

  • 概念: IF或CASE语句是构建状态机的核心,通过检查当前状态变量决定执行哪个分支。
  • 用途: 控制顺序流程、设备模式切换等。
  • 示例: 一个简单的电机控制状态机。
CASE CurrentState OF
    STATE_IDLE://待机状态
        Motor := FALSE;
        IF StartCommand THEN
            CurrentState := STATE_STARTING;
            StartTimer(IN := TRUE, PT := T#2S);
        END_IF;
    STATE_STARTING://电机启动中
        Motor := TRUE; // 低速或特殊启动模式
        IF StartTimer.Q THEN // 启动定时结束
            CurrentState := STATE_RUNNING;
            StartTimer(IN := FALSE);
        ELSIF StopCommand OR Fault THEN
            CurrentState := STATE_STOPPING;
            StartTimer(IN := FALSE);
        END_IF;
    STATE_RUNNING://电机运行中
        Motor := TRUE; // 正常运行
        IF StopCommand THEN
            CurrentState := STATE_STOPPING;
            StopTimer(IN := TRUE, PT := T#3S);
        ELSIF Fault THEN
            CurrentState := STATE_FAULT;
        END_IF;
    STATE_STOPPING://电机正在停止
        Motor := FALSE; // 可能执行制动逻辑
        IF StopTimer.Q THEN // 停止定时结束
            CurrentState := STATE_IDLE;
            StopTimer(IN := FALSE);
        END_IF;
    STATE_FAULT://电机错误状态
        Motor := FALSE;
        IF ResetCommand AND FaultCleared THEN
            CurrentState := STATE_IDLE;
        END_IF;
END_CASE;

4、错误处理与优先级逻辑

  • 概念: 使用IF语句检查错误标志或紧急信号,并赋予它们最高的执行优先级。
  • 用途: 确保系统安全,在异常发生时能立即执行安全动作。
  • 示例: 紧急停止或故障信号具有最高优先级,无条件停止设备。
IF EmergencyStop OR MajorFault THEN
    // 最高优先级安全逻辑
    Motor := FALSE;
    PowerContact := FALSE;
    Alarm := TRUE;
    // 可能复位其他正在进行的操作...
ELSE
    // 正常控制逻辑区域
    IF ... THEN // 正常的启动、停止、运行逻辑
        ...
    END_IF;
END_IF;

三、 关键注意事项

  1. 条件表达式: 表达式必须结果为布尔值(TRUE/FALSE)。

有人会有疑问,也可以是(X>Y),(X<>Y),(X=1)等,其实比较的结果也是非是及非即(TRUE/FALSE),在此做出解释。

  1. 完备性: 使用ELSIF和ELSE确保所有可能情况都被覆盖,避免逻辑漏洞。
  2. 可读性:
  • 合理缩进。
  • 为复杂条件或分支添加注释。
  • 避免过深的嵌套层次。
  1. 性能: IF语句按顺序评估条件,将最可能为真或最需快速响应的条件放在前面。
  2. 与梯形图(LD)比较: IF在ST中更擅长表达复杂条件判断和算法。简单连锁逻辑在梯形图中可能更直观。
  3. PLC扫描周期: IF语句在每次PLC扫描周期中都会执行一次。

四、 总结

通过深入理解和灵活运用IF语句及其高级技巧,你可以编写出逻辑更清晰、更健壮、更易于维护的PLC程序,有效应对工业自动化中的各种复杂控制需求。希望本文能帮助您更好地理解和应用 IF 语句。