声明:该资源从安富莱论坛摘录

一、Modbus简介——来自维基百科

 Modbus是一种串行通信协议,是Modicon于1979年,为使用可编程逻辑控制器(PLC)而发表的。MODBUS是工业领域通信协议的业界标准,并且现在是工业电子设备之间相当常用的连接方式。Modbus比其他通信协议使用的更广泛的主要原因有:
  1.公开发表并且无版税要求
  2.相对容易的工业网络部署
  3.对供应商来说,修改移动原生的位元或字节没有很多限制

二、MODBUS指令说明

  2.1 读线圈寄存器01H

  1) 描述:

  读MODBUS从机线圈寄存器当前状态。

  2) 查询:

  例如从机地址为0x11,线圈寄存器的起始地址为0x0013,结束地址为0x0037。该次查询总共访问(0x0037-0x0013 + 1)37个线圈寄存器。

表2.1.1 读线圈寄存器-查询

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

01

寄存器起始地址高字节(1个字节)

00

寄存器起始地址低字节(1个字节)

13

寄存器数量高字节(1个字节)

00

寄存器数量低字节(1个字节)

25

CRC校验高字节(1个字节)

0E

CRC校验低字节(1个字节)

84

  3) 响应

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

表2.1.2 读线圈寄存器-响应

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

01

返回字节数(1个字节)

05

数据1(线圈0x001A - 线圈0x0013)(1个字节)

CD

数据2(线圈0x0022 - 线圈0x001B)(1个字节)

6B

数据3(线圈0x002A - 线圈0x0023)(1个字节)

B2

数据4(线圈0x0032 - 线圈0x002B)(1个字节)

0E

数据5(线圈0x0037 - 线圈0x0033)(1个字节)

1B

CRC校验高字节(1个字节)

45

CRC校验低字节(1个字节)

E6

线圈0x0013到线圈0x001A的状态为0xCD,二进制值为11001101,该字节的最高字节为线圈0x001A,最低字节为线圈0x0013。线圈0x001A到线圈0x0013的状态分别为ON-ON-OFF-OFF-ON-ON-OFF-ON。

表2.1.3 线圈0x0013到0x001A状态

0x001A

0x0019

0x0018

0x0017

0x0016

0x0015

0x0014

0x0013

ON

ON

OFF

OFF

ON

ON

OFF

ON

最后一个数据字节中,线圈0x0033到线圈0x0037状态为0x1B(二进制00011011),线圈0x0037是左数第4位,线圈0x0033为该字节的最低字节,线圈0x0037至线圈0x0033的状态分别为ON-ON-OFF-ON-ON,剩余3位使用0填充。

表2.1.4 线圈0x0033到线圈0x0037状态

0x003A

0x0039

0x0038

0x0037

0x0036

0x0035

0x0034

0x0033

填充

填充

填充

ON

ON

OFF

ON

ON

 

2.2 读离散输入寄存器 02H

  1) 说明

  读离散输入寄存器状态。

  2) 查询

  从机地址为0x11。离散输入寄存器的起始地址为0x00C4,结束寄存器地址为0x00D9。总共访问(0x00D9-0x00C4+1)22个离散输入寄存器。

表 2.2.1 读离散输入寄存器——查询

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

02

寄存器地址高字节(1个字节)

00

寄存器地址低字节(1个字节)

C4

寄存器数量高字节(1个字节)

00

寄存器数量低字节(1个字节)

16

CRC校验高字节(1个字节)

BA

CRC校验低字节(1个字节)

A9

  3) 响应

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

表2.2.1 读输入寄存器-响应

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

02

返回字节数(1个字节)

03

数据1(0x00CB - 0x00C4)(1个字节)

AC

数据1(0x00D3 - 0x00CC)(1个字节)

DB

数据1(0x00D9 - 0x00D4)(1个字节)

35

CRC校验高字节(1个字节)

20

CRC校验低字节(1个字节)

18

 离散输入寄存器0x00D4到0x00D9的状态为0x35 (二进制00110101)。输入寄存器0x00D9为左数第3位,输入寄存器0x00D4为最低位,输入寄存器0x00D9到0x00D4的状态分别为ON-ON-OFF-ON-OFF-ON。0x00DB寄存器和0x00DA寄存器被0填充。

表2.2.2 离散输入寄存器0x00C4到0x00DB状态

0x00CB

0x00CA

0x00C9

0x00C8

0x00C7

0x00C6

0x00C5

0x00C4

0

0

1

1

0

1

0

1

0x00D3

0x00D2

0x00D1

0x00D0

0x00CF

0x00CE

0x00CD

0x00CC

1

1

1

0

1

0

1

1

0x00DB

0x00DA

0x00D9

0x00D8

0x00D7

0x00D6

0x00D5

0x00D4

填充

填充

1

1

0

1

0

1

  2.3 读保持寄存器 03H

  1) 说明
  读保持寄存器。可读取单个或多个保持寄存器。
  2) 查询
  从机地址为0x11。保持寄存器的起始地址为0x006B,结束地址为0x006D。该次查询总共访问(0x006D-0x006B+1)3个保持寄存器。

表2.3.1 读保持寄存器-查询

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

03

寄存器地址高字节(1个字节)

00

寄存器地址低字节(1个字节)

6B

寄存器数量高字节(1个字节)

00

寄存器数量低字节(1个字节)

03

CRC高字节(1个字节)

76

CRC低字节(1个字节)

87

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

表2.3.2 读保持寄存器-响应

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

03

字节数(1个字节)

06

数据1高字节(0x006B)(1个字节)

00

数据1低字节(0x006B)(1个字节)

6B

数据2高字节(0x006C)(1个字节)

00

数据2低字节(0x006C)(1个字节)

13

数据3高字节(0x006D)(1个字节)

00

数据3低字节(0x006D)(1个字节)

00

CRC高字节(1个字节)

38

CRC低字节(1个字节)

B9

表2.3.3保持寄存器0x006B到0x006D结果

0x006B

高字节

0x006B

低字节

0x006C

高字节

0x006C

低字节

0x006D

高字节

0x006D

低字节

00

6B

00

13

00

00

  2.4 读输入寄存器 04H

  1) 说明
  读输入寄存器命令。该命令支持单个寄存器访问也支持多个寄存器访问。
  2) 查询
  从机地址为0x11。输入寄存器的起始地址为0x0008,寄存器的结束地址为0x0009。本次访问访问2个读入寄存器。

表2.4.1 读输入寄存器-查询

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

04

寄存器起始地址高字节(1个字节)

00

寄存器起始地址低字节(1个字节)

08

寄存器数量高字节(1个字节)

00

寄存器数量低字节(1个字节)

02

CRC高字节(1个字节)

F2

CRC低字节(1个字节)

99

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

表2.4.2 读寄存器-响应

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

04

字节数(1个字节)

04

数据1高字节(0x0008)(1个字节)

00

数据1低字节(0x0008)(1个字节)

0A

数据2高字节(0x0009)(1个字节)

00

数据2低字节(0x0009)(1个字节)

0B

CRC高字节(1个字节)

8B

CRC低字节(1个字节)

80

表2.4.3输入寄存器0x0008到0x0009结果

0x0008

高字节

0x0008

低字节

0x0009

高字节

0x0009

低字节

0x00

0x0A

0x00

0x0B

2.5 写单个线圈寄存器 05H

  1) 说明
  写单个线圈寄存器。0xFF00值请求线圈处于ON状态,0x0000值请求线圈处于OFF状态。0x05指令设置单个线圈的状态,0x15指令可以设置多个线圈的状态,两个指令虽然都设定线圈的ON/OFF状态,但是ON/OFF的表达方式却不同。
  2) 查询
  从机地址为0x11,线圈寄存器的地址为0x00AC。使0x00AC线圈处于ON状态,即数据内容为0xFF00。

表2.5.1 写单个线圈-查询

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

05

寄存器地址高字节(1个字节)

00

寄存器地址低字节(1个字节)

AC

数据1高字节(1个字节)

FF

数据1低字节(1个字节)

00

CRC校验高字节(1个字节)

4E

CRC校验低字节(1个字节)

8B

 

 3) 响应

2.5.1强制单个线圈——响应

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

05

寄存器地址高字节(1个字节)

00

寄存器地址低字节(1个字节)

AC

寄存器1高字节(1个字节)

FF

寄存器1低字节(1个字节)

00

CRC校验高字节(1个字节)

4E

CRC校验低字节(1个字节)

8B

  2.6 写单个保持寄存器 06H


  1) 说明
  写保持寄存器。注意0x06指令只能操作单个保持寄存器,0x16指令可以设置单个或多个保持寄存器。
  2) 查询
  从机地址为0x11。保持寄存器地址为0x0001。寄存器内容为0x0003。

表2.6.1 写单个保持寄存器——查询

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

06

寄存器地址高字节(1个字节)

00

寄存器地址低字节(1个字节)

01

数据1高字节(1个字节)

00

数据1低字节(1个字节)

01

CRC校验高字节(1个字节)

9A

CRC校验低字节(1个字节)

9B

3) 响应

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

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

06

寄存器地址高字节(1个字节)

00

寄存器地址低字节(1个字节)

01

寄存器数量高字节(1个字节)

00

寄存器数量低字节(1个字节)

01

CRC校验高字节(1个字节)

1B

CRC校验低字节(1个字节)

5A

  2.7 写多个线圈寄存器 0FH


  1) 说明
  写多个线圈寄存器。若数据区的某位值为“1”表示被请求的相应线圈状态为ON,若某位值为“0”,则为状态为OFF。
  2) 查询
  从机地址为0x11,线圈寄存器的起始地址为0x0013,线圈寄存器的结束地址为0x001C。总共访问(0x001C-0x0013+1)10个寄存器。寄存器内容如下表所示。

表2.7.1 线圈寄存器0013H到001CH

0x001A

0x0019

0x0018

0x0017

0x0016

0x0015

0x0014

0x0013

1

1

0

0

1

1

0

1

0x0022

0x0021

0x0020

0x001F

0x001E

0x001D

0x001C

0x001B

0

0

0

0

0

0

0

1

  传输的第一个字节0xCD对应线圈为0x0013到0x001A,LSB(最低位)对应线圈0x0013,传输第二个字节为 0x01,对应的线圈为0x001B到0x001C,LSB对应线圈0x001C,其余未使用位使用0填充。

表2.7.1 写多个线圈寄存器——查询

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

0F

寄存器地址高字节(1个字节)

00

寄存器地址低字节(1个字节)

13

寄存器数量高字节(1个字节)

00

寄存器数量低字节(1个字节)

0A

字节数(1个字节)

02

数据1(0x0013 - 0x001A)(1个字节)

CD

数据2(0x001B - 0x001C)(1个字节)

01

CRC校验高字节(1个字节)

BF

CRC校验低字节(1个字节)

0B

 3) 响应

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

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

0F

寄存器地址高字节(1个字节)

00

寄存器地址低字节(1个字节)

13

寄存器数量高字节(1个字节)

00

寄存器数量低字节(1个字节)

0A

字节数(1个字节)

02

CRC校验高字节(1个字节)

99

CRC校验低字节(1个字节)

1B

  2.8 写多个保持寄存器10H

  1) 说明
  写多个保持寄存器。
  2) 查询
  从机地址为0x11。保持寄存器的起始地址为0x0001,寄存器的结束地址为0x0002。总共访问(0x0002-0x0001+1)2个寄存器。保持寄存器0x0001的内容为0x000A,保持寄存器0x0002的内容为0x0102。

表2.8.1 写多个保持寄存器——请求

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

10

寄存器起始地址高字节(1个字节)

00

寄存器起始地址低字节(1个字节)

01

寄存器数量高字节(1个字节)

00

寄存器数量低字节(1个字节)

02

字节数(1个字节)

04

数据1高字节(1个字节)

00

数据1低字节(1个字节)

0A

数据2高字节(1个字节)

01

数据2低字节(1个字节)

02

CRC校验高字节(1个字节)

C6

CRC校验低字节(1个字节)

F0

表2.8.2保持寄存器0x0001到0x0002内容

地址

0x0001

高字节

0x0001

低字节

0x0002

高字节

0x0002

低字节

数值

0x00

0x0A

0x01

0x02

  3) 响应

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

 

Hex

从机地址(1个字节)

11

功能码(1个字节)

10

寄存器起始地址高字节(1个字节)

00

寄存器起始地址低字节(1个字节)

01

寄存器数量高字节(1个字节)

00

寄存器数量低字节(1个字节)

02

CRC校验高字节(1个字节)

12

CRC校验低字节(1个字节)

98