跳到正文
Learn-SCL
SCL 示例库/SCL 指令手册/SCL FOR — 计数循环

SCL FOR — 计数循环

按计数循环执行一段代码;支持步长和递减循环。

控制流 S7-1200/1500 TIA V19 别名:FOR 循环 / 计数循环 / FOR 语句

在 TIA 里试一下

通过 TiaLink 把本页示例(FB_For_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。

TiaLink 设置

默认 http://localhost:8080。也可以在本页地址后加 ?tialink= 临时指定。

TiaLink 启动时若设置了 --api-token,这里要填相同的值;只保存在本机浏览器 localStorage,不会上传。

一句话

答案:FOR #i := 起始值 TO 结束值 BY 步长 DO ... END_FOR; 按计数循环;步长为负时递减,步长为 0 或运行中修改边界可能死循环。

FOR 按计数循环执行一段代码:FOR #i := 起始值 TO 结束值 BY 步长 DO ... END_FOR;。结束值包含在内;步长为负时递减;步长为 0 会死循环。

最小示例

下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面的场景已在 PLC 云仿真里跑过,输出见“云仿真验证”。

FB_For_Demo FB

最小示例 · 35 行 · 源文件 blocks/FB_For_Demo.scl

查看 FB_For_Demo 的块接口
区块名称类型说明
输入StartValueInt
输入EndValueInt
输入StepInt
输出SumInt
输出CountInt
输出LastInt
临时iInt
blocks/FB_For_Demo.scl
1FUNCTION_BLOCK "FB_For_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4   VAR_INPUT
5      StartValue : Int := 1;    // 起始值
6      EndValue : Int := 5;      // 结束值(包含)
7      Step : Int := 1;          // 步长;负数为递减
8   END_VAR
9 
10   VAR_OUTPUT
11      Sum : Int;                // 累加和
12      Count : Int;              // 实际循环次数
13      Last : Int;               // 最后一次的循环变量
14   END_VAR
15 
16   VAR_TEMP
17      i : Int;                  // 循环变量
18   END_VAR
19 
20BEGIN
21   REGION 初始化
22      #Sum := 0;
23      #Count := 0;
24      #Last := 0;
25   END_REGION
26 
27   REGION 计数循环
28      FOR #i := #StartValue TO #EndValue BY #Step DO
29         #Sum := #Sum + #i;
30         #Count := #Count + 1;
31         #Last := #i;
32      END_FOR;
33   END_REGION
34END_FUNCTION_BLOCK
35 

块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。

SCL 写法

SCL
1FOR #i := 1 TO 5 BY 1 DO
2   #Sum := #Sum + #i;
3END_FOR;

递减循环:

SCL
1FOR #i := 5 TO 1 BY -1 DO
2   // 5, 4, 3, 2, 1
3END_FOR;
  • 循环变量通常声明在 VAR_TEMP,不要在循环里改变它的类型或边界。
  • BY 可以省略,默认步长是 1。
  • EXIT 立即退出整个循环;CONTINUE 跳过本次剩余语句,进入下一次。

怎么工作

写法 循环变量
FOR #i := 1 TO 5 BY 1 1, 2, 3, 4, 5
FOR #i := 5 TO 1 BY -1 5, 4, 3, 2, 1
FOR #i := 1 TO 5 BY 2 1, 3, 5
FOR #i := 5 TO 1 BY 1 一次也不执行
  • 结束值会被执行一次,不是“到结束值之前”。
  • 起始值大于结束值且步长为正时,循环体一次也不执行。
  • 循环次数在运行时不能改变;不要在循环里修改结束值或步长。
  • 循环变量超出 INT/DINT 范围会出错;大范围用 DINT。

常用场景

1. 遍历数组

FOR #i := 1 TO 8 DO #Slots[#i] := ...; END_FOR; 是数组批量处理的常用写法;注意数组上下界,不要写死 1..8。

2. 累加/统计

从一批数据里求和、求平均、找最大值;循环变量同时作为数组下标。

3. 重复固定次数

配方步骤、延时计数、批量复位;次数固定时 FOR 比 WHILE 更安全,因为边界明确。

常见坑

  • 步长为 0:BY 0 会让循环变量不前进,直接死循环;步长必须非 0。
  • 运行中改边界:在循环体里改结束值或步长,TIA 帮助明确不保证结果;边界要在循环外算好。
  • 结束值理解错:结束值会执行一次;要“取到 5 之前”就用 4 或调整条件。
  • 循环变量用全局变量:其他代码可能改写它;循环变量放 VAR_TEMP,不要用全局 M/DB 变量。
  • 数组越界:FOR #i := 1 TO 8 配 Array[0..7] 会越界;用实际上下界。
  • 大范围用 INT:超过 32767 用 DINT,否则循环变量溢出。
  • 在循环里做耗时操作:扫描周期会变长;大数据量考虑分片或状态机。

和 LAD 的区别

LAD 没有 FOR 这种文本循环,通常用跳转/标签或库函数实现;SCL 的 FOR 更适合数组遍历和批量计算。两者逻辑可以对应,但 SCL 的可读性更好。LAD 侧可参考 程序控制指令。

云仿真验证

PLC 云仿真:PASS(4 次扫描)。场景:1 到 5 正向循环;5 到 1 递减;步长 2 和空循环。结果来自 PLC 云仿真 的 scl_run_scenario;页面构建时执行同一份 SCL 源码和场景。

查看云仿真回归输出
云仿真回归输出
PASS  1 到 5 正向循环 (1 step(s), 1 scan(s))
PASS  5 到 1 递减 (1 step(s), 1 scan(s))
PASS  步长 2 和空循环 (2 step(s), 2 scan(s))
RESULT: ALL PASS (4 scan(s))

云仿真验证语法、结构和逐扫描行为,不等同于 TIA 编译;TIA 状态见下方“验证状态”。

验证状态

项目结果日期证据
构建期语法/结构校验PASS2026-11-02parse + validate
PLC 云仿真PASS(4 scans)2026-11-02scl_run_scenario / scl_validate
TIA 导入编译待实测—TiaLink + TIA Portal(待实测)

“待实测”表示还没有在 TIA Portal 里导入编译,不代表代码有问题;上机前请先在测试项目编译。云仿真在 tia.hubwiz.com/sim 执行,不替代 TIA 编译。

来源与说明

参数、行为和数据类型的核对来源:TIA Portal V19 帮助的 Instructions/Instructions/Basic_instructions/SCL/Program_control_operations/FOR__Run_in_counting_loop.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。

起止值、步长和循环变量类型以 TIA Portal V19 帮助为事实核对;中文讲解、SCL 示例和验证场景由 Learn-SCL 编写。

Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。

常见问题

FOR 的循环变量要声明在哪里?

通常声明在块的 VAR_TEMP 里(TIA 帮助也建议 Temp)。循环变量只在本扫描有效,不要用全局变量或会被其他代码改写的变量。

FOR 可以递减吗?

可以。起始值大于结束值、步长为负时递减,例如 `FOR #i := 5 TO 1 BY -1 DO`。

FOR 的边界会执行几次?

结束值会被执行一次。例如 `FOR #i := 1 TO 5 BY 1` 执行 5 次;起始值大于结束值且步长为正时一次也不执行。

← 返回 SCL 指令手册