MODBUS RTU传输模式介绍

描述

上期我们学习了,第一篇MODBUS协议基本介绍,今天我们来研究第二篇MODBUS RTU传输模式介绍。

第二篇 MODBUS RTU传输模式介绍

当设备使用 RTU(Remote Terminal Unit)模式在Modbus串行链路通信,消息中每个8位域都是由两个十六进制字符组成。该模式的主要优点是较高的数据密度,在相同的波特率下比ASCII模式有更高的吞吐率。RTU模式的每个报文必须以连续的字符流传送。

RTU模式每个字节(11位)的格式

  1. 编码系统:8 位二进制,报文中每个 8 位字节含有两个 4 位十六进制字符(0-9,A-F)。
  2. 每字节 bit 流:1 起始位、8 数据位,首先发送最低有效位、1 位奇偶检验、1 停止位。

偶校验是要求的,其它模式(奇校验、无校验)也可以使用,为了保证兼容性,同时支持无校验模式是建议的。默认校验模式必须为偶校验。

字符如何串行传送:

每个字符或字节均由此顺序发送(从左到右),最低有效位(LSB)…最高有效位(MSB)。

MODBUS

RTU模式位序列

设备配置为奇校验、偶校验或无校验都可以接受,如果无奇偶校验,就传送一个附加的停止位以填充字符帧。

MODBUS

RTU模式位序列(无校验的特殊情况)

帧检验域: 循环冗余检验(CRC)。

帧描述:

MODBUS

RTU报文帧

Modbus报文RTU帧

由发送设备将 Modbus 报文构造为带有已知起始和结束标记的帧。这使设备可以在报文的开始接收新帧,并且知道何时报文结束。不完整的报文必须能够被检测到,而错误标志必须作为结果被设置。

在 RTU 模式中,报文帧由时长至少为 3.5 个字符时间的空闲间隔区分。在后续部分,这个时间区间被称为 t3.5。

MODBUS整个报文帧必须以连续的字符流发送。

如果两个字符直接的空闲间隔大于 1.5 个字符时间,则报文被认为不完整应该被接收设备丢弃,如图:

MODBUS

非正常报文帧

注:RTU 接受驱动程序的实现,由于 t1.5 和 t3.5 的定时,隐含了大量的对中断的管理。在高速通信速率下,这导致 CPU 负担加重。因此,在通信速率等于或低于 19200bps 时,这两个定时必须严格遵守;对于波特率大于 19200bps 的情形,应该使用 2 个定时的固定值:建议的字符间超时时间(t1.5)位 750us,帧间的超时时间(t1.5)位 1.750ms。

下图表示了对 RTU 传输模式状态图的描述。“主设备”和“从设备”的不同角度均在相同的图中表示:

MODBUS

1.从“初始”态到“空闲”态转换需要 t3.5 定时超时:这保证帧间延迟。

2.“空闲”态是没有发送和接收报文要处理的正常状态。

3.在 RTU 模式,当没有活动的传输的实际间隔打达 3.5 个字符长时,通信链路被认为在“空闲”态。

4.在链路空闲时,在链路上检测到的任何传输的字符都被识别为帧起始。链路变为“活动”状态。然后,当链路上没有字符传输的时间间隔达到 t3.5 后,被识别为帧结束。

5.检测到帧结束后,完成 CRC 计算和校验。然后,分析地址域以确定帧是否发往此设备,如果不是,则丢弃此帧。为了减少接收处理时间,地址域可以在一接到就分析,而不需要等到整个帧结束。这样,CRC 计算只需要在帧寻址到该节点(包括广播帧)时进行。

CRC计算

在 RTU 模式包含一个对全部报文内容执行的,基于循环冗余校验(CRC-Cyclical Redundancy Checking)算法的错误检验域。CRC域检验整个报文的内容。不管报文有无奇偶校验,均执行此检验。

CRC 包含由两个 8 位字节组成的一个 16 位值。

CRC 域作为报文的最后的域附加在报文之后。计算后,首先附加低字节。然后是高字节。CRC 高字节为报文发送的最后一个字节。

附加在报文后面的 CRC 的值由发送设备计算。接收设备在接收报文时重新计算 CRC 的值,并将计算结果于实际接收到的 CRC 值相比较,如果两个值不相等,则为错误。

CRC 的计算,开始对一个 16位寄存器预装全“1”,然后将报文中连续的 8位字节对其进行后续的计算。只有字符中的 8 个数据位参与到生成 CRC 的运算,起始位、停止位和校验位不参与 CRC 计算。

CRC 生成的过程中,每个 8 位字符与寄存器中的值异或,然后结果向最低有效位(LSB)方向移动 1 位,而最高有效位(MSB)置 0.然后提取并检查 LSB:如果LSB 为 1,则寄存器中的值与一个固定的预置值异或;如果LSB 为 0,则不进行异或操作。

这个过程将重复直到执行完 8 次移位,完成最后一次(第八次)移位及相关操作后,下一个 8 位字节与寄存器的当前值异或,然后又同上面描述过的一样重复 8 次。当所有报文中字节都预算之后得到的寄存器中的最终值,就是 CRC。

简单代码如下:

MODBUS

MODBUS

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分