SCL IF — 条件判断
用 IF / ELSIF / ELSE / END_IF 按条件执行代码;SCL 里最常用的分支结构。
控制流
S7-1200/1500
TIA V19
别名:IF 语句 / 条件判断 / ELSIF / IF-THEN
在 TIA 里试一下
通过 TiaLink 把本页示例(FB_IF_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案:SCL 用 IF 条件 THEN ... ELSIF ... ELSE ... END_IF; 按条件执行分支;每个分支用 END_IF 结束,ELSIF 不是 ELSE IF。
IF 按条件执行分支:IF 条件 THEN ... ELSIF 条件 THEN ... ELSE ... END_IF;。只执行第一个成立的分支;故障、联锁这类高优先级条件放在最前面。
最小示例
下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面的场景已在 PLC 云仿真里跑过,输出见“云仿真验证”。
FB_IF_Demo FB
最小示例 · 26 行 · 源文件 blocks/FB_IF_Demo.scl
查看 FB_IF_Demo 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | Start | Bool | |
| 输入 | Stop | Bool | |
| 输入 | Fault | Bool | |
| 输出 | Run | Bool | |
blocks/FB_IF_Demo.scl
1FUNCTION_BLOCK "FB_IF_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4 VAR_INPUT
5 Start : Bool;
6 Stop : Bool;
7 Fault : Bool;
8 END_VAR
9
10 VAR_OUTPUT
11 Run : Bool;
12 END_VAR
13
14BEGIN
15 REGION 启停与故障优先级
16
17 IF #Fault THEN
18 #Run := FALSE;
19 ELSIF #Start AND NOT #Stop THEN
20 #Run := TRUE;
21 ELSE
22 #Run := FALSE;
23 END_IF;
24 END_REGION
25END_FUNCTION_BLOCK
26
块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。
SCL 写法
SCL
1IF #Fault THEN
2 #Run := FALSE;
3ELSIF #Start AND NOT #Stop THEN
4 #Run := TRUE;
5ELSE
6 #Run := FALSE;
7END_IF;
ELSIF 是同一层的多路分支;不要写成 ELSE IF(那是嵌套,需要多一层 END_IF)。
- 每个
IF 必须以 END_IF; 结束,语句末尾有分号。
- 条件表达式用
AND、OR、NOT、比较运算符组合。
怎么工作
| 条件顺序 |
行为 |
第 1 个 IF 成立 |
执行第 1 个分支,后面的 ELSIF/ELSE 跳过 |
| 第 1 个不成立、第 2 个成立 |
执行第 2 个分支 |
| 都不成立 |
执行 ELSE;没有 ELSE 就什么都不做 |
- 优先级由书写顺序决定:越靠前越优先。
- 条件里不要写赋值;赋值是语句,不是表达式。
IF 可以嵌套,但深层嵌套会难读;复杂状态用 CASE 或状态机。
常用场景
1. 启停与故障优先级
故障 > 停止 > 启动;把 Fault 放最前面,确保故障时任何启动条件都不能让设备运行。
2. 模式选择
手动/自动/维护三种模式,用 IF/ELSIF 按优先级选择;互斥模式也可以用 CASE。
3. 参数范围判断
IF #Value < #Min THEN ... ELSIF #Value > #Max THEN ... ELSE ...;范围多时用 CASE 或查表。
常见坑
ELSIF 写成 ELSE IF:多了一层嵌套,END_IF 数量不对会编译报错。
- 条件顺序错:把“启动”放在“故障”前面,故障时仍可能运行;高优先级条件放最前。
- 漏分号:
END_IF; 和赋值语句都要分号;SCL 不是 Python。
- 在条件里赋值:
IF #A := #B THEN 不是合法条件;赋值要单独写。
- 浮点数相等比较:
IF #Real = 1.0 可能因精度不成立;用范围比较。
- 分支不写
ELSE:没有 ELSE 时输出保持上一次的值,可能不是你想要的安全状态;安全相关逻辑要显式写 ELSE。
和 LAD 的区别
LAD 用跳转/标签或图形分支实现条件;SCL 的 IF/ELSIF/ELSE 是文本结构,更适合复杂条件和状态机。两者逻辑可以一一对应,但 SCL 更容易表达范围判断和组合条件。LAD 侧可参考 程序控制指令。
云仿真验证
PLC 云仿真:PASS(4 次扫描)。场景:启动、停止和故障优先级。结果来自 PLC 云仿真 的 scl_run_scenario;页面构建时执行同一份 SCL 源码和场景。
查看云仿真回归输出
云仿真回归输出
PASS 启动、停止和故障优先级 (4 step(s), 4 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/IF__Run_conditionally.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。
IF/ELSIF/ELSE 的语法和分支语义以 TIA Portal V19 帮助为事实核对;中文讲解、SCL 示例和验证场景由 Learn-SCL 编写。
Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。
常见问题
SCL 的 IF 和 CASE 怎么选?
少量条件、范围判断用 IF;一个整数/枚举值对应多个固定分支用 CASE。CASE 更容易看出状态机的全部状态。
ELSIF 和 ELSE IF 有什么区别?
ELSIF 是同一层多路分支,只执行第一个成立的分支;ELSE IF 是嵌套的第二个 IF,需要多一层 END_IF。SCL 里通常用 ELSIF。
IF 里能不能声明变量?
不能。变量要在块接口或 VAR_TEMP 里声明;IF 只包含语句。