请求报文
客户端发送的请求报文如下:
字段名称 | 值(十六进制) | 说明 |
---|---|---|
事务标识符 | 0x0001 | 客户端生成的事务标识符。 |
协议标识符 | 0x0000 | 固定值。 |
长度 | 0x0006 | 从单元标识符到报文结束的字节数。 |
单元标识符 | 0x00 | 固定值。 |
功能码 | 0x03 | 读取保持寄存器。 |
起始地址 | 0x0000 | 起始寄存器地址。 |
寄存器数量 | 0x0002 | 要读取的寄存器数量。 |
完整的请求报文为:0x0001 0x0000 0x0006 0x00 0x03 0x0000 0x0002
服务器响应报文
假设服务器成功读取了两个寄存器的数据,返回的报文格式如下:
字段名称 | 长度(字节) | 说明 |
---|---|---|
事务标识符 | 2 | 与请求报文中的事务标识符相同。 |
协议标识符 | 2 | 固定为0x0000。 |
长度 | 2 | 表示从单元标识符到报文结束的字节数。 |
单元标识符 | 1 | 与请求报文中的单元标识符相同。 |
功能码 | 1 | 与请求报文中的功能码相同。 |
数据字节计数 | 1 | 返回数据的字节数。 |
数据 | 可变 | 返回的寄存器数据。 |
假设读取的两个寄存器的值分别为0xAAAA和0xBBBB,返回的报文如下:
字段名称 | 值(十六进制) | 说明 |
---|---|---|
事务标识符 | 0x0001 | 与请求报文中的事务标识符相同。 |
协议标识符 | 0x0000 | 固定值。 |
长度 | 0x0005 | 从单元标识符到报文结束的字节数(1字节单元标识符 + 1字节功能码 + 1字节数据字节计数 + 4字节数据)。 |
单元标识符 | 0x00 | 与请求报文中的单元标识符相同。 |
功能码 | 0x03 | 与请求报文中的功能码相同。 |
数据字节计数 | 0x04 | 返回数据的字节数(2个寄存器,每个寄存器2字节)。 |
数据 | 0xAAAA 0xBBBB | 返回的寄存器数据。 |
完整的响应报文为:0x0001 0x0000 0x0005 0x00 0x03 0x04 0xAAAA 0xBBBB
解释
- 事务标识符(0x0001):与请求报文中的事务标识符相同,用于匹配请求和响应。
- 协议标识符(0x0000):固定值,表示使用的是Modbus TCP协议。
- 长度(0x0005):从单元标识符到报文结束的字节数,包括单元标识符(1字节)、功能码(1字节)、数据字节计数(1字节)和数据(4字节)。
- 单元标识符(0x00):与请求报文中的单元标识符相同。
- 功能码(0x03):与请求报文中的功能码相同,表示读取保持寄存器。
- 数据字节计数(0x04):返回数据的字节数,表示返回了4个字节的数据(2个寄存器,每个寄存器2字节)。
- 数据(0xAAAA 0xBBBB):返回的寄存器数据,表示两个寄存器的值分别为0xAAAA和0xBBBB。
错误响应
如果服务器无法完成请求,例如寄存器地址无效或设备故障,服务器会返回一个错误响应报文。错误响应报文的格式如下:
字段名称 | 长度(字节) | 说明 |
---|---|---|
事务标识符 | 2 | 与请求报文中的事务标识符相同。 |
协议标识符 | 2 | 固定为0x0000。 |
长度 | 2 | 表示从单元标识符到报文结束的字节数。 |
单元标识符 | 1 | 与请求报文中的单元标识符相同。 |
功能码 | 1 | 请求的功能码的最高位设置为1,表示错误。 |
错误码 | 1 | 表示具体的错误类型。 |
假设请求的功能码为0x03,但服务器无法完成请求,返回的错误响应报文如下:
字段名称 | 值(十六进制) | 说明 |
---|---|---|
事务标识符 | 0x0001 | 与请求报文中的事务标识符相同。 |
协议标识符 | 0x0000 | 固定值。 |
长度 | 0x0003 | 从单元标识符到报文结束的字节数(1字节单元标识符 + 1字节功能码 + 1字节错误码)。 |
单元标识符 | 0x00 | 与请求报文中的单元标识符相同。 |
功能码 | 0x83 | 请求的功能码的最高位设置为1,表示错误。 |
错误码 | 0x02 | 表示具体的错误类型,例如0x02表示非法数据地址。 |
完整的错误响应报文为:0x0001 0x0000 0x0003 0x00 0x83 0x02
总结
- 正常响应:返回请求的数据,包含事务标识符、协议标识符、长度、单元标识符、功能码、数据字节计数和数据。
- 错误响应:返回错误信息,包含事务标识符、协议标识符、长度、单元标识符、功能码(最高位为1)和错误码。
通过这些报文格式,客户端可以清楚地了解服务器的响应情况。