在 TIA 里试一下
通过 TiaLink 把本页示例(FB_Demux_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案:DEMUX(K := #K, IN := #Value, OUT0 => ..., OUTELSE => ...) 把 IN 写到 K 选中的输出;其他输出保持原值。
DEMUX 把输入写到 K 选中的输出:DEMUX(K := #K, IN := #Value, OUT0 => #Out0, OUTELSE => #DefaultOut);。只有选中的输出被写入,其他输出保持原值。
参数
| 参数 | 方向 | 类型 | 存储区 | 说明 |
K | 输入 | 整数 | I, Q, M, D, L, P | 选择哪个输出:K=0 写 OUT0,K=1 写 OUT1,依此类推。 |
IN | 输入 | 整数 / 浮点 / 位串 / 字符串 / 时间 | I, Q, M, D, L, P | 要分配的值。 |
OUT0...OUTn | 输出 | 与 IN 相同类型 | I, Q, M, D, L, P | 候选输出;只有 K 选中的那个被写入,其他保持原值。 |
OUTELSE | 输出 | 与 IN 相同类型 | I, Q, M, D, L, P | K 超出已有输出编号时的默认输出;不写时越界结果无效。 |
参数表以 TIA Portal V19 帮助为事实核对;S7-1200/1500 有差异时在类型列并列显示。存储区是 TIA 允许的范围,实际可用范围还受块接口和优化属性影响。
最小示例
下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面的场景已在 PLC 云仿真里跑过,输出见“云仿真验证”。
FB_Demux_Demo FB
最小示例 · 21 行 · 源文件 blocks/FB_Demux_Demo.scl
查看 FB_Demux_Demo 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | K | Int | |
| 输入 | Value | Int | |
| 输出 | Out0 | Int | |
| 输出 | Out1 | Int | |
| 输出 | Out2 | Int | |
| 输出 | DefaultOut | Int | |
blocks/FB_Demux_Demo.scl
1FUNCTION_BLOCK "FB_Demux_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 0.1
4 VAR_INPUT
5 K : Int := 0;
6 Value : Int := 7;
7 END_VAR
8
9 VAR_OUTPUT
10 Out0 : Int;
11 Out1 : Int;
12 Out2 : Int;
13 DefaultOut : Int;
14 END_VAR
15
16BEGIN
17 REGION 多路分配
18 DEMUX(K := #K, IN := #Value, OUT0 => #Out0, OUT1 => #Out1, OUT2 => #Out2, OUTELSE => #DefaultOut);
19 END_REGION
20END_FUNCTION_BLOCK
21
块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。
SCL 写法
SCL
1DEMUX(K := #K, IN := #Value, OUT0 => #Out0, OUT1 => #Out1, OUT2 => #Out2, OUTELSE => #DefaultOut);
DEMUX 是语句,不是带返回值的函数;输出用 => 接。
怎么工作
K |
写入 |
| 0 |
OUT0 |
| 1 |
OUT1 |
| 2 |
OUT2 |
| 超出已有输出 |
OUTELSE |
无 OUTELSE 且越界 |
无效/诊断 |
K 从 0 开始。
- 没选中的输出保持原值,不会自动清零;需要清零就自己复位。
- 所有输出和
IN 类型要兼容。
- 和
MUX 相反:MUX 多选一,DEMUX 一选多。
常用场景
1. 按工位分发参数
把设定值分发给选中的工位/通道;其他工位保持原值,不会误清零。
2. 报警/消息分发
按类别把消息写到对应缓冲区;K 选择目标。
3. 测试通道
测试时只把测试值写到一个输出,其他输出不受影响。
常见坑
- K 从 1 开始:K=0 是 OUT0;按 1-based 编号会写错。
- 以为其他输出会清零:不会;只写选中的输出。
- 越界不写 OUTELSE:结果无效/报诊断;给默认输出更安全。
- 输出类型不一致:所有 OUT 和 IN 要兼容;字符串注意容量。
- 把 DEMUX 当 MUX:DEMUX 一选多,MUX 多选一。
- 忘记初始化输出:第一次扫描前输出可能是旧值;上电初始化。
和 LAD 的区别
LAD 的 DEMUX 盒有 K、IN、多个输出和 OUTELSE;SCL 里直接写语句,输出用 => 接。语义一样,SCL 更容易把分发逻辑写成一行。梯形图版本见 Learn-LAD 的 Demux 页。
云仿真验证
PLC 云仿真:PASS(3 次扫描)。场景:K=0 写 OUT0;K=2 写 OUT2;K 越界写 OUTELSE。结果来自 PLC 云仿真 的 scl_run_scenario。
查看云仿真回归输出
云仿真回归输出
PASS K=0 写 OUT0 (1 step(s), 1 scan(s))
PASS K=2 写 OUT2 (1 step(s), 1 scan(s))
PASS K 越界写 OUTELSE (1 step(s), 1 scan(s))
RESULT: ALL PASS (3 scan(s))
云仿真验证语法、结构和逐扫描行为,不等同于 TIA 编译;TIA 状态见下方“验证状态”。
验证状态
| 项目 | 结果 | 日期 | 证据 |
|---|
| 构建期语法/结构校验 | PASS | 2026-11-02 | parse + validate |
| PLC 云仿真 | PASS(3 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/DEMUX__Demultiplex.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。
K/IN/OUT0..OUTn/OUTELSE 参数和越界规则以 TIA Portal V19 帮助为事实核对;中文讲解、SCL 示例和验证场景由 Learn-SCL 编写。
Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。
常见问题
DEMUX 的 K 从 0 还是 1 开始?
从 0 开始:K=0 写 OUT0,K=1 写 OUT1。
没选中的输出会清零吗?
不会。DEMUX 只写选中的输出,其他输出保持原值;需要清零就自己复位。
K 越界会怎样?
有 OUTELSE 就写 OUTELSE;没有时结果无效/报诊断,其他输出不变。