Modbus通讯命令格式及功能码
1 命令格式
MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上的MODBUS 协议映射能够在应用数据单元(ADU)上引入一些附加域。通用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~00024)00017为11h
请求指令:01 01 00 1100 08
响应指令的格式为:
模块地址 | 功能码 | 字节个数 | 数据 | 数据 |
例:线圈2与7 为ON,其他为OFF
响应为:01 01 0142
42h 即为二进制的0100 0010
功能码 02
02用于读数字量模块的输入状态。
请求指令的格式为:
模块地址 | 功能码 | 起始地址高字节 | 起始地址低字节 | 线圈个数 高字节 | 线圈个数 低字节 |
例:读模块第1~8个通道的输入(地址为00001~00008)
请求指令:01 02 00 0100 08
响应指令的格式为:
模块地址 | 功能码 | 字节个数 | 数据 | 数据 |
例:输入2与3 为ON,其他为OFF
响应为:01 02 01 60
60h 即为二进制的0110 0000
功能码 03/04
03/04用于读模块的寄存器的值。
请求指令的格式为:
模块地址 | 功能码 | 起始地址高字节 | 起始地址低字节 | 寄存器个数 高字节 | 寄存器个数 低字节 |
例:读模拟量输入第1~2个通道的输入(地址为40001~40002)
请求指令:01 04 0001 00 02
响应指令的格式为:
模块地址 | 功能码 | 字节个数 | 数据 | 数据 |
模拟量实际值与寄存器数据的对应关系:
若寄存器为16位。则最小值为0,最大值为FFFF,0对应量程最小值,FFFF对应量程最大值。假设量程为4~20mA,则0对应4mA,FFFF对应20mA
例:模拟量为0~10V,输入通道1的值为5V,通道2的值为6.5V
响应为:01 04 04 7F FF A6 65。 7FFF对应5V,A665对应6.5V。
(一个指令来回的字节数是6+2+3+2*8+2=29个字节)
功能码 05
05用于写线圈为ON/OFF。ON/OFF的状态用数据序列表示。FF 00hex表示为ON,00 00hex表示为OFF,FF 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
功能码 15(0Fh)
15用于设置线圈序列的值为ON/OFF
请求指令的格式为:
模块地址 | 功能码 | 起始地址高字节 | 起始地址低字节 | 线圈个数 高字节 | 线圈个数 低字节
| 字节数 | 设置数据的高字节 | 设置数据的低字节 |
例:设置10个线圈的值,起始地址为00017(11hex)
请求指令:01 0F 00 11 00 0A 02 CD 01。CD 01 等价于二进制的11001101 0000 0001。
响应指令的格式为:
模块地址 | 功能码 | 起始地址高字节 | 起始地址低字节 | 线圈个数的 高字节 | 线圈个数的 低字节 |
例:01 0F 00 11 00 0A
功能码 16(10h)
16用于设置多个保持寄存器的值
请求指令的格式为:
模块地址 | 功能码 | 起始地址高字节 | 起始地址低字节 | 寄存器个数的高字节 | 寄存器个数的低字节 | 字节数 | 数据
|
例:设置通道1(地址为40009)的值为100.0
请求指令:01 10 0009 00 02 04 42 C8 00 00。
响应指令的格式为:
模块地址 | 功能码 | 起始地址高字节 | 起始地址低字节 | 寄存器个数的高字节 | 寄存器个数的低字节 |
例:01 10 00 0900 02