关于MODBUS RTU的T3.5 、T1.5的时序问题

    先看一下MODBUS协议里面关于这两个重要的时序是怎么写的:

    在RTU模式,报文由时长至少3.5个字符时间的空间间隔区分。如下图:

关于MODBUS RTU的T3.5 、T1.5的时序问题_第1张图片

    整个报文帧必须以连续的字符流发送,如果两个字符之间的空闲大于1.5个字符时间,则报文帧认为不完整,应该被接收点丢弃。

关于MODBUS RTU的T3.5 、T1.5的时序问题_第2张图片

    注意: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。

下面是一些代码及解释

关于MODBUS RTU的T3.5 、T1.5的时序问题_第3张图片

关于MODBUS RTU的T3.5 、T1.5的时序问题_第4张图片

假设现在波特率是9600bps,要发送读取数据的请求:01 03 00 1e 00 01 e4 0c

每个字节包含一个起始位和一个停止位,这样发送这串命令要花费时间8*10/9600 = 8.3ms

即第一帧发送时间是8.3ms

而T3.5的时间是 3.5*10/9600 = 3.65ms

所以第二帧数据开始发送的时间至少是第12ms开始(8.3+3.65 = 11.95ms)

下面是这段程序的时间线。如果ModbusInterval在串口中断里面赋值为1的话,那么从10ms就要开始处理数据,那么处理完后,可能还没到12ms就可以接收下一帧数据。这在时间间隔上不满足T3.5的要求;所以还是赋值为2最为合适。

关于MODBUS RTU的T3.5 、T1.5的时序问题_第5张图片

在实际使用时,上位机串口软件设为30ms定时发送数据的话,会收到误码;设为40ms以上定时发送的话就都正常。







你可能感兴趣的:(STM32,C语言)