在 TIA 里试一下
通过 TiaLink 把本页示例(FB_For_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案: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 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | StartValue | Int | |
| 输入 | EndValue | Int | |
| 输入 | Step | Int | |
| 输出 | Sum | Int | |
| 输出 | Count | Int | |
| 输出 | Last | Int | |
| 临时 | i | Int | |
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
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 状态见下方“验证状态”。
验证状态
“待实测”表示还没有在 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 次;起始值大于结束值且步长为正时一次也不执行。