在 TIA 里试一下
通过 TiaLink 把本页示例(FB_Repeat_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案:REPEAT ... UNTIL 条件 END_REPEAT; 先执行一次循环体,再判断条件;条件为假继续,为真退出,至少执行一次。
REPEAT 先执行一次循环体,再判断 UNTIL 条件:条件为假继续,为真退出。它至少执行一次,适合“先做一次、再决定要不要继续”的逻辑。
最小示例
下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面的场景已在 PLC 云仿真里跑过,输出见“云仿真验证”。
FB_Repeat_Demo FB
最小示例 · 33 行 · 源文件 blocks/FB_Repeat_Demo.scl
查看 FB_Repeat_Demo 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | Limit | Int | |
| 输出 | Sum | Int | |
| 输出 | Count | Int | |
| 临时 | i | Int | |
blocks/FB_Repeat_Demo.scl
1FUNCTION_BLOCK "FB_Repeat_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4 VAR_INPUT
5 Limit : Int := 5;
6 END_VAR
7
8 VAR_OUTPUT
9 Sum : Int;
10 Count : Int;
11 END_VAR
12
13 VAR_TEMP
14 i : Int;
15 END_VAR
16
17BEGIN
18 REGION 初始化
19 #Sum := 0;
20 #Count := 0;
21 #i := 0;
22 END_REGION
23
24 REGION 直到循环
25 REPEAT
26 #i := #i + 1;
27 #Sum := #Sum + #i;
28 #Count := #Count + 1;
29 UNTIL #i >= #Limit
30 END_REPEAT;
31 END_REGION
32END_FUNCTION_BLOCK
33
块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。
SCL 写法
SCL
1REPEAT
2 #i := #i + 1;
3 #Sum := #Sum + #i;
4UNTIL #i >= #Limit
5END_REPEAT;
注意 UNTIL #Condition 后面没有分号,END_REPEAT; 有分号。
怎么工作
| 条件 |
行为 |
| 第一次执行前 |
不判断,直接执行循环体 |
UNTIL 为假 |
继续下一轮 |
UNTIL 为真 |
退出循环 |
| 条件一直为假 |
死循环 |
- 条件在循环体之后判断,所以循环体至少执行一次。
- 条件为真时退出,这一点和
WHILE 相反(WHILE 是条件为真继续)。
- 循环体必须改变条件,或加计数上限/
EXIT,否则会死循环。
- 次数固定时优先
FOR;至少执行一次且次数不定时用 REPEAT。
常用场景
1. 先执行再确认
先读一次传感器/通信数据,再判断是否需要重试;至少读一次,避免“条件一开始就为假”导致什么都没做。
2. 重试机制
通信失败后重试,直到成功或达到最大次数;用计数器做上限,避免无限重试。
3. 迭代计算
先算一次,再判断误差是否满足;不满足继续迭代。需要设置最大迭代次数。
常见坑
- 把 UNTIL 当 WHILE:
WHILE 条件为真继续,REPEAT 的 UNTIL 条件为真退出;方向反了逻辑就反了。
- UNTIL 后多写分号:
UNTIL #Cond; 不是标准写法;条件后面直接换行写 END_REPEAT;。
- 至少执行一次:即使条件一开始就满足,循环体也会执行一次;需要零次可能时用
WHILE。
- 忘记改变条件:条件一直为假会死循环;循环体必须推进状态。
- 没有上限:等待外部状态/通信时要有最大次数或超时。
- 循环体耗时:扫描周期会变长;大数据量考虑状态机分片。
和 LAD 的区别
LAD 没有 REPEAT 文本循环,通常用跳转/标签或状态机实现;SCL 的 REPEAT 更适合“至少执行一次”的迭代。两者逻辑可以对应,但 SCL 更容易表达退出条件。LAD 侧可参考 程序控制指令。
云仿真验证
PLC 云仿真:PASS(3 次扫描)。场景:上限 5 累加 1..5;上限 0 也至少执行一次。结果来自 PLC 云仿真 的 scl_run_scenario;页面构建时执行同一份 SCL 源码和场景。
查看云仿真回归输出
云仿真回归输出
PASS 上限 5 累加 1..5 (1 step(s), 1 scan(s))
PASS 上限 0 也至少执行一次 (2 step(s), 2 scan(s))
RESULT: ALL PASS (3 scan(s))
云仿真验证语法、结构和逐扫描行为,不等同于 TIA 编译;TIA 状态见下方“验证状态”。
验证状态
“待实测”表示还没有在 TIA Portal 里导入编译,不代表代码有问题;上机前请先在测试项目编译。云仿真在 tia.hubwiz.com/sim 执行,不替代 TIA 编译。
来源与说明
参数、行为和数据类型的核对来源:TIA Portal V19 帮助的 Instructions/Instructions/Basic_instructions/SCL/Program_control_operations/REPEAT__Run_if_condition_is_not_met.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。
循环体至少执行一次、UNTIL 条件在循环体后判断的规则以 TIA Portal V19 帮助为事实核对;中文讲解、SCL 示例和验证场景由 Learn-SCL 编写。
Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。
常见问题
REPEAT 和 WHILE 有什么区别?
REPEAT 先执行一次再判断,至少执行一次;WHILE 先判断,条件一开始为假时一次也不执行。
UNTIL 条件什么时候判断?
每次循环体执行完后判断。条件为假继续下一轮,为真退出循环。
REPEAT 会死循环吗?
会。如果 UNTIL 条件一直为假,循环不会退出;循环体必须改变条件,或加计数上限/EXIT。