
物联网 · 盛世宏博 · 以太网温湿度、RS485 Modbus RTU、Modbus TCP、RJ45、PoE、寄存器解析、二次开发
维度 | 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,假以太网还得手拉手加终端电阻。
RTU 帧:
[从站地址][功能码][数据...][CRC 低][CRC 高]TCP 帧:
[MBAP 头 7字节][从站地址 1][功能码][数据...]一句话:RTU 是“单车道班车”,TCP 是“每人一部电话”。
L1 物理:网线 8 芯通、PoE 端口灯亮、探头不贴空调出风
L2 链路:交换机端口 100M/1000M Full、无 CRC 错误
L3 网络:同 VLAN、ping 通、延迟 <1ms
L4 传输:telnet/nc 通 TCP 502
L5 应用:Modbus Poll / pymodbus 读到合理温湿度生产环境:
Modbus 数据模型:
协议帧里是 0 基偏移:
手册写 40001 → 代码读 offset 0
手册写 40002 → 代码读 offset 1
手册写 40003 → 代码读 offset 2组态软件里力控/亚控常用 1-based,pymodbus/NModbus 用 0-based,读不到先怀疑偏移。
常见映射:
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。
16 位整数一般 Big Endian(AB CD)。
32 位浮点要管两层:
厂商不统一,西门子系常高字在前,部分欧姆龙/三菱低字在前。
验证办法:设备里强制写 25.5,上位机轮换字节序,能还原 25.5 就是对的。
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()工程化要点:
通用步骤:
常见现象对照:
别让 SCADA 直连两种链路,正确姿势:
RS485 温湿度 ×N ──USB-485/串口服务器──┐
├─ 边缘网关(RTU→TCP / MQTT)
RJ45 温湿度 ×N ──PoE 交换机───────────┘
│
平台(统一物模型)边缘网关负责:
device_id / ts / temp / hum / quality 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 删除。