Modbus报文详解
Modbus报文格式包含头部和数据部分,以下是对其详细解析:
一、头部
地址码(Address Code):
指定通信对象的地址,通常为1到255之间的数字。
在Modbus RTU中,地址范围从0到247,其中0是广播地址,用于向所有从机发送消息,但从机不会对广播信息进行应答。地址248到255通常保留给特殊功能或未来使用。
功能码(Function Code):
指定Modbus协议的功能,包括读寄存器、写寄存器、读取输入寄存器、写入输出寄存器等。
功能码占1字节,有效值范围是1~255。
常见的功能码包括:
01 (0x01):读线圈状态(Read Coils),用于读取一组逻辑线圈的当前状态(ON/OFF)。
02 (0x02):读离散输入状态(Read Discrete Inputs),用于读取一组离散输入的状态(ON/OFF)。
03 (0x03):读保持寄存器(Read Holding Registers),用于读取一组保持寄存器中的二进制内容。
04 (0x04):读输入寄存器(Read Input Registers),用于读取一组输入寄存器中的二进制内容。
05 (0x05):写单个线圈(Write Single Coil),用于写入单个逻辑线圈的状态(ON/OFF)。
06 (0x06):写单个寄存器(Write Single Register),用于写入单个保持寄存器的数据。
15 (0x0F):写多个线圈(Write Multiple Coils),用于写入一组逻辑线圈的状态。
16 (0x10):写多个寄存器(Write Multiple Registers),用于写入一组保持寄存器的数据。
二、数据部分
数据部分包含了请求或响应数据,其结构和长度依赖于功能码的不同。
例如,在读取保持寄存器(功能码03)时,数据部分可能包括寄存器起始地址的高位和低位、寄存器数量的高位和低位等。
三、校验码
CRC校验(Cyclic Redundancy Check):
在Modbus RTU中,数据传输前需要计算CRC校验和,以检验数据是否传输正确。
CRC校验占2字节。
校验码(用于Modbus ASCII):
在Modbus ASCII中,校验码用于校验数据是否传输正确,占2个ASCII字符。
以下是一个Modbus报文示例,用于采集设备ID为1的寄存器数据,从寄存器地址1开始采集100个寄存器,功能码为3(读保持寄存器):
Modbus RTU报文:
地址码:01(表示设备ID为1)
功能码:03(读保持寄存器)
数据部分:
起始地址(高位):00
起始地址(低位):00(表示从寄存器地址0000H开始,即1号寄存器,注意Modbus地址通常是从0开始的,但在这里我们按照题目要求的1号寄存器进行解释,实际使用时可能需要根据设备的具体实现来调整)
寄存器数量(高位):00
寄存器数量(低位):64(表示采集64个寄存器,但题目要求100个,这里需要注意,由于Modbus RTU报文长度的限制,可能需要拆分多个报文来读取100个寄存器,或者设备支持扩展的报文格式。此处先以64个为例进行说明)
CRC校验:根据前面的报文内容计算得出,占2字节(具体值需要根据报文内容计算)
四、其他
在Modbus ASCII格式中,命令格式还包括回车和换行符,表示数据传输结束。
Modbus协议还支持TCP/IP等其他通信方式,但其报文格式与RTU和ASCII格式有所不同。
综上所述,Modbus报文格式是一个结构化的数据通信协议,通过头部中的地址码和功能码来指定通信对象和操作类型,数据部分则包含了具体的请求或响应数据。校验码用于确保数据传输的正确性。
一、头部
地址码(Address Code):
指定通信对象的地址,通常为1到255之间的数字。
在Modbus RTU中,地址范围从0到247,其中0是广播地址,用于向所有从机发送消息,但从机不会对广播信息进行应答。地址248到255通常保留给特殊功能或未来使用。
功能码(Function Code):
指定Modbus协议的功能,包括读寄存器、写寄存器、读取输入寄存器、写入输出寄存器等。
功能码占1字节,有效值范围是1~255。
常见的功能码包括:
01 (0x01):读线圈状态(Read Coils),用于读取一组逻辑线圈的当前状态(ON/OFF)。
02 (0x02):读离散输入状态(Read Discrete Inputs),用于读取一组离散输入的状态(ON/OFF)。
03 (0x03):读保持寄存器(Read Holding Registers),用于读取一组保持寄存器中的二进制内容。
04 (0x04):读输入寄存器(Read Input Registers),用于读取一组输入寄存器中的二进制内容。
05 (0x05):写单个线圈(Write Single Coil),用于写入单个逻辑线圈的状态(ON/OFF)。
06 (0x06):写单个寄存器(Write Single Register),用于写入单个保持寄存器的数据。
15 (0x0F):写多个线圈(Write Multiple Coils),用于写入一组逻辑线圈的状态。
16 (0x10):写多个寄存器(Write Multiple Registers),用于写入一组保持寄存器的数据。
二、数据部分
数据部分包含了请求或响应数据,其结构和长度依赖于功能码的不同。
例如,在读取保持寄存器(功能码03)时,数据部分可能包括寄存器起始地址的高位和低位、寄存器数量的高位和低位等。
三、校验码
CRC校验(Cyclic Redundancy Check):
在Modbus RTU中,数据传输前需要计算CRC校验和,以检验数据是否传输正确。
CRC校验占2字节。
校验码(用于Modbus ASCII):
在Modbus ASCII中,校验码用于校验数据是否传输正确,占2个ASCII字符。
以下是一个Modbus报文示例,用于采集设备ID为1的寄存器数据,从寄存器地址1开始采集100个寄存器,功能码为3(读保持寄存器):
Modbus RTU报文:
地址码:01(表示设备ID为1)
功能码:03(读保持寄存器)
数据部分:
起始地址(高位):00
起始地址(低位):00(表示从寄存器地址0000H开始,即1号寄存器,注意Modbus地址通常是从0开始的,但在这里我们按照题目要求的1号寄存器进行解释,实际使用时可能需要根据设备的具体实现来调整)
寄存器数量(高位):00
寄存器数量(低位):64(表示采集64个寄存器,但题目要求100个,这里需要注意,由于Modbus RTU报文长度的限制,可能需要拆分多个报文来读取100个寄存器,或者设备支持扩展的报文格式。此处先以64个为例进行说明)
CRC校验:根据前面的报文内容计算得出,占2字节(具体值需要根据报文内容计算)
四、其他
在Modbus ASCII格式中,命令格式还包括回车和换行符,表示数据传输结束。
Modbus协议还支持TCP/IP等其他通信方式,但其报文格式与RTU和ASCII格式有所不同。
综上所述,Modbus报文格式是一个结构化的数据通信协议,通过头部中的地址码和功能码来指定通信对象和操作类型,数据部分则包含了具体的请求或响应数据。校验码用于确保数据传输的正确性。