SCL 块移动/填充家族 — BLKMOV、UMOVE_BLK、UFILL_BLK
BLKMOV、UMOVE_BLK、UFILL_BLK 的用法对比:按字节移动、不可中断块移动、不可中断块填充。
移动
S7-1200/1500
TIA V19
别名:块移动 / 块填充 / BLKMOV / UMOVE_BLK / UFILL_BLK
在 TIA 里试一下
通过 TiaLink 把本页示例(FB_UMoveBlk_Demo、FB_UFillBlk_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用 。
导入示例块
TiaLink 设置
目标 PLC
自动(第一个 PLC)
本页目录
一句话
答案: 块移动优先用 UMOVE_BLK(不可中断),填充用 UFILL_BLK;BLKMOV 是 legacy 的按字节/字移动,指针写法只用于维护旧程序。
块移动优先用 UMOVE_BLK(不可中断),块填充用 UFILL_BLK;BLKMOV 是 legacy 的按字节/字移动,指针写法只用于维护旧程序。新代码通常直接用 MOVE_BLK/FILL_BLK 就够。
参数
参数 方向 类型 存储区 说明
IN输入 元素类型 / 指针D, L UMOVE_BLK 的源数组起始元素;UFILL_BLK 的填充值;BLKMOV 的源存储区指针。
COUNT输入 USINT / UINT / UDINTI, Q, M, D, L, P 移动/填充的元素个数;BLKMOV 用 BYTE/WORD 长度表示字节数。
OUT输出 元素类型 / 指针D, L UMOVE_BLK/UFILL_BLK 的目标数组起始元素;BLKMOV 的目标存储区指针。
参数表以 TIA Portal V19 帮助为事实核对;S7-1200/1500 有差异时在类型列并列显示。存储区是 TIA 允许的范围,实际可用范围还受块接口和优化属性影响。
最小示例
下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面代码已通过构建期语法/结构校验;云仿真状态见下方。
FB_UMoveBlk_Demo FB
UMOVE_BLK 示例 · 36 行 · 源文件 blocks/FB_UMoveBlk_Demo.scl
查看 FB_UMoveBlk_Demo 的块接口 区块 名称 类型 说明 输入 CopyBool输入 CountUInt输出 DoneBool输出 SumInt静态 SourceARRAY[0..3] OF Int静态 DestARRAY[0..3] OF Int
blocks/FB_UMoveBlk_Demo.scl 复制
1 FUNCTION_BLOCK "FB_UMoveBlk_Demo"
2 { S7_Optimized_Access := 'TRUE' }
3 VERSION : 0.1
4 VAR_INPUT
5 Copy : Bool ;
6 Count : UInt := 4 ;
7 END_VAR
8
9 VAR_OUTPUT
10 Done : Bool ;
11 Sum : Int ;
12 END_VAR
13
14 VAR
15 Source : Array [ 0 . . 3 ] of Int ;
16 Dest : Array [ 0 . . 3 ] of Int ;
17 END_VAR
18
19 BEGIN
20 REGION 准备数据
21 #Source [ 0 ] := 1 ; #Source [ 1 ] := 2 ; #Source [ 2 ] := 3 ; #Source [ 3 ] := 4 ;
22 #Dest [ 0 ] := 0 ; #Dest [ 1 ] := 0 ; #Dest [ 2 ] := 0 ; #Dest [ 3 ] := 0 ;
23 END_REGION
24
25 REGION 不可中断块移动
26 IF #Copy THEN
27 UMOVE_BLK( IN := #Source [ 0 ] , COUNT := #Count , OUT => #Dest [ 0 ] ) ;
28 END_IF ;
29 END_REGION
30
31 REGION 结果
32 #Done := #Dest [ 0 ] = 1 AND #Dest [ 1 ] = 2 AND #Dest [ 2 ] = 3 AND #Dest [ 3 ] = 4 ;
33 #Sum := #Dest [ 0 ] + #Dest [ 1 ] + #Dest [ 2 ] + #Dest [ 3 ] ;
34 END_REGION
35 END_FUNCTION_BLOCK
36
FB_UFillBlk_Demo FB
UFILL_BLK 示例 · 31 行 · 源文件 blocks/FB_UFillBlk_Demo.scl
查看 FB_UFillBlk_Demo 的块接口 区块 名称 类型 说明 输入 FillBool输入 ValueInt输入 CountUInt输出 DoneBool输出 SumInt静态 DestARRAY[0..3] OF Int
blocks/FB_UFillBlk_Demo.scl 复制
1 FUNCTION_BLOCK "FB_UFillBlk_Demo"
2 { S7_Optimized_Access := 'TRUE' }
3 VERSION : 0.1
4 VAR_INPUT
5 Fill : Bool ;
6 Value : Int := 7 ;
7 Count : UInt := 4 ;
8 END_VAR
9
10 VAR_OUTPUT
11 Done : Bool ;
12 Sum : Int ;
13 END_VAR
14
15 VAR
16 Dest : Array [ 0 . . 3 ] of Int ;
17 END_VAR
18
19 BEGIN
20 REGION 不可中断块填充
21 IF #Fill THEN
22 UFILL_BLK( IN := #Value , COUNT := #Count , OUT => #Dest [ 0 ] ) ;
23 END_IF ;
24 END_REGION
25
26 REGION 结果
27 #Done := #Dest [ 0 ] = #Value AND #Dest [ 1 ] = #Value AND #Dest [ 2 ] = #Value AND #Dest [ 3 ] = #Value ;
28 #Sum := #Dest [ 0 ] + #Dest [ 1 ] + #Dest [ 2 ] + #Dest [ 3 ] ;
29 END_REGION
30 END_FUNCTION_BLOCK
31
块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。
SCL 写法
SCL 复制
1
2 UMOVE_BLK( IN := #Source [ 0 ] , COUNT := #Count , OUT => #Dest [ 0 ] ) ;
3
4
5 UFILL_BLK( IN := #Value , COUNT := #Count , OUT => #Dest [ 0 ] ) ;
Legacy BLKMOV 是指针/存储区写法,维护旧程序时可能遇到:
SCL 复制
1 #Ret := BLKMOV( IN := P#M14 . 0 WORD 4 , OUT => P#M100 . 0 WORD 4 ) ;
怎么工作
指令
作用
新代码建议
MOVE_BLK
可中断块移动
普通数组复制
UMOVE_BLK
不可中断块移动
需要一致性时
FILL_BLK
可中断块填充
普通批量填充
UFILL_BLK
不可中断块填充
需要一致性时
BLKMOV
legacy 按字节/字移动
只维护旧程序
IN/OUT 用数组起始元素;COUNT 是元素个数,不是字节数(BLKMOV 例外,按 BYTE/WORD 长度)。
源和目标元素类型必须一致;数组越界/COUNT 过大结果无效。
“不可中断”意味着执行期间不被更高优先级中断打断;数据一致,但扫描周期可能变长。
BLKMOV 的指针写法依赖存储区布局,优化块/不同 CPU 上要重新确认。
常用场景
1. 需要一致性的数组复制
通信缓冲区、配方快照等不能在中途被中断改写的场景,用 UMOVE_BLK;普通数组复制用 MOVE_BLK 即可。
2. 批量预置/清零
需要一次性填完不被中断,用 UFILL_BLK;普通清零用 FILL_BLK。
3. 维护旧程序
看到 BLKMOV(IN := P#...) 的旧代码,先确认存储区/长度;新代码不要继续用这种指针写法。
常见坑
COUNT 当字节数 :UMOVE_BLK/UFILL_BLK 的 COUNT 是元素个数;BLKMOV 才是 BYTE/WORD 长度。
IN/OUT 写整个数组 :按 TIA 帮助写起始元素 #Source[0]/#Dest[0]。
元素类型不一致 :Int 不能复制到 Word;先统一类型。
不可中断的代价 :数据一致,但扫描周期变长;大数据量要评估实时性。
BLKMOV 指针布局 :优化块/标准块、不同 CPU 的存储布局不同;旧代码迁移要重新验证。
越界 :COUNT 超过源/目标剩余元素数,结果无效;先算上下界。
和 LAD 的区别
LAD 里对应 MOVE_BLK/UMOVE_BLK/FILL_BLK/UFILL_BLK 的盒;SCL 里直接写函数调用,数组起始元素和 COUNT 仍然要自己保证。BLKMOV 的指针盒在旧程序里常见,新程序优先用块移动/填充指令。LAD 侧可参考 移动指令 。
云仿真验证
本页代码已通过构建期语法/结构校验。该示例使用 TIA 的数组起始元素写法,云仿真只做 scl_validate,未跑场景(数组切片)。 云仿真校验日期:2026-11-02。
打开 PLC 云仿真
验证状态
项目 结果 日期 证据 构建期语法/结构校验 PASS 2026-11-02 parse + validate PLC 云仿真 scl_validate 通过 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/Move_operations/BLKMOV__Move_block.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。
BLKMOV/UMOVE_BLK/UFILL_BLK 的参数和不可中断语义以 TIA Portal V19 帮助为事实核对;中文讲解、SCL 示例和验证场景由 Learn-SCL 编写。
Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal 。
常见问题
BLKMOV、UMOVE_BLK、UFILL_BLK 怎么选? 新程序数组复制用 MOVE_BLK/UMOVE_BLK,填充用 FILL_BLK/UFILL_BLK;BLKMOV 是 legacy 指针写法,只在维护旧程序时用。
UMOVE_BLK 的 IN/OUT 用整个数组还是起始元素? 用数组起始元素,例如 `#Source[0]`/`#Dest[0]`;COUNT 是元素个数。
不可中断是什么意思? 指令执行期间不被更高优先级中断打断,适合需要一致性的数据;代价是扫描周期可能变长。
上一条 SCL FILL_BLK — 填充数组
下一条 SCL DECO — 解码