跳到正文
Learn-SCL
SCL 示例库/SCL 指令手册/SCL IF — 条件判断

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 里调用。

TiaLink 设置

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

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

一句话

答案: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 的块接口
区块名称类型说明
输入StartBool
输入StopBool
输入FaultBool
输出RunBool
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 状态见下方“验证状态”。

验证状态

项目结果日期证据
构建期语法/结构校验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/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 只包含语句。

← 返回 SCL 指令手册