在 TIA 里试一下
通过 TiaLink 把本页示例(FB_Return_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案:RETURN; 立即退出当前 FC/FB/OB,回到调用块;RETURN 后面的语句不再执行,块末尾的 RETURN 可以省略。
RETURN; 立即退出当前 FC/FB/OB,回到调用块;RETURN 后面的语句不再执行。块末尾的 RETURN 可以省略。
最小示例
下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面的场景已在 PLC 云仿真里跑过,输出见“云仿真验证”。
FB_Return_Demo FB
最小示例 · 27 行 · 源文件 blocks/FB_Return_Demo.scl
查看 FB_Return_Demo 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | Value | Int | |
| 输出 | Result | Int | |
| 输出 | Done | Bool | |
blocks/FB_Return_Demo.scl
1FUNCTION_BLOCK "FB_Return_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4 VAR_INPUT
5 Value : Int;
6 END_VAR
7
8 VAR_OUTPUT
9 Result : Int;
10 Done : Bool;
11 END_VAR
12
13BEGIN
14 REGION 参数检查
15 #Done := FALSE;
16 IF #Value < 0 THEN
17 #Result := -1;
18 RETURN;
19 END_IF;
20 END_REGION
21
22 REGION 正常计算
23 #Result := #Value * 2;
24 #Done := TRUE;
25 END_REGION
26END_FUNCTION_BLOCK
27
块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。
SCL 写法
SCL
1IF #Value < 0 THEN
2 #Result := -1;
3 RETURN;
4END_IF;
FC 带返回值时,先把返回值写到函数名对应的返回变量,再 RETURN;:
SCL
1#FC_Check := FALSE;
2IF #Error THEN
3 RETURN;
4END_IF;
5#FC_Check := TRUE;
怎么工作
| 位置 |
行为 |
在 IF 分支里 |
条件成立时退出整个块 |
在 FOR/WHILE/REPEAT 里 |
退出整个块,不只是退出循环 |
| 在块末尾 |
可以省略,执行到 END_FUNCTION_BLOCK 也会返回 |
| 在 FC 里 |
返回调用块;返回值取返回变量当前值 |
RETURN 是“提前退出”,不是“跳过本次循环”;跳过本次循环用 CONTINUE。
- 退出循环但继续执行块内后面的代码,用
EXIT。
RETURN 之前的输出赋值会保留;RETURN 之后的赋值不会执行。
- 在 OB 里
RETURN 会结束本次 OB 调用,后面的程序不执行;一般只在明确的保护逻辑里用。
常用场景
1. 参数检查/保护
输入非法、设备未就绪、安全条件不满足时,先写安全输出,再 RETURN,避免继续执行后面的动作。
2. 提前结束计算
找到了目标值、误差已满足、已经处理完,不需要继续循环/计算时提前返回;比多层 IF 嵌套更清晰。
3. FC 的错误返回
FC 先设默认返回值,检查失败时直接 RETURN;;调用方只读返回值,不需要额外的 Done 输出。
常见坑
- RETURN 后还有必须执行的代码:清理、输出复位、计数器更新要放在
RETURN 之前。
- 把 RETURN 当 EXIT:
RETURN 退出整个块,不是只退出循环;只想退出循环用 EXIT。
- FC 返回值未赋值:
RETURN; 不会自动给返回值;先写 #FC_Name := ...。
- 输出未初始化:提前返回时,后面的输出可能保持上一次的值;在块开头给安全默认值。
- 在 OB 里随意 RETURN:会跳过 OB 后面的程序;确认这是你想要的行为。
- RETURN 在循环里:会直接退出块,循环后面的代码也不会执行;需要区分
EXIT/CONTINUE/RETURN。
和 LAD 的区别
LAD 用跳转/标签或 RET 指令实现提前返回;SCL 的 RETURN 是文本语句,更适合 guard clause(先检查、失败就返回)。两者逻辑可以对应,但 SCL 更容易把保护条件写在块开头。LAD 侧可参考 程序控制指令。
云仿真验证
PLC 云仿真:PASS(3 次扫描)。场景:负数提前返回,正常值继续计算。结果来自 PLC 云仿真 的 scl_run_scenario;页面构建时执行同一份 SCL 源码和场景。
查看云仿真回归输出
云仿真回归输出
PASS 负数提前返回,正常值继续计算 (3 step(s), 3 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/RETURN__Exit_block.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。
RETURN 退出当前块、继续调用块的规则以 TIA Portal V19 帮助为事实核对;中文讲解、SCL 示例和验证场景由 Learn-SCL 编写。
Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。
常见问题
RETURN 和 EXIT 有什么区别?
RETURN 退出整个块;EXIT 只退出当前循环,循环后面的代码还会继续执行。
FC 里 RETURN 怎么返回值?
FC 的返回值写在函数名对应的返回变量里(例如 `#FC_Name := ...`),再 `RETURN;` 退出;不要依赖未赋值的返回变量。
RETURN 后面的代码会执行吗?
不会。RETURN 立即结束当前块;需要执行的清理/输出赋值要放在 RETURN 之前。