Modbus通讯命令格式及功能码

1 命令格式

MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上的MODBUS 协议映射能够在应用数据单元(ADU)上引入一些附加域。通用Modbus帧如下图。

Modbus通讯命令格式及功能码

以下介绍常见功能码与PDU。

 

2常见的功能码

功能码(HEX

名称

作用

01

读线圈状态

读离散输出位

02

读输入状态

读离散输入位

03

读保持寄存器

 

04

读输入寄存器

16位寄存器,常用于读取整数或者浮点数

05

写单个线圈

写数据使线圈On/OFF

06

写单个寄存器

16位格式写数据

08

回路诊断

检测通讯端口

15

写多个线圈

写数据使多个线圈ON/OFF

16

写多个寄存器

16位格式写数据

 

 

功能码 01

01用于读数字量模块的输出状态。

请求指令的格式为:

模块地址

功能码

起始地址高字节

起始地址低字节

线圈个数

高字节

线圈个数

低字节

例:读模块第1~8个线圈(地址为00017~000240001711h

请求指令:01 01 00 1100 08

 

响应指令的格式为:

模块地址

功能码

字节个数

数据

数据

例:线圈27 ON,其他为OFF

响应为:01 01 0142

42h 即为二进制的0100 0010

 

 

功能码 02

02用于读数字量模块的输入状态。

请求指令的格式为:

模块地址

功能码

起始地址高字节

起始地址低字节

线圈个数

高字节

线圈个数

低字节

例:读模块第1~8个通道的输入(地址为00001~00008

请求指令:01 02 00 0100 08

 

响应指令的格式为:

模块地址

功能码

字节个数

数据

数据

例:输入23 ON,其他为OFF

响应为:01 02 01 60

60h 即为二进制的0110 0000

 

 

功能码 03/04

03/04用于读模块的寄存器的值。

请求指令的格式为:

模块地址

功能码

起始地址高字节

起始地址低字节

寄存器个数

高字节

寄存器个数

低字节

例:读模拟量输入第1~2个通道的输入(地址为40001~40002

请求指令:01 04 0001 00 02

 

响应指令的格式为:

模块地址

功能码

字节个数

数据

数据

模拟量实际值与寄存器数据的对应关系:

若寄存器为16位。则最小值为0,最大值为FFFF0对应量程最小值,FFFF对应量程最大值。假设量程为4~20mA,则0对应4mAFFFF对应20mA

 

例:模拟量为0~10V,输入通道1的值为5V,通道2的值为6.5V

响应为:01 04 04 7F FF A6 65 7FFF对应5VA665对应6.5V

(一个指令来回的字节数是6+2+3+2*8+2=29个字节)

 

功能码 05

05用于写线圈为ON/OFFON/OFF的状态用数据序列表示。FF 00hex表示为ON00 00hex表示为OFFFF FF hex表示 释放。

请求指令的格式为:

模块地址

功能码

起始地址高字节

起始地址低字节

强制数据的

高字节

强制数据的

低字节

例:设置线圈3(地址为00003)为ON

请求指令:01 05 0003 FF00

 

响应指令的格式为:

模块地址

功能码

起始地址高字节

起始地址低字节

设置数据的

高字节

设置数据的

低字节

响应指令为请求指令的重复。

 

 

功能码 06

06用于写单个寄存器的值。

请求指令的格式为:

模块地址

功能码

起始地址高字节

起始地址低字节

设置数据的

高字节

设置数据

低字节

例:设置寄存器40002的值为00 04 h

请求指令:01 06 0002 00 04

 

响应指令的格式为:

模块地址

功能码

起始地址高字节

起始地址低字节

设置数据的

高字节

设置数据

低字节

响应指令为请求指令的重复。

 

 

功能码 08

08用于诊断回路。发送的信息可以为任意长度,其最大值为数据缓冲器的长度减去8个字节。

请求指令的格式为:

模块地址

功能码

任意数据

例:

请求指令:01 08 0002 00 04

 

响应指令的格式为:

模块地址

功能码

任意数据

例:

响应为:01 08 0002 00 04

 

 

功能码 150Fh

15用于设置线圈序列的值为ON/OFF

请求指令的格式为:

模块地址

功能码

起始地址高字节

起始地址低字节

线圈个数

高字节

线圈个数

低字节

 

字节数

设置数据的高字节

设置数据的低字节

例:设置10个线圈的值,起始地址为0001711hex

请求指令:01 0F 00 11 00 0A 02 CD 01CD 01 等价于二进制的11001101 0000 0001

 

响应指令的格式为:

模块地址

功能码

起始地址高字节

起始地址低字节

线圈个数的

高字节

线圈个数的

低字节

例:01 0F 00 11 00 0A

 

 

功能码 1610h

16用于设置多个保持寄存器的值

请求指令的格式为:

模块地址

功能码

起始地址高字节

起始地址低字节

寄存器个数的高字节

寄存器个数的低字节

字节数

数据

 

例:设置通道1(地址为40009)的值为100.0

请求指令:01 10 0009 00 02 04 42 C8 00 00

 

响应指令的格式为:

模块地址

功能码

起始地址高字节

起始地址低字节

寄存器个数的高字节

寄存器个数的低字节

例:01 10 00 0900 02