快速了解Modbus协议
文章目录
- 快速了解Modbus协议
- 1、为何 Modbus 如此受欢迎
- 2、范围和数据速率
- 3、逻辑电平
- 4、层数
- 5、网络与通讯
- 6、数据帧格式
- 7、数据类型
- 8、服务器如何存储数据
- 9、总结
Modbus 是一种流行的低速串行通信协议,广泛应用于自动化行业。 该协议由 Modicon(现已被施耐德电气收购)于 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 兼容设备与任何工业自动化系统 (IAS) 或楼宇管理系统 (BMS) 轻松集成。
1、为何 Modbus 如此受欢迎
Modbus 被许多不同行业的制造商使用,并且因其简单性而变得相当流行。 它是一个开放标准; 因此,制造商可以将 RTU 版本的 Modbus 内置到他们的设备中,而无需支付任何使用费。 该协议甚至可以在 Arduino 等原型板上实现。 事实上,该通信协议可以在任何微控制器或计算机上轻松实现。 数据通信通过请求-响应方式进行,消息具有固定的帧格式。
Modbus 协议最初是作为应用层协议开发的,用于通过串行层传输数据,目前有三个版本:两个用于串行线路 — Modbus RTU 和 Modbus ASCII;两个用于串行线路 — Modbus RTU 和 Modbus ASCII;两个用于串行线路 — Modbus RTU 和 Modbus ASCII。 一种用于以太网(TCP/IP 和 UDP)——Modbus TCP。 虽然相对简单,该协议仍然能够进行消息检查,并且准确率超过 99%。 Modbus RTU 具有循环冗余校验和 (CRC),Modbus ASCII 具有用于错误检查的纵向冗余校验 (LRC)。
尽管该协议诞生于 20 世纪 70 年代,但其实施只需要极少的 RAM 和内存资源。 在 20 世纪 70 年代,计算机技术以及嵌入式技术还没有今天那么先进,像 Modbus 这样的轻量级协议尤其有吸引力。 Modbus 的受欢迎程度从未下降。
2、范围和数据速率
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 米。
3、逻辑电平
在 Modbus 上,二进制 0 由 +2 至 +6V 的电压电平表示。 二进制1由-2至-6V的电压电平表示。
4、层数
最初,Modbus 是在串行层上实现的单一协议。 当为以太网实现协议时,引入了应用数据单元,以便能够通过串行以及 TCP/IP 和 UDP 网络实现。 该协议现在分为两层——核心层和网络层。 核心层定义协议数据单元(PDU),而网络层定义应用数据单元(ADU)。 即使没有定义任何应用数据单元,PDU也可以通过UDP网络传输。
Modbus 的串行版本(即 Modbus RTU 和 Modbus ASCII)仅需要 PDU,而以太网版本(即 Modbus TCP)则需要 PDU 和 ADU。
5、网络与通讯
Modbus 是一种以主从配置实现的请求-响应协议。 有两种类型的设备 - Modbus 客户端和 Modbus 服务器。 Modbus 客户端是主站,通常是 SCADA 系统或 HMI 中的监控计算机。 Modbus 服务器是从站,通常是远程终端单元,例如传感器模块、PLC 和 PAC。
Modbus 的串行版本支持单个客户端与最多 247 个 Modbus 服务器的通信。 由于 RS-485 和 RS-232 端口都是 Modbus 实现的通用端口,如果使用 RS-232 端口,Modbus 服务器的最大数量可达 247 个,但如果使用 RS-485 端口,则最大 Modbus 服务器数量可达 247 个。 由于 RS-485 标准的实际限制,Modbus 服务器限制为 32 个。 可以有多个客户端和无限的服务器,因为 Modbus 的以太网版本具有用于互联网路由的附加 6 字节标头
整个数据通信由Modbus客户端通过请求-响应的方式控制。 在 Modbus 中,数据被传输为字节。 在 RTU 版本中,每个字节都编码在一个 11 位异步帧中,该帧由起始位、数据字节、偶校验和一个停止位组成。 在 ASCII 版本中,每个字节都编码在 10 位帧中,该帧由起始位、7 位数据、1 位偶数或奇数奇偶校验或无位(如果没有奇偶校验)以及 1 个停止位(如果使用奇偶校验)组成 2 停止位。
主设备/客户端和从设备/服务器之间传递的消息称为协议数据单元(PDU)。 PDU 由从机地址、功能代码(命令)、数据和校验和(CRC 或 LRC)组成。
主设备向由从设备地址标识的从设备之一发送请求。 从机地址为一字节长,可以是 0 到 255 之间的值。根据协议,从机地址 0 保留用于广播消息,标识从机设备的从机地址不能超过 247。功能代码也是一字节 长,它告诉被寻址的从设备必须采取什么样的操作。 1~255范围内的功能码有效,其中128~255保留用于异常响应。 该操作是读取或写入操作,请求中的数据借此提供执行该操作所需的附加信息。 例如,它可以指定从哪里开始读取以及必须读取多少数据。 RTU 版本采用CRC 进行错误检查,而ASCII 版本采用LRC 进行错误检查。
当主设备向寻址的从设备发出请求时,它会发回响应。 从机地址和功能代码在同一响应中回显。 数据包含主站请求的值。 如果在执行请求的操作时发生错误,则功能代码将被修改,并且数据包含描述错误的代码。 同样,分别根据 RTU 或 ASCII 帧的 CRC 或 LRC 用于确保消息或 PDU 的完整性。
6、数据帧格式
在 RTU 成帧中,每个字节代表 11 位帧中的两个 4 位十六进制字符。 PDU 由 1 字节长的从机地址、1 字节长的功能码、0 至 252 字节长的数据和 2 字节长的 CRC 组成。
在 ASCII 帧中,每个字节代表 10 位帧中的两个 ASCII 字符。 PDU 由 1 个字符长的起始字符、2 个字符长的从机地址、2 个字符长的功能代码、0 至 504 个字符长的数据、2 个字符长的 LRC 和 2 个字符长的结束字符组成。 起始字符始终为冒号 (😃 或 ASCII 3A 十六进制。 结束字符始终是带有换行符的回车符(ASCII 0D 和 0A 十六进制)。 RTU 中的每个 PDU 以及 ASCII 版本均由 28 位或 3.5 个字符分隔。
Modbus 的 RTU 和 ASCII 版本几乎相似,除了一些差异之外。 在 RTU 成帧中,字节以二进制形式表示,而在 ASCII 成帧中,字节以可读的 4 位 ASCII 字符表示。 ASCII 帧具有文本开始和文本结束字符,而在 RTU 帧中,PDU/消息之间的 28 位分隔被解释为检测帧的开始和结束。 由于 RTU 成帧使用较短的消息,因此它比 ASCII 版本更快。 ASCII 版本确实有一个优点,即消息中的字符之间最多可以间隔一秒。 如果间隔超过一秒,设备将视为传输错误。
TCP版本的Modbus中的PDU由2字节长的事务ID、2字节长的协议字段、2字节长的长度字段、1字节长的从机地址和1到252字节长的协议字段组成。 消息字段。
事务 ID 标识事务,协议始终设置为 0 以指示 Modbus。 长度表示后面的字节数。 接下来是 1 字节长的从机地址。 消息字段是类似于Modbus帧的RTU版本,由功能代码和数据组成。 消息字段的最大大小可以是 253 字节(即功能代码为 1 字节,数据如 RTU 帧中最大为 252 字节)。
在所有版本(RTU、ASCII 和 TCP)中,最低有效位首先发送。Modbus 兼容设备无法自动检测波特率,因此需要在总线的客户端和服务器端显式设置相同的波特率。 Modbus PDU 支持的格式只能发送数据,无法跨通信设备发送参数。
7、数据类型
Modbus 中有两种类型的数据——线圈( Coils)和寄存器(Registers)。 线圈是单个位,可以是 0(关)或 1(开)。 线圈可以是离散的输出线圈或离散的输入触点。 离散输入触点是物理离散输入的状态,即“开”或“关”。 离散输出线圈是物理离散输出信号的状态,即 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兼容设备都不是输入/输出设备,因此输入寄存器也用于存储数据。
8、服务器如何存储数据
在传感器模块、PLC 或 PAC 等 Modbus 服务器上,数据被组织到四个表或数据库中。 有两个数据库用于存储离散的开/关值或线圈。 这些数据库分别存储离散输出线圈和离散输入触点。 然后,有两个存储数值的数据库或寄存器,分别存储模拟输入寄存器和模拟输出保持寄存器。
每个数据库可存储 9999 个值。 例如,离散输出线圈和离散输入触点的数据库可以分别存储 0000 到 270E 范围内的 9999 位。 模拟输入寄存器和模拟输出保持寄存器的数据库可存储 9999 个字,每个字的范围为 0000 至 270E,每个字为 16 位长。
离散量输出线圈和模拟量输出保持寄存器的数据库是读写型的,而离散量输入触点和模拟量输入寄存器的数据库是只读型的。
数据库中的值可以通过位置名称来访问。 离散量输出线圈、离散量输入触点、模拟量输入寄存器和模拟量输出保持寄存器的数据库位置分别为 19999、1000119999、30001~39999 和 40001~49999。 下表总结了 Modbus 服务器上四个数据库的结构和性质。
9、总结
Modbus 是一种广泛使用的工业通信协议,通常与 PLC 一起使用。 该协议具有三个版本:RTU、ASCII 和 Modbus。 RTU 版本是开放标准且速度最快,最常被制造商使用。 对于较短的消息,RTU 帧的 Modbus 消息可以以 100 毫秒的间隔更新。 几乎所有商业 HMI、SCADA、OPC 服务器和数据采集软件都支持 Modbus,因此可以轻松地将 Modbus 兼容设备集成到任何工业自动化系统或楼宇管理系统中。