物联网 · 盛世宏博 · 分布式采集
区县馆扩到 3 个楼层、6~12 间库房之后,最容易踩的惯性错误就是把所有一体机串成一条 RS485 从头拉到尾。实测里这条链路一定出问题:
分布式部署的判据很朴素:一个防火分区 = 一条独立总线 = 一个边缘采集域,平台只做汇总,不碰底层轮询时序。
┌── MQTT/HTTP ──▶ 智慧档案平台
│
┌─────────┐ ┌────┴────┐ ┌─────────┐
│网关 GW-A│ │网关 GW-B│ │网关 GW-C│
│4×RS485 │ │4×RS485 │ │TCP桥接 │
└─┬─┬─┬─┬─┘ └─┬─┬─┬─┬─┘ └────┬────┘
│ │ │ │ │ │ │ │ │
库1 库2 库3 库4 库5 库6 库7 远端楼栋(串口服务器)项目 | 工程值 | 超了怎么办 |
|---|---|---|
单总线从站数 | ≤8 | 拆第二条总线 |
单总线物理长度 | ≤500m@9600 | 加 RS485 中继或换 TCP 方案 |
单网关管理域 | ≤32 台 | 加第二台网关 |
终端电阻 | 仅首尾 | 中间任何接头不并电阻 |
屏蔽层接地点 | 网关侧单点 | 楼层配电箱地≠通讯地,分开 |
段1 0x01~0x08 普通档案库群
段2 0x09~0x10 特藏/古籍库群(轮询权重更高)
段3 0x11~0x18 缓冲间/查阅厅/消毒仓
段4 0x19~0x20 备用与调试平台点名强制带 gateway_id + bus_id + slave,禁止只存 slave 数字。
不是每个寄存器都 2s 扫一遍。同一从站用 0x03 连续读,把帧数压下来:
# 单 slave 一次 0x03 读 6 个连续寄存器
# 40001~40006 → run_mode / target_rh / target_temp / deadband
# / humidify_out / dehumid_out
READ_BLOCKS = {
"fast": {"addr": 0, "cnt": 8, "period": 2}, # 温湿+状态字+联锁
"medium": {"addr": 8, "cnt": 6, "period": 5}, # 净化/消杀/臭氧
"slow": {"addr": 14, "cnt": 5, "period": 30}, # 故障/滤网/累计时长
}8 台设备 fast 轮完实测 <150ms,给 medium/slow 留足时隙,总线不撞车。
class BusDomain:
def poll(self, slave):
if slave in self.quarantine: # 已隔离的跳过
return None
try:
return self.modbus_read(slave)
except NoAck:
self.strikes[slave] += 1
if self.strikes[slave] >= 3:
self.quarantine[slave] = now() + 300 # 5min 冷却
publish_event({"type":"device_isolated",
"gateway":self.gw,
"slave":slave})关键区别:隔离的是单 slave,不是整条总线。隔壁库设备完全不受影响。
状态字 bit6 / 联锁字 bit0~bit2 任何位翻转 → 立刻打断周期队列,优先读完整消杀包并上送,平台侧延迟控制在 1s 内。
{
"gw": "GW-3F-A",
"bus": "BUS-01",
"zone": "库房A-普通档案",
"slave": 3,
"ts_platform": 1702545600123,
"ts_device": 1702545600000,
"freshness_ms": 123,
"payload": {
"rh": {"v": 53.2, "raw": 532, "q": "GOOD"},
"temp": {"v": 21.5, "raw": 215, "q": "GOOD"},
"status": {"raw": 0x00A2, "disinfecting": false, "purifying": true},
"safety": {"door":0,"human":0,"fire":0,"water":0},
"ozone_ppm": 0.018
},
"bus_meta": {"crc_err_1h": 2, "rtt_ms": 41}
}模式 | 触发条件 | 用在哪 |
|---|---|---|
tick | 固定 5s 打包 | 温湿平稳期保底 |
delta | |Δrh|≥0.5% 或 |Δt|≥0.2℃ | 梅雨季/开门扰动 |
edge | 状态字/联锁字异或非零 | 消杀启停、门禁事件 |
平台侧以 (gw, bus, slave, ts_platform) 做幂等主键,断线重传不重复落盘。
设备层 → 原始点 + 质量戳
↓ 按 zone 分组窗口(30s)
库区级 → avg_rh / avg_temp / any_fault / disinfecting_count
↓ 按 archive 滚动
馆级 → 全馆达标率 / 在线率 / 消杀排程表 / 告警汇总边缘网关不知道其他库房的存在。典型例子——消杀排程:
平台算好:库房A 22:00~00:00 臭氧窗口
库房B 00:30~02:30(错开相邻库)
下发 scheduled_start/end 到各网关 → 网关只负责写本域 slave相邻库联锁、全馆停机这类"全局决策"不下沉到串口。
层级 | 断什么 | 行为 |
|---|---|---|
设备 | 和网关失联 | 按最后写入的 target/deadband 本地 PID 继续跑 |
网关 | 和平台失联 | 本地缓存 24h 环形缓冲,恢复后按 ts 顺序补传 |
平台 | 某网关整体离线 | 该域所有点标 STALE,其他域正常聚合,不降级 |
多库房分布式这件事,RS485 本身没变,变的是边界划在哪儿:
一库一总线、一域一网关、快中慢三档轮询、单设备隔离不扩散、边缘只采不管、平台只汇不轮、事件走快通道、断线靠本地自治兜底。
分组采集解决"采得稳",平台汇总解决"看得全",两个半件事分开做,多库房项目就不会在验收季集体返工。
关键词:多库房分布式,RS485分组采集,边缘网关,分区轮询,三档寄存器窗口,单设备隔离,MQTT上送,三层聚合,断线续传,消杀排程
标签:#多库房 #分布式部署 #恒湿一体机 #RS485 #分组采集 #边缘网关 #分区轮询 #平台汇总 #故障隔离 #智慧档案
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。