跳到正文
Learn-SCL
SCL 示例库/SCL 指令手册/SCL 块移动/填充家族 — BLKMOV、UMOVE_BLK、UFILL_BLK

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 设置

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

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

一句话

答案:块移动优先用 UMOVE_BLK(不可中断),填充用 UFILL_BLK;BLKMOV 是 legacy 的按字节/字移动,指针写法只用于维护旧程序。

块移动优先用 UMOVE_BLK(不可中断),块填充用 UFILL_BLK;BLKMOV 是 legacy 的按字节/字移动,指针写法只用于维护旧程序。新代码通常直接用 MOVE_BLK/FILL_BLK 就够。

参数

参数方向类型存储区说明
IN输入元素类型 / 指针D, LUMOVE_BLK 的源数组起始元素;UFILL_BLK 的填充值;BLKMOV 的源存储区指针。
COUNT输入USINT / UINT / UDINTI, Q, M, D, L, P移动/填充的元素个数;BLKMOV 用 BYTE/WORD 长度表示字节数。
OUT输出元素类型 / 指针D, LUMOVE_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
1FUNCTION_BLOCK "FB_UMoveBlk_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 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 
19BEGIN
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
35END_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
1FUNCTION_BLOCK "FB_UFillBlk_Demo"
2{ S7_Optimized_Access := 'TRUE' }
3VERSION : 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 
19BEGIN
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
30END_FUNCTION_BLOCK
31 

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

SCL 写法

SCL
1// 不可中断块移动:IN/OUT 用数组起始元素,COUNT 是元素个数
2UMOVE_BLK(IN := #Source[0], COUNT := #Count, OUT => #Dest[0]);
3 
4// 不可中断块填充
5UFILL_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 云仿真

验证状态

项目结果日期证据
构建期语法/结构校验PASS2026-11-02parse + validate
PLC 云仿真scl_validate 通过2026-11-02scl_run_scenario / scl_validate
TIA 导入编译PASS(0 error / 0 warning)2026-11-02TiaLink + 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 指令手册