在 TIA 里试一下
通过 TiaLink 把本页示例(FB_Mux_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案:#Result := MUX(K := #K, IN0 := ..., IN1 := ..., INELSE := ...) 按 K 选择输入;K 越界时返回 INELSE。
MUX 按 K 选择输入:#Result := MUX(K := #K, IN0 := #A, IN1 := #B, INELSE := #DefaultValue);。K=0 选 IN0,K=1 选 IN1;越界时返回 INELSE。
参数
| 参数 | 方向 | 类型 | 存储区 | 说明 |
K | 输入 | 整数 | I, Q, M, D, L, P | 选择哪个输入:K=0 选 IN0,K=1 选 IN1,依此类推。 |
IN0...INn | 输入 | 整数 / 浮点 / 位串 / 字符串 / 时间 | I, Q, M, D, L, P | 候选输入;编号从 0 开始。 |
INELSE | 输入 | 与 IN0 相同类型 | I, Q, M, D, L, P | K 超出已有输入编号时使用的默认值;不写时越界结果无效。 |
Return | 返回值 | 与输入相同的类型 | — | 选中的输入值,或 INELSE。 |
参数表以 TIA Portal V19 帮助为事实核对;S7-1200/1500 有差异时在类型列并列显示。存储区是 TIA 允许的范围,实际可用范围还受块接口和优化属性影响。
最小示例
下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面的场景已在 PLC 云仿真里跑过,输出见“云仿真验证”。
FB_Mux_Demo FB
最小示例 · 21 行 · 源文件 blocks/FB_Mux_Demo.scl
查看 FB_Mux_Demo 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | K | Int | |
| 输入 | A | Int | |
| 输入 | B | Int | |
| 输入 | C | Int | |
| 输入 | DefaultValue | Int | |
| 输出 | Result | Int | |
blocks/FB_Mux_Demo.scl
1FUNCTION_BLOCK "FB_Mux_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4 VAR_INPUT
5 K : Int := 1;
6 A : Int := 10;
7 B : Int := 20;
8 C : Int := 30;
9 DefaultValue : Int := -1;
10 END_VAR
11
12 VAR_OUTPUT
13 Result : Int;
14 END_VAR
15
16BEGIN
17 REGION 多路选择
18 #Result := MUX(K := #K, IN0 := #A, IN1 := #B, IN2 := #C, INELSE := #DefaultValue);
19 END_REGION
20END_FUNCTION_BLOCK
21
块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。
SCL 写法
SCL
1#Result := MUX(K := #K, IN0 := #A, IN1 := #B, IN2 := #C, INELSE := #DefaultValue);
两个输入时可以省略 IN2;越界处理建议始终写 INELSE。
怎么工作
K |
结果 |
| 0 |
IN0 |
| 1 |
IN1 |
| 2 |
IN2 |
| 超出已有输入 |
INELSE |
无 INELSE 且越界 |
无效值/诊断 |
K 从 0 开始,和数组下标一致。
- 所有输入和
INELSE 类型要兼容;返回类型跟随输入。
- 支持整数、浮点、位串、字符串、时间等;字符串/时间要同类型。
MUX 是选择器,不修改输入;DEMUX 是反向分配。
常用场景
1. 配方/工位参数选择
K 是配方号或工位号,IN0..INn 是对应参数;越界用 INELSE 给默认值。
2. 多传感器选择
诊断时选择某一路传感器值显示;K 来自 HMI 或步号。
3. 状态机输出
不同状态选不同设定值;比 CASE 更紧凑,但状态多时 CASE 更清晰。
常见坑
- K 从 1 开始:K=0 是 IN0;按 1-based 编号会选错。
- 越界不写 INELSE:结果无效/报诊断;一定要有默认值。
- 输入类型不一致:Int/Real/String 混用会编译报错;先统一。
- 输入太多:MUX 支持有限数量;超过时用数组 + 下标或 CASE。
- 把 MUX 当 DEMUX:MUX 多选一,DEMUX 一选多。
- 字符串长度:字符串选择要注意目标容量;结果可能被截断。
和 LAD 的区别
LAD 的 MUX 盒有 K、多个输入和 INELSE;SCL 里直接写函数调用,参数个数由调用决定。语义一样,SCL 更容易把选择逻辑写成一行。梯形图版本见 Learn-LAD 的 Mux 页。
云仿真验证
PLC 云仿真:PASS(4 次扫描)。场景:选 0、1、2 和越界。结果来自 PLC 云仿真 的 scl_run_scenario。
查看云仿真回归输出
云仿真回归输出
PASS 选 0、1、2 和越界 (4 step(s), 4 scan(s))
RESULT: ALL PASS (4 scan(s))
云仿真验证语法、结构和逐扫描行为,不等同于 TIA 编译;TIA 状态见下方“验证状态”。
验证状态
| 项目 | 结果 | 日期 | 证据 |
|---|
| 构建期语法/结构校验 | PASS | 2026-11-02 | parse + validate |
| PLC 云仿真 | PASS(4 scans) | 2026-11-02 | scl_run_scenario / scl_validate |
| TIA 导入编译 | PASS(0 error / 0 warning) | 2026-11-02 | TiaLink + TIA Portal |
“待实测”表示还没有在 TIA Portal 里导入编译,不代表代码有问题;上机前请先在测试项目编译。云仿真在 tia.hubwiz.com/sim 执行,不替代 TIA 编译。
来源与说明
参数、行为和数据类型的核对来源:TIA Portal V19 帮助的 Instructions/Instructions/Basic_instructions/SCL/Word_logic_operations/MUX__Multiplex.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。
K/IN0..INn/INELSE 参数和越界规则以 TIA Portal V19 帮助为事实核对;中文讲解、SCL 示例和验证场景由 Learn-SCL 编写。
Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。
常见问题
MUX 的 K 从 0 还是 1 开始?
从 0 开始:K=0 选 IN0,K=1 选 IN1。
K 超出范围会怎样?
有 INELSE 就返回 INELSE;没有 INELSE 时结果无效/报诊断。
MUX 能选字符串/时间吗?
可以,但所有输入和 INELSE 的类型要兼容;返回类型跟随输入。