Modbus协议通信经验

1. Modbus相关概念,网上一大堆,可以参考外文网站http://www.simplymodbus.ca/TCPclient.htm

2. Modubs协议属于数据链路层协议,即在物理层基础之上实现原始比特的可靠传输。

     比如物理层的通信媒介为485,那么原始比特传输一般是1个起始位,8个数据位,2个停止位,有无校验位都可。为了实现可靠传输,需要数据链路协议收发帧。

3. Modbus协议基于485总线上发送数据时,一般首先发送最高字节,比如发送0x6789,先发送0x67,再发送0x89.

4. modbus分为RTU、ASCII、TCPIP三大类,一般使用RTU通讯方式。

5. 由于Modbus的04或03功能码一个寄存器占用2个字节数据,如果传输float型数据时,float是4个字节,需要在协议中规定偏移和系数得到浮点值。比如传浮点值F,那么就可以规定此值偏移为b, 系数为k,传的两个字节数据组合后的值为x,那么F=k(x+b)。通过这样的方式,使2个字节表示了4个字节的float数据.

6. 如果Modbus采用一问一答方式,主机发起请求,从机执行请求并且应答。由于此协议没有结束标记,因此收发双方靠时延确定是否接收完成。请求或应答消息帧前后必须以3.5个以上的字符时间以间隔:

起始空闲(至少3.5个字符空闲)

消息帧

结束空闲(至少3.5个字符空闲)

       消息帧发送前必须距上一帧消息间隔有3.5个字符时间的空闲,而在发完最后一个字符后,也必须以至少3.5个字符时间的空闲停顿表示消息的结束。也就是要保证两个帧间的间隔至少大于3.5个字符的空闲时间。可以通过这个来决定是否一帧数据收完。

       整个消息帧必须作为一连续的流转输,如果在一个消息帧中间,两个字符间有超过1.5个字符时间的停顿时间,则接收方可以认为本帧错误。

3.5个和1.5个的字符空闲时间与通信波特率有关,计算方法如下:

1.5个字符间隔 = 1 / 9600 * 11 * 1.5 * 1000 = 1.7ms

3.5个字符间隔 = 1 / 9600 * 11 * 3.5 * 1000 = 4.01ms

      上面假定波特率为9600,波特率含义是每秒传输的二进制位的个数,比如9600bps,意思就是说每1秒(也就是1000毫秒)传输9600个位,11表示RS485原始比特传输一个起始位、8个数据位、1个停止位、1个校验位,11*1.5表示1.5个字符有多少位,由于每一位需要1000/9600毫秒,那么1.5个字符就需要(11*1.5)*(1000/9600)毫秒。

     一个modbus协议帧最长255字节,那么最长帧传输时间为255*1.7=433ms,假如一个协议帧长度为45字节,那么最长协议帧为45*1.7=76.5ms。如果把超时时间设置为传输时间的5~10倍,比如350ms。主机发起请求后,若从机300ms内未应答,则可以认为本次请求失败。
 

猜你喜欢

转载自blog.csdn.net/fengel_cs/article/details/105995214