ModbusTCP协议详解

Modbus 是一种广泛使用的通信协议,最初由 Modicon 公司在 1979 年开发,最初用于工业设备之间的通信。Modbus协议采用客户端-服务器架构,并支持多种物理层的实现,如串行(Modbus RTU)和以太网(Modbus TCP)。

Modbus TCP 是 Modbus RTU 的一种扩展,通过 TCP/IP 网络 传输数据,实现了更高效的远程通信。Modbus TCP 用于通过以太网连接工业设备,实现设备之间的通信,常见于 SCADA(监控与数据采集)系统和工业自动化领域。

1. Modbus TCP协议概述

Modbus TCP协议是基于TCP/IP协议栈的,它通过TCP端口 502 进行通信。它是一个简单的、面向请求-响应的协议,用于读取和写入工业设备(如PLC、传感器、执行器等)的数据。与传统的串行协议(如Modbus RTU)不同,Modbus TCP通过网络传输数据,支持更加灵活和高效的设备互联。

1.1 Modbus TCP的基本特性

  • 通信方式:基于TCP/IP协议,传输层采用TCP,确保了数据传输的可靠性。
  • 端口号:默认使用 502 端口进行通信。
  • 数据传输单位:Modbus通信的数据传输单位是 寄存器,每个寄存器包含16位数据。
  • 主从架构:Modbus TCP通常采用主-从架构,主设备(如SCADA系统)发起请求,设备(如PLC)响应请求。
  • 支持远程通信:通过TCP/IP网络实现远程设备之间的通信,支持局域网(LAN)和广域网(WAN)。

2. Modbus TCP协议的报文结构

Modbus TCP协议的通信数据格式分为两部分:应用数据单元(ADU) 和 Modbus协议数据单元(PDU)。在Modbus TCP中,应用数据单元(ADU)包含了Modbus协议的数据单元(PDU)以及额外的头部信息。

2.1 Modbus TCP应用数据单元(ADU)

一个Modbus TCP报文的ADU包括以下几个部分:

  1. TCP头部(7字节):由TCP协议栈负责,包含TCP的源端口、目的端口、数据长度、校验和等信息。
  2. Modbus头部(6字节):
    • Transaction Identifier(2字节):事务标识符,用于区分不同的Modbus请求。
    • Protocol Identifier(2字节):协议标识符,Modbus协议为0x0000。
    • Length(2字节):指定从这段数据开始到消息末尾的字节数,包含整个ModbusPDU的长度。
  3. ModbusPDU(协议数据单元):包含Modbus协议本身的操作内容。

2.2 ModbusPDU(协议数据单元)

Modbus PDU 是 Modbus 通信中的核心部分,它包含了 Modbus 请求和响应的具体内容。ModbusPDU根据不同的功能码进行不同的处理。一个标准的Modbus PDU结构如下:

  • Function Code(1字节):功能码,表示请求操作的类型,如读取寄存器、写寄存器等。
  • Data:功能码相关的数据,具体内容根据功能码的不同而不同。

3. Modbus TCP的功能码

Modbus协议通过功能码来指示请求的具体操作,Modbus TCP协议也继承了这一特性。常见的功能码包括:

  • 0x01 – 读取线圈状态(Read Coils)
  • 0x02 – 读取离散输入(Read Discrete Inputs)
  • 0x03 – 读取保持寄存器(Read Holding Registers)
  • 0x04 – 读取输入寄存器(Read Input Registers)
  • 0x05 – 写单个线圈(Write Single Coil)
  • 0x06 – 写单个保持寄存器(Write Single Register)
  • 0x0F – 写多个线圈(Write Multiple Coils)
  • 0x10 – 写多个保持寄存器(Write Multiple Registers)

每个功能码执行特定的操作,Modbus TCP通过这些功能码实现数据的读取、写入、状态查询等任务。

3.1 常见功能码解释

  1. 功能码 0x03:读取保持寄存器(Read Holding Registers)
    • 用于从PLC等设备的保持寄存器中读取数据,返回值为16位寄存器值。
    • 请求格式:
      请求:[设备地址] + [功能码 0x03] + [起始寄存器地址] + [寄存器数量]
      响应:[设备地址] + [功能码 0x03] + [字节数] + [寄存器数据]
  2. 功能码 0x06:写单个保持寄存器(Write Single Register)
    • 用于向PLC设备的单个保持寄存器写入数据。
    • 请求格式:
      请求:[设备地址] + [功能码 0x06] + [寄存器地址] + [寄存器数据]
      响应:[设备地址] + [功能码 0x06] + [寄存器地址] + [寄存器数据]
  3. 功能码 0x10:写多个保持寄存器(Write Multiple Registers)
    • 用于一次性写入多个寄存器的值。
    • 请求格式:
      请求:[设备地址] + [功能码 0x10] + [起始寄存器地址] + [寄存器数量] + [字节数] + [数据]
      响应:[设备地址] + [功能码 0x10] + [起始寄存器地址] + [寄存器数量]

4. Modbus TCP通信流程

Modbus TCP通信是基于客户端-服务器模型的。通信的过程一般遵循以下步骤:

  1. 建立TCP连接:客户端(如SCADA系统)和服务器(如PLC)通过TCP/IP网络建立连接,默认端口为502。
  2. 发送请求:客户端发送Modbus请求,内容包括目标设备地址、功能码、寄存器地址等信息。
  3. 设备响应:服务器接收到请求后,按照功能码和地址操作并返回相应的数据或确认信息。
  4. 关闭连接:请求和响应完成后,客户端与服务器可以关闭连接,或者保持长连接进行后续通信。

5. Modbus TCP的应用场景

Modbus TCP协议广泛应用于工业自动化和控制系统中,特别是在需要远程监控和控制的场景。常见应用场景包括:

  • SCADA系统:Modbus TCP可以将PLC、传感器、执行器等设备通过网络连接到SCADA系统,实现远程监控与数据采集。
  • 智能电表:Modbus TCP被用于读取电表数据,例如电流、电压、功率等。
  • 工业自动化:通过Modbus TCP控制工厂中的各种设备,如电机、阀门、传感器等。
  • 楼宇自动化:在HVAC(供暖、通风和空调)、照明、安防等楼宇控制系统中,Modbus TCP用于设备间的通信。

6. Modbus TCP协议的优缺点

优点:

  • 简单易用:Modbus协议非常简单,易于实现和调试。
  • 广泛支持:Modbus协议在工业自动化领域非常流行,许多设备和软件都支持Modbus。
  • 低成本:Modbus TCP基于以太网,网络硬件成本相对较低。
  • 可靠性高:基于TCP/IP协议,通信可靠、无错误,且具备自动重试机制。

缺点:

  • 数据传输速度较慢:相比其他更现代的协议(如Ethernet/IP),Modbus TCP的速度较慢,适用于低速数据采集。
  • 没有内建安全机制:Modbus协议本身没有安全性设计,容易受到攻击,如中间人攻击(MITM)。
  • 无法支持复杂数据类型:Modbus协议只能处理基本的二进制、整数和浮点数等数据类型,无法处理复杂数据结构。

7. 总结

Modbus TCP是一种基于TCP/IP协议的通信协议,广泛用于工业自动化、SCADA、楼宇自动化等领域。其简洁、稳定、可靠的特点使其在工业环境中得到了广泛的应用。尽管它存在一些局限性,如安全性问题和较低的传输速度,但由于其