使用TCP不需要校验。
后文所说的寄存器,也可能指线圈,离散输入等,具体视功能码而定。
master端
共发送12字节
示例:00 3d 00 00 00 06 01 01 00 00 00 10
第1,2字节[00 3d]:
序列码,每次+1。当master端发送序列码为00 3d,则slave端也需要返回以00 3d打头的消息,以保证每帧的消息发送和接受不会出错。
第3~5字节[00 00 00]:
意义不明,可能只是为了分隔。
第6字节[06]:
固定为06,表示请求。
第7字节[01]:
请求的slave ID
第8字节[01]:
功能码。具体可以看Modbus Poll的function选项
第9,10字节[00 00]:
起始地址。上文意思是从0开始读。
第11,12字节[00 10]:
读多少位。上文意思是读16位
slave 端
示例:00 3d 00 00 00 05 01 01 02 ff ff
第1,2字节[00 3d]:
序列码,每次+1。当master端发送序列码为00 3d,则slave端也需要返回以00 3d打头的消息,以保证每帧的消息发送和接受不会出错。
第3~5字节[00 00 00]:
意义不明,可能只是为了分隔。
第6字节[05]:
返回声明。如果为03及以下时,说明请求错误,可能是请求超过寄存器限制等。如果是03以上,说明正常。正常时值取第9字节数值加3。如第9字节为02,加3为05,所以返回声明为05。
第7字节[01]:
应答的slave ID。
第8字节[01]:
应答的功能码。具体功能码定义,可以参看Modbus Slave软件Function
第9字节[02]:
返回数据长度,单位字节。
其余字节:
数据。数据位小端排列。
如,数据为[1000 0001 0111 1110],最左边为寄存器的高位,31位;最右边为低位,0位。则应答应为[7e 81],即0~15这最低的字节在应答数据第一字节的位置,16~31这最高的字节在应答数据第二字节的位置。
对于更多的位数,则遵循最低字节在最前面,最高字节在最后的原则。
如果请求的位数不足一个字节,则最少返回一个字节数据,其余未请求的数据以0占位。
如:master端只请求1位,则需要返回1个字节;master端请求17位,需要返回2个字节。