SCL MOVE_BLK — 块移动
从数组起始元素复制 COUNT 个元素到另一个数组;源和目标元素类型必须一致。
移动
S7-1200/1500
TIA V19
别名:Move block / 块移动 / 数组复制 / MOVE_BLK
在 TIA 里试一下
通过 TiaLink 把本页示例(FB_MoveBlk_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。
一句话
答案:用 MOVE_BLK(IN := #Source[0], COUNT := 4, OUT => #Dest[0]) 从数组起始元素复制 COUNT 个元素;IN/OUT 的元素类型必须一致。
MOVE_BLK 从源数组的起始元素开始,复制 COUNT 个元素到目标数组的起始元素;IN 和 OUT 的元素类型必须相同。它复制的是元素个数,不是字节数。
参数
| 参数 | 方向 | 类型 | 存储区 | 说明 |
IN | 输入 | 元素类型(Int/Real/Word/...) | D, L | 源数组的起始元素,例如 #Source[0]。不是整个数组名;从该元素开始复制 COUNT 个元素。 |
COUNT | 输入 | USINT / UINT / UDINT | I, Q, M, D, L, P | 要复制的元素个数,不是字节数。S7-1500 还支持 ULINT。 |
OUT | 输出 | 元素类型(与 IN 一致) | D, L | 目标数组的起始元素,例如 #Dest[0]。源和目标元素类型必须相同。 |
参数表以 TIA Portal V19 帮助为事实核对;S7-1200/1500 有差异时在类型列并列显示。存储区是 TIA 允许的范围,实际可用范围还受块接口和优化属性影响。
最小示例
下面是一个完整块,页面展示的源码就是 TiaLink 导入的同一份源码。页面代码已通过构建期语法/结构校验;云仿真状态见下方。
FB_MoveBlk_Demo FB
最小示例 · 47 行 · 源文件 blocks/FB_MoveBlk_Demo.scl
查看 FB_MoveBlk_Demo 的块接口
| 区块 | 名称 | 类型 | 说明 |
|---|
| 输入 | Copy | Bool | |
| 输入 | Count | UInt | |
| 输出 | Done | Bool | |
| 输出 | Sum | Int | |
| 输出 | First | Int | |
| 输出 | Last | Int | |
| 静态 | Source | ARRAY[0..3] OF Int | |
| 静态 | Dest | ARRAY[0..3] OF Int | |
blocks/FB_MoveBlk_Demo.scl
1FUNCTION_BLOCK "FB_MoveBlk_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 First : Int;
13 Last : Int;
14 END_VAR
15
16 VAR
17 Source : Array[0..3] of Int;
18 Dest : Array[0..3] of Int;
19 END_VAR
20
21BEGIN
22 REGION 准备源数据
23 #Source[0] := 1;
24 #Source[1] := 2;
25 #Source[2] := 3;
26 #Source[3] := 4;
27 #Dest[0] := 0;
28 #Dest[1] := 0;
29 #Dest[2] := 0;
30 #Dest[3] := 0;
31 END_REGION
32
33 REGION 块移动
34
35 IF #Copy THEN
36 MOVE_BLK(IN := #Source[0], COUNT := #Count, OUT => #Dest[0]);
37 END_IF;
38 END_REGION
39
40 REGION 结果检查
41 #Done := #Dest[0] = 1 AND #Dest[1] = 2 AND #Dest[2] = 3 AND #Dest[3] = 4;
42 #Sum := #Dest[0] + #Dest[1] + #Dest[2] + #Dest[3];
43 #First := #Dest[0];
44 #Last := #Dest[3];
45 END_REGION
46END_FUNCTION_BLOCK
47
块接口表由源码自动生成;# 前缀表示块内局部变量,实际工程里也可以是全局标签或 DB 变量。
SCL 写法
TIA 帮助里的标准写法是用数组起始元素,而不是整个数组名:
SCL
1MOVE_BLK(IN := #Source[0], COUNT := #Count, OUT => #Dest[0]);
也可以直接操作全局 DB 的数组:
SCL
1MOVE_BLK(IN := "DB_Source".Values[1], COUNT := 10, OUT => "DB_Target".Values[1]);
COUNT 可以用常量、UInt 或 UDInt;数组下标从数组声明的最低界开始。复制从起始元素往后数 COUNT 个,目标数组后面的元素保持不变。
怎么工作
| 参数 |
作用 |
IN |
源数组的起始元素,例如 #Source[0] |
COUNT |
复制的元素个数,例如 4 |
OUT |
目标数组的起始元素,例如 #Dest[0] |
- 只复制
COUNT 个元素;源和目标范围可以重叠,但重叠时结果取决于复制方向,工程上应避免。
- 源和目标元素类型必须一致;
Int 和 Word 不能互拷。
COUNT 超过源或目标剩余元素数时,结果无效;TIA 可能在编译或运行时给出错误。
- 目标数组后面的元素不会被清零,也不会被覆盖。
常用场景
1. 缓冲区整体移位
缓冲站要把 1..7 号位整体后移到 2..8 号位时,可以用 MOVE_BLK 一次复制 7 个结构体元素,再把 1 号位写成新工件。比 FOR 循环更短,但要注意重叠方向。
2. 配方/参数批量下发
把配方 DB 里的 10 个 Real 参数复制到设备参数数组;COUNT 用常量或 UInt,源和目标元素类型保持一致。
3. 数组快照
在修改数组前,把当前值复制到备份数组,便于出错时恢复。备份数组长度要不小于 COUNT。
常见坑
- 把
COUNT 当字节数:COUNT=4 是 4 个元素,不是 4 个字节;元素宽度由数组类型决定。
- 直接写整个数组名:
IN := #Source 在 TIA 里可能被拒绝;按帮助写起始元素 #Source[0]。
- 元素类型不一致:
Int 数组不能复制到 Word 数组;编译会报类型错误。
- COUNT 超过数组长度:源或目标剩余元素不够时,结果无效;先用
UPPER_BOUND - 起始下标 + 1 算上限。
- 重叠复制:源和目标在同一数组且有重叠时,复制方向会影响结果;需要移位时先复制到临时数组。
- 忘记初始化目标:
MOVE_BLK 只覆盖 COUNT 个元素,后面的旧值还在;需要清零就再调用 FILL。
和 LAD 的区别
LAD 里对应 MOVE_BLK 的盒(MoveBlockI/MoveBlockU),引脚是 IN/COUNT/OUT;SCL 里直接写函数调用,数组起始元素和 COUNT 仍然要自己保证。梯形图版本见 Learn-LAD 的 MoveBlockI 页。
云仿真验证
本页代码已通过构建期语法/结构校验。该示例使用 TIA 的数组起始元素写法,云仿真只做 scl_validate,未跑场景(数组切片)。 云仿真校验日期:2026-11-02。
打开 PLC 云仿真
验证状态
“待实测”表示还没有在 TIA Portal 里导入编译,不代表代码有问题;上机前请先在测试项目编译。云仿真在 tia.hubwiz.com/sim 执行,不替代 TIA 编译。
来源与说明
参数、行为和数据类型的核对来源:TIA Portal V19 帮助的 Instructions/Instructions/Basic_instructions/SCL/Move_operations/MOVE_BLK__Move_block.md。中文讲解、SCL 示例、时序图和验证场景由 Learn-SCL 编写。
参数、元素类型和数组起始元素规则以 TIA Portal V19 帮助为事实核对;中文讲解、SCL 示例和验证场景由 Learn-SCL 编写。
Siemens 文档与截图的版权归 Siemens;本站只引用事实参数,不复制官方描述段落和图片。官方参考:Siemens TIA Portal。
常见问题
MOVE_BLK 的 COUNT 是字节数还是元素个数?
是元素个数。COUNT=4 表示从 IN 起始元素开始复制 4 个元素;元素宽度由数组元素类型决定,不是字节数。
为什么 MOVE_BLK 编译报类型不一致?
IN 和 OUT 的元素类型必须相同,例如 Int 数组只能复制到 Int 数组。Word 和 Int 虽然都是 16 位,也不能直接互拷。
MOVE_BLK 和普通赋值有什么区别?
普通赋值一次只写一个元素;MOVE_BLK 一次复制一段连续元素,适合数组、配方和缓冲区。单个元素直接用 := 更清楚。