首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >工业以太网温湿度传感器运维全解:Modbus TCP原理、抓包分析与异常处理

工业以太网温湿度传感器运维全解:Modbus TCP原理、抓包分析与异常处理

原创
作者头像
HONSOR盛世宏博
发布于 2026-10-22 10:54:55
发布于 2026-10-22 10:54:55
700
举报

工业以太网温湿度传感器运维全解:Modbus TCP原理、抓包分析与异常处理

物联网 · 盛世宏博 · 工业以太网温湿度传感器 · Modbus TCP · Wireshark排障 · 动环运维

关键词:Modbus TCP、MBAP、事务标识符、读保持寄存器、异常码0x83、TCP连接池、STALE/OFFLINE、字节序、端口镜像、边缘网关 标签:#物联网 #Modbus #TCP/IP #POE供电 #腾讯云 #Python #Wireshark #以太网温湿度传感器 #网口温湿度变送器 #机房监控

一、Modbus TCP 在温湿度传感器里到底是什么

工业以太网温湿度传感器通常扮演 Modbus TCP Server:

  • 监听 502(也可厂家自定义端口)
  • 主站(网关/SCADA/Python脚本)发起 TCP 连接 → 发 MBAP+PDU → 设备回温度/湿度/露点/状态字
  • 没有 CRC(RTU 才有),可靠性由 TCP 保证;但应用层语义错误(地址错、Unit ID错、缩放错)TCP 管不了

四种数据对象要分清:

数据对象

功能码

温湿度场景

Coils 线圈

01/05/0F

启停加热膜、复位告警

Discrete Inputs

02

门磁/水浸输入(少数设备)

Input Registers

04

只读测量值(温度/湿度/露点)

Holding Registers

03/06/10

设定值、阈值、采样周期、设备参数

很多传感器温度放 Input Registers(04),设定值放 Holding Registers(03);用 03 去读“当前温度”也可能能读出来,但是否支持要看设备点表。


二、报文结构:MBAP + PDU

读“温度+湿度”两个寄存器:

代码语言:javascript
复制
00 01  00 00  00 06  01  03  00 00  00 02
│││   │││   │││   │   │   │││   │││
TID   Prot  Len   Unit FC  Start Count
  • Transaction ID(2B):主站生成,设备原样回;用于匹配请求/响应
  • Protocol ID(2B):Modbus TCP 固定 0000,非零=网关/固件异常
  • Length(2B):1(Unit) + PDU长度,大端
  • Unit ID(1B):直连传感器常填 1;网关后面挂 RS485 时用于选从站
  • PDU:功能码 + 数据,和 RTU 一致

正常响应:

代码语言:javascript
复制
00 01 00 00 00 05 01 03 02 00FA 012C
                              ││    ││
                          字节数  temp  hum
                          250→25.0℃  300→30.0%RH

三、Wireshark 抓包:端口镜像 + 过滤

交换机把传感器口/网关口镜像到抓包口:

代码语言:javascript
复制
# 华为
observe-port 1 interface GigabitEthernet0/0/24
interface GigabitEthernet0/0/11
 mirror to observe-port 1 both

Wireshark 过滤:

代码语言:javascript
复制
tcp.port == 502
ip.addr == 192.168.110.11 && tcp.port == 502
modbus

看三件事:

  1. TCP 握手:一直 SYN_SENT 没 SYN_ACK → 端口没开 / 防火墙拦 / IP 冲突
  2. Modbus 响应:功能码最高位被置 1(0x03→0x83)就是异常响应
  3. 字节序/缩放:原始值 0x00FA 是 250 还是 25.0,必须对照手册

四、异常响应:0x83 不是“通信坏了”,是“设备拒绝”

异常规则:原功能码 OR 0x80。

0x03 → 0x83,后面跟 1 字节异常码:

异常码

含义

温湿度传感器现场含义

0x01

Illegal Function

设备不支持该功能码

0x02

Illegal Data Address

40001 没减 1、地址越界、Input/Holding 区搞反

0x03

Illegal Data Value

读数量=0、>125、写值超范围、浮点没对齐

0x04

Slave Device Failure

MCU 看门狗、探头自检失败、固件卡死

0x06

Slave Busy

固件升级/自校准中

0x0A/0x0B

Gateway 类

串口网关找不到后端 RS485 从站

经验:有 0x83 说明 TCP 通了、设备活着,别再去查网线;去查地址基(0-based/1-based)、寄存器区、数量、Unit ID。

经典翻车:40001 ≠ 0x0001

  • 组态软件写 40001 → 协议帧里发 0x0000
  • pymodbus/NModbus 里直接传 0
  • 传成 1 → 读出来是湿度/状态字,温度“显示 1562℃”

五、Ping 通但没数据:五段定位法

  1. 物理/POE:Link 灯、PoE 电压 44~57V、水晶头 T568B 一致
  2. 链路层:交换机端口 CRC 错误、双工不匹配(强制 100M Full)
  3. 网络层:Ping 通 ≠ 502 通,nc -zv 192.168.110.11 502 / tcping
  4. 传输层:防火墙 ACL 拦 502、设备改 1502/5020、Unit ID 不是 1
  5. 应用层:地址偏移、INT16/UINT16、×0.1 重复乘、ABCD/CDAB 字序错

六、TCP 连接池耗尽:工业以太网传感器最隐蔽的坑

廉价网口变送器并发连接 1~4 个:

  • Modbus Poll 占 1 个
  • 触摸屏占 1 个
  • PLC 占 1 个
  • 云平台网关占 1 个
  • 你再开 Wireshark/Python → 新连接被 RST

现象:

  • 上午 10 点集中掉线
  • ZeroWindow / TCP Retransmission 增多
  • 旧 SCADA 没下线,LWIP pbuf 池耗尽

正解:

  • 统一走边缘网关,SCADA/云/大屏都连网关,不直连传感器
  • 平台侧连接池化 / 长连接复用
  • 问厂家:“最大并发 TCP 连接数 / Socket 数” 再选型
  • 严禁“每次轮询 new Socket 再关”

七、数值疯了?先读原始寄存器

现象

根因

处理

1562℃

原始值没除 10

×0.1

65466(实际 -70)

UINT16 当 INT16

有符号解析

湿度恒 100.0

探头凝露/靠近加湿口

移位+防凝露加热

温度跳 ±3℃

空调出风口直吹

改回风口/机柜中部

两个寄存器拼浮点错

ABCD/CDAB 反了

用 25.5 已知值校验

数据长时间不变

已离线,平台画旧缓存

标 STALE/OFFLINE,不画野值

Python 校验片段:

代码语言:javascript
复制
def to_temp(reg):
    if reg > 32767:
        reg -= 65536
    return reg * 0.1

def u16_to_float(high, low, word_order="abcd"):
    if word_order == "abcd":
        regs = [high, low]
    else:
        regs = [low, high]
    b = b"".join(r.to_bytes(2, "big") for r in regs)
    import struct
    return struct.unpack(">f", b)[0]

八、运维巡检清单(生产环境直接用)

  • [ ] 静态 IP + MAC + 端口绑定,DHCP 关闭
  • [ ] 502 白名单:只允许网关 IP 访问传感器
  • [ ] Unit ID 不默认全 1(避免扫描器秒发现)
  • [ ] Telnet/HTTP 管理口关闭或进管理 VLAN
  • [ ] SNMPv3 读设备健康(Uptime/CRC/PoE 电压)
  • [ ] 每天跑配置漂移扫描:固件版本、采样周期、寄存器版本
  • [ ] 抓包基线 pcap:正常轮询零广播、零 ARP 风暴
  • [ ] 注入测试:拔线→OFFLINE;改系统时间→时间跳变告警;广播风暴→风暴抑制生效
  • [ ] 边缘网关断网缓存,补传带 collect_ts 不是 send_ts

九、典型故障决策树

代码语言:javascript
复制
Ping 不通
 └─ 线/POE/VLAN/端口隔离

Ping 通 502 拒
 └─ 防火墙/端口/Unit ID/固件复位

握手成功无 Modbus 响应
 └─ Unit ID 错 / 功能码不支持 / MCU 卡死

返回 0x83 02
 └─ 地址基错(40001↔0x0000)、Input/Holding 区错

返回 0x83 04
 └─ 探头故障/自检失败/看门狗

数值数量级错
 └─ 缩放/符号/字序/浮点对齐

偶发重传
 └─ 工业现场正常;连握手都重传才查交换机/强电并行

批量 RST
 └─ TCP 连接池满 → 上边缘网关代理

十、收尾

工业以太网温湿度传感器运维,不是“Ping 通就完事”:

  • 原理层:MBAP 事务 ID 匹配、0-based 地址、Input/Holding 分开
  • 抓包层:Wireshark 看握手、看 0x83、看字节序、看 ZeroWindow
  • 异常层:0x83 是设备说话不是网络沉默;OFFLINE/STALE 必须进质量位不能画旧值
  • 架构层:传感器 TCP 连接数很贵,多主站必须走边缘网关收敛

把“Modbus TCP 原理 + 抓包证据链 + 连接池边界 + 质量位”四件事做扎实,温湿度平台才配叫可运维的工业系统,不是会画曲线的玩具。

十一、一句话给运维岗

看到 0x83 先高兴——设备还活着; 看到 Ping 通没数据先查 502 和 Unit ID; 看到批量掉线先查连接池,不是先骂传感器。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 工业以太网温湿度传感器运维全解:Modbus TCP原理、抓包分析与异常处理
    • 一、Modbus TCP 在温湿度传感器里到底是什么
    • 二、报文结构:MBAP + PDU
    • 三、Wireshark 抓包:端口镜像 + 过滤
    • 四、异常响应:0x83 不是“通信坏了”,是“设备拒绝”
      • 经典翻车:40001 ≠ 0x0001
    • 五、Ping 通但没数据:五段定位法
    • 六、TCP 连接池耗尽:工业以太网传感器最隐蔽的坑
    • 七、数值疯了?先读原始寄存器
    • 八、运维巡检清单(生产环境直接用)
    • 九、典型故障决策树
    • 十、收尾
    • 十一、一句话给运维岗
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档