移动操作
数据传输与管理
数据传输是 PLC 程序的循环系统。高效管理变量副本、结构序列化和内存块操作。
什么是 TIA Portal 中的移动操作?
移动操作允许将数据从一个内存位置复制到另一个内存位置。它们范围广泛,从简单的变量复制 (MOVE) 到用于通信的整个结构的复杂操作 (Serialize/Deserialize),或者是管理连续数据区域 (MOVE_BLK)。
TIA Portal 提供用于符号访问、通过 Variant 类型进行动态管理以及针对 Array DB 优化的现代指令,同时保留了用于与旧版 S7-300 系统兼容的 Legacy 指令。
基础传输
基本的复制和格式化指令
MOVE — 复制值
MOVE功能
将输入 IN 的内容复制到输出 OUT。如果数据类型不同,且安全的情况下,可能会发生隐式转换。
适用场景
初始化变量、复制 HMI 设定值或传输计算结果。
专家提示
您可以添加多个输出 (OUT1, OUT2...) 以同时将一个值复制到多个目的地。
在 SCL 中,只需使用赋值语句:destination := source;
适用于几乎所有数据类型 (Bool, Int, Real, Struct, String)。
Serialize / Deserialize
SER功能
Serialize 将复杂结构转换为顺序字节流 (Array of Byte)。Deserialize 则执行相反操作。
适用场景
准备通过通信协议 (TCP/IP, UDP) 发送的数据或紧凑型存储。
专家提示
使用 POS 参数跟踪目标缓冲区中的填充索引。
对于与不理解西门子 UDT 的第三方系统进行交换至关重要。
确保缓冲区大小足够,以避免运行错误。
SWAP — 交换
SWAP功能
反转操作数 IN 中的字节顺序 (Endianness)。
适用场景
与使用“小端”格式的设备通信,而 PLC 使用“大端”格式。
专家提示
通常用于 Word 或 DWord 类型。
用于处理来自某些 Modbus 传感器的数据。
可用于重新排列接收到的反向 ASCII 代码。
块移动
大规模和连续内存区域的操作
MOVE_BLK / UMOVE_BLK
MOVE_BLK功能
将指定数量的元素从源数组复制到目标数组。UMOVE_BLK 是不可中断(原子)版本。
适用场景
缓冲区管理、历史数据归档或复制生产配方。
专家提示
起始索引 (COUNT) 定义要复制的元素数量。
UMOVE_BLK 确保在复制过程中数据不会被报警 OB 修改。
源和目标数据类型必须相同。
MOVE_BLK_VARIANT
功能
MOVE_BLK 的高级版本,支持 Variant 数据类型以实现灵活寻址。
适用场景
开发处理不同大小或类型数组的可重用库块。
专家提示
允许在运行时间确定类型的数组之间进行复制。
使用 CountOfElements 自动化 COUNT 参数。
在 S7-1500 中对于通用编程非常强大。
区域填充
快速初始化内存范围
FILL_BLK / UFILL_BLK
FILL功能
使用输入 IN 处指定的单个值填充内存区域(数组)。
适用场景
将测量数组重置为零,或使用默认值初始化缓冲区。
专家提示
对于与中断共享的关键区域,UFILL_BLK 更佳。
比使用 FOR 循环初始化大数组性能高得多。
COUNT 指定从指定指针开始填充的元素数量。
Scatter / Gather
位分解与合成
SCATTER / GATHER
功能
SCATTER 将一个字 (Word, DWord...) 分解为单个位到结构或数组中。GATHER 执行相反操作。
适用场景
从诊断字中提取状态位,或从控制位合成控制字。
专家提示
有效地替代了大量的位访问(例如:%X0)。
适用于 S7-1200 和 S7-1500。
确保代码更简洁、更易于维护。
Array DB 访问
在数组型数据块中进行读写
ReadFromArrayDB / WriteToArrayDB
功能
允许在配置为“Array DB”的数据块中读取或写入特定元素。
适用场景
管理需要动态且快速索引的大型数据列表。
专家提示
“L”版本(例如:ReadFromArrayDBL)访问装载内存(Load Memory)以获取不常用的数据。
使用 Array DB 通常比传统的索引访问性能更高。
检查索引是否在范围内,以避免访问错误。
Variant 操作
动态编程工具
VariantGet / VariantPut
功能
VariantGet 将 Variant 变量的值提取到有类型变量中。VariantPut 将有类型值写入 Variant 变量中。
适用场景
处理只有在块调用时才知道确切类型的数据。
专家提示
在提取值之前使用 EQ_Type 检查类型。
创建通用通信函数的基础。
如果 Variant 指向数组,CountOfElements 返回元素数量。
数组边界
动态确定限值
LOWER_BOUND / UPPER_BOUND
功能
返回作为 Variant 参数传递的数组的下限 (LOWER) 或上限 (UPPER)。
适用场景
对大小未知的数组进行循环(例如:Array[*] of MyUDT)。
专家提示
对于编写健壮的 FOR 循环至关重要:FOR i := LOWER_BOUND(...) TO UPPER_BOUND(...) DO
适用于一维和多维数组。
DIM 参数指定所需维度(默认为 1)。
Legacy 指令
与旧版 S7-300/400 系统的兼容性
保留了 BLKMOV、FILL 和 FieldRead/FieldWrite 等指令以实现兼容性。对于新的 S7-1200/1500 项目,请首选 MOVE_BLK、FILL_BLK 和直接符号访问。
复制方法对比
选择正确的传输指令
| 您需要... | 推荐指令 | 示例 |
|---|---|---|
| 复制简单变量 | MOVE | 设定值 -> 实际值 |
| 复制内存区域 | MOVE_BLK | FIFO 缓冲区 |
| 初始化数组 | FILL_BLK | 故障重置 |
| 准备 TCP 消息 | Serialize | 结构体 -> 字节流 |
| 将字拆分为位 | SCATTER | 字诊断 -> 结构体 |
| 动态访问 | VARIANT | 通用库块 |
常见问题
MOVE 和 MOVE_BLK 有什么区别?
MOVE 旨在一次复制单个值或完整结构。MOVE_BLK 经过优化,用于复制数组的一部分(一定数量的连续元素)。
为什么要使用 UMOVE_BLK 而不是 MOVE_BLK?
“U”代表不可中断 (Uninterruptible)。此指令确保复制操作不会被报警循环(高优先级 OB)中断,从而确保复制数据的一致性。
何时使用 Serialize 和 Deserialize?
当您需要通过“原始”协议(如 TSEND/TRCV)发送结构化数据或向第三方设备发送数据时,这些指令至关重要。它们以标准化的方式处理字节对齐。
MOVE_BLK 是否支持绝对地址 (P#DB1.DBX0.0...)?
支持,但 TIA Portal 鼓励使用符号访问。对于复杂的绝对寻址,虽然 MOVE_BLK_VARIANT 是推荐的现代解决方案,但仍会使用 BLKMOV (Legacy)。