Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。
Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。
标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。
ModbusTCP的数据帧可分为两部分:MBAP+PDU。
报文头MBAP
MBAP为报文头,长度为7字节,组成如下:
事务处理标识(2byte)+协议标识(2byte)+长度(2byte)+单元标识符(1byte)
帧结构PDU
PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定
PDU详细结构
0x03:读保持寄存器
- 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
- 响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)
- 如:请求:00 00 00 00 00 06 01 03 00 00 00 01
- 响应: 00 00 00 00 00 05 01 03 02 12 34
请求: - 00 00为此次通信事务处理标识符
- 00 00表示协议标识符,00 00为modbus协议;
- 00 06为数据长度,用来指示接下来数据的长度,单位字节;
- 01为设备地址,用以标识连接在串行线或者网络上的远程服务端的地址。以上七个字节也被称为modbus报文头;
- 03为功能码,此时代码03为读取保持寄存器数据;
- 00 00为起始地址;
- 00 01为寄存器数量,(word数量);
响应: -
00 00为此次通信事务处理标识符,应答报文要求与先前对应的请求保持一致;
00 00为协议标识符,与先前对应的请求保持一致;
00 05为数据长度,用来指示接下来数据的长度,单位字节;
01为设备地址,应答报文要求与先前对应的请求保持一致;
03为功能码,正常情况下应答报文要求与先前对应的请求保持一致,如果出错则返回80h+先前的功能码;
02指示接下来数据的字节长度;
12 34为被读取的保持寄存器中的数据值,即要求被读取的地址为00 00的保持寄存器中的数值为1234h。