Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
一、Modbus RTU
RTU协议中的指令由地址码(一个字节),功能码(一个字节),起始地址(两个字节),数据(N个字节),校验码(两个字节)五个部分组成。数据由数据长度(两个字节,表示的是寄存器个数,假定为M)和数据正文(M乘以2个字节)组成。
读保持型寄存器(功能码03)
Tx(发送):01 03 00 00 00 0A C5 CD
从站地址(01)+ 功能码(03)+ 起始地址(00 00)+ 寄存器数量(00 0A)+ CRC(C5 CD)
Rx(接收):01 03 14 00 37 00 2C 00 21 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 7C CC
从站地址(01)+ 功能码(03)+ 字节数量(14)+ 字节状态(00 37 00 2C 00 21 00 0A 00 00 00 00 00 00 00 00 00 00 00 00)+ CRC(7C CC)
字节数量 14(16进制)相当于 20(10进制)
二、Modbus TCP
Tx(发送):00 00 00 00 00 06 01 03 00 00 00 04
byte[0] byte[1] :消息号
byte[2] byte[3] :modbus标识
byte[4] byte[5] :表示排在byte[5]后面所有字节的个数,也就是总长度。
byte[6] :站号
byte[7] :功能码
byte[8] byte[9]:起始地址
byte[10] byte[11] :指定想读取的数据长度,比如我们就想读取地址0的一个数据,这里就写 00 01,如果我们想读取地址0-999共计一个数据的长度,就写 03 E8。
Rx(接收):03 1A 00 00 00 05 01 03 02 00 16
byte[0] byte[1] :消息号
byte[2] byte[3] : modbus标识
byte[4] byte[5] :表示排在byte[5]后面所有字节的个数,也就是总长度。
byte[6] : 站号
byte[7] :功能码
byte[8] :指示byte[8]后面跟随的字节个数。
byte[9] byte[10] :真实的数据
三、Modbus的功能码