首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >以太网温湿度传感器解析:从 RS485 对比到 Modbus TCP IP 读取实战

以太网温湿度传感器解析:从 RS485 对比到 Modbus TCP IP 读取实战

原创
作者头像
盛世宏博小可
发布于 2026-10-22 09:14:54
发布于 2026-10-22 09:14:54
150
举报

以太网温湿度传感器解析:从 RS485 对比到 Modbus TCP IP 读取实战

物联网 · 盛世宏博 · 以太网温湿度、RS485 Modbus RTU、Modbus TCP、RJ45、PoE、寄存器解析、二次开发


一、RS485 与以太网温湿度传感器:不是“升级关系”,是“架构关系”

维度

RS485 温湿度变送器

RJ45 以太网温湿度传感器

物理层

屏蔽双绞线 A/B/GND

网线 + 交换机

协议

Modbus RTU(串行)

Modbus TCP / HTTP / MQTT / SNMP

拓扑

手拉手总线,终端电阻 120Ω

星型,每设备独立 IP

寻址

从站地址 1~247,易冲突

IP + Port 502 + Unit ID

通信方式

半双工,主站串行轮询

全双工,多客户端可并发

距离

单段 ≤1200m

单段 ≤100m,靠交换机/光纤延伸

供电

12/24VDC 外供

PoE 802.3af/at 一根网线搞定

故障域

断点/短路拖垮整条总线

单点故障只盲自己

远程运维

现场拿 USB-485 调

ping / Web / Wireshark / API

适用

小库房、老 PLC、长距离、预算紧

机房、档案库、配电室、算力中心

经验判断:点位 ≤16、距离 >100m、已有 485 总线 → 留 RS485;点位多、要上云/组态/SCADA、要远程诊断 → 直接以太网。

⚠️ 坑:有些“RJ45 温湿度”只是把 RS485 信号借网口外形,里面还是 Modbus RTU——必须看说明书:真以太网才上交换机/PoE,假以太网还得手拉手加终端电阻。


二、Modbus RTU vs Modbus TCP:报文差在哪

RTU 帧:

代码语言:javascript
复制
[从站地址][功能码][数据...][CRC 低][CRC 高]
  • 串口参数必须一致:9600/19200、8、N/Even、1
  • 主站一个一个问,从站一个一个答
  • CRC16 自己算,帧间要 3.5 字符静默时间

TCP 帧:

代码语言:javascript
复制
[MBAP 头 7字节][从站地址 1][功能码][数据...]
  • 跑在 TCP 上,端口默认 502
  • TCP 本身保证可靠传输,没有 CRC
  • 用 Transaction ID 区分并发请求
  • Unit ID 大多用来透传“背后那台 RTU 设备是谁”

一句话:RTU 是“单车道班车”,TCP 是“每人一部电话”。


三、以太网温湿度传感器上线五层检查

代码语言:javascript
复制
L1 物理:网线 8 芯通、PoE 端口灯亮、探头不贴空调出风
L2 链路:交换机端口 100M/1000M Full、无 CRC 错误
L3 网络:同 VLAN、ping 通、延迟 <1ms
L4 传输:telnet/nc 通 TCP 502
L5 应用:Modbus Poll / pymodbus 读到合理温湿度

生产环境:

  • 独立动环 VLAN
  • 静态 IP + MAC 绑定
  • 502 只对中国采集网关开放,业务网 ACL 拦掉
  • Web 管理口改端口或关掉,默认 admin 必须改

四、Modbus TCP 读温湿度:三个翻车点

1. 地址偏移(40001 ≠ 1)

Modbus 数据模型:

  • 00001 线圈
  • 10001 离散输入
  • 30001 输入寄存器
  • 40001 保持寄存器

协议帧里是 0 基偏移:

代码语言:javascript
复制
手册写 40001 → 代码读 offset 0
手册写 40002 → 代码读 offset 1
手册写 40003 → 代码读 offset 2

组态软件里力控/亚控常用 1-based,pymodbus/NModbus 用 0-based,读不到先怀疑偏移。

2. 缩放因子(250 ≠ 25.0)

常见映射:

代码语言:javascript
复制
40001 INT16 ×0.1 ℃    → 250 表示 25.0℃
40002 INT16 ×0.1 %RH   → 558 表示 55.8%RH
40003 UINT16 1         → PM2.5 μg/m³
40004 UINT16 1         → 状态字/告警位图
40005~40006 FLOAT32    → 露点/温度(占 2 个寄存器)

没设 Scale=0.1,画面就显示 250℃——不是探头炸了,是没除 10。

3. 字节序(32 位浮点头号杀手)

16 位整数一般 Big Endian(AB CD)。

32 位浮点要管两层:

  • 字节序:ABCD / DCBA / BADC / CDAB
  • 字序:高字在前还是低字在前

厂商不统一,西门子系常高字在前,部分欧姆龙/三菱低字在前。

验证办法:设备里强制写 25.5,上位机轮换字节序,能还原 25.5 就是对的。


五、Python 读取实战(Modbus TCP)

代码语言:javascript
复制
from pymodbus.client import ModbusTcpClient

IP = "192.168.100.50"
PORT = 502
UNIT = 1

client = ModbusTcpClient(IP, port=PORT, timeout=2)
if not client.connect():
    raise SystemExit("TCP 502 都连不上,先查 VLAN/防火墙/IP")

try:
    # 读保持寄存器 0 起始 6 个:温度/湿度/露点/状态/预留/预留
    rr = client.read_holding_registers(0, 6, slave=UNIT)
    if rr.isError():
        print("Modbus 异常:", rr)
    else:
        r = rr.registers
        temp = r[0] * 0.1      # 40001
        hum  = r[1] * 0.1      # 40002
        dew  = r[2] * 0.1      # 40003
        status = r[3]          # 40004 位域:在线/故障/校准过期...

        print(f"T={temp}℃  H={hum}%RH  Td={dew}℃  status={status:#06x}")

    # 如果是 FLOAT32 露点,占 40003~40004
    rf = client.read_holding_registers(2, 2, slave=UNIT)
    import struct
    hi, lo = rf.registers
    # 大端字序 ABCD
    val = struct.unpack(">f", struct.pack(">HH", hi, lo))[0]
    print("露点(float)=", round(val, 2))
finally:
    client.close()

工程化要点:

  • 长连接复用,别每次请求 new 一个 socket
  • 超时 1000~3000ms,重试 2~3 次
  • 温湿度周期 2~5s,别 100ms 狂轮
  • 多设备用 asyncio + Semaphore 控并发
  • 0xFFFF / 温度>85 / 湿度>100 → 打 INVALID,不进库

六、组态软件对接口径(力控/亚控/MCGS)

通用步骤:

  1. 新建设备 → Modbus TCP
  2. IP / 502 / Unit ID=1
  3. 超时 2000~3000ms,重试 3,周期 ≥2000ms
  4. 变量:
    • 40001 → INT16 → 线性转换 ×0.1 → ℃
    • 40002 → INT16 → 线性转换 ×0.1 → %RH
  5. 字节顺序按手册选 ABCD / CDAB
  6. 浮点变量显式选 FLOAT32 + 字序

常见现象对照:

  • 读到 0 / 乱码 → 地址 0-based/1-based 错
  • 25℃ 变 250℃ → 没设 Scale 0.1
  • 温度变 -1000℃ → 浮点字节序错
  • 一台能读、加第二台挂 → IP 冲突 / 设备连接数上限
  • 网络通但没数据 → 防火墙拦 502 / VLAN 隔离 / Unit ID 错

七、RS485 设备怎么融进以太网平台

别让 SCADA 直连两种链路,正确姿势:

代码语言:javascript
复制
RS485 温湿度 ×N ──USB-485/串口服务器──┐
                                      ├─ 边缘网关(RTU→TCP / MQTT)
RJ45 温湿度 ×N ──PoE 交换机───────────┘
                                      │
                                      平台(统一物模型)

边缘网关负责:

  • RTU 侧:波特率/校验/从站地址/终端电阻
  • TCP 侧:IP 管理、长连接、批量上报
  • 统一输出:device_id / ts / temp / hum / quality

八、选型结论(直接给判断)

  • 老旧档案室、16 台以内、线已经拉好 → RS485 Modbus RTU
  • 机房/档案库/配电室/算力中心/多库房 → RJ45 Modbus TCP + PoE
  • 前端有 485 探头、后端要上云 → 485 转 TCP 边缘网关,别推翻重来
  • 买以太网传感器先问四句:
    1. 寄存器表给不给(0基/1基、缩放、字节序)
    2. 有没有 REST API / SNMP
    3. 断网本地缓存多久、恢复是否补传
    4. 502 能否改端口、Web 能否关、固件能否 OTA

九、一句话收口

RS485 温湿度是“串行总线思维”:地址、CRC、终端电阻、轮询; 以太网温湿度是“网络节点思维”:IP、502、MBAP、长连接、平台消费。 读数的时候记住三件事——40001 是 offset 0、整数要乘 0.1、浮点先校字节序,能避开 80% 的现场假故障。


关键词:以太网温湿度传感器、RS485 Modbus RTU、Modbus TCP、RJ45、PoE、MBAP、寄存器偏移、缩放因子、字节序、边缘网关

标签:#以太网温湿度 #RS485 #ModbusRTU #ModbusTCP #RJ45 #PoE #寄存器解析 #字节序 #边缘网关 #动环监控 #组态对接

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

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

目录
  • 以太网温湿度传感器解析:从 RS485 对比到 Modbus TCP IP 读取实战
    • 一、RS485 与以太网温湿度传感器:不是“升级关系”,是“架构关系”
    • 二、Modbus RTU vs Modbus TCP:报文差在哪
    • 三、以太网温湿度传感器上线五层检查
    • 四、Modbus TCP 读温湿度:三个翻车点
      • 1. 地址偏移(40001 ≠ 1)
      • 2. 缩放因子(250 ≠ 25.0)
      • 3. 字节序(32 位浮点头号杀手)
    • 五、Python 读取实战(Modbus TCP)
    • 六、组态软件对接口径(力控/亚控/MCGS)
    • 七、RS485 设备怎么融进以太网平台
    • 八、选型结论(直接给判断)
    • 九、一句话收口
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档