Modbus协议是一只应用层报文传输协议,有RTU、ASCII、TCP/IP三种报文类型,使用串口传输时,有两种模式RTU和ASCII模式。ASCII模式采用是LRC校验,RTU模式采用16位的CRC校验,使用TCP/IP网络传输时,则不需要这种校验。

Modbus协议规定了4个存储区,如下表所示

区号

名称

读写

范围

0区

输出线圈

可读可写

00001-09999

1区

输入线圈

只读

10001-19999

3区

输入寄存器

只读

30001-39999

4区

保存寄存器

可读可写

40001-49999

常用的功能码

功能码

名称

modbus设备寄存器地址

位操作/字操作

操作数量

01H

读取输出线圈(读取)

00001-09999

位操作

单个或多个

02H

读取输入线圈(读取)

10001-19999

位操作

单个或多个

03H

读取保持寄存器(读取)

40001-49999

字操作

单个或多个

04H

读取 输入寄存器(读取)

30001-39999

字操作

单个或多个

05H

预置单线圈(写入)

00001-09999

位操作

单个线圈

06H

预置单寄存器(写入)

40001-49999

字操作

单个寄存器

0FH

预置多线圈(写入)

00001-09999

位操作

多个线圈

10H

预置多寄存器(写入)

40001-49999

字操作

多个寄存器

       在modbus标准中,RTU是必须要求的,ASCII是可选项,即一个Modbus设备可以只支持RTU模式或兼容RTU和ASCII两种模式,不能只支持ASCII模式。在发送报文时,一帧结束后,必须要有3.5个字符周期的是间隔时间(4.01ms),否则会出现粘包的情况。

串行通讯的报文格式

从站地址

功能码

数据

CRC/LRC

1 Byte

1 Byte

N Byte

2 Byte

读取输出线圈(01H)

报文格式例子:

从站地址

功能码

起始地址(高位)

起始地址(低位)

数量(高)

数量(低)

校验

0x01

0x01

0x00

0x00

0x00

0x1B

XXXX

      报文解析的意思是从站号为1的设备中读取00001-00027的线圈状态值(0x1B=27),功能码0x01表示读取的是0区的输出线圈状态值。

返回的报文格式

从站地址

功能码

字节计算

字节1

字节2

字节3

字节4

校验

0x01

0x01

0x04

0xCD

0x6B

0xB2

0x05

XXXX

读取返回的状态值为 CD 6B B2 05

      报文的意思就是从1号从站设备返回输出线圈00001-00027的状态值,bit位被置1,表示该输出线圈为ON

0xCD=1100 1101 对应00001-00008  0x6B=0110 1011对应的是00009-00016
0xB2=1011 0010 对应的是00017-00024 0x05=0000 0101对应的是00025-00027

其他功能的读取,同上述功能码的读取报文,返回报文类似