Modbus通信协议

Modbus通信详解

一、Modbus协议简介

​ Modbus 通信协议是一种应用于工业自动化领域的通信协议。它最早由 Modicon 公司(现为施耐德电气的一部分)在 1979 年为其可编程逻辑控制器(PLC)开发。Modbus 协议简单、稳定且易于实现,因此在工业控制系统中得到了广泛应用。它支持主从通信模式,即一个主设备可以与多个从设备进行通信。

​ 此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一 控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消 息域格局和内容的公共格式。

​ Modbus 协议有两种主要的传输模式:Modbus RTU(Remote Terminal Unit,远程终端单元)和 Modbus TCP(Transmission Control Protocol,传输控制协议)。下面分别介绍这两种模式。

在Modbus网络上面传输

​ 标准的Modbus口是使用一RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特 率、奇偶校验。控制器能直接或经由Modem组网。

​ 控制器通信使用主—从技术,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根 据主设备查询提供的数据作出相应反应。典型的主设备:主机和可编程仪表。典型的从设备:可编程控制器。

​ 主设备可单独和从设备通信,也能以广播方式和所有从设备通信。如果单独通信,从设备返回一消息 作为回应,如果是以广播方式查询的,则不作任何回应。Modbus协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。

​ 从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。 如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。

查询——回应周期

在这里插入图片描述

(1)查询

​ 查询消息中的功能代码告之被选中的从设备要执行何种功能。数据段包含了从设备要执行功能的任何附加信息。例如功能代码03是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检测域为从设备提供了一种验证消息内容是否正确的方法。

(2)回应

​ 如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。数据段包括了从设备收集的数据:像寄存器值或状态。如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。

Modbus RTU

​ Modbus RTU 是一种基于串行通信的协议,通常使用 RS-232 或 RS-485 接口。它采用二进制数据格式,具有较高的通信速度和较低的传输延迟。

与之类似的还有一种Modbus ASCII方式,也是基于串行通信的协议,通常使用 RS-232 或 RS-485 接口。不过,Modbus ASCII 使用 ASCII 字符表示数据,而非二进制格式。

Modbus ASCII的数据帧如下:

  • 起始符:一个冒号(:)字符,表示数据帧的开始
  • 设备地址:用两个 ASCII 字符表示的从设备地址
  • 功能码:用两个 ASCII 字符表示的主设备请求的操作类型,如读取寄存器、写入寄存器等
  • 数据:根据功能码携带相应的 ASCII 字符表示的数据
  • 校验码:用两个 ASCII 字符表示的循环冗余校验(LRC)值,用于检测数据传输过程中的错误
  • 结束符:一个回车(CR)字符和一个换行(LF)字符,表示数据帧的结束

与 Modbus RTU 相比,Modbus ASCII的通信速度较慢,但具有更好的可读性和更高的容错性。然而,由于其较低的通信速度和较大的数据帧尺寸,Modbus ASCII在实际应用中的使用相对较少,更多地被Modbus RTU和Modbus TCP取代。

​ 当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit字节包含两 个4Bit的十六进制字符。这种方式的主要优点是:在同样的波特率下,可比ASCII方式传送更多的数据。

1.RTU消息帧

在这里插入图片描述

​ 传输的第一个域是设备地址。可以使用的传输字符是十 六进制的0…9,A…F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收 到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少3.5个字符时间的 停顿标定了消息的结束。一个新的消息可在此停顿后开始。 整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设 备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字 符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的 CRC域的值不可能是正确的。

示例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dYjXBXyi-1691653637689)(E:\Typora\sources\image-20230810153900072.png)]

2.设备地址

​ 消息帧的地址域包含两个字符(ASCII)或8Bit(RTU)。可能的从设备地址是0…247(十进制)。单 个设备的地址范围是(1~247)。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。

​ 地址0是用作广播地址,以使所有的从设备都能认识。当Modbus协议用于更高水准的网络,广播可能不允许或以其它方式代替

3.功能码

​ 消息帧中的功能代码域包含了两个字符8Bits(RTU)。可能的代码范围是十进制的1…255。 当然,有些代码是适用于所有控制器,有此是应用于某种控制器,还有些保留以备后用。 当消息从主设备发往从设备时,功能代码域将告之从设备需要执行哪些行为。例如去读取输入的开关状态,读一组寄存器的数据内容,读从设备的诊断状态,允许调入、记录、校验在从设备中的程序等。 当从设备回应时,它使用功能代码域来指示是正常回应(无误)还是有某种错误发生(称作异议回应)。 对正常回应,从设备仅回应相应的功能代码。对异议回应,从设备返回一等同于正常代码的代码,但最重要的位置为逻辑1

​ 例如:一从主设备发往从设备的消息要求读一组保持寄存器,将产生如下功能代码:

​ 0 0 0 0 0 0 1 1 (十六进制03H)

​ 对正常回应,从设备仅回应同样的功能代码。对异议回应,它返回:

​ 1 0 0 0 0 0 1 1 (十六进制83H)

​ 除功能代码因异议错误作了修改外,从设备将一独特的代码放到回应消息的数据域中,这能告诉主设 备发生了什么错误。 主设备应用程序得到异议的回应后,典型的处理过程是重发消息,或者诊断发给从设备的消息并报告 给操作员。

4.数据

​ 数据域是由两个十六进制数集合构成的,范围00…FF。根据网络传输模式,这可以是由一对ASCII 字符组成或由一RTU字符组成。

​ 从主设备发给从设备消息的数据域包含附加的信息:从设备必须用于进行执行由功能代码所定义的所 为。这包括了象不连续的寄存器地址,要处理项的数目,域中实际数据字节数。

​ 例如,如果主设备需要从设备读取一组保持寄存器(功能代码03),数据域指定了起始寄存器以及要 读的寄存器数量。如果主设备写一组从设备的寄存器(功能代码10十六进制),数据域则指明了要写的起 始寄存器以及要写的寄存器数量,数据域的数据字节数,要写入寄存器的数据。

​ 如果没有错误发生,从从设备返回的数据域包含请求的数据。如果有错误发生,此域包含一异议代码, 主设备应用程序可以用来判断采取下一步行动。

​ 在某种消息中数据域可以是不存在的(0长度)。例如,主设备要求从设备回应通信事件记录(功能代码0B十六进制),从设备不需任何附加的信息。

5.错误检错

CRC冗余校验:
有关CRC校验内容查看——CSDN博主「li星野」的原创文章,
原文链接:https://blog.csdn.net/qq_43441284/article/details/124945020

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值