2. Modbus协议基础与环保设备通信

在环保远程监控系统中,数据采集器、数采仪或边缘网关需要与现场各类环保设备交换数据,而 Modbus 是其中出现频率最高的现场总线协议之一。理解 Modbus 的帧结构、功能码、寄存器类型以及常见接口参数,是后续完成“数据映射”的前提——只有先知道设备把某个量放在哪个寄存器、用什么功能码读取、走什么物理接口,才能把它准确映射到监控平台的指标上。

一、Modbus RTU 与 Modbus TCP 的帧结构差异

Modbus 有两种主流传输形态:串行链路上的 Modbus RTU 和以太网上的 Modbus TCP。两者共享同一套功能码与寄存器语义,但帧格式不同。

Modbus RTU 帧由四部分组成:从站地址(1 字节)、功能码(1 字节)、数据域(N 字节)、CRC 校验(2 字节,低字节在前)。帧与帧之间依靠至少 3.5 个字符时间的静默间隔来界定边界,因此串口参数(波特率、数据位、校验位、停止位)必须与设备严格一致,否则会出现“收到乱码”或“CRC 错误”。

Modbus TCP 帧则由 MBAP 报文头(7 字节)加 PDU 组成。MBAP 包含事务标识符(2 字节)、协议标识符(2 字节,Modbus 固定为 0)、长度字段(2 字节)和单元标识符(1 字节)。TCP 依靠长度字段定界,不再需要 CRC,也不需要静默间隔。单元标识符在直连设备时可填 1,在经过串口服务器转换时则用于标识后端 RTU 从站地址。

Modbus RTU 与 Modbus TCP 帧结构对比 Modbus RTU 帧(串行链路) 从站地址 1 字节 功能码 1 字节 数据域 N 字节(起始地址/数量/值) CRC 校验 2 字节(低字节在前) 帧边界:≥3.5 字符静默间隔;串口参数须与设备一致 Modbus TCP 帧(以太网) 事务标识 2 字节 协议标识 2 字节=0 长度 2 字节 单元标识 1 字节 功能码 1 字节 数据域 N 字节 MBAP 报文头共 7 字节;靠长度字段定界,无 CRC 共同语义:功能码 + 寄存器地址 + 数量/数值 → 决定“读什么、读多少、写什么” RTU 与 TCP 仅传输封装不同,PDU 含义一致,映射逻辑可复用

二、功能码:读写的“动词”

功能码决定主站要做什么操作。环保监控中最常用的是以下几类:

  • 01(读线圈):读取开关量输出状态,如设备启停、报警输出继电器状态。
  • 02(读离散输入):读取开关量输入,如门禁状态、液位开关、故障干接点。
  • 03(读保持寄存器):读取可读写的 16 位寄存器,是模拟量参数的主力,如 COD 浓度、流量、温度、量程设置。
  • 04(读输入寄存器):读取只读的 16 位寄存器,常用于实时测量值。
  • 05 / 06(写单个线圈 / 单个寄存器):用于下发单个控制命令或修改单个参数。
  • 15 / 16(写多个线圈 / 多个寄存器):批量下发控制字或参数组。

需要特别注意:功能码 03 与 04 在语义上区分“可读写”与“只读”,但很多环保设备厂商并不严格遵循,实际以设备手册的寄存器表为准。映射前必须核对手册中每个点位标注的功能码,不能凭经验猜测。

三、寄存器类型与地址约定

Modbus 数据模型包含四类对象:线圈(0x 区)、离散输入(1x 区)、输入寄存器(3x 区)、保持寄存器(4x 区)。工程上常见的“40001”这类五位数地址,是传统 PLC 地址表示法,其中 4 表示保持寄存器区,0001 表示区内偏移。而协议帧中实际传输的是从 0 开始的偏移地址,因此 40001 对应帧内地址 0,40002 对应 1,依此类推。这个“地址偏移 1”的问题,是现场调试中最常见的错位来源之一。

此外,一个 16 位寄存器只能表示 0~65535 的整数。环保设备中的 COD、氨氮等参数常带小数,厂商通常约定缩放因子,例如寄存器值 1234 表示 12.34 mg/L(除以 100)。也有设备用两个连续寄存器组成 32 位浮点数,此时还涉及字序(高字在前或低字在前)问题,需在映射时明确标注。

四、环保设备常见通信接口与参数配置

现场环保设备(如水质在线监测仪、CEMS 烟气分析仪、流量计、PLC 控制柜)常见的物理接口有三类:

  • RS-485 两线制:最普遍,支持多点总线,一台网关可挂多台从站。典型参数为 9600 bit/s、8 数据位、无校验、1 停止位(写作 9600-8-N-1),部分设备用 19200 或偶校验。
  • RS-232:点对点,多用于设备调试口或老式仪表。
  • 以太网 RJ45:新型数采仪和分析仪多支持 Modbus TCP,默认端口 502,需配置 IP、子网掩码、网关。

串口服务器是常见的中介设备:它把 RS-485 上的 RTU 从站转换为 TCP 访问,此时网关侧使用 Modbus TCP,单元标识符填写后端从站地址。配置时要保证串口服务器的波特率、校验位与从站一致,并注意其“RTU 转 TCP”模式下的超时与帧间隔参数。

配置检查顺序建议:先确认物理接线(A/B 线是否反接、终端电阻是否接入),再核对串口参数,然后用单点读测试验证功能码与地址,最后才批量映射。跳过单点验证直接批量配置,往往会把接线问题误判为地址问题。

五、一次典型的读取过程与结果判读

假设某水质监测仪手册标明:COD 值位于保持寄存器 40007,功能码 03,缩放因子 0.01,单位 mg/L。网关以 RTU 方式读取,从站地址为 3,串口 9600-8-N-1。主站发出的请求 PDU 为:功能码 03,起始地址 0x0006(即 40007 的区内偏移 6),寄存器数量 0x0001。设备正常响应时返回功能码 03、字节数 02、数据 0x04D2(即十进制 1234),映射后 COD = 1234 × 0.01 = 12.34 mg/L。

若返回的功能码为 0x83(即 03 的最高位置 1),说明设备返回异常,随后一个字节为异常码:01 表示非法功能码,02 表示非法数据地址,03 表示非法数据值,04 表示从站设备故障。现场遇到 0x83 02,优先检查寄存器地址是否偏移错位或该点位是否真实存在;遇到超时无响应,则优先检查从站地址、波特率、接线极性。

请求(主站→从站): 03 03 00 06 00 01 + CRC
响应(从站→主站): 03 03 02 04 D2 + CRC
映射结果: 0x04D2 = 1234 → 1234 × 0.01 = 12.34 mg/L