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-D1093.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 = 3412H5.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-D97.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上电后第一个扫描周期为ON7.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(交换) │
│ · 交换两个地址的内容 │
│ · 用于数据排序等场合 │
└────────────────────────────────────────────────────┘练习题
- 编写程序将D0-D9的数据复制到D100-D109。
- 如何将D0-D49全部清零?
- 设计一个配方切换程序,有3种配方可选。
- 说明MOV和BMOV指令的区别及应用场景。