ModbusRTU的工作原理

[复制链接]
查看40161 | 回复0 | 2024-3-22 21:17:47 | 显示全部楼层 |阅读模式


点击上方蓝字关注我们


介绍

MODBUS RTU(Remote Terminal Unit)是一种在串行通信(如RS-232或RS-485)上实现的MODBUS协议。它是工业领域中最常用的通信协议之一,广泛应用于各种自动化设备和控制系统。以下是MODBUS RTU的主要特点和工作原理:
特点:

    「简单性和开放性」:MODBUS RTU是一个简单、开放的协议,由于其易于理解和实施,它被广泛采用于工业环境中。「二进制传输」:MODBUS RTU以二进制形式传输数据,这提高了数据传输的效率。「基于主从架构」:MODBUS RTU通常在主从(或客户端-服务器)架构中运行,其中一个主站(通常是控制系统或计算机)控制通信,从站(如传感器、执行器或驱动器)响应主站的请求。「串行通信」:它通过串行通信(RS-232、RS-422、RS-485等)进行数据传输,适用于短距离和低速通信。「数据和地址封装」:在MODBUS RTU中,数据包含在帧中,每个帧包括设备地址、功能码、数据以及用于错误检测的循环冗余校验(CRC)。
工作原理:

    「消息帧结构」:MODBUS RTU消息帧包括设备地址、功能码、数据和CRC校验。每个消息以一个起始位开始,并在静默期(约3.5个字符时间)后结束。「地址」:每个MODBUS RTU设备都有一个独特的地址,范围从1到247。地址0用于广播消息,所有设备都会接收但不响应。「功能码」:功能码定义了主站要求从站执行的操作,如读取数据、写入数据、诊断等。「数据传输」:数据可以是寄存器的值、状态信息或其他命令参数。「错误检测」:MODBUS RTU使用CRC校验来确保数据传输的完整性和准确性。「响应和超时」:从站收到请求后,会对请求进行处理并发送响应。如果主站在预设的时间内未收到响应,则会判断为超时。
串口报文格式

在串行通信中,尤其是在采用 MODBUS RTU 协议的情况下,报文(消息帧)遵循一定的格式。MODBUS RTU 是一种在串行线路上(如 RS-232、RS-485)使用的协议,它的报文格式设计用于高效且可靠地传输数据。以下是 MODBUS RTU 报文的基本格式:
    「起始位」:每个消息帧开始前,线路上存在一段至少为 3.5 字符时间长度的静默期。这意味着在这段时间内没有任何通信活动。「从站地址」(1字节):标识消息的目标设备。每个从站设备在MODBUS网络上有一个唯一的地址。地址范围通常是从 1 到 247。「功能码」(1字节):指定要执行的操作类型,比如读写寄存器等。「数据字段」(可变长度):包含附加信息,如寄存器的地址、要读取或写入的值等。数据字段的长度取决于功能码和操作的特定需求。「错误检查字段」(2字节):通常是一个循环冗余校验(CRC)校验码,用于确保数据传输的准确性。CRC 是根据从站地址、功能码和数据字段计算得出的。「结束间隔」:MODBUS RTU 消息帧之间有一个「至少为 3.5 字符时间长度的静默期」,用于标识消息帧的结束。

每个字节在串行通信中以二进制形式传输,包括 1 个起始位、8 个数据位、可选的奇偶校验位和 1 或 2 个停止位。这种报文格式允许 MODBUS RTU 协议在各种工业环境中高效、可靠地运作。
RTU消息帧


MODBUS RTU (Remote Terminal Unit) 消息帧是 MODBUS 协议在串行通信中的一种实现。在 MODBUS RTU 模式下,数据以二进制形式传输,每个消息帧包含多个字段,用于确保正确且可靠的通信。以下是 MODBUS RTU 消息帧的结构:
    「设备地址 (Slave Address)」

    长度:1字节。作用:指定要通信的从站设备。它的值在1到247之间,每个设备有一个唯一的地址。
    「功能码 (Function Code)」

    长度:1字节。作用:指示从站执行的动作,如读取寄存器、写入寄存器等。
    「数据 (Data)」

    长度:可变。作用:根据功能码的不同,这部分可能包含要读取的寄存器的地址和数量,或要写入的寄存器的值等。
    「错误检查 (Error Checking)」

    长度:2字节。作用:通常是一个循环冗余校验 (CRC) 码,用于检测传输错误。CRC码是基于前面的整个消息(包括设备地址、功能码和数据)计算得出。
    「开始和结束标志」

    在 MODBUS RTU 模式下,消息帧的开始和结束是通过静默间隔识别的。当线路上存在一定时间(通常是3.5个字符时间)的沉默时,这被解释为帧的结束。同样,帧的开始也是通过检测到数据后的第一个「静默间隔」来确定。

MODBUS RTU 消息帧的这种结构使其在串行通信中高效且可靠。每个帧的开始和结束不是通过特定字符,而是通过时间间隔来识别,这是串行通信的一个特点。CRC校验确保数据在传输过程中的完整性和准确性。
问答

地址为什么不是1-254或者255呢?

MODBUS RTU 协议中地址的范围限制为 1 到 247 的原因主要基于历史和实际应用的考虑。以下是一些关键点:
    「协议规范」:在 MODBUS 协议的最初设计中,地址范围被限制在 1 到 247。这是一个在协议规范中定义的标准,被广泛采用并成为通用的实践。「广播地址」:在 MODBUS 协议中,地址 0 被保留作为广播地址。当主站向地址 0 发送消息时,所有从站都会接收这条消息,但不回应。这是为了同时向多个设备发送指令而设计的。「特殊用途和保留地址」:地址 248 到 255 通常保留用于特殊用途。在某些实现中,这些地址用于诊断、配置目的或其他非标准功能。「兼容性和标准化」:保持地址范围为 1 到 247 有助于确保与各种不同制造商和设备的兼容性。由于 MODBUS 广泛应用于各种工业环境,遵循这一标准范围可以减少兼容性问题。「历史原因」:最初的 MODBUS 协议是在 1970 年代末设计的,那时的网络规模较小,247 个设备已经足够满足大多数应用场景的需求。

总之,虽然理论上地址可以扩展到更大的范围,但由于历史、标准化和实际应用的考虑,MODBUS RTU 协议中通常将地址范围限制在 1 到 247。
字符和字节是什么关系?RTU的传输方式是按字符还是字节呢?

在串行通信和特别是在 MODBUS RTU 协议中,"字符"和"字节"之间的关系非常重要,但这两个术语有时会引起混淆。「字符 vs 字节:」
    「字节」:

    字节是数据存储的基本单位,通常由8位(bits)组成。在数字通信中,一个字节可以表示256(28)种不同的状态,通常用来表示一个字符(如字母、数字或符号)。
    「字符」:

    在 MODBUS RTU 通信中,一个"字符"指的是完整的数据单位,它包括数据位、起始位、停止位,以及可能的奇偶校验位。标准的 MODBUS RTU 字符格式是:1个起始位、8个数据位、1个奇偶校验位(可选)、1个停止位。因此,一个完整的"字符"可以由10位或11位组成,取决于是否使用奇偶校验。

「RTU的传输方式:」
    在 MODBUS RTU 中,传输的基本单位是"字符",不仅仅是数据位(或字节)。这意味着每次传输包括起始位、数据位、奇偶校验位和停止位。当计算消息帧之间的间隔时间时,需要考虑整个字符的时间,而不仅仅是数据位的时间。

因此,当我们谈论 MODBUS RTU 的传输方式时,我们实际上是在讨论完整字符的传输,包括所有必要的开始、数据、校验和结束位。这种传输方式确保了数据的完整性和可靠性,特别是在串行通信环境中。MODBUS RTU 通信协议的上下文中:
    「起始位」:确实是 1 位(bit)。起始位用于标志一个字节数据的开始。「数据位」:通常是 7 或 8 位。尽管理论上串行通信可以配置为使用 5 到 8 位数据位,但在 MODBUS RTU 协议中,一般使用 8 位数据位。「奇偶校验位」:可以是 1 位或无。在 MODBUS RTU 中,可以配置为无奇偶校验(None)、偶校验(Even)或奇校验(Odd)。奇偶校验位用于错误检测。「停止位」:通常是 1 位或 2 位。在 MODBUS RTU 中,如果使用无奇偶校验,则停止位可能设置为 2 位;如果使用奇偶校验,则通常使用 1 位停止位。「注意」:在 MODBUS RTU 协议中,最常见的配置是 8 数据位、无奇偶校验(或偶校验)和 1 停止位,或者 8 数据位、奇偶校验和 1 停止位。
如何计算间隔时间呢?

在 MODBUS RTU 协议中,计算消息帧间隔时间(即帧的开始和结束标志)是基于串行通信的波特率(Baud Rate)。MODBUS RTU 使用一段沉默时间来标识消息帧的开始和结束,这段时间通常被定义为** 3.5 **个字符时间。正确计算这个间隔时间对于确保 MODBUS RTU 网络的可靠通信至关重要。「计算方法:」
    「确定波特率」:首先,您需要知道串行通信的波特率。波特率是每秒传输的符号数。例如,9600 波特率意味着每秒传输 9600 个符号。「计算每个字符的时间」:MODBUS RTU 协议中,每个字符由 11 位组成(起始位 1 位、数据位 8 位、奇偶校验位 1 位、停止位 1 位)。因此,每个字符的时间 = 11 位 / 波特率。例如,如果波特率是 9600,那么每个字符的时间是 11 / 9600 秒。「计算间隔时间」:间隔时间是 3.5 个字符时间。因此,总的间隔时间 = 3.5 × 每个字符的时间。

例如,假设您的波特率是 9600,那么间隔时间的计算将是:
    每个字符的时间 = 11 位 / 9600 波特 = 0.00114583333 秒(大约 1.1458 毫秒)。总间隔时间 = 3.5 × 0.00114583333 秒 = 0.00401041666 秒(大约 4.01 毫秒)。

这个间隔时间被用来检测消息帧的结束,并且也用于确定下一个消息帧的开始。正确设置和维护这个间隔时间是确保 MODBUS RTU 网络稳定运行的关键。

☆ END ☆

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则