
物联网 · 盛世宏博 · 动环监控 · 寄存器映射 · VLAN部署 · 网口温湿度变送器
关键词:Modbus TCP、温湿度传感器、寄存器映射、0-based偏移、字节序、VLAN、工业PoE交换机、动环监控、边缘网关、交付台账 标签:#物联网 #Modbus #TCP/IP #UDP #POE供电 #腾讯云 #Wireshark #Python #InfluxDB #以太网温湿度传感器 #网口温湿度变送器 #机房监控
前面《选型、组网与排错指南》把"买什么、怎么连"讲完了,本篇收敛到实施阶段两个最容易在深夜验收现场卡住人的点:寄存器映射怎么落纸面不返工,以及 VLAN 从规划到交换机命令行怎么一步到位。所有示例来自同一批次 12 台机房+配电室混合部署项目的现场台账脱敏版。
现场经验:80% 的"平台读不出数"不是通信问题,是寄存器表在交接环节丢了精度——厂家给的 Excel、实施工程师手记、网关配置、平台点表四份对不上。
约定项 | 本项目取值 | 踩坑背景 |
|---|---|---|
地址基准 | 0-based(协议报文填 0x0000 起) | 厂家手册印 40001,pymodbus/simplemodbus 填 0,混用必错 |
功能码 | 读 0x03(保持寄存器),写 0x06(单寄存器)/0x10(多寄存器) | 部分老型号不支持 0x10 连续写,阈值下发退 0x06 |
字节序 | 默认 ABCD(大端);FLOAT32 例外标 CDAB | 同一厂家两批次固件字节序翻过一次 |
缩放因子 | 温度×0.1、湿度×0.1、露点×0.1、电压×0.01 | 驱动层只乘一次,HMI 不再二次缩放 |
质量位 | 寄存器 40003 独立承载,不复用数据寄存器高位 | 避免"值=65535 当离线"的野路子 |
寄存器(1-based) | 0-based地址 | 长度 | 类型 | 含义 | 读写 | 备注 |
|---|---|---|---|---|---|---|
40001 | 0x0000 | 1 | INT16 | 温度(×0.1℃) | RO | 补码,-400~850 → -40.0~85.0℃ |
40002 | 0x0001 | 1 | UINT16 | 湿度(×0.1%RH) | RO | 0~1000 |
40003 | 0x0002 | 1 | UINT16 | 状态字 | RO | bit0=STALE, bit1=传感器故障, bit2=加热膜ON |
40004 | 0x0003 | 2 | FLOAT32(CDAB) | 露点温度(×0.1℃) | RO | 占连续两寄存器,必须一次读 |
40101 | 0x0064 | 1 | INT16 | 温度高告警阈值 | RW | 默认 280=28.0℃ |
40102 | 0x0065 | 1 | INT16 | 温度低告警阈值 | RW | 默认 180=18.0℃ |
40103 | 0x0066 | 1 | INT16 | 湿度高告警阈值 | RW | 默认 600=60.0%RH |
40104 | 0x0067 | 1 | INT16 | 湿度低告警阈值 | RW | 默认 400=40.0%RH |
40201 | 0x00C8 | 1 | UINT16 | 采集周期(s) | RW | 范围 2~60,默认 5 |
40202 | 0x00C9 | 1 | UINT16 | Modbus Unit ID | RW | 重启生效,1~247 |
关键实施纪律:网关配置里每个点同时存
name / 1based / 0based / dtype / swap / scale / rw,平台导入用 CSV,四列一个不能少。
# regsmoke.py - 单节点冒烟,输出原始十六进制+解析值
from pymodbus.client import ModbusTcpClient
import struct
def smoke(ip, unit=1):
c = ModbusTcpClient(ip, timeout=2); c.connect()
# 一次读 40001~40004(0x0000 起,4寄存器,含FLOAT露点)
rr = c.read_holding_registers(0x0000, 4, slave=unit)
raw = rr.registers
print(f"[{ip}] raw hex: {[hex(r) for r in raw]}")
temp = int.from_bytes(struct.pack('>H', raw[0]), 'big', signed=True) * 0.1
hum = raw[1] * 0.1
stat = raw[2]
# CDAB 重组露点:raw[2]低字 raw[3]高字 → 实际项目按厂家确认
dew_bytes = struct.pack('>HH', raw[3], raw[2])
dew = struct.unpack('>f', dew_bytes)[0]
print(f" T={temp:.1f} H={hum:.1f} stat=0x{stat:04X} Dew={dew:.1f}")
# 回读阈值校验
rb = c.read_holding_registers(0x0064, 1, slave=unit)
print(f" TH_hi={rb.registers[0]*0.1:.1f}℃")
c.close()
# smoke("192.168.110.11")跑完输出贴进验收记录,比"平台上看了一眼有数"硬气十倍。
VLAN | 用途 | 子网 | 网关 | 说明 |
|---|---|---|---|---|
VLAN 10 | 业务服务器 | 192.168.10.0/24 | .1 | 传感器绝不进 |
VLAN 20 | 办公/运维 | 192.168.20.0/24 | .1 | 仅运维PC临时跳板 |
VLAN 110 | 动环采集域 | 192.168.110.0/24 | .1 | 传感器+PoE交换机+边缘网关 |
VLAN 120 | 门禁/视频辅控 | 192.168.120.0/24 | .1 | 和110三层隔离 |
传感器 IP 分配规则:192.168.110.1X,末位 = 机柜列号×10+位置序号,例列头A-03 → .13。
# 创建VLAN
vlan 110
description DYNAMIC_ENV_SENSORS
# 传感器接入端口(例G0/0/11~G0/0/22)
interface range GigabitEthernet0/0/11 to G0/0/22
port link-type access
port default vlan 110
poe enable
poe priority high
storm-control broadcast min 5 # 防UDP广播风暴
mac-address binding ip 192.168.110.11 vlan 110 mac xxxx-xxxx-110b
mac-address binding ip 192.168.110.12 vlan 110 mac xxxx-xxxx-110c
... # 逐台绑定
port-security enable
port-security max-mac-num 1
# 边缘网关上联口(Trunk,只放110)
interface GigabitEthernet0/0/1
port link-type trunk
port trunk allow-pass vlan 110 only
# 未用端口全部 shutdown
interface range GigabitEthernet0/0/23 to G0/0/24
shutdown# 五元组白名单,顺序即优先级
permit tcp 192.168.110.254/32 192.168.110.0/24 eq 502 # 网关→传感器
permit tcp 192.168.20.50/32 192.168.110.254/32 eq 8883 # 运维跳板→网关MQTT
deny ip any 192.168.110.0/24 # 其余全拦
deny icmp any any # 动环域不回ping验收时从办公 VLAN 20 的笔记本
tcping 192.168.110.11 502必须 timeout,从网关.254上发才通——通了才签字。
Day1 上午 交换机上架 → VLAN+PoE+端口绑定 → 未用口shutdown
Day1 下午 逐台传感器上电,笔记本直连网关口跑 regsmoke.py,原始值贴台账
Day2 上午 全量12台在线,Wireshark抓30min基线pcap存档
Day2 下午 拔线/断电/重启三项注入测试 + 补传记录截图
Day3 网关CSV点表导入平台,Grafana面板按quality位分色,验收会顺序不能反:先单台冒烟再全网通电,否则第一台地址冲突会把后面全带歪。
fw_version 列,网关按 SN 前缀走两套解析。 port trunk allow-pass 漏删了 VLAN 1,默认VLAN透传。解决:显式 undo port trunk allow-pass vlan 1。 display mac-address vlan 110 一眼能看出来。 tshark -i eth0 -w baseline_v110.pcapng 进归档目录。 文件 | 格式 | 用途 |
|---|---|---|
REG_MAP_v110.xlsx | 含 0-based/1-based/dtype/swap/scale 全列 | 网关+平台双方对齐 |
IP_MAC_VLAN_110.csv | SN / IP / MAC / 端口号 / 固件版本 | 端口绑定依据 |
switch_config_110.txt | 交换机完整导出(脱敏) | 复测可复现 |
fw_policy.txt | 防火墙五元组导出 | 等保核查 |
regsmoke_12nodes.log | 每台冒烟原始 hex 输出 | 上线证据 |
baseline_v110.pcapng | 30min 零广播抓包 | 安全基线 |
寄存器映射和 VLAN 组网是动环项目里"看不见但决定能不能过验收"的两根柱子。映射表要精确到每个寄存器的字节序和版本分支,VLAN 要精确到每个接入端口的 MAC 绑定和一条多余 VLAN 都不透传。这两份台账在现场多花半天,后面三年运维少接二十个半夜电话。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。