数据采集基础:常见传感器与协议(Modbus、OPC UA、MQTT),数据清洗与归一化处理

说到数据采集,很多新手第一反应就是“接上线,读数据就行”。其实没那么简单。我搞工业物联网这些年,见过太多因为协议不通、数据格式混乱导致的翻车现场。这一章咱们就聊聊传感器、协议和数据清洗,把基础打牢。

一、传感器:工业血脉的“末梢神经”

传感器种类太多,但巡检场景下常用的就那几类。我个人习惯把它们按信号类型分:

传感器类型输出信号典型应用
温度(热电偶/热电阻)4-20mA / 热电偶电压电机轴承、锅炉炉膛
压力(压阻式/电容式)4-20mA / 0-10V液压系统、管道压力
振动(加速度/速度)4-20mA / IEPE 旋转机械、风机
流量(电磁/超声波)脉冲 / 4-20mA冷却水、气体输送
液位(雷达/超声波)4-20mA / Modbus RTU储罐、水池
我的经验: 4-20mA信号虽然老,但抗干扰能力强,远距离传输首选。我曾在化工厂遇到变频器强干扰,RS485通讯乱码,最后换成模拟量走隔离栅才稳定。

二、三大工业通信协议:Modbus、OPC UA、MQTT

协议这东西,说白了就是约好的“说话方式”。设备厂家各说各话,你得当个翻译官。我按应用层级讲:

2.1 Modbus:工业届的“普通话”

Modbus分RTU(串口)和TCP(以太网)。RTU用RS485总线,一根线上挂几十个设备。TCP直接用网线,封包格式几乎一样。

举个读取温度寄存器的例子:

// Modbus RTU 读取保持寄存器(功能码03)
// 请求:从站地址 0x01,功能码 0x03,起始地址 0x0064,寄存器数量 0x0002
// 报文:01 03 00 64 00 02 85 F8
// 响应:01 03 04 01 2C 01 40 xx xx
// 温度 = (0x012C + 0x0140/100) = 300 + 3.2 = 303.2°C
踩坑提醒: 我曾经被“寄存器字节顺序”坑过——有的设备低位在前,有的高位在前,还有的整型拆成两个16位寄存器。不改代码,温度能差几十度。建议第一次对接时先读已知量验证。

2.2 OPC UA:面向未来的统一架构

OPC UA比Modbus高级很多。它不光传数据,还自带数据模型、安全认证、历史记录。说白了,Modbus只告诉你“值是多少”,OPC UA还能告诉你“这个值代表什么、单位是什么、量程是多少”。

重要概念:

  • 地址空间: 每个变量是一个节点,有唯一NodeId
  • 订阅机制: 客户端订阅变量,变化时服务器推送,不用轮询
  • 安全: 支持证书加密,适合跨企业网

OPC UA的痛点?嗯,协议栈复杂,嵌入式设备资源紧张时跑不动。而且早期版本不同厂商兼容性差。我建议:新项目能用OPC UA就用,但一定要先做互操作性测试。

2.3 MQTT:物联网时代的轻量级消息

MQTT是发布/订阅模式。设备发消息到主题(Topic),后端订阅。最常用的是QoS 1(至少一次)和QoS 2(恰好一次)。

典型主题设计:

factory/zone1/pump02/temperature  →  payload: 85.2
factory/zone1/pump02/pressure     →  payload: 2.3
factory/zone1/pump02/status       →  payload: running

MQTT适合无线、低带宽、不稳定的场景。注意:千万别把敏感数据明文发!我见过工厂Wi-Fi弱密码,被隔壁车间搞了个恶作剧,把风机转速改到0。之后所有MQTT都强制TLS加密。

三、协议选型对比

特性ModbusOPC UAMQTT
传输模式请求/响应客户端/服务器或发布/订阅发布/订阅
数据模型无(纯数值)丰富(对象、方法、类型)简单(字符串/二进制)
安全性无(或简单校验)强(证书加密)TLS + 用户名密码
实时性高(轮询周期可控)中(订阅推送,延迟可接受)中(依赖Broker)
适用场景PLC、仪表、DCSMES、SCADA、ERP集成远程监测、边缘网关

你想想看,现场设备如果全是新采购,统一OPC UA最省心。但如果有一堆老旧温控表,老老实实走Modbus转网关吧。

四、数据清洗与归一化处理

数据采集回来,你以为就能直接用了?太天真了。原始数据里常夹杂着:超量程、通讯毛刺、丢包、重复值、单位不一致。我称之为“数据的三道关”:

4.1 第一关:数据清洗

  • 去冗余: 相同时间戳的重复值只留一个(比如MQTT QoS 1可能重复投递)
  • 异常值过滤: 使用帕累托准则(3σ)或IQR方法剔除飞点。我习惯保留原始值的同时标记异常,而不是直接删除——万一后面分析需要呢?
  • 填补空值: 短时间缺失用线性插值,长时间缺失标记为“不可用”。千万别用均值填充,会掩盖故障。

4.2 第二关:归一化

归一化就是把不同量纲的数据压到同一尺度,比如0~1或-1~1。常用两种:

// Min-Max 归一化
x_norm = (x - x_min) / (x_max - x_min)

// Z-Score 标准化
x_norm = (x - μ) / σ

Min-Max适合有明确上下限的传感器(如温度0-200℃),Z-Score适合分布未知的情况。我在做振动分析时坚决用Z-Score,因为加速度幅值变化大,Min-Max会被偶尔的尖峰压平移。

4.3 第三关:时间戳对齐

不同协议的采样时间戳不同——Modbus轮询有延迟,MQTT有网络抖动。我建议在采集层统一用网关的系统时间打戳,然后按固定周期(比如1秒)重采样。重采样方法:

  • 最近邻: 取最接近时刻的值,简单快速
  • 线性插值: 适合连续变量,但丢点超过一个周期就别用了
重要原则: 清洗和归一化不能改变数据的时序关系。原始数据必须存档,清洗后的数据用于分析和告警。我的做法是分表存储:raw_data保留全量,clean_data只存清洗后的,tag表记录每次清洗的参数和版本。

五、数据采集整体流程

下面这张图把传感器、协议、清洗到归一化的链条串起来,你看一遍就明白了:

数据采集与处理流程 传感器 温度/压力/振动 通信协议 Modbus/OPC UA/MQTT 采集网关 协议解析+时间戳 原始数据 raw_data 数据清洗 去重·异常过滤·插值 归一化 Min-Max / Z-Score 清洗后数据 关键策略 保留原始数据 清洗参数版本化管理
我的习惯: 在采集网关里就把时间戳对齐好,这样后续处理不用二次打标。网关CPU够用的话,甚至可以跑一些简单的异常过滤(比如值超出量程上限就直接丢弃)。省得大量脏数据涌进数据库。

好了,这一章的重点就是这些。传感器选型要匹配信号类型和量程,协议选择要看现场设备能力和集成需求,数据清洗和归一化不能偷懒。基础打牢了,后面的阈值设计与实时巡检才能稳。你想想看,如果连数据都是错的,阈值调得再精细有什么用?