modbus rtu通讯-T1.5以及T3.5时间间隔

目录

1 间隔概念

2 间隔时间计算

3不同的波特率下,数据帧之间的传输时间间隔是不一样的


1 间隔概念

T1.5T3.5时间是实现RTU接收驱动程序过程中非常重要的两个概念。

其中T1.5是用来描述同一modbus报文帧内部两个字符之间的传输间隔时间(实际工程应用中T1.5机制使用比较少,本文忽略)T1.5的图示如下:

modbus rtu通讯-T1.5以及T3.5时间间隔_第1张图片

重点讲下T3.5。T3.5是用来描述两个不同modbus报文帧之间的传输间隔时间(当前数据帧的结束字符与下一个数据帧的起始字符传输时间间隔)

Modbus-RTU通讯建立在底层串口通讯的基础之上。当串口的一个接收中断到来表明已完成一个字符的接收。Modbus-Rtu通讯是连续的字符流。

那么就引出一个问题,在连续的字符流之中如何判断一帧数据的起始和结束呢???

要解决以上的这个问题,Modbus-Rtu引入了一个“T3.5”的时间间隔。在串口接收的连续字符流之中若出现两个字符之间的接收时间间隔超过3.5个字符时间,则判断为两个数据帧的间隔。接收驱动程序上实现的思路是:

串口在接收到一个字符(假设字符’a’)时便开始计时,时间记为Time1,在接收到下一个字符(假设字符‘b’)时,时间记为Time2。如果Time2 - Time1的时间差值大于3.5个字符时间,则判断字符‘b’为下一数据帧的起始字符。字符‘a’为本帧数据的结束字符。

T3.5 的图示如下:

modbus rtu通讯-T1.5以及T3.5时间间隔_第2张图片

2 间隔时间计算

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


1个字符包括1位起始位、8位数据位(一般情况)、1位校验位(或者没有)、1位停止位(一般情况下)
这样说起来一般情况下1个字符就包括11位
那么3.5个字符就是3.5*11=38.5位
还有比如没有校验位的
1个字符包括1位起始位、8位数据位(一般情况)、1位停止位(一般情况下)
这样说起来一般情况下1个字符就包括10位
那么3.5个字符就是3.5*10=35位


波特率含义是每秒传输的二进制位的个数
比如9600bps,意思就是说每1秒(也就是1000毫秒)传输9600个位,
反过来说传输9600个二进制位需要1000毫秒
那么传输38.5个二进制位需要的时间就是:
38.5/9.6=4.0104167毫秒

MODBUS RTU要求一帧数据起始和结束至少有大于等于3.5个字符的时间
在波特率为9600的情况下,只要大于4.0104167毫秒即可!

一般,为了简单起见,可以将传输45Bit(位)的时间四舍五入后的整型值作为两个数据帧之间的时间间隔,并以此来判断报文接收的完整性。

3不同的波特率下,数据帧之间的传输时间间隔是不一样的

注意:RTU接收驱动程序的实现,由于T1.5和T3.5的定时,隐含着大量对中断的管理。在高通信速率下,这导致CPU负担家中,因此,在<=19200bps时,这两个定时必须严格遵守;对于>19200bps的情形,应该使用2个定时的固定值,建议字符间的超时时间t1.5为750us;帧间超时时间为1.75ms。

 在实际使用的时候,我觉得T1.5都没有必要关注。据我用示波器观察,在一个帧之内,字节和字节之间也就是停止位和起始位,字节和字节是紧密连接在一起的。所以我在程序里面就没有对T1.5进行处理。

而在帧与帧之间的T3.5则需要程序处理。因为RTU模式没有起始符和结束符,两个数据包之间只能靠时间间隔来区分。但是仪表在工厂实际的使用过程中,一般都是间隔40ms、50ms,甚至更长时间读一次数据,这之间的间隔完全超过了T3.5。

你可能感兴趣的:(通信协议,modbusrtu,3.5,时间间隔)