博图SCL中CONTINUE语句详解:高效循环控制利器
在博图(TIA Portal)的SCL(结构化控制语言)编程中,`CONTINUE`语句是优化循环流程的强大工具。它允许您**跳过当前循环迭代的剩余代码,直接进入下一次迭代**,特别适合处理需要条件过滤的工业自动化场景。
CONTINUE核心机制
当SCL程序执行到CONTINUE语句时:
-
立即终止当前迭代的执行
-
跳过循环体内CONTINUE之后的所有代码
-
循环**不会退出**,直接开始下一次迭代
-
循环变量自动更新(在`FOR`循环中)
CONTINUE vs EXIT 关键区别

SCL实战案例解析
案例1:过滤数组中的零值(模拟数据采集)
FUNCTION_BLOCK ContinueDemo
VAR
// 输入数组(模拟采集数据)
InputArray: ARRAY1..10 OF INT := 120, 0, 345, 0, 87, 0, 0, 256, 0, 412;
// 输出变量
ValidDataCount: INT;
DataSum: INT;
FilteredArray: ARRAY1..10 OF INT;
// 临时变量
i: INT;
idx: INT := 1;
END_VAR
BEGIN
ValidDataCount := 0;
DataSum := 0;
// 清空过滤后数组
FOR i := 1 TO 10 DO
FilteredArrayi := 0;
END_FOR;
// 主处理循环
FOR i := 1 TO 10 DO
// 跳过零值数据
IF InputArrayi = 0 THEN
CONTINUE; // 跳过无效数据
END_IF;
// 有效数据处理
FilteredArrayidx := InputArrayi; // 存储有效值
DataSum := DataSum + InputArrayi; // 累加
idx := idx + 1; // 更新索引
ValidDataCount := ValidDataCount + 1; // 计数
END_FOR;
END_FUNCTION_BLOCK

执行结果:
FilteredArray = 120, 345, 87, 256, 412, 0, 0, 0, 0, 0
DataSum = 120 + 345 + 87 + 256 + 412 = 1220
ValidDataCount = 5
工业应用场景:
PLC处理传感器数据时自动过滤无效零值,确保后续计算和控制的准确性
案例2:跳过特定状态设备(产线控制)
FUNCTION_BLOCK LineController
VAR
// 设备状态数组 (0=停机, 1=运行, 2=故障)
DeviceStatus: ARRAY1..8 OF INT := 1, 2, 1, 0, 1, 2, 1, 1;
// 控制变量
ActiveDevices: INT;
MaintenanceList: ARRAY1..8 OF BOOL;
// 临时变量
i: INT;
END_VAR
BEGIN
ActiveDevices := 0;
// 初始化维护列表
FOR i := 1 TO 8 DO
MaintenanceListi := FALSE;
END_FOR;
// 设备状态扫描
FOR i := 1 TO 8 DO
CASE DeviceStatusi OF
0: // 停机设备
CONTINUE; // 跳过不处理
2: // 故障设备
MaintenanceListi := TRUE; // 标记需要维护
CONTINUE; // 跳过正常处理流程
END_CASE;
// 正常设备处理流程
ActiveDevices := ActiveDevices + 1;
// 这里添加设备控制逻辑...
END_FOR;
END_FUNCTION_BLOCK
```
执行结果:
ActiveDevices = 5 (设备1,3,5,7,8)
MaintenanceList = FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE
工业应用场景:
自动化产线中跳过停机或故障设备,只对正常运行设备执行控制逻辑

案例3:嵌套循环中的CONTINUE(矩阵处理)
FUNCTION_BLOCK MatrixProcessor
VAR
// 3x3温度矩阵
Temperature: ARRAY1..3, 1..3 OF REAL :=
[25.5, 120.0, 28.1,
26.2, 999.9, 27.8, // 999.9表示传感器故障
24.9, 25.3, 150.0];
// 统计结果
ValidReadings: INT;
TotalSum: REAL;
MaxTemp: REAL;
// 临时变量
i, j: INT;
END_VAR
BEGIN
ValidReadings := 0;
TotalSum := 0.0;
MaxTemp := -273.15; // 绝对零度
// 矩阵扫描
FOR i := 1 TO 3 DO
FOR j := 1 TO 3 DO
// 跳过无效温度值 (>100°C视为异常)
IF Temperaturei,j > 100.0 THEN
CONTINUE; // 只影响内层循环
END_IF;
// 有效温度处理
ValidReadings := ValidReadings + 1;
TotalSum := TotalSum + Temperaturei,j;
// 更新最高温度
IF Temperaturei,j > MaxTemp THEN
MaxTemp := Temperaturei,j;
END_IF;
END_FOR;
END_FOR;
END_FUNCTION_BLOCK
```
执行结果:
ValidReadings = 6 (跳过120.0, 999.9和150.0)
TotalSum = 25.5+28.1+26.2+27.8+24.9+25.3 = 157.8
MaxTemp = 28.1
```
工业应用场景:
热处理系统中过滤传感器异常值,确保温度监控的可靠性
四、SCL编程最佳实践
- 位置优化
CONTINUE`应放在循环开始位置,尽早过滤无效条件:
FOR i := 1 TO 100 DO
IF SkipCondition THEN // 尽早判断
CONTINUE;
END_IF;
// 主要处理逻辑...
END_FOR;
- 配合CASE语句
多条件分支时提高可读性:
scl
CASE currentState OF
STATE_IDLE: CONTINUE;
STATE_ERROR: HandleError(); CONTINUE;
STATE_PROCESSING: // 正常处理
END_CASE;
- 避免过度嵌套
用`CONTINUE`替代深层嵌套IF:
scl
// 不推荐
IF Condition1 THEN
IF Condition2 THEN
// 核心逻辑
END_IF;
END_IF;
// 推荐
IF NOT Condition1 THEN CONTINUE; END_IF;
IF NOT Condition2 THEN CONTINUE; END_IF;
// 核心逻辑
- 循环类型支持
CONTINUE`适用于所有SCL循环结构:
-
FOR循环
-
WHILE循环
-
REPEAT...UNTIL循环
五、典型工业应用场景
- 数据采集过滤
跳过通信错误、超量程值等无效数据
- 设备状态管理
跳过停机/维护中的设备处理
- 批处理控制
跳过已完成或跳过的工艺步骤
- 报警抑制
特定条件下跳过报警检测
- 资源调度
跳过被占用的设备或通道
掌握CONTINUE语句能让您的SCL代码:
-
✅ 更简洁(减少嵌套层级)
-
✅ 更高效(避免不必要计算)
-
✅ 更易维护(条件过滤一目了然)
-
✅ 更可靠(精确控制执行流程)
在工业自动化编程中合理使用`CONTINUE`,可显著提升PLC程序的执行效率和可读性,特别适合处理需要复杂条件过滤的实时控制场景。