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