跳到正文
Learn-SCL
SCL 示例库/SCL 指令手册/SCL MOVE_BLK — 块移动

SCL MOVE_BLK — 块移动

从数组起始元素复制 COUNT 个元素到另一个数组;源和目标元素类型必须一致。

移动 S7-1200/1500 TIA V19 别名:Move block / 块移动 / 数组复制 / MOVE_BLK

在 TIA 里试一下

通过 TiaLink 把本页示例(FB_MoveBlk_Demo)作为“外部源”导入你当前打开的 TIA Portal 项目:预检、生成块、编译,并清理外部源。导入后不会自动保存;FB 导入后需要在 OB 里调用。

TiaLink 设置

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

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

一句话

答案:用 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 / UDINTI, 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 的块接口
区块名称类型说明
输入CopyBool
输入CountUInt
输出DoneBool
输出SumInt
输出FirstInt
输出LastInt
静态SourceARRAY[0..3] OF Int
静态DestARRAY[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;              // 为 1 时执行块移动
6      Count : UInt := 4;        // 复制元素个数
7   END_VAR
8 
9   VAR_OUTPUT
10      Done : Bool;              // 4 个元素都等于源值
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      // TIA 帮助的写法:IN/OUT 用数组起始元素,COUNT 是元素个数。
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 云仿真

验证状态

项目结果日期证据
构建期语法/结构校验PASS2026-11-02parse + validate
PLC 云仿真scl_validate 通过2026-11-02scl_run_scenario / scl_validate
TIA 导入编译待实测—TiaLink + TIA Portal(待实测)

“待实测”表示还没有在 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 一次复制一段连续元素,适合数组、配方和缓冲区。单个元素直接用 := 更清楚。

← 返回 SCL 指令手册