Modbus RTU 串口通信协议概述
一、Modbus RTU 通信协议概述:
1、Modbus RTU 协议是Modicon公司首先推出的通信协议;
2、Modbus RTU 协议是一种主从式串行异步半双工通信协议;
3、Modbus RTU 协议是一种基于RS485\RS422\RS232物理层的通信协议;
4、Modbus RTU协议通信中每个字符通信格式规定为1个起始位、8个数据位、1个校验位、1\2个停止位
5、Modbus RTU协议传输过程中每1个字节都以16进制方式直接进行传输;
6、Modbus RTU 协议使用CRC校验作为错误检查。
二、Modbus RTU 通信协议数据格式:
起始符
| 地址码
| 功能码
| 数据区
| 校验码
| 结束符
| 大于等于3.5字符时间
| 8位
| 8位
| N*8位
| 16位
| 大于等于3.5字符时间
| 1、起始符:以大于等于3.5个字符时间作为一帧数据的开始;
2、地址码:从站的地址,其理论范围为1~254;
3、功能码:主站发送,告诉从站执行的功能,其范围为1~255;
4、数据区:具体数据内容,不同功能码内容不同;
5、校验码:CRC校验码,检验码的范围由地址码开始到数据区结束;
6、结束符:以大于等于3.5个字符时间作为一帧数据的结束;
三、Modbus RTU 通信协议寄存器种类:
寄存器
种类
| 说
明
| 与PLC
比较
| 举例
说明
| 线圈状态
(Coil Status)
| 数字量输出、继电器输出
可读可写
| DO数字量输出或
内部读写位变量
| 电磁阀输出、继电器
| 离散输入状态
(Input Status)
| 数字量输入
只读
| DI数字量输入或
内部只读位变量
| 按钮输入、拨码开关
接近开关
| 保持寄存器
(Holding Register)
| 输出参数、保持参数
可读可写
| AO模拟量输出或
内部读写寄存器
| 模拟量输出设定、
变量阀输出大小
| 输入寄存器
(Input Register)
| 输入参数
只读
| AI模拟量输入或
内部只读寄存器
| 模拟量输入、
现场工程量信号采集
| 四、Modbus RTU 通信协议寄存器地址分配:
寄存器种类
| 寄存器编号
| 寄存器地址
| 支持功能码
| 读写状态
| 线圈状态
| 000001~065536
| 0000H~FFFFH
| 01、05、15
| 可读可写
| 离散输入状态
| 100001~165536
| 0000H~FFFFH
| 02
| 只读
| 保持寄存器
| 400001~465536
| 0000H~FFFFH
| 03、06、16、23
| 可读可写
| 输入寄存器
| 300001~365536
| 0000H~FFFFH
| 04
| 只读
| 五、Modbus RTU 通信协议功能码说明:
功能码
| 功能
| 寄存器编号
| 寄存器地址
| 位/字操作
| 操作数量
| 01
| 读线圈状态
| 000001~065536
| 0000H~FFFFH
| 位操作
| 读1~2000
| 02
| 读离散输入状态
| 100001~165536
| 0000H~FFFFH
| 位操作
| 读1~2000
| 03
| 读保持寄存器
| 400001~465536
| 0000H~FFFFH
| 字操作
| 读1~125
| 04
| 读输入寄存器
| 300001~365536
| 0000H~FFFFH
| 字操作
| 读1~125
| 05
| 写单个线圈
| 000001~065536
| 0000H~FFFFH
| 位操作
| 写1
| 06
| 写单个寄存器
| 400001~465536
| 0000H~FFFFH
| 字操作
| 写1
| 15
| 写单个或多个线圈
| 000001~065536
| 0000H~FFFFH
| 位操作
| 写1~1968
| 16
| 写单个或多个保持寄存器
| 400001~465536
| 0000H~FFFFH
| 字操作
| 写1~123
| 23
| 读写单个或多个保持寄存器
| 000001~065536
| 0000H~FFFFH
| 字操作
| 读1~125、写1~121
| 六、Modbus RTU 通信协议CRC校验:
生成CRC校验值的过程如下:
1、预置一个值为FFFFH的16位寄存器,此寄存器为CRC寄存器;
2、把通信数据帧的第1个8位二进制数据与CRC寄存器的低8位进行异或运算,
异或的结果扔存放于该CRC寄存器中;
3、把CRC寄存器的内容右移1位,用0填补最高位,并检测移出的位是0还是1;
4、如果移出的位为0,则重复步骤3,如果移出的位为1,则CRC寄存器与A001A进行异或运算;
5、重复步骤3和4,直到右移8次,这样通信数据帧的第1个8位二进制数据就全部进行了处理;
6、重复步骤2、3、4、5,依次进行通信数据帧中的剩余字节;
7、将该通信数据帧中所有字节数据按上述步骤计算完成后,得到的16位CRC寄存器的高、低8位进行交换;
8、最后得到的CRC寄存器内容即为CRC校验码、
常用的CRC-16算法有查表和计数法,具体可查阅相关资料。
Modbus RTU 串口通信协议功能码格式
一、Modbus RTU通信协议01(0x01)功能码报文格式详解:
Modbus RTU主站发送:
名称
| 从站地址
| 功能码
| 寄存器地址
| 寄存器数量
| CRC校验
| 数量
| 02
| 01
| 00
| 02
| 00
| 04
| 9C
| 3A
|
|
|
|
|
|
|
|
|
| Modbus RTU从站正确返回:
名称
| 从站地址
| 功能码
| 字节计数
| 寄存器数据
| CRC校验
| 数量
| 02
| 01
| 01
| 03
| 11
| CD
| Modbus RTU从站异常返回:
名称
| 从站地址
| 功能码
| 错误代码
| CRC校验
| 数量
| 02
| 81
| 02
| 31
| 91
| ModbusSlave作从站,串口助手作主站
读从站(地址为2)第3个位开始连续4个离散量输出,返回结果为03(H)二进制0011
二、Modbus RTU通信协议02(0x02)功能码报文格式详解:
Modbus RTU主站发送:
名称
| 从站地址
| 功能码
| 寄存器地址
| 寄存器数量
| CRC校验
| 数量
| 03
| 02
| 00
| 03
| 00
| 04
| 88
| 2B
|
|
|
|
|
|
|
|
|
| Modbus RTU从站正确返回:
名称
| 从站地址
| 功能码
| 字节计数
| 寄存器数据
| CRC校验
| 数量
| 03
| 02
| 01
| 0F
| E0
| 34
| Modbus RTU从站异常返回:
名称
| 从站地址
| 功能码
| 错误代码
| CRC校验
| 数量
| 03
| 82
| 02
| 60
| A1
| ModbusSlave作从站,串口助手作主站
读从站(地址为3)第4个位开始连续4个离散量输入,返回结果为0F(H)二进制1111
三、Modbus RTU通信协议03(0x03)功能码报文格式详解:
Modbus RTU主站发送:
名称
| 从站地址
| 功能码
| 寄存器地址
| 寄存器数量
| CRC校验
| 数量
| 02
| 03
| 00
| 00
| 00
| 04
| 44
| 3A
|
|
|
|
|
|
|
|
|
| Modbus RTU从站正确返回:
名称
| 从站地址
| 功能码
| 字节计数
| 寄存器数据
| CRC校验
| 数量
| 02
| 03
| 08
| 00
| 7B
| 01
| C8
| 03
| 15
| 03
| F2
| 21
| 60
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Modbus RTU从站异常返回:
名称
| 从站地址
| 功能码
| 错误代码
| CRC校验
| 数量
| 02
| 83
| 02
| 30
| F1
| ModbusSlave作从站,串口助手作主站
读从站(地址为2)第1个字节开始连续4个保持寄存器数据,返回结果为00 7B 01 C8 03 15 03 F2 (H)十进制为 123、456、789、1010
四、Modbus RTU通信协议04(0x04)功能码报文格式详解:
Modbus RTU主站发送:
名称
| 从站地址
| 功能码
| 寄存器地址
| 寄存器数量
| CRC校验
| 数量
| 02
| 04
| 00
| 00
| 00
| 04
| F1
| FA
|
|
|
|
|
|
|
|
|
| Modbus RTU从站正确返回:
名称
| 从站地址
| 功能码
| 字节计数
| 寄存器数据
| CRC校验
| 数量
| 02
| 04
| 08
| 03
| F2
| 03
| 15
| 01
| C8
| 00
| 7B
| 75
| 42
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Modbus RTU从站异常返回:
名称
| 从站地址
| 功能码
| 错误代码
| CRC校验
| 数量
| 02
| 84
| 02
| 32
| C1
|
读从站(地址为2)第1个字节开始连续4个输入寄存器数据,返回结果为03 F2 03 15 01 C8 00 7B (H)十进制为 1010、789、456、123
五、Modbus RTU通信协议05(0x05)功能码报文格式详解:
Modbus RTU主站发送:
名称
| 从站地址
| 功能码
| 寄存器地址
| 寄存器数据
| CRC校验
| 数量
| 02
| 05
| 00
| 03
| FF
| 00
| 7C
| 09
|
|
|
|
|
|
|
|
|
| Modbus RTU从站正确返回:
名称
| 从站地址
| 功能码
| 寄存器地址
| 寄存器数据
| CRC校验
| 数量
| 02
| 05
| 00
| 03
| FF
| 00
| 7C
| 09
|
|
|
|
|
|
|
|
|
| Modbus RTU从站异常返回:
名称
| 从站地址
| 功能码
| 错误代码
| CRC校验
| 数量
| 02
| 85
| 02
| 33
| 51
| ModbusSlave作从站,串口助手作主站
写从站(地址为2)单个线圈第4个位为ON或OFF,(请求数据域中的常量说明请求的 ON/OFF 状态。
十六进制值 FF 00 请求输出为 ON。十六进制值00 00 请求输出为 OFF。其它所有值均是非法的,并且对输出不起作用。正常响应是请求的应答,在写入线圈状态之后返回这个正常响应。)
六、Modbus RTU通信协议06(0x06)功能码报文格式详解:
Modbus RTU主站发送:
名称
| 从站地址
| 功能码
| 寄存器地址
| 寄存器数据
| CRC校验
| 数量
| 02
| 06
| 00
| 03
| EF
| AC
| 35
| B4
|
|
|
|
|
|
|
|
|
| Modbus RTU从站正确返回:
名称
| 从站地址
| 功能码
| 寄存器地址
| 寄存器数据
| CRC校验
| 数量
| 02
| 06
| 00
| 03
| EF
| AC
| 35
| B4
|
|
|
|
|
|
|
|
|
| Modbus RTU从站异常返回:
名称
| 从站地址
| 功能码
| 错误代码
| CRC校验
| 数量
| 02
| 86
| 02
| 33
| A1
| ModbusSlave作从站串口,助手作主站写从站(地址为2)单个寄存器第4个字节为EF AC或为00 00
七、Modbus RTU通信协议15(0x0F)功能码报文格式详解:
Modbus RTU主站发送:
名称
| 从站地址
| 功能码
| 寄存器地址
| 寄存器数量
| 寄存器字节数
| 寄存器输出值
| CRC校验
| 数量
| 02
| 0F
| 00
| 00
| 00
| 0F
| 02
| CD
| 0C
| A5
| 91
|
|
|
|
|
|
|
|
|
|
|
|
| Modbus RTU从站正确返回:
名称
| 从站地址
| 功能码
| 寄存器地址
| 寄存器数量
| CRC校验
| 数量
| 02
| 0F
| 00
| 00
| 00
| 0F
| 15
| FC
|
|
|
|
|
|
|
|
|
| Modbus RTU从站异常返回:
名称
| 从站地址
| 功能码
| 错误代码
| CRC校验
| 数量
| 02
| 8F
| 02
| 35
| F1
| ModbusSlave作从站,串口助手作主站
写从站(地址为2)多个离散量输出数值,这是一个请求从线圈 00 开始写入 15 个线圈的实例:
请求的数据内容为两个字节:十六进制 CD 0C (二进制 1100 1101 0000 1100)。使用下列方法,
二进制位对应输出。
位: 1 1 0 0 1 1 0 1 0 0 0 0 1 1 0 0
输出:7 6 5 4 3 2 1 0 - - - - 11 10 9 8
传输的第一字节(十六进制 CD)寻址为输出7-0,在这种设置中,最低有效比特寻址为最低输出(0).
传输的下一字节(十六进制0C)寻址为输出11-8,在这种设置中,最低有效比特寻址为最低输出(8).
用零填充最后数据字节中的未使用位。
八、Modbus RTU通信协议16(0x10)功能码报文格式详解:
Modbus RTU主站发送:
名称
| 从站地址
| 功能码
| 寄存器地址
| 寄存器数量
| 寄存器字节数
| 寄存器数据(N字节数)
| CRC校验
| 数量
| 01
| 10
| 00
| 00
| 00
| 02
| 04
| FB
| AC
| E0
| 21
| 8B
| 72
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Modbus RTU从站正确返回:
名称
| 从站地址
| 功能码
| 寄存器地址
| 寄存器数量
| CRC校验
| 数量
| 01
| 10
| 00
| 00
| 00
| 02
| E0
| 34
|
|
|
|
|
|
|
|
|
| Modbus RTU从站异常返回:
名称
| 从站地址
| 功能码
| 错误代码
| CRC校验
| 数量
| 01
| 90
| 03
| 0C
| 01
| ModbusSlave作从站,串口助手作主站
这是一个请求将十六进制FB AC 和 E0 21 (或请求将十六进制 00 00 和00 00)写入从 0 开始的两个寄存器的实例:
九、Modbus RTU通信协议23(0x17)功能码报文格式详解:
Modbus RTU主站发送:
名称
| 从站地址
| 功能码
| 读寄存器地址
| 读寄存器数量
| 写寄存器地址
| 写寄存器数量
| 写寄存器字节
| 写寄存器数据
(N*2个字节)
| CRC校验
| 数量
| 02
| 17
| 00
| 00
| 00
| 03
| 00
| 05
| 00
| 01
| 02
| E0
| A2
| 18
| 98
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Modbus RTU从站正确返回:
名称
| 从站地址
| 功能码
| 字节计数
| 寄存器数据
| CRC校验
| 数量
| 02
| 17
| 06
| 04
| D2
| 11
| D8
| 0E
| 72
| 8D
| AE
|
|
|
|
|
|
|
|
|
|
|
|
| Modbus RTU从站异常返回:
名称
| 从站地址
| 功能码
| 错误代码
| CRC校验
| 数量
| 02
| 97
| 02
| 3F
| F1
| ModbusSlave作从站,串口助手作主站
名称(主站发送)
| 数量
| 名称(从站正确返回)
| 数量
| 从站地址
| 02
| 从站地址
| 02
| 功能码
| 17
| 功能码
| 17
| 读寄存器地址(Hi)
| 00
| 读寄存器字节数
| 06
| 读寄存器地址(Lo)
| 00
| 读寄存器值(Hi)
| 04
| 读寄存器数量(Hi)
| 00
| 读寄存器值(Lo)
| D2
| 读寄存器数量(Lo)
| 03
| 读寄存器值(Hi)
| 11
| 写寄存器地址(Hi)
| 00
| 读寄存器值(Lo)
| D8
| 写寄存器地址(Lo)
| 06
| 读寄存器值(Hi)
| 0E
| 写寄存器数量(Hi)
| 00
| 读寄存器值(Lo)
| 72
| 写寄存器数量(Lo)
| 03
| CRC校验码Hi
| 8D
| 写寄存器字节数
| 06
| CRC校验码Lo
| AE
| 写寄存器的值Hi
| AB
|
|
| 写寄存器的值Lo
| CD
|
|
| 写寄存器的值Hi
| 12
|
|
| 写寄存器的值Lo
| EA
|
|
| 写寄存器的值Hi
| 34
|
|
| 写寄存器的值Lo
| AC
|
|
| CRC校验码Hi
| 5A
|
|
| CRC校验码Lo
| DA
|
|
|
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |