在 TIA 里试一下
通过 TiaLink 把本页示例(FB_CASE_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案: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 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | Step | Int | |
| 输出 | Command | Int | |
| 输出 | Done | Bool | |
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;
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 状态见下方“验证状态”。
验证状态
“待实测”表示还没有在 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 更容易看出状态机的全部状态。