Modbus通信协议指令学习记录
- Modbus协议版本
-
- 阅读指令格式
-
- Modbus RTU
- Modbus ASCII
- Modbus TCP
- 写入指令格式
-
- Modbus RTU
- Modbus ASCII
- Modbus TCP
- 后记
Modbus协议版本
Modbus协议目前存在Modbus RTU、Modbus ASCII、Modbus TCP三个版本。
- Modbus RTU协议紧凑,采用二进制表示数据、循环冗余校验校验和;
- Modbus ASCII协议是人类可读的、冗长的表达方式,采用纵向冗余校验和校验;
- Modbus TCP该协议不需要验证和计算。 大多数Modbus液位计、流量计、智能电表等设备通过串行通信Modbus RTU和Modbus ASCII协议。 PLC设备一般通过TCP/UDP连接,采用Modbus TCP协议。 由于设备的限制和串行通信的需要,也可以使用Modbus RTU over TCP/UDP通信方式,即通过TCP/UDP连接,但使用Modbus RTU协议
阅读指令格式
以下是不同协议的对比分析,具有相同的含义(相同的地址和相同的读取数据)。 考虑到03功能码在使用过程中比较常用,以03读取为例
Modbus RTU
Modbus RTU必须明确常用于传感器设备和普通智能电表的协议。 01:设备地址 ,设备地址为1 03:功能码 ,目前03阅读请求 00 00:寄存器起始地址,从00 开始读取00寄存器 00 02:读取寄存器长度 ,读2个长度,回复4个字节 C4 0B:CRC效验和 01:设备地址 ,设备地址为1 03:功能码目前为03读取回复 04:数据长度 ,数据包含四个字节 00 0C:寄存器1数值 00 02:寄存器2值 BB F1:CRC效验和
Modbus ASCII
使用相同的命令Modbus RTU和Modbus ASCII虽然命令的长度有很大的不同(ASCII为RTU两倍),但表达的意思完全一样,不建议使用。 3A:起始符 30 31:设备地址 30 33:功能码 30 30 30 30:寄存器的起始地址: 30 30 30 32:读取寄存器长度 46 41:LRC效验和 0D 0A:结束符 3A:起始符 30 31:设备地址 30 33:功能码 30 34:数据长度 30 30 30 43:寄存器1值 30 30 30 32:寄存器2值 45 41:LRC效验和 0D 0A: 结束符
Modbus TCP
因为以TCP为连接,有TCP本协议取消了效验和效验,以确保数据准确。 00 00:事务标识符,当前为第几次通信,回复与一直,可以通过这项判断请求与指令是否匹配 00 00:协议标识符 00 06:剩余长度 01:设备地址 03:功能码 00 00:寄存器的起始地址 00 02:读取寄存器长度 00 00:事务标识符 00 00:协议标识符 00 07:剩余长度 01:设备地址 03:功能码 04:数据长度 00 0C:寄存器1数值 00 02:寄存器2值
写入指令格式
以下是不同协议的对比分析,具有相同的含义(相同的地址和相同的读取数据)。 考虑到10功能码可以写入一个或多个寄存器,以10写入为例
Modbus RTU
Modbus RTU为传感器类设备、普通智能电表常用的协议一定要弄清楚。 01:设备地址 ,设备地址为1 10:功能码 ,目前为10写入请求 00 00:寄存器起始地址,00 00寄存器开始写入 00 02:写入寄存器长度 ,写两个长度,对应后四个字节数据 04:数据长度 ,数据包含四个字节 00 00:寄存器1值 00 0A:寄存器2数值 73 A8:CRC效验和 01:设备地址 ,设备地址为1 10:功能码目前为10写入回复 00 00:寄存器起始地址,00 00寄存器开始入 00 02:写入寄存器长度 ,写入2个长度 41 C8:CRC效验和
Modbus ASCII
同一条命令用Modbus RTU和Modbus ASCII方式表现出来,虽然在命令长度上有很大区别(ASCII为RTU的两倍),但表达的意思是完全一样的,所以不建议使用。 3A:起始符 30 31:设备地址 31 30:功能码 30 30 30 30:寄存器起始地址 30 30 30 32:写入寄存器长度 30 34:数据长度 30 30 30 30:寄存器1数值 30 30 30 41:寄存器2数值 44 46:LRC效验和 0D 0A:结束符 3A:起始符 30 31:设备地址 31 30:功能码 30 30 30 30:寄存器起始地址 30 30 30 32:写入寄存器长度 45 44:LRC效验和 0D 0A: 结束符
Modbus TCP
因为以TCP为连接,有TCP效验保证数据准确,所以协议中取消了效验和。 00 00:事务标识符,当前为第几次通信,回复与一直,可以通过这项判断请求与指令是否匹配 00 00:协议标识符 00 0B:剩余长度 01:设备地址 10:功能码 00 00:寄存器起始地址 00 02:写入寄存器长度 04:数据长度 00 00:寄存器1数值 00 0A:寄存器2数值 00 00:事务标识符 00 00:协议标识符 00 06:剩余长度 01:设备地址 10:功能码 00 00:寄存器起始地址 00 02:写入寄存器长度
后记
本文只是记录本人学习过程中的理解,可能有部分内容有纰漏,望各位不吝赐教。 下篇Modbus通信工具学习记录