我前前后后接过不少 RS485 老电表的改造需求,场景都差不多:厂区配电间、园区机房、老旧台区,几十块电表散在各处,数据靠人工抄,或者拉一条 485 线到值班室,定时读一次。电表本身不坏、计量也准,真要全换智能电表,单表成本加上拆装施工,几百块打底,几十个表就是上万的开销。但如果它带 RS485 接口,其实是有一条“不换表也能上云”的路的,而且不止一条。今天就把我实际用过的三种路径完整梳理一遍:DTU 透传、单片机自研采集器、边缘网关协议转换。每条路径的成本、开发量、坑点都会交代清楚,照着选就行了。
1. 先弄明白:老电表缺的不是数据,而是“最后一公里”
1.1 你面对的电表大概率是这种状态
RS485 老电表虽然不带网口、不支持 MQTT,但绝大多数都有标准的 RS485 通信接口。我经手过的表里,最常见的规约是 DL/T 645-2007 和 Modbus RTU 两类。DL/T 645 是国内电能表的主流通信规约,Modbus RTU 则更多出现在带有电力监控模块或工业级电能表的场景里。
这两种规约有个共同点:数据都是二进制帧,走的是 RS485 半双工总线。只要你用对波特率、校验位、设备地址,就能读到电压、电流、功率、电能量等数据。问题在于,RS485 天生是短距离总线通信,最长一般也就一千米左右,而且不能直接上网。传统做法是再加一台串口服务器或者工控机做中转,数据才能到局域网。放到云平台时代,缺的其实就是把 RS485 数据搬到互联网上的那一段链路。
1.2 上云链路拆开看,就三截
我之前在项目里总结过一个简单框架:老电表上云 = 采集端 + 协议解析端 + 传输端。
采集端负责通过 RS485 总线轮询电表寄存器,取得原始数据;协议解析端把 DL/T 645 或 Modbus RTU 的二进制帧翻译成我们看得懂的电压、电量等数值;传输端把解析后的数据通过 MQTT、HTTP 等协议发给云平台,最终落到监控大屏或报表里。
老电表的问题在于,它只有最底层的数据输出能力,没有网络模块、没有协议转换能力。所以市面上所有“不换表上云”的方案,本质上都是在补后面两截。理解了这个逻辑,再去看 DTU、采集器、网关,思路一下就清晰了——它们只是把“协议解析”和“网络传输”这两件事放在了不同的位置而已。
1.3 不换表改造前,先确认三件事
不是所有 RS485 电表都适合改造。我建议你在动手之前,先做三个确认,省得到现场才发现搞不定。
第一,确认电表确实有 RS485 接口,并且知道端口定义。很多表上标的是 A、B,有些标 485+、485-,还有些藏在接线端子盖板内侧。注意,不同厂家的电表,A/B 的定义可能相反,一定要以说明书或表体印刷为准。
第二,确认通信规约和默认参数。DL/T 645 常见的出厂配置是 2400bps、偶校验、地址如“000000”或“123456”;Modbus RTU 一般是 9600bps、8 数据位、无校验。但这个不绝对,老表改过参数的也不少见,建议先用 485 转 USB 工具在本地电脑上扫一遍。
第三,确认现场有可用的网络。WiFi 信号弱、没有以太网线、又禁止装 4G 卡的环境,会让不少方案直接失效。我在一个地下配电房就吃过亏,4G 信号只有一格,最后只能部署带外置天线的 4G DTU。
这三件事都确认了,再往下选方案,基本不会跑偏。
2. 三条路线的取舍逻辑:透传、采集、网关到底差在哪
2.1 一句话说清楚三条路线的本质
很多人一开始就纠结买哪种设备,其实核心差异是三句话的事:
- DTU 透传路线:不解析、不加工,把 RS485 发来的二进制数据原封不动地搬到云平台。解析和显示的工作留给云平台去干。
- 单片机采集器路线:在电表旁边加一个 ESP32 或 STM32 小盒子,主动轮询电表、解析协议、把结果转换成 JSON 后用 MQTT 上报。云平台拿到的已经是“干净数据”。
- 边缘网关路线:本质上是一台轻量级计算设备,通过多串口或者多路 485 总线挂多块电表,在本地做轮询、解析、缓存、协议转换,再把聚合后的数据统一上云。
一句话总结就是:DTU 搬砖,采集器翻译,网关调度。从这里也能看出,方案的选择直接取决于你现场有几块表、有多少技术储备。
2.2 直接给一张决策表
我把三条路线放在一起对比过,参数如下:
| 对比维度 | 路线一:DTU 透传 | 路线二:单片机采集器 | 路线三:边缘网关 |
|---|---|---|---|
| 核心硬件 | 串口服务器 / 工业 DTU | ESP32、STM32 等开发板 + RS485 模块 | 树莓派、软路由或工业网关 |
| 单点成本 | 120~300 元 | 50~80 元 | 200~500 元起 |
| 需要开发量 | 低,纯配置为主 | 中高,需写固件代码 | 中,需写脚本或编排流程 |
| 协议处理位置 | 云平台 | 本地采集器 | 本地网关 |
| 适合电表数量 | 1~2 块/台设备 | 1~8 块 | 8 块以上 |
| 断网补数据 | 看设备,多数无 | 可自己实现 | 可本地缓存补传 |
| 维护门槛 | 最低 | 较高 | 中 |
2.3 真正决定选哪条路的,通常只有这三件事
第一件事是电表数量。只有一两块表,用 DTU 最简单,成本也算合理;表多了以后,DTU 数量堆上去,云平台还要逐个解析,管理和成本都难看。
第二件事是现场的网络条件。有网线的地方可以考虑 WiFi/以太网设备,没网线但能装 SIM 卡的用 4G DTU,网络极差且不允许新增设备的,就只能考虑带本地缓存能力的采集器或网关,等网络恢复再补报。
第三件事是你有多大能力维护。DTU 坏了换一台就行,单片机采集器坏了大概率要自己拆下来重刷固件,边缘网关还涉及 Linux 系统的日常维护。我在项目里经常和客户说一句话:便宜是要用时间换的,你不懂代码,就别选第二条。
3. 路线一:串口服务器/DTU 透传,把 Modbus RTU 原封不动抬上云
3.1 先搞清楚透传到底透的是什么
很多文档把“透传”写得很玄,实际就是设备不关心你的数据内容,只把串口收到的二进制字节流通过网络发出去,同理网络收到的数据也会转成串口字节流发给电表。对于 RS485 电表来说,你实际透传的就是一帧帧 DL/T 645 或 Modbus RTU 报文。
选择透传路线有个前提:云平台必须能解析你电表的协议。如果云平台自带 Modbus 网关或 DL/T 645 解析插件,比如 some 工业 IoT 平台、OneNet 老版本 Modbus 组件、ThingsBoard 的 Modbus 扩展,那 DTU 透传方案就能做到“零代码”。云平台负责按地址下发读取请求,再解析返回的寄存器数据,你只管配好链路就行。
3.2 DTU 选型时盯着这几个参数看
别被厂家宣传的“智能 DTU”忽悠了。我选型时只看几个实际参数:
串口电平必须是 RS485,而不是只支持 RS232。很多标称“串口服务器”的设备只有 RS232 口,接电表还得再挂一个 485 转 232 模块,绕一圈没必要。
传输能力要同时支持 TCP/UDP 透传和 MQTT 透传。MQTT 是现在 IoT 云平台的主力协议,只支持 TCP 的设备还要在云侧再包一层协议解析,麻烦。
断线缓存和补传能力很关键。电网环境波动大,网络断个几分钟很常见,没有本地缓存的 DTU,断网期间的数据就彻底丢了。
供电和端子防护别忽略。配电房里最好选带隔离电源和浪涌保护的型号,避免雷击或电表侧干扰把设备打坏。
3.3 配置步骤:从接线上位到云平台出数据
第一步,接线。DTU 的 485 端子上的 A 接电表 A,B 接电表 B,屏蔽层单端接地。接线前断电操作,别带电干活,485 线在带电状态下插拔很容易烧接口。
第二步,配置波特率、数据位、停止位、校验位。DL/T 645 常见是 2400bps、偶校验;Modbus RTU 常见是 9600、8N1。但老表不一定都是默认值,先用电脑串口工具试通再固化到 DTU。
第三步,配置网络连接。DTU 设为 MQTT Client 模式,填入云平台 MQTT 服务器地址、端口、设备 ID 和密钥。如果云平台走 TCP 透传,则填云平台接入网关的 IP 端口。
第四步,在云平台上建设备。选好 Modbus 网关组件,添加从站地址 1,映射寄存器地址和数据类型。比如想读当前总有功电能,就需要根据电表协议文档找到对应的寄存器地址和字节顺序。
第五步,验证数据链路。云平台上盯着定时刷新,看电压、电流、电量值是否和电表本地显示一致。这一步最容易发现寄存器地址搞错或 AB 反接的问题。
3.4 路线一有哪些容易翻车的场景
透传方案最舒服的场景是单表、单点位、云平台上已经有现成的解析能力。但我也见过不少翻车现场。
云平台没有对应协议解析插件。数据确实传上去了,但全是乱码字节,云平台不会自己猜协议,这时候还得自己写服务器端解析脚本,DTU 的“零开发”优势就没了。
多表场景下成本失控。每块表一个 DTU,设备费用加认证管理费用,很快就比一个边缘网关还贵。所以电表超过三四块时,我不太建议走 DTU。
DTU 断网丢失数据。我用过的多数入门级 DTU 只有“透传”没有“缓存”,网络一断,数据一丢,后面平台复盘数据时就会发现缺段。对电量统计这类需要连续性的场景,这是个不可接受的缺陷。
4. 路线二:ESP32/STM32 自研采集器,几十元搞定但得动手写固件
4.1 成本核算:为什么它能把成本压到最低
自研采集器的硬件成本我算过很多次,以 ESP32 方案为例:ESP32 开发板 20~30 元,MAX485 转接模块 5~8 元,电源模块和外壳大约 15 元,总成本基本在 50 元左右。批量打样的时候还可以进一步压缩。相比 DTU 的 120 元以上单价,这条路在成本上确实有绝对优势。
更重要的是,数据在本地就完成了解析和格式化,云平台侧不用再做二进制解析,直接收 JSON 就能入库展示。这等于把第 1 节里说的“协议解析”和“传输”两截都在本地做完了,云平台任务最轻。
4.2 硬件接线和关键电平问题
核心接线是 ESP32 的串口接 MAX485 模块,再通过模块接电表。MAX485 上常见标注为 DI、RO、DE、RE,DI 接 ESP32 的 TX,RO 接 RX,DE 和 RE 并在一起接一个 GPIO 控制引脚。发送数据时把 DE/RE 拉高,接收时拉低,这就是 RS485 半双工收发切换的基本操作。
这块有个容易踩的坑:MAX485 模块分 3.3V 和 5V 版本。ESP32 的 GPIO 输出是 3.3V,如果用了需要 5V 驱动的模块,控制信号不稳定会导致收发切换失灵,表现为有时候能读、有时候读不到数据。我一般选支持 3.3V 供电的 MAX3485 模块,或者直接在模块上做电平转换,省心很多。
另外,RS485 的 A/B 之间要不要加电阻,取决于现场线长和节点数量,这块我放到第 6 节专门讲。
4.3 固件里必须处理的四个细节
自研采集器不是“网上找个例程烧进去就行”这么简单。我前后踩过的坑,集中在这四个细节上:
第一,从机轮询要有超时机制。电表不是每次都及时响应,总线繁忙或者线缆干扰会导致无响应。如果固件不设超时,一个地址卡住,整个轮询线程就死了。我习惯把单次读取超时设为 500ms 左右,连续三次失败就把该表标记为离线,不阻塞其他表。
第二,Modbus CRC16 和 DL/T 645 的校验和必须自己验证。很多例程不校验 CRC,数据错几个字节照样上报,平台上看数值偶尔跳变,排查时特别痛苦。正确做法是收帧后先校验 CRC 再解析。
第三,MQTT 掉线重连要有退避机制。直接写死重连间隔,断网期间会满带宽重连,云平台可能把设备踢掉。我用递增退避:第一次 5 秒,第二次 10 秒,最大 5 分钟,网络恢复后自动回到低间隔。
第四,断网数据要落盘。ESP32 自带 Flash 有限,但存最近几百条电量数据还是够的。我用 NVS 或者 SPIFFS 存一个环形缓冲,网络恢复后按时间戳补报,这样电量统计不会出现空洞。
4.4 一段能跑通的参考代码
以下是以 ESP32 + Arduino 框架为基础的简化示例,演示了通过 Modbus RTU 读取电表保持寄存器,再通过 MQTT 上报 JSON 的核心逻辑。实际项目里需要按你的电表寄存器地址调整。
#include <WiFi.h> #include <PubSubClient.h> #include <ModbusMaster.h> #define RS485_CTRL 17 #define RS485_RX 16 #define RS485_TX 4 ModbusMaster node; WiFiClient espClient; PubSubClient client(espClient); uint8_t meterAddr = 1; uint16_t voltage = 0, current = 0, energy = 0; void preTransmission() { digitalWrite(RS485_CTRL, HIGH); } void postTransmission() { digitalWrite(RS485_CTRL, LOW); } void setup() { Serial.begin(115200); pinMode(RS485_CTRL, OUTPUT); Serial2.begin(9600, SERIAL_8N1, RS485_RX, RS485_TX); node.begin(meterAddr, Serial2); node.preTransmission(preTransmission); node.postTransmission(postTransmission); WiFi.begin("your-ssid", "your-password"); while (WiFi.status() != WL_CONNECTED) { delay(500); } client.setServer("mqtt.your-cloud.com", 1883); client.connect("meter_collector_01"); } void loop() { uint8_t result = node.readHoldingRegisters(0x0000, 3); if (result == node.ku8MBSuccess) { voltage = node.getResponseBuffer(0); current = node.getResponseBuffer(1); energy = node.getResponseBuffer(2); char payload[128]; snprintf(payload, sizeof(payload), "{\"addr\":%d,\"voltage\":%d,\"current\":%d,\"energy\":%d}", meterAddr, voltage, current, energy); client.publish("meter/data", payload); } else { Serial.printf("Modbus read failed: %d\n", result); } delay(5000); }这里只演示了核心链路,实际还要处理 CRC 校验和、MQTT 重连、掉线补传等,功能压在一起会显得乱,但主体框架已经够用了。
4.5 关于 W5500 接入 OneNet 等平台的补充
有的现场没有 WiFi,但有网线。这种情况下 ESP32 可以接一个 W5500 以太网模块,用有线方式联网。W5500 是一个硬件 TCP/IP 协议栈芯片,通过 SPI 接口和 MCU 通信,能把 TCP/IP 的处理负担从 MCU 上卸下来。接 OneNet 或 TLink 这类云平台时,走 MQTT over TCP 即可,区别只在服务器地址和端口要严格按平台控制台页面给的信息来填。
这里我提个实际心得:W5500 对 SPI 信号时序比较敏感,模块和 ESP32 之间的连线尽量短,最好用杜邦线之前先测一下信号完整性。我之前因为飞线太长,出现间歇性连不上网的问题,后来改成短排线连接就正常了。
4.6 自研采集器的代价:适合有嵌入式底子的团队
这条路最大的成本不是硬件,而是你的调试时间。固件调通之前,你至少需要一把 USB 转 RS485 调试棒、一台逻辑分析仪或者示波器,还得耐得住性子去核对帧格式。如果你从来没接触过串口协议,建议先在电脑上用串口助手调通电表,再往 ESP32 上移植,别一上来就双线作战。
另外,自研设备不是捡来的,坏了得自己修。长期运行的采集器要考虑外壳防护、端子固定、电源隔离,现场配电房的温度和灰尘对开发板很不友好。我给客户交付的自研采集器,都是带工业外壳、灌胶处理、加端子排的版本,裸板直接扔配电柜里基本撑不过一年。
5. 路线三:边缘网关做协议转换,一拖八的一体化方案
5.1 为什么要一个“中间层”:多表场景的终点
现场电表超过 8 块的时候,DTU 方案数量多、成本高,单片机方案单算数据也能做,但管理起来很麻烦。这时候更适合上一台边缘网关,把多块电表全部挂到一个 RS485 总线上,由网关统一轮询、统一解析、统一上云。
网关本质上是台小计算机,树莓派、NanoPi、软路由甚至二手工控机都可以胜任。它的优势不光是省设备成本,更重要的是能承载复杂的协议转换逻辑、本地缓存和历史数据补齐,云平台只管接收聚合结果。
5.2 用 Node-RED 快速搭一个轻量采集网关
如果不想写太多代码,Node-RED 是很好的中间层选择。它通过可视化节点拖拽完成采集流程,典型链路是:serial 节点读串口,modbus 节点发请求,function 节点解析数据,mqtt out 节点发布到云平台。
我在一个 12 块电表的项目中用过这种组合,效果不错。现场网关跑了半年,基本没出过问题。Node-RED 重启后会自动恢复流程节点状态,数据格式调整只需要改 function 节点,不用重新编译整个固件,这对后期维护非常友好。
要注意的是 Node-RED 默认跑在 Node.js 上,内存占用比单片机方案高很多,建议至少 1GB RAM 的板子。树莓派 3B+ 或 NanoPi NEO 这类都够用,但别用 64MB 内存的老路由器强跑。
5.3 更可控的方式:Python 脚本做多表轮询和缓存
Node-RED 虽然快,但复杂轮询逻辑和数据校验还是写 Python 更顺手。我用 pymodbus 库做多表轮询,配合 SQLite 做本地缓存,最后用 paho-mqtt 发布数据。核心流程如下:
from pymodbus.client import ModbusSerialClient import sqlite3, json, time import paho.mqtt.client as mqtt client_serial = ModbusSerialClient( method='rtu', port='/dev/ttyS0', baudrate=9600, timeout=0.5 ) client_mqtt = mqtt.Client() client_mqtt.connect('mqtt.your-cloud.com', 1883, 60) meters = [1, 2, 3, 4, 5, 6, 7, 8] for addr in meters: result = client_serial.read_holding_registers(0x0000, 3, slave=addr) if result.isError(): continue payload = { 'addr': addr, 'voltage': result.registers[0] / 10.0, 'current': result.registers[1] / 100.0, 'energy': result.registers[2] / 100.0, } conn = sqlite3.connect('/var/lib/gateway/cache.db') conn.execute("INSERT INTO cache(ts, data) VALUES(?, ?)", (int(time.time()), json.dumps(payload))) conn.commit() conn.close() client_mqtt.publish(f'meter/{addr}/data', json.dumps(payload))实际部署时还要把轮询周期、串口加锁、异常重试加进去。串口是独占资源,多线程轮询必须加锁,否则多个协程同时读取会导致帧错乱。
5.4 网关方案里的可靠性设计
网关方案并不是“多台设备汇聚一下”那么简单,长期运行有几个细节决定成败。
数据落盘必须有。断网期间网关继续轮询电表,数据先写 SQLite 或 CSV 文件,网络恢复后统一补发。否则断网几小时,电表数据就断几小时。
补发要限速。网络恢复瞬间直接把几千条数据同时推送,MQTT broker 可能扛不住,平台端也可能发生消息堆积。我一般按每秒 5~20 条的速度补发,同时记录最新补发位置,防止重复。
进程要自愈。Node-RED 或者 Python 脚本挂了没人发现,设备就成哑巴了。建议用 systemd 的 Restart=always 来拉起进程,再加一个硬件看门狗,真死机了能自动断电重启。
5.5 什么情况下别碰网关方案
只有一两块电表、现场不具备稳定供电、或者你完全不想维护一台 Linux 设备,就别选网关。成本和复杂度都划不来。我见过有人为了两块表专门上一台树莓派,结果半年后系统 TF 卡损坏,数据全丢,最后还是换回 DTU,这属于典型的需求和方案错配。
6. RS485 现场改造的坑:接线、电阻、协议、网络一个都不能少
6.1 接线:A/B 反接、屏蔽层处理、总线拓扑
RS485 接线看着简单,却是现场故障率最高的环节。A/B 必须对应,但不同厂家的定义不一样,有些表 B 是负极,有些表 B 反而接在 A 的对面,我只能建议你以实物说明书为准。
总线必须手拉手菊花链连接,不能星形接法。星形连接会导致反射干扰,距离稍长就会出现偶发乱码。如果现场已经布成星形,可以在星形点加一个 485 集线器或者中继器,把拓扑重新归整。
屏蔽层应该单端接地,不要两端都接,避免形成地环路。我在配电房里见过因为屏蔽层两端接地导致的地电位差干扰,表现为通信时好时坏,把屏蔽层改成单端接地后问题就消失了。
6.2 上下拉电阻和终端电阻:什么时候加、怎么算
很多人压根没听说过 RS485 还需要上下拉电阻,但实际项目中这个坑能让你整个系统跑不通。RS485 总线上电空闲时,如果没有任何设备主动驱动总线,A/B 之间的电平是浮动的,接收器会输出乱码 0x00 或 0xFF,导致云平台上不断收到大量垃圾数据。
解决思路是给总线加上“静态电平”:在 A 接一个上拉电阻到 VCC,B 接一个下拉电阻到 GND,空闲时 A-B 就有稳定的正向压差。同时根据线长和数据速率,可能还要在总线两端加终端电阻。
粗算公式可以用这个简化式:Vdiff = VCC * R_T / (2R + R_T)。其中 VCC 是偏置电压,R_T 是终端电阻,R 是上拉或下拉电阻的阻值,2R 表示上拉和下拉串联,R_T 表示终端电阻并联在 A-B 之间。
我举两个实例给你感受下。VCC = 5V,终端电阻 120Ω,上拉下拉各 10kΩ,代入后 Vdiff 约 0.06V,远低于接收器需要的 200mV 阈值,不靠谱。如果把上拉下拉改为 1kΩ,Vdiff 大约 0.28V,就能稳定识别了。
所以经验法则是:总线距离短、节点少时,可以不加终端电阻,只在 A/B 上挂一组 3.3kΩ 到 10kΩ 的偏置电阻即可;距离超过 10 米或者节点多于 5 个时,建议两端都加 120Ω 终端电阻,同时把上拉下拉调整到 1kΩ 左右,保证有足够阈值余量。
还要注意,每一组电阻只能加在总线的一端或者两端,别每台设备都加。我用过一个项目,客户每块表都加了 120Ω 终端电阻,结果整个总线阻抗太低,发送器拉不动,通信直接瘫痪。这个教训很深刻。
6.3 协议坑:DL/T 645 和 Modbus RTU 的帧结构完全不是一回事
DL/T 645 的帧以 0x68 开头,后面跟着 6 字节地址域、控制码、数据长度、数据域、校验和、0x16 结尾,常见波特率是 2400bps 偶校验。Modbus RTU 则是地址 + 功能码 + 寄存器地址 + 数据长度 + 数据 + CRC16,常见 9600bps 8N1。
问题在于,很多云平台的 Modbus 解析组件不认识 DL/T 645。如果你电表是 DL/T 645,而 DTU 只是透传、云平台只能解析 Modbus,那数据传上去就是乱码。这时候要么云平台支持 DL/T 645 插件,要么你必须在本地把它转换成 Modbus 格式,或者直接用第 4、5 节说的采集器和网关方案。
我建议在选型前先确认电表规约,别等设备买回来才发现协议对不上。
6.4 电表地址、波特率、校验位不匹配的直接后果
地址配置不一致,总线无响应,这是最隐蔽的坑。很多电表出厂地址是 000000 或 1,但实际运行中有人改过,你按默认地址去轮询自然读不到数据。解决办法是先用 485 转 USB 工具连接电表,逐一扫描地址段,确定真实地址。
波特率不匹配时,总线上收到的是乱码位,校验大概率失败。DL/T 645 最有迷惑性,因为它默认 2400bps,但如果客户现场统一调到过 9600,你按默认参数去调 DDTU 就会一直失败。调参前先问一句或者查一次,省去很多现场的反复。
校验位配置错误表现类似,会偶发正常、偶尔异常。Modbus 大多用无校验 + 两停止位,DL/T 645 用偶校验。配置时优先按电表说明书来。
6.5 网络层的顽固问题:掉线重连、重复上报、缓存
数据链路走到网络层面,问题也不少。用 WiFi 连电表采集器时,现场路由器信道拥堵可能导致 MQTT 频繁掉线,光把采集器重启没用,需要调整 TCP keepalive 参数和 MQTT 重连退避。
MQTT QoS 0 丢消息、QoS 1 可能重复投递,这是协议本身的特性。平台端处理数据时,最好以“表地址 + 时间戳”为唯一标识做幂等去重,这样即使重复收到也不会造成电量重复累加。
断网补传也是一门学问。恢复网络后一次性把几百条数据全推上来,我说过要限速,不然云平台可能有写入瓶颈。平台数据接口做批量写入的时候也要注意事务性,避免中途失败出现半截数据。
6.6 电气和现场干扰:供电、雷击、静电
老电表改造多数在配电环境,供电质量差、电磁干扰强。采集器和 DTU 的电源尽量选隔离 DC-DC 模块,别再和接触器线圈共用开关电源。我在项目里遇到过继电器吸合的瞬间采集器重启的问题,换隔离电源后解决。
RS485 接口建议加 TVS 管和自恢复保险丝,防止雷击浪涌把通信芯片打坏。对于跨建筑的长距离 485 线,屏蔽层接入大地是必须的。
安全红线也得牢记:计量柜内的互感器、电压端子,非专业人员绝对不能动。我在现场都是全程让客户电工配合,自己只碰通信端子,不碰强电部分。这不是技术问题,是人身安全底线。
7. 改造中我的几点体会
7.1 有时候最难的不是技术,而是电表侧资料不齐
改造老电表最大的敌人往往是找不到文档。有的表铭牌都模糊了,上网也搜不到说明书,只能靠现场试。我建议手边常备一把 485 转 USB 调试棒和一个串口抓包工具,用暴力扫地址、扫波特率的方式把参数摸清楚,再确认上云方案要走的协议。这套方法我用了很多年,成功率很高。
7.2 先做一台,再复制到全部,别上来就铺开
每次接到多表改造需求,我都会先在现场挑一块最好说话的表,完成一台设备从接线到云平台出现实时数据的完整闭环。确认没问题后,再成批部署。这个习惯帮我避开了很多批量返工。一次现场改 20 块表,如果顺序装完再一起调,光找哪台设备错了就能消耗一整天。
7.3 最后分享一个实用小习惯
我在每台采集设备和网关上都贴了一张标签,写上设备地址、电表通讯波特率、校验方式、对应的云平台设备 ID。后续出了问题,不靠记忆,翻开标签就能定位。这个习惯价值不大,但关键时刻很救命。
另外,RS485 调试阶段,建议先在本地电脑上确认通信完全稳定,再切换到云平台链路。不要带着一个没验证过的本地链路直接跳到云上调试,那样一旦出错,你根本分不清问题出在串口、网络、还是平台侧。按我的经验,先把“串口能读数据”这一步做实了,后面所有事情都会顺很多。