关闭 157条新站内信，查看站内信 20条信息提到我，查看@我 280个新通知，查看新通知 36个新关注，查看新关注

- 手机浏览
- 统计排行

点击这里，立即和我们进行QQ联系

  armfly 退出 |
  消息(437) 设置 | 系统设置

  铜币：684 枚威望：390 点身份：管理员

- 帖子
- 用户
- 版块

###### 帖子

热搜： STM32 JLINK 示波器 ADS1256 RA8875
发帖 回复
返回列表
置顶 精华 加亮 | 锁定 提前 压帖 | 分类 移动 复制 合并 | 推送 | 删除

- 989阅读
- 3回复

# MODBUS协议整理 [复制链接]

上一主题 下一主题

在线 armfly

UID：2

  - 注册时间2012-04-30
  - 最后登录2015-09-25
  - 在线时间1474小时
  - 发帖679
  - 搜Ta的帖子
  - 精华 14
  - 铜币684
  - 威望390
  - 贡献值0
  - 银元0
  访问TA的空间 加好友 用道具

管理员

关闭

个人中心可以申请新版勋章哦
  立即申请 知道了

发帖
  679

铜币
  684

威望
  390

贡献值
  0

银元
  0

只看楼主 倒序阅读 使用道具 楼主 发表于: 2014-06-22 , 来自:浙江省温州市 , 编辑
1.Modbus简介——来自维基百科
Modbus是一种串行通信协议，是Modicon于1979年，为使用可编程逻辑控制器（PLC）而发表的。MODBUS是工业领域通信协议的业界标准，并且现在是工业电子设备之间相当常用的连接方式。Modbus比其他通信协议使用的更广泛的主要原因有：
1.公开发表并且无版税要求
2.相对容易的工业网络部署
3.对供应商来说，修改移动原生的位元或字节没有很多限制
2.MODBUS指令说明
2.1 读线圈寄存器01H
1) 描述：
读MODBUS从机线圈寄存器当前状态。
2) 查询：
例如从机地址为11H，线圈寄存器的起始地址为0013H，结束地址为0037H。该次查询总共访问37个线圈寄存器。
表2.1.1 读线圈寄存器－查询

| Hex
从机地址 | 11
功能码 | 01
寄存器起始地址高字节 | 00
寄存器起始地址低字节 | 13
寄存器数量高字节 | 00
寄存器数量低字节 | 25
CRC校验高字节 | 0E
CRC校验低字节 | 84

3) 响应
响应负载中的各线圈状态与数据内容每位相对应。1代表ON，0代表OFF。若返回的线圈数不为8的倍数，则在最后数据字节未尾使用0代替。
表2.1.2 读线圈寄存器－响应

| Hex
从机地址 | 11
功能码 | 01
返回字节数 | 05
数据1(线圈0013H-线圈001AH) | CD
数据2(线圈001BH-线圈0022H) | 6B
数据3(线圈0023H-线圈002AH) | B2
数据4(线圈0032H-线圈002BH) | 0E
数据5(线圈0037H-线圈0033H) | 1B
CRC校验高字节 | 45
CRC校验低字节 | E6

线圈0013H到线圈001AH的状态为CDH，二进制值为11001101，该字节的最高字节为线圈001AH，最低字节为线圈0013H。线圈001AH到线圈0013H的状态分别为ON-ON-OFF-OFF-ON-ON-OFF-ON。
表2.1.3 线圈0013H到001A状态

001AH | 0019H | 0018H | 0017H | 0016H | 0015H | 0014H | 0013H
ON | ON | OFF | OFF | ON | ON | OFF | ON

最后一个数据字节中，线圈0033H到线圈0037状态为1BH(二进制00011011)，线圈0037H是左数第4位，线圈0033H为该字节的最低字节，线圈0037H至线圈0033H的状态分别为ON-ON-OFF-ON-ON，剩余3位使用0填充。
表2.1.4 线圈0033H到线圈0037状态

003AH | 0039H | 0038H | 0037H | 0036H | 0035H | 0034H | 0033H
填充 | 填充 | 填充 | ON | ON | OFF | ON | ON

2.2 读离散输入寄存器 02H
1) 说明
读离散输入寄存器状态。
2) 查询
从机地址为11H。离散输入寄存器的起始地址为00C4H，结束寄存器地址为00D9H。总共访问32个离散输入寄存器。
表 2.2.1 读离散输入寄存器——查询

| Hex
从机地址 | 11
功能码 | 02
寄存器地址高字节 | 00
寄存器地址低字节 | C4
寄存器数量高字节 | 00
寄存器数量低字节 | 16
CRC校验高字节 | BA
CRC校验低字节 | A9

3) 响应
响应各离散输入寄存器状态，分别对应数据区中的每位值，1 代表ON；0 代表OFF。第一个数据字节的LSB(最低字节)为查询的寻址地址，其他输入口按顺序在该字节中由低字节向高字节排列，直到填充满8位。下一个字节中的8个输入位也是从低字节到高字节排列。若返回的输入位数不是8的倍数，则在最后的数据字节中的剩余位至该字节的最高位使用0填充。
表2.2.1 读输入寄存器－响应

| Hex
从机地址 | 11
功能码 | 02
返回字节数 | 03
数据1(00C4H-00CBH) | AC
数据2(00CCH-00D3H) | DB
数据3(00D4H-00D9H) | 35
CRC校验高字节 | 20
CRC校验低字节 | 18

离散输入寄存器00D4H到00D9H的状态为35H (二进制00110101)。输入寄存器00D9H为左数第3位，输入寄存器00D4为最低位，输入寄存器00D9H到00D4H的状态分别为ON-ON-OFF-ON-OFF-ON。00DBH寄存器和00DAH寄存器被0填充。
表2.2.2 离散输入寄存器00C4H到00DBH状态

00CBH | 00CAH | 00C9H | 00C8H | 00C7H | 00C6H | 00C5H | 00C4H
0 | 0 | 1 | 1 | 0 | 1 | 0 | 1
00D3H | 00D2H | 00D1H | 00D0H | 00CFH | 00CEH | 00CDH | 00CCH
1 | 1 | 1 | 0 | 1 | 0 | 1 | 1
00DBH | 00DAH | 00D9H | 00D8H | 00D7H | 00D6H | 00D5H | 00D4H
填充 | 填充 | 1 | 1 | 0 | 1 | 0 | 1

评分管理 共条评分

评分 收藏 新鲜事
回复
举报 帖子操作

| 分享到 淘江湖 新浪 QQ微博 QQ空间 开心 人人 豆瓣 网易微博 百度 鲜果 白社会 飞信

在线 armfly

UID：2

  - 注册时间2012-04-30
  - 最后登录2015-09-25
  - 在线时间1474小时
  - 发帖679
  - 搜Ta的帖子
  - 精华 14
  - 铜币684
  - 威望390
  - 贡献值0
  - 银元0
  访问TA的空间 加好友 用道具

管理员

发帖
  679

铜币
  684

威望
  390

贡献值
  0

银元
  0

只看该作者 沙发 发表于: 2014-06-22 , 来自:浙江省温州市 , 编辑
2.3 读保持寄存器 03H
1) 说明
读保持寄存器。可读取单个或多个保持寄存器。
2) 查询
从机地址为11H。保持寄存器的起始地址为006BH，结束地址为006DH。该次查询总共访问3个保持寄存器。
表2.3.1 读保持寄存器-查询

| Hex
从机地址 | 11
功能码 | 03
寄存器地址高字节 | 00
寄存器地址低字节 | 6B
寄存器数量高字节 | 00
寄存器数量低字节 | 03
CRC高字节 | 76
CRC低字节 | 87

3) 响应
保持寄存器的长度为2个字节。对于单个保持寄存器而言，寄存器高字节数据先被传输，低字节数据后被传输。保持寄存器之间，低地址寄存器先被传输，高地址寄存器后被传输。
表2.3.2 读保持寄存器-响应

| Hex
从机地址 | 11
功能码 | 03
字节数 | 06
数据1高字节(006BH) | 00
数据1低字节(006BH) | 6B
数据2高字节(006CH) | 00
数据2 低字节(006CH) | 13
数据3高字节(006DH) | 00
数据3低字节(006DH) | 00
CRC高字节 | 38
CRC低字节 | B9

表2.3.3保持寄存器006BH到006DH结果

006BH 高字节 | 006BH 低字节 | 006CH 高字节 | 006CH 低字节 | 006DH 高字节 | 006DH 低字节
00 | 6B | 00 | 13 | 00 | 00

2.4 读输入寄存器 04H
1) 说明
读输入寄存器命令。该命令支持单个寄存器访问也支持多个寄存器访问。
2) 查询
从机地址为11H。输入寄存器的起始地址为0008H，寄存器的结束地址为0009H。本次访问访问2个输入寄存器。
表2.4.1 读输入寄存器-查询

| Hex格式
从机地址 | 11
功能码 | 04
寄存器起始地址高字节 | 00
寄存器起始地址低字节 | 08
寄存器个数高字节 | 00
寄存器个数低字节 | 02
CRC高字节 | F2
CRC低字节 | 99

3) 响应
输入寄存器长度为2个字节。对于单个输入寄存器而言，寄存器高字节数据先被传输，低字节数据后被传输。输入寄存器之间，低地址寄存器先被传输，高地址寄存器后被传输。
表2.4.2 读寄存器-响应

| Hex格式
从机地址 | 11
功能码 | 04
字节数 | 04
数据1高字节(0008H) | 00
数据1低字节(0008H) | 0A
数据2高字节(0009H) | 00
数据2低字节(0009H) | 0B
CRC高字节 | 8B
CRC低字节 | 80

表2.4.3输入寄存器0008H到0009H结果

006BH 高字节 | 006BH 低字节 | 006CH 高字节 | 006CH 低字节
00 | 0A | 00 | 0B

评分管理 共条评分

回复 评分 新鲜事
帖内置顶 举报 帖子操作

在线 armfly

UID：2

  - 注册时间2012-04-30
  - 最后登录2015-09-25
  - 在线时间1474小时
  - 发帖679
  - 搜Ta的帖子
  - 精华 14
  - 铜币684
  - 威望390
  - 贡献值0
  - 银元0
  访问TA的空间 加好友 用道具

管理员

发帖
  679

铜币
  684

威望
  390

贡献值
  0

银元
  0

只看该作者 板凳 发表于: 2014-06-22 , 来自:浙江省温州市 , 编辑
2.5 写单个线圈寄存器 05H
1) 说明
写单个线圈寄存器。FF00H值请求线圈处于ON状态，0000H值请求线圈处于OFF状态。05H指令设置单个线圈的状态，15H指令可以设置多个线圈的状态，两个指令虽然都设定线圈的ON/OFF状态，但是ON/OFF的表达方式却不同。
2) 查询
从机地址为11H，线圈寄存器的地址为00ACH。使00ACH线圈处于ON状态，即数据内容为FF00H。
表2.5.1 写单个线圈-查询

| Hex
从机地址 | 11
功能码 | 05
寄存器地址高字节 | 00
寄存器地址低字节 | AC
数据1高字节 | FF
数据2低字节 | 00
CRC校验高字节 | 4E
CRC校验低字节 | 8B

3) 响应
2.5.1强制单个线圈——响应

| Hex
从机地址 | 11
功能码 | 05
寄存器地址高字节 | 00
寄存器地址低字节 | AC
寄存器1高字节 | FF
寄存器1低字节 | 00
CRC校验高字节 | 4E
CRC校验低字节 | 8B

2.6 写单个保持寄存器 06H
1) 说明
写保持寄存器。注意06指令只能操作单个保持寄存器，16指令可以设置单个或多个保持寄存器。
2) 查询
从机地址为11H。保持寄存器地址为0001H。寄存器内容为0003H。
表2.6.1 写单个保持寄存器——查询

| Hex
从机地址 | 11
功能码 | 06
寄存器地址高字节 | 00
寄存器地址低字节 | 01
数据1高字节 | 00
数据1低字节 | 01
CRC校验高字节 | 9A
CRC校验低字节 | 9B

3) 响应
表2.6.2 写单个保持寄存器——响应

| Hex
从机地址 | 11
功能码 | 06
寄存器地址高字节 | 00
寄存器地址低字节 | 01
寄存器数量高字节 | 00
寄存器数量低字节 | 01
CRC校验高字节 | 1B
CRC校验低字节 | 5A

评分管理 共条评分

回复 评分 新鲜事
帖内置顶 举报 帖子操作

在线 armfly

UID：2

  - 注册时间2012-04-30
  - 最后登录2015-09-25
  - 在线时间1474小时
  - 发帖679
  - 搜Ta的帖子
  - 精华 14
  - 铜币684
  - 威望390
  - 贡献值0
  - 银元0
  访问TA的空间 加好友 用道具

管理员

发帖
  679

铜币
  684

威望
  390

贡献值
  0

银元
  0

只看该作者 地板 发表于: 2014-06-22 , 来自:浙江省温州市 , 编辑
2.7 写多个线圈寄存器 0FH
1) 说明
写多个线圈寄存器。若数据区的某位值为“1”表示被请求的相应线圈状态为ON，若某位值为“0”，则为状态为OFF。
2) 查询
从机地址为11H，线圈寄存器的起始地址为0013H，线圈寄存器的结束地址为001CH。总共访问10个寄存器。寄存器内容如下表所示。
表2.7.1 线圈寄存器0013H到001CH

001AH | 0019H | 0018H | 0017H | 0016H | 0015H | 0014H | 0013H
1 | 1 | 0 | 0 | 1 | 1 | 0 | 1
0022H | 0021H | 0020H | 001FH | 001EH | 001DH | 001CH | 001BH
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1

传输的第一个字节 CDH对应线圈为0013H到001AH，LSB（最低位）对应线圈0013H，传输第二个字节为 01H，对应的线圈为001BH到001CH，LSB对应线圈001CH，其余未使用位使用0 填充。
表2.7.1 写多个线圈寄存器——查询

| Hex
从机地址 | 11
功能码 | 0F
寄存器地址高字节 | 00
寄存器地址低字节 | 13
寄存器数量高字节 | 00
寄存器数量低字节 | 0A
字节数 | 02
数据1(0013H-001AH) | CD
数据2(001BH-001CH) | 01
CRC校验高字节 | BF
CRC校验低字节 | 0B

3) 响应
表2.7.1 写多个线圈寄存器——响应

| Hex
从机地址 | 11
功能码 | 0F
寄存器地址高字节 | 00
寄存器地址低字节 | 13
寄存器数量高字节 | 00
寄存器数量低字节 | 0A
字节数 | 02
CRC校验高字节 | 99
CRC校验低字节 | 1B

2.8 写多个保持寄存器10H
1) 说明
写多个保持寄存器。
2) 查询
从机地址为11H。保持寄存器的其实地址为0001H，寄存器的结束地址为0002H。总共访问2个寄存器。保持寄存器0001H的内容为000AH，保持寄存器0002H的内容为0102H。
表2.8.1 写多个保持寄存器——请求

| Hex
从机地址 | 11
功能码 | 10
寄存器起始地址高字节 | 00
寄存器起始地址低字节 | 01
寄存器数量高字节 | 00
寄存器数量低字节 | 02
字节数 | 04
数据1高字节 | 00
数据1低字节 | 0A
数据2高字节 | 01
数据2低字节 | 02
CRC校验高字节 | C6
CRC校验低字节 | F0

表2.8.2保持寄存器0001H到0002H内容

地址 | 0001H高字节 | 0001H低字节 | 0002H高字节 | 0003H低字节
数值 | 00 | 0A | 01 | 12

3) 响应
表2.8.3 写多个保持寄存器——响应

| Hex
从机地址 | 11
功能码 | 10
寄存器起始地址高字节 | 00
寄存器起始地址低字节 | 01
寄存器数量高字节 | 00
寄存器数量低字节 | 02
CRC校验高字节 | 12
CRC校验低字节 | 98

评分管理 共条评分

回复 评分 新鲜事
帖内置顶 举报 帖子操作

发帖 回复
返回列表

| http://bbs.armfly.com 访问内容超出本站范围，不能确定是否安全 |

快速回复

限100 字节
批量上传需要先选择文件，再选择上传
进入高级模式

- 文字颜色

提到某人：
可@您关注的人，最多可@10人 选择好友
回复后跳转到最后一页

上一个 下一个

- 旺旺
- 默认表情

1 2 3

| 关闭 |

| 关闭 选中1篇 删除 评分 屏蔽 提醒 全选 |

在线好友 在线好友 消息 消息 我的菜单 我的菜单
浏览 浏览 发帖 发帖 写日志 写日志 传照片 传照片
我的菜单

###### 我的书签

###### 快捷链接

- 我的帖子

我的设置 返回首页
回到顶部