硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4905|回复: 3
收起左侧

MODBUS协议整理

[复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2014-6-22 06:47:32 | 显示全部楼层 |阅读模式
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代表ON0代表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 线圈0013H001A状态
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 代表ON0 代表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
离散输入寄存器00D4H00D9H的状态为35H (二进制00110101)。输入寄存器00D9H为左数第3位,输入寄存器00D4为最低位,输入寄存器00D9H00D4H的状态分别为ON-ON-OFF-ON-OFF-ON00DBH寄存器和00DAH寄存器被0填充。
2.2.2 离散输入寄存器00C4H00DBH状态
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

回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
 楼主| 发表于 2014-6-22 06:52:03 | 显示全部楼层
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
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
 楼主| 发表于 2014-6-22 06:53:09 | 显示全部楼层
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
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
 楼主| 发表于 2014-6-22 06:54:05 | 显示全部楼层
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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-1 05:21 , Processed in 0.214416 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表