Modbus 是一种流行的低速串行通信协议,广泛应用于自动化行业。该协议由 Modicon(现被 Schneider Electric 收购)于 1979 年为其自己的可编程逻辑控制器开发。该协议用作 PLC 和智能自动化设备之间的链接。Modbus 现在是一个由 Modbus 组织维护的开放协议,从一开始就在自动化工程师中非常流行。该协议广泛用于工业监控,尤其是 PLC。

串行协议基于主从配置,能够设置 Modbus 客户端与多达 247 个 Modbus 服务器的通信。设备上的物理接口通过标准 RS-485 或 RS-232 端口实现。总线是屏蔽或非屏蔽双绞线电缆,两端电阻为 150 欧姆。使用 9 针 D 型外壳、螺丝端子或 RJ-45 连接器,可以轻松地将电缆连接到设备。

Modbus 是使用菊花链或分接头的点对点或多点网络。Modbus 网络中的整个通信由主站(即 Modbus 客户端)控制和管理。Modbus 广泛用于连接仪器和控制设备与控制器或数据收集设备。通常,数据收集设备或 Modbus 客户端是人机界面 (HMI) 或监控和数据采集 (SCADA) 系统中的监控计算机。包括传感器模块、可编程逻辑控制器(PLC)或可编程自动化控制器(PAC)在内的远程终端单元(RTU)是Modbus服务器。几乎所有商业 HMI、SCADA、OPC 服务器都支持 Modbus,

为什么 Modbus 如此受欢迎

Modbus 被许多不同行业的制造商使用,并且由于其简单性而变得非常流行。它是一个开放标准;因此,制造商可以在他们的设备中构建 Modbus 的 RTU 版本,而无需支付任何专利费。该协议甚至可以在 Arduino 等原型板上实现。事实上,通信协议可以很容易地在任何微控制器或计算机上实现。数据通信通过请求-响应进行,消息具有固定的帧格式。

最初开发为在串行层上传输数据的应用层协议,目前有三个版本的 Modbus 协议:两个用于串行线路——Modbus RTU 和 Modbus ASCII;一种用于以太网(TCP/IP 和 UDP)——Modbus TCP。虽然相对简单,但该协议仍然支持消息检查,准确率超过 99%。Modbus RTU 具有循环冗余校验和 (CRC),而 Modbus ASCII 具有用于错误检查的纵向冗余校验 (LRC)。

尽管该协议始于 1970 年代,但该协议的实施需要最少的 RAM 和内存资源。在 20 世纪 70 年代,当计算机技术和嵌入式技术还没有今天那么先进时,像 Modbus 这样的轻量级协议特别有吸引力。Modbus 的流行度从未下降。

35cf39ab15a84013a1548d7151af32b6~noop.image?_iz=58558&from=article.jpg

范围和数据速率

Modbus 的标准数据速率为 9600 b/s 或 19.2 kb/s。通常,默认速率为 19.2 kb/s。数据速率可以降低到 4800 b/s、2400 b/s 等。最大数据速率为 115.2 kb/s。在 9600 b/s 的标准数据速率下,Modbus 的最大范围可达 1000 米。如果数据速率增加,则范围会缩小。抽头长度应始终小于 20 米。

逻辑电平

在 Modbus 上,二进制 0 由 +2 至 +6V 的电压电平表示。二进制 1 由 -2 到 -6V 的电压电平表示。

最初,Modbus 是在串行层上实现的单一协议。当为以太网实现协议时,引入了应用程序数据单元以支持通过串行以及 TCP/IP 和 UDP 网络实现。该协议现在分为两层——核心层和网络层。核心层定义协议数据单元(PDU),而网络层定义应用数据单元(ADU)。即使没有定义任何应用程序数据单元,PDU 也可以通过 UDP 网络传输。

Modbus 的串行版本(即 Modbus RTU 和 Modbus ASCII)只需要 PDU,而以太网版本(即 Modbus TCP)则需要 PDU 和 ADU。

aa2cfed82cb2465e9c175b6dc21ffb57~noop.image?_iz=58558&from=article.jpg

网络和通信

Modbus 是一种在主从配置中实现的请求-响应协议。有两种类型的设备——Modbus 客户端和 Modbus 服务器。Modbus Client 是主机,通常是 SCADA 系统或 HMI 中的监控计算机。Modbus 服务器是从站,通常是远程终端单元,如传感器模块、PLC 和 PAC。

Modbus 的串行版本支持单个客户端与多达 247 个 Modbus 服务器的通信。由于 RS-485 和 RS-232 端口对于 Modbus 实施是通用的,如果使用 RS-232 端口,Modbus 服务器的最大数量可以达到 247 个,但是如果使用 RS-485 端口,最大数量由于 RS-485 标准的实际限制,Modbus 服务器被限制为 32 个。可以有多个客户端和无限的服务器,因为以太网版本的 Modbus 有一个额外的 6 字节标头用于互联网路由

整个数据通信由Modbus客户端通过请求-响应的方式进行控制。在 Modbus 中,数据以字节形式传输。在 RTU 版本中,每个字节都编码在一个 11 位异步帧中,该帧由起始位、数据字节、偶校验位和一个停止位组成。在 ASCII 版本中,每个字节都编码在一个 10 位帧中,该帧由一个起始位、7 位数据、1 位偶数或奇数奇偶校验或无奇偶校验位组成,如果使用奇偶校验则为 1 位停止位 2停止位。

主/客户端和从/服务器之间通信的消息称为协议数据单元 (PDU)。PDU 由从机地址、功能代码(命令)、数据和校验和(CRC 或 LRC)组成。

主机向由从机地址标识的其中一个从机发送请求。从地址是一个字节长,可以有一个介于0和255之间的值。根据协议,从地址0是为广播消息保留的,标识从设备的从地址不能超过247。功能代码也是一个字节long,它告诉被寻址的从设备必须采取什么样的行动。1~255 范围内的功能码有效,其中128~255 为异常响应预留。该操作是读取或写入操作,请求中的数据借此提供执行该操作所需的附加信息。例如,它可能指定从哪里开始读取以及必须读取多少数据。CRC在RTU版本中用于错误校验,

当主机向寻址的从机发出请求时,它会发回响应。从站地址和功能代码在同一响应中回显。数据包含主站请求的值。如果在执行请求的操作时发生错误,则修改功能代码并且数据包含描述错误的代码。同样,CRC 或 LRC 分别取决于 RTU 或 ASCII 帧,用于确保消息或 PDU 的完整性。

在 RTU 帧中,每个字节代表 11 位帧中的两个 4 位十六进制字符。PDU由1字节长的从地址、1字节长的功能码、0到252字节长的数据和2字节长的CRC组成。

bb6351bdd8b54ccf9c9e611e07ff2135~noop.image?_iz=58558&from=article.jpg

在 ASCII 帧中,每个字节代表 10 位帧中的两个 ASCII 字符。PDU由1个字符长的Start字符、2个字符长的从机地址、2个字符长的功能码、0到504个字符长的数据、2个字符长的LRC和2个字符长的End字符组成。起始字符始终是冒号 ( 或 ASCII 3A 十六进制。结束字符始终是带换行符的回车符(ASCII 0D 和 0A 十六进制)。RTU 和 ASCII 版本中的每个 PDU 由 28 位或 3.5 个字符分隔。

aec6557382cc435382fab928e56f94df~noop.image?_iz=58558&from=article.jpg

Modbus 的 RTU 和 ASCII 版本几乎相似,只有少数差异。在 RTU 帧中,字节以二进制形式呈现,而在 ASCII 帧中,字节以可读的 4 位 ASCII 字符形式呈现。ASCII 帧具有文本开始和文本结束字符,而在 RTU 帧中,PDU/消息之间的 28 位分隔被解释为检测帧的开始和结束。由于 RTU 成帧使用较短的消息,因此它比 ASCII 版本更快。ASCII 版本确实有一个优势,即消息中的字符之间最多可以间隔一秒。如果间隔超过一秒,则设备将其视为传输错误。

TCP版本Modbus中的PDU由2字节长的事务ID、2字节长的协议字段、2字节长的长度字段、1字节长的从机地址、1到252字节长的消息字段。

20b0feef02c243e099a9ac35c923545b~noop.image?_iz=58558&from=article.jpg

事务 ID 标识事务,协议始终设置为 0 以指示 Modbus。长度表示后面的字节数。随后是一个 1 字节长的从机地址。消息字段是类似于 Modbus 帧的 RTU 版本,由功能代码和数据组成。消息字段的最大大小可以为 253 字节(即功能代码为 1 字节,数据最大为 252 字节,如 RTU 帧)。

在所有版本中首先发送最低有效位 — RTU、ASCII 和 TCP,Modbus 兼容设备无法自动检测波特率,因此需要在总线的客户端和服务器端明确设置相同的波特率。Modbus PDU 支持一种只能发送数据而不能跨通信设备发送参数的格式。

数据类型

Modbus 中有两种数据类型——线圈和寄存器。线圈是单个位,可以是 0(关)或 1(开)。线圈可以是离散输出线圈或离散输入触点。离散输入触点是物理离散输入的状态,为 ON 或 OFF。离散输出线圈是物理离散输出信号的状态,为 ON 或 OFF。

这些寄存器是 16 位无符号寄存器,可以包含表示浮点数、ASCII 文本、队列或表的值。寄存器本身仅存储 0 到 65535 范围内的正值,即 0x0000 到 0xFFFF 十六进制。存储在寄存器中的 16 位数据可以被 Modbus 客户端解释为 16 位无符号整数、16 位有符号整数、2 个字符的 ASCII 字符串或离散的 ON/OFF 值。存储在寄存器中的 32 位数据可以被 Modbus 客户端解释为 32 位无符号整数、32 位有符号整数、4 字符 ASCII 字符串或 32 位双精度浮点数。

有两种类型的寄存器——模拟输入寄存器和模拟输出保持寄存器。与离散输入触点(线圈)一样,输入寄存器将外部输入的状态存储为 0 到 65535(0x0000 到 0xFFFF)之间的值。过去,输入寄存器通常用于存储模拟输入值的数字表示,可以是电压或电流信号。输出保持寄存器用于在设备上存储数据。现在,由于大多数Modbus兼容设备都不是输入/输出设备,因此输入寄存器也用于存储数据。

服务器如何存储数据

在传感器模块、PLC 或 PAC 等 Modbus 服务器上,数据被组织到四个表或数据库中。有两个数据库用于存储离散的开/关值或线圈。这些数据库分别存储离散输出线圈和离散输入触点。然后,有两个存储数值的数据库或分别存储模拟输入寄存器和模拟输出保持寄存器的寄存器。

每个数据库可以存储 9999 个值。例如,离散输出线圈和离散输入触点的数据库可以存储 9999 个位,范围从 0000 到 270E。模拟输入寄存器和模拟输出保持寄存器的数据库可以存储 9999 个字,范围从 0000 到 270E,每个字为 16 位长。

离散量输出线圈和模拟量输出保持寄存器的数据库为读写型,而离散量输入接点和模拟量输入寄存器的数据库为只读型。

数据库中的值通过位置名称访问。离散输出线圈、离散输入接点、模拟输入寄存器、模拟输出保持寄存器的数据库位置分别为1~9999、10001~19999、30001~39999、40001~49999。下表总结了 Modbus 服务器上四个数据库的结构和性质。

217cfc0a4e564835b6c3b0d537fef495~noop.image?_iz=58558&from=article.jpg

结论

Modbus 是一种广泛使用的工业通信协议,通常与 PLC 一起使用。该协议具有三个版本——RTU、ASCII 和 Modbus。RTU 版本是开放标准且最快的,最常被制造商使用。对于较短的消息,RTU 帧的 Modbus 消息可以 100 毫秒的间隔更新。几乎所有商业 HMI、SCADA、OPC 服务器和数据采集软件都支持 Modbus,因此可以轻松地将 Modbus 兼容设备集成到任何工业自动化系统或楼宇管理系统中。