跳到正文
Learn-SCL
SCL 示例库/SCL 指令手册/SCL CASE — 多路分支

SCL CASE — 多路分支

按一个整数或枚举值跳到多个分支;比一长串 ELSIF 清晰,适合状态机。

控制流 S7-1200/1500 TIA V19 别名:CASE 语句 / 多路分支 / 状态机

在 TIA 里试一下

通过 TiaLink 把本页示例(FB_CASE_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。

TiaLink 设置

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

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

一句话

答案:SCL 用 CASE 选择值 OF 分支 ... ELSE ... END_CASE; 按一个整数/枚举值执行对应分支;多个值可写 1, 2:,没有匹配走 ELSE。

CASE 按一个整数或枚举值选择分支:CASE #Step OF 0: ... 1, 2: ... ELSE ... END_CASE;。它比一长串 ELSIF 更清晰,适合状态机和命令码。

最小示例

下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面的场景已在 PLC 云仿真里跑过,输出见“云仿真验证”。

FB_CASE_Demo FB

最小示例 · 31 行 · 源文件 blocks/FB_CASE_Demo.scl

查看 FB_CASE_Demo 的块接口
区块名称类型说明
输入StepInt
输出CommandInt
输出DoneBool
blocks/FB_CASE_Demo.scl
1FUNCTION_BLOCK "FB_CASE_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4   VAR_INPUT
5      Step : Int;                // 当前步号
6   END_VAR
7 
8   VAR_OUTPUT
9      Command : Int;             // 本步命令
10      Done : Bool;               // 步号 3 视为完成
11   END_VAR
12 
13BEGIN
14   REGION 按步号选择命令
15      CASE #Step OF
16         0:
17            #Command := 0;
18         1:
19            #Command := 10;
20         2, 3:
21            #Command := 20;
22         ELSE
23            #Command := 99;      // 未知步号:安全默认
24      END_CASE;
25   END_REGION
26 
27   REGION 完成判断
28      #Done := #Step = 3;
29   END_REGION
30END_FUNCTION_BLOCK
31 

块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。

SCL 写法

SCL
1CASE #Step OF
2   0:
3      #Command := 0;
4   1:
5      #Command := 10;
6   2, 3:
7      #Command := 20;
8   ELSE
9      #Command := 99;
10END_CASE;
  • 一个分支可以写多个值:2, 3:。
  • 可以用范围:10..20:(具体语法以 TIA 版本为准)。
  • ELSE 处理没有匹配的值;状态机建议写 ELSE 做安全默认。

怎么工作

Step 执行分支
0 第一个分支
1 第二个分支
2 或 3 第三个分支
其他 ELSE
  • 只执行第一个匹配的分支;分支之间不会穿透。
  • 选择值必须是整数/枚举,不能是 Real。
  • END_CASE; 结束;每个分支语句用分号。
  • CASE 可以嵌套,但状态机通常只用一个 CASE。

常用场景

1. 状态机

Step 0=空闲、1=启动、2=运行、3=完成、4=故障;每个分支写该状态的动作和转移条件。比 IF/ELSIF 更容易看出全部状态。

2. 命令码分发

HMI 或通信下发命令码 1=启动、2=停止、3=复位;CASE 分发到对应处理,ELSE 拒绝未知命令。

3. 配方/工位选择

工位号或配方号对应不同参数组;CASE 选择参数,ELSE 用默认值。

常见坑

  • 选择值用 Real:浮点数相等比较不可靠;CASE 用整数/枚举。
  • 漏 ELSE:未知值什么都不做,输出保持上一次的值;安全相关逻辑要显式处理。
  • 分支穿透:SCL 的 CASE 不会自动穿透,但漏写语句会让该分支什么都不做。
  • END_CASE 漏分号:END_CASE; 要分号。
  • 重复的值:同一个值出现在多个分支,编译可能报错;检查标签。
  • 状态没有出口:某个状态没有转移条件,设备会卡住;每个状态都要有下一步或报警。

和 LAD 的区别

LAD 用跳转/比较实现多路分支;SCL 的 CASE 是文本结构,更适合状态机。两者都能表达同样的逻辑,但 SCL 的 CASE 在分支多时更易读、易改。LAD 侧可参考 程序控制指令。

云仿真验证

PLC 云仿真:PASS(5 次扫描)。场景:按 Step 选择命令。结果来自 PLC 云仿真 的 scl_run_scenario;页面构建时执行同一份 SCL 源码和场景。

查看云仿真回归输出
云仿真回归输出
PASS  按 Step 选择命令 (5 step(s), 5 scan(s))
RESULT: ALL PASS (5 scan(s))

云仿真验证语法、结构和逐扫描行为,不等同于 TIA 编译;TIA 状态见下方“验证状态”。

验证状态

项目结果日期证据
构建期语法/结构校验PASS2026-11-02parse + validate
PLC 云仿真PASS(5 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/CASE__Create_multiway_branch.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。

CASE 的语法、分支标签和 ELSE 语义以 TIA Portal V19 帮助为事实核对;中文讲解、SCL 示例和验证场景由 Learn-SCL 编写。

Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。

常见问题

CASE 的选择值可以是什么类型?

通常是整数类型(Int、DInt、UInt 等)或枚举;不要用 Real 做 CASE 选择值,浮点数相等比较不可靠。

CASE 没有匹配的分支会怎样?

有 ELSE 就执行 ELSE;没有 ELSE 就什么都不做,输出保持上一次的值。状态机建议写 ELSE 做安全处理。

CASE 和 IF 怎么选?

一个值对应多个固定分支用 CASE;范围判断、少量条件、复杂布尔组合用 IF。CASE 更容易看出状态机的全部状态。

← 返回 SCL 指令手册