3.3.2 RTU消息帧格式

传输设备(主/从设备)将Modbus报文放置在带有已知起始和结束点的消息帧中,这就要求接收消息帧的设备在报文的起始处开始接收,并且要知道报文传输何时结束。另外还必须能够检测到不完整的报文,且能够清晰地设置错误标志。

在RTU模式中,消息的发送和接收以至少3.5个字符时间的停顿间隔为标志。实际使用中,网络设备不断侦测网络总线,计算字符间的停顿间隔时间,判断消息帧的起始点。当接收到第一个域(地址域)时,每个设备都进行解码以判断是否是发给自己的。在最后一个传输字符结束之后,一个至少3.5个字符时间的停顿标定了消息的结束,而一个新的消息可在此停顿后开始。另外,在一帧报文中,必须以连续的字符流发送整个报文帧。如果两个字符之间的空闲间隔大于1.5个字符时间,那么认为报文帧不完整,该报文将被丢弃。

很多初学者面对3.5字符时间间隔的概念时,往往陷入迷茫的状态。其实,需要记住的是:

• 3.5时间间隔目的是作为区别前后两帧数据的分隔符。

• 3.5时间间隔只对RTU模式有效。

后续具体编码的章节会针对这一点进一步阐述。

如图3-2所示,Modbus通信时规定主机发送完一组命令必须间隔3.5个字符再发送下一组新命令,这3.5个字符主要用来告诉其他设备这次命令(数据)已结束。这3.5个字符的时间间隔采用以下方式计算:

图3-2 Modbus RTU相邻帧间隔

通常情况下在串行通信中,1个字符包括1位起始位、8位数据位、1位校验位(或者没有)、1位停止位(一般情况下)。这样一般情况下1个字符就包括11位,那么3.5个字符就是3.5×11=38.5位。

而串行通信中波特率的含义是每秒传输的二进制位的个数。例如波特率为9600bps,则意思就是说每1s(也就是1000ms)传输9600个位的数据;反过来说传输9600个二进制位的数据需要1000ms,那么传输38.5个二进制位的数据需要的时间就是:

38.5×(1000/9600)=4.0104167ms

如图3-2所示,Modbus RTU要求相邻两帧数据的起始和结束之间至少有大于等于3.5个字符的时间间隔,那么在波特率为9600bps的情况下,只要大于4.0104167ms即可!

每个消息帧的格式如图3-3所示。

图3-3 Modbus RTU帧格式

注意:为了实现RTU通信中的时间间隔管理,定时器将引起大量中断处理,在较高的通信波特率下,这将导致CPU的沉重负担。为此,协议规定当波特率等于或低于19200bps时,需要严格遵守时间间隔;而在波特率大于19200bps的情况下,时间间隔使用固定值。建议1.5个字符时间间隔为750μs,帧间时间间隔为1 750μs。