接入一台工业设备,演示版本通常很快:建立连接、读取寄存器、打印数值。

进入平台以后,链路会变成:

物理设备
-> 协议驱动
-> 数据解析
-> 设备身份映射
-> 本地缓存或时序库

任何一层语义不一致,问题都可能在很远的下游才出现。顺着这条链路看,工业设备接入要处理的问题会清楚很多。

一、连接层:连接成功不等于可以通信

现场常见的接入方式包括串口、TCP、Modbus、厂商私有协议、HTTP、SOAP 和 MQTT。连接层需要统一管理:

  • 建连与认证;
  • 读取、写入超时;
  • 心跳;
  • 断线重连;
  • 连接状态;
  • 优雅关闭。

重连要使用退避策略,避免设备断电后所有客户端同时高频重试:

1s -> 2s -> 4s -> 8s -> 30s

成功通信后再重置退避时间。连接对象还要有明确所有者,不能由多个 goroutine 在没有协调的情况下同时重连和关闭。

二、解析层:不要让原始协议泄漏到业务层

协议返回的是字节、寄存器或厂商字段,业务需要的是温度、压力、运行状态和告警。

解析层应完成:

  • 字节序处理;
  • 数据类型转换;
  • 缩放系数;
  • 单位标准化;
  • 位域解析;
  • CRC 或校验和;
  • 异常值识别。

例如一个寄存器值 253,可能表示 25.3℃。下游不应该再次猜测缩放规则,标准模型里应直接保存数值、单位和质量信息。

三、身份层:先回答“这是谁”

设备可能同时拥有IP、序列号、厂商编号、数据库 ID 和 GUID。IP 会变,名称会重,数据库自增 ID 只在局部有意义。

稳定身份应该由平台统一下发或维护,并贯穿:

配置 -> 采集 -> 存储 -> 转发 -> 告警 -> 页面

四、时间层:数据是什么时候发生的

工业数据里至少有三个时间:

  • 设备产生时间;
  • 网关采集时间;
  • 平台接收时间。

工业设备接入的难点,不在于写一个 demo 读到数据,而在于把数据稳定、准确、可追溯地送进平台。