Skip to content

3.4 数据传送指令

本节将介绍PLC数据传送和移动指令

学习目标

  • 掌握数据传送指令的用法
  • 理解块传送的概念
  • 能够实现数据的灵活传送

1. 数据传送概述

1.1 什么是数据传送

数据传送指令用于在PLC内部不同存储区域之间移动或复制数据。

数据传送基本概念:

┌─────────────┐          ┌─────────────┐
│   源数据    │ ───────→ │  目标地址   │
│   (源)      │   传送   │   (目标)    │
└─────────────┘          └─────────────┘

说明:
· 源数据可以是常数或地址
· 目标必须是地址
· 传送后源数据不变(复制操作)

1.2 数据传送分类

数据传送指令类型:

┌─────────────────────────────────────────────────────┐
│                  数据传送指令                       │
├────────────┬────────────┬────────────┬──────────────┤
│   MOV      │  BLKMOV    │   FILL     │    SWAP     │
│  单数据    │  块传送    │   填充     │    交换     │
├────────────┼────────────┼────────────┼──────────────┤
│ 传送一个值 │ 传送多个值 │ 用同一值   │ 高低字节    │
│ 到一个地址 │ 到连续地址 │ 填充区域   │ 交换        │
└────────────┴────────────┴────────────┴──────────────┘

1.3 常用数据传送指令

功能通用名称说明
单数据传送MOV/MOVE传送一个数据
块传送BLKMOV/BMOV传送多个连续数据
填充FILL/FMOV用同一值填充区域
交换SWAP/XCH交换数据

2. 单数据传送(MOVE/MOV)

2.1 功能说明

将源操作数的值传送到目标地址,是最基本的数据传送指令。

MOVE指令原理:

执行前:               执行后:
┌───────┐             ┌───────┐
│ 源:100│   传送      │ 源:100│  ← 源不变
└───────┘   ───→      └───────┘
                      
┌───────┐             ┌───────┐
│目标:0 │             │目标:100│ ← 目标更新
└───────┘             └───────┘

2.2 MOV指令梯形图

【梯形图】
              ┌──────────┐
   执行条件 ──┤   MOV    │
              │          │
   源数据 ────┤IN     OUT├───── 目标地址
              └──────────┘

【简化表示】
       条件
    ───┤├───────[MOV 100 → D0]───

【说明】
· IN:源操作数(常数或地址)
· OUT:目标地址
· 当条件满足时执行传送

2.3 MOV指令示例

【示例1】常数传送
       启动信号
    ───┤├───────[MOV 100 → D0]───
    
    说明:将常数100传送到D0

【示例2】寄存器间传送
       启动信号
    ───┤├───────[MOV D10 → D20]───
    
    说明:将D10的值传送到D20

【示例3】32位数据传送(双字)
       启动信号
    ───┤├───────[DMOV 100000 → D100]───
    
    说明:32位数据传送,占用D100和D101两个寄存器

2.4 间接寻址传送

利用变量作为地址偏移(间接寻址):

原理:用一个寄存器的值作为地址偏移量

示例:
· 若索引寄存器Z=5
· MOV 100 → D[Z] 
· 实际传送到D5

应用场景:
· 数组操作
· 批量数据处理
· 配方切换

3. 块数据传送(BLKMOV/BMOV)

3.1 功能说明

一次性传送多个连续数据到另一个连续区域。

块传送原理:

源区域:           目标区域:
┌───┐              ┌───┐
│D0 │ ──────────→ │D100│
├───┤              ├───┤
│D1 │ ──────────→ │D101│
├───┤              ├───┤
│D2 │ ──────────→ │D102│
├───┤              ├───┤
│D3 │ ──────────→ │D103│
└───┘              └───┘
  ↑                  ↑
源起始地址        目标起始地址
     └── 传送数量:4 ──┘

3.2 BLKMOV梯形图

【梯形图】
               ┌──────────┐
   执行条件 ───┤ BLKMOV   │
               │          │
   源起始 ─────┤SRC       │
               │          │
   目标起始 ───┤DST       │
               │          │
   传送数量 ───┤NUM       │
               └──────────┘

【简化表示】
       条件
    ───┤├───────[BMOV D0 → D100, 10个]───

说明:将D0-D9共10个数据传送到D100-D109

3.3 重叠区域处理

当源和目标区域重叠时:

情况1:目标在源后面(正向传送)
D0-D3 → D2-D5  ❌ 可能出错

正确方法:从高地址向低地址传送
或使用专用指令


情况2:使用临时区域
D0-D3 → 临时区 → D2-D5  ✓ 安全

4. 填充指令(FILL/FMOV)

4.1 功能说明

用同一个值填充一段连续的存储区域。

填充指令原理:

填充值: 0           目标区域:
                   ┌───┐
  0 ──────────────→│D100│ = 0
  │                ├───┤
  ├──────────────→│D101│ = 0
  │                ├───┤
  ├──────────────→│D102│ = 0
  │                ├───┤
  └──────────────→│D103│ = 0
                   └───┘

4.2 FILL梯形图

【梯形图】
               ┌──────────┐
   执行条件 ───┤  FILL    │
               │          │
   填充值 ─────┤IN        │
               │          │
   目标起始 ───┤DST       │
               │          │
   填充数量 ───┤NUM       │
               └──────────┘

【简化表示】
       条件
    ───┤├───────[FMOV 0 → D100, 10个]───

说明:用0填充D100-D109共10个寄存器

【应用场景】
· 数据区清零
· 初始化参数
· 设置默认值

5. 交换指令(SWAP/XCHG)

5.1 字节交换(SWAP)

交换一个字(16位)的高低字节。

SWAP指令原理:

交换前:              交换后:
┌────────────────┐   ┌────────────────┐
│ 高字节 │ 低字节 │   │ 低字节 │ 高字节 │
│  12H   │  34H   │ → │  34H   │  12H   │
└────────────────┘   └────────────────┘
    MW10 = 1234H         MW10 = 3412H

5.2 数据交换(XCHG)

交换两个地址的内容。

XCHG指令原理:

交换前:           交换后:
┌───────┐         ┌───────┐
│D0: 100│         │D0: 200│
└───────┘  交换   └───────┘
    ↕      ←→        ↕
┌───────┐         ┌───────┐
│D10:200│         │D10:100│
└───────┘         └───────┘

5.3 XCH梯形图

【梯形图】
       条件
    ───┤├───────[XCH D0 ↔ D10]───

【说明】
· 交换D0和D10的内容
· 16位数据交换用XCH
· 32位数据交换用DXCH

【应用场景】
· 数据排序
· 变量值互换

6. 其他传送指令

6.1 条件传送

带条件的数据传送(选择传送):

               ┌──────────┐
   条件 ───────┤   SEL    │
               │          │
   值0 ────────┤IN0       │
   值1 ────────┤IN1   OUT ├── 输出
               └──────────┘

当条件=0时,输出=值0
当条件=1时,输出=值1

应用:根据条件选择不同的参数值

6.2 移位传送

移位寄存器功能:

       移位信号
    ───┤├───────[SFTR 输入 起始地址 移位位数 总长度]───

工作原理:
移位前:M10-M17 = 0000 1111
移位后:M10-M17 = 0011 1100  (右移4位,新数据移入)

应用场景:
· 传送带产品跟踪
· 流水线工位管理
· 历史数据记录

6.3 表格操作

表格指令:

FIFO(先进先出):
· 写入表格:数据存入队列末尾
· 读出表格:从队列头部取出数据

LIFO(后进先出/栈):
· 压栈(PUSH):数据存入栈顶
· 出栈(POP):从栈顶取出数据

应用场景:
· 数据缓冲
· 消息队列
· 历史记录

7. 数据传送应用实例

7.1 配方切换

需求:根据选择切换不同配方参数

配方存储:
· 配方1:D100-D109
· 配方2:D110-D119
· 配方3:D120-D129
· 当前配方:D0-D9

程序:
// 选择配方1
       选择1
    ───┤├───────[BMOV D100 → D0, 10个]───

// 选择配方2
       选择2
    ───┤├───────[BMOV D110 → D0, 10个]───

// 选择配方3
       选择3
    ───┤├───────[BMOV D120 → D0, 10个]───

工作流程:
按下选择1 → D100-D109复制到D0-D9
按下选择2 → D110-D119复制到D0-D9
按下选择3 → D120-D129复制到D0-D9

7.2 数据保存与恢复

需求:保存当前参数到备份区,可恢复

保存(保存按钮触发):
       保存按钮
    ───┤├───────[BMOV D0 → D500, 50个]───

                    备份区域

恢复(恢复按钮触发):
       恢复按钮
    ───┤├───────[BMOV D500 → D0, 50个]───

                    从备份恢复

7.3 数据初始化

需求:系统启动时初始化数据区

// 首次扫描时执行(使用首次扫描标志或启动OB)
       首次扫描
    ───┤├───────[FMOV 0 → D0, 100个]───    // D0-D99清零
               [FMOV 0 → M0, 256个]───      // M0-M255清零
               [MOV 100 → D100]───          // 设置默认速度
               [MOV 50 → D101]───           // 设置默认位置

说明:首次扫描标志在PLC上电后第一个扫描周期为ON

7.4 数据采集记录

需求:记录最近10次测量数据

数据移位存储:
       测量触发
    ───┤P├──────[BMOV D1 → D2, 9个]───   // D1-D9向后移动
               [MOV 新数据 → D1]───       // 新数据存入D1

数据结构:
D1  ← 最新数据
D2  ← 上一次
D3  ← 上上次
...
D10 ← 最旧数据

每次测量触发上升沿:
1. D1-D9向后移动一位
2. 新测量值存入D1
3. 最旧的D10被覆盖

7.5 通信缓冲区

发送缓冲区准备:

// 组装发送数据
       发送准备
    ───┤├───────[MOV 255 → D200]───    // 帧头
               [MOV D0 → D201]───      // 数据1
               [MOV D1 → D202]───      // 数据2
               [MOV D2 → D203]───      // 数据3
               [MOV 校验值 → D204]─── // 校验

// 或使用块传送(更高效)
       发送准备
    ───┤├───────[MOV 255 → D200]───    // 帧头
               [BMOV D0 → D201, 3个]── // 数据区

8. 使用注意事项

8.1 数据类型匹配

注意数据宽度:

┌────────────────────────────────────────────────────┐
│  错误示例:                                        │
│  MOV D0 M0   ← D0是16位,M0是1位,不匹配         │
│                                                    │
│  正确做法:                                        │
│  MOV D0 K4M0  ← 传送到M0开始的16位区域           │
└────────────────────────────────────────────────────┘

数据类型对应:
· 位(Bit) ↔ 位
· 字节(Byte) ↔ 字节
· 字(Word) ↔ 字
· 双字(DWord) ↔ 双字

8.2 执行条件

传送指令执行时机:

【每次扫描执行】
       SM400                         // 常ON
    ───┤├───────[MOV K100 D0]───    // 每个扫描周期都执行

【条件执行】
       X0
    ───┤├───────[MOV K100 D0]───    // X0=ON时执行

【边沿执行】
       X0
    ───┤P├──────[MOV K100 D0]───    // X0上升沿执行一次

建议:
· 需要持续更新的用条件触发
· 只需执行一次的用边沿触发

8.3 地址范围检查

防止地址越界:

错误示例:
BMOV D0 D32760 K10   // D32760-D32769
                     // 如果D区只到D32767,会越界!

预防措施:
1. 规划好数据区域分配
2. 检查传送范围是否超出
3. 使用符号地址减少错误

本节小结

数据传送指令要点:

┌────────────────────────────────────────────────────┐
│  MOV(单数据传送)                                 │
│  · 传送一个数据到目标地址                         │
│  · 最基本最常用的传送指令                         │
│  · 注意16位/32位区别                              │
├────────────────────────────────────────────────────┤
│  BMOV(块传送)                                    │
│  · 一次传送多个连续数据                           │
│  · 效率高于多次MOV                                │
│  · 注意避免源目标重叠                             │
├────────────────────────────────────────────────────┤
│  FMOV(填充)                                      │
│  · 用同一值填充连续区域                           │
│  · 常用于数据初始化/清零                          │
├────────────────────────────────────────────────────┤
│  XCH(交换)                                       │
│  · 交换两个地址的内容                             │
│  · 用于数据排序等场合                             │
└────────────────────────────────────────────────────┘

练习题

  1. 编写程序将D0-D9的数据复制到D100-D109。
  2. 如何将D0-D49全部清零?
  3. 设计一个配方切换程序,有3种配方可选。
  4. 说明MOV和BMOV指令的区别及应用场景。

← 上一节:3.3 计数器指令 | 返回目录 | 下一节:3.5 数学运算指令 →

本教程由 AI (Claude Opus 4.5) 生成,仅供学习参考