博文

IEC61131-3 ST语言实战 - 流程控制语句全解析

ST/PLC

IEC61131-3 ST 语言实战 - 流程控制语句全解析

1. IF 条件语句

1.1 基本 IF

IF Temperature > 100.0 THEN
    Alarm := TRUE;
    Valve := FALSE;
END_IF;

1.2 IF-ELSE

IF Mode = 1 THEN
    Speed := 1000;
ELSE
    Speed := 500;
END_IF;

1.3 IF-ELSIF-ELSE

IF Error_Code = 0 THEN
    Status := 'OK';
ELSIF Error_Code = 1 THEN
    Status := 'Warning';
    Alarm := TRUE;
ELSIF Error_Code = 2 THEN
    Status := 'Error';
    Emergency_Stop();
ELSE
    Status := 'Unknown';
END_IF;

1.4 嵌套 IF

IF Motor_Running THEN
    IF Speed > Max_Speed THEN
        Speed := Max_Speed;
        Warning := TRUE;
    END_IF;
END_IF;

// 实际场景:安全启动检查
IF NOT EmergencyStop THEN
    IF Door_Closed THEN
        IF (AutoMode OR ManualMode) THEN
            Machine_Start();
        END_IF;
    END_IF;
END_IF;

2. CASE 选择语句

2.1 基本 CASE(状态机最常用)

CASE State OF
    0:  // 初始化
        Init_Done := FALSE;
        State := 1;
    1:  // 等待启动
        IF Start_Button THEN
            State := 2;
        END_IF;
    2:  // 运行中
        Motor_Run();
        IF Stop_Button THEN
            State := 3;
        END_IF;
    3:  // 停止
        Motor_Stop();
        State := 0;
    ELSE
        State := 0;  // 默认处理
END_CASE;

2.2 多值 CASE

CASE Command OF
    1, 3, 5:     // 奇数命令
        Process_Odd();
    2, 4, 6:     // 偶数命令
        Process_Even();
    10..20:      // 范围 10 到 20
        Process_Range();
    ELSE
        Invalid_Command := TRUE;
END_CASE;

2.3 枚举 CASE(推荐)

// 先定义枚举类型
TYPE Machine_State : (
    IDLE,
    STARTING,
    RUNNING,
    STOPPING,
    ERROR
); END_TYPE

VAR
    CurrentState : Machine_State;
END_VAR

CASE CurrentState OF
    Machine_State.IDLE:
        // 空闲状态处理
        Standby();
    Machine_State.STARTING:
        // 启动中
        Pre_Check();
        IF Check_OK THEN
            CurrentState := Machine_State.RUNNING;
        END_IF;
    Machine_State.RUNNING:
        // 运行状态处理
        Run_Process();
    Machine_State.STOPPING:
        // 停止中
        Safe_Stop();
        CurrentState := Machine_State.IDLE;
    Machine_State.ERROR:
        // 错误状态处理
        Handle_Error();
END_CASE;

3. FOR 循环

3.1 基本 FOR

// 累加数组
Sum := 0;
FOR i := 0 TO 9 DO
    Sum := Sum + Data[i];
END_FOR;

3.2 带步长

FOR i := 0 TO 100 BY 10 DO
    Process(i);  // i = 0, 10, 20, ..., 100
END_FOR;

3.3 递减循环

FOR i := 10 DOWNTO 1 DO
    Countdown[i] := i;
END_FOR;

3.4 数组处理实战

// 查找数组中第一个大于阈值的元素
FoundIndex := -1;
FOR i := 0 TO 9 DO
    IF Data[i] > Threshold THEN
        FoundIndex := i;
        EXIT;  // 找到就跳出
    END_IF;
END_FOR;

// 数组复制
FOR i := 0 TO 99 DO
    Target[i] := Source[i];
END_FOR;

4. WHILE 循环

4.1 基本 WHILE

// 条件满足时执行
WHILE Counter < 100 DO
    Counter := Counter + 1;
    IF Sensor_Input THEN
        EXIT;  // 提前退出
    END_IF;
END_WHILE;

4.2 数据处理

WHILE Data_Ready AND Index < MAX_SIZE DO
    Buffer[Index] := Read_Data();
    Index := Index + 1;
END_WHILE;

4.3 注意事项

⚠️ PLC 中慎用 WHILE:可能导致扫描周期过长触发看门狗。建议用状态机分步执行。


5. REPEAT 循环

5.1 基本 REPEAT

// 至少执行一次,条件满足时退出
REPEAT
    Counter := Counter + 1;
    Result := Process(Counter);
UNTIL Result = SUCCESS OR Counter > 100
END_REPEAT;

5.2 实际示例

// 串口数据读取
REPEAT
    Bytes_Read := Read_Serial(Buffer, Index);
    Index := Index + Bytes_Read;
UNTIL Bytes_Read = 0 OR Index >= BUFFER_SIZE
END_REPEAT;

6. EXIT 与循环控制

6.1 EXIT(跳出循环)

FOR i := 0 TO 99 DO
    IF Data[i] = Target THEN
        Found_Index := i;
        EXIT;  // 找到目标,跳出循环
    END_IF;
END_FOR;

6.2 CONTINUE(跳过当前迭代)

// 部分平台支持 CONTINUE
FOR i := 0 TO 99 DO
    IF Data[i] = 0 THEN
        CONTINUE;  // 跳过当前迭代
    END_IF;
    Sum := Sum + Data[i];
END_FOR;

7. 实战案例:状态机完整示例

FUNCTION_BLOCK FB_ProcessMachine
VAR_INPUT
    Start_Command : BOOL;
    Stop_Command : BOOL;
    Error_Reset : BOOL;
END_VAR
VAR_OUTPUT
    ActiveStep : INT;
    MachineRunning : BOOL;
END_VAR
VAR
    State : INT := 0;
    StepTimer : TON;
    ErrorFlag : BOOL;
END_VAR

CASE State OF
    0:  // 初始化
        Initialize_Device();
        IF Init_Done THEN
            State := 10;
        END_IF;
    
    10: // 等待启动
        IF Start_Command AND NOT ErrorFlag THEN
            State := 20;
        END_IF;
    
    20: // 加速
        StepTimer(IN := TRUE, PT := T#2s);
        Ramp_Speed(1000);
        IF StepTimer.Q THEN
            State := 30;
        END_IF;
    
    30: // 运行
        Run_Process();
        IF Stop_Command OR ErrorFlag THEN
            State := 40;
        END_IF;
    
    40: // 减速停止
        StepTimer(IN := TRUE, PT := T#2s);
        Ramp_Speed(0);
        IF StepTimer.Q THEN
            State := 0;
        END_IF;
    
    99: // 错误处理
        Handle_Error();
        IF Error_Reset THEN
            ErrorFlag := FALSE;
            State := 0;
        END_IF;
    
    ELSE
        State := 99;  // 未知状态转错误处理
END_CASE;

ActiveStep := State;
MachineRunning := (State >= 10) AND (State < 40);

END_FUNCTION_BLOCK

文档版本:1.0 | 更新日期:2026-04-28 | 作者:JianLin Studio

← 返回博文列表