第2章:数据采集基础:传感器类型、数据采集协议(Modbus、IEC 104)、数据清洗与预处理

大家好,我是老张。在储能运维这个行当摸爬滚打了十来年,今天咱们聊聊数据采集这件事。

很多人觉得数据采集不就是接根线、读个数吗?其实没那么简单。我见过太多项目,前期采集没做好,后面做可视化分析时,数据全是垃圾,根本没法用。说白了,数据采集是整个可视化体系的根基,根基不稳,楼盖得再高也得塌。

2.1 储能系统常见的传感器类型

储能系统里,传感器就像我们的眼睛和耳朵。没有它们,你根本不知道电池在干什么。

我个人习惯把传感器分成三大类:

  • 电气量传感器:电压、电流、功率。这是最基础的,每个电池簇、每个PCS(储能变流器)都得装。
  • 环境量传感器:温度、湿度、气压。电池对温度特别敏感,我见过一个项目因为温度传感器装少了,导致热失控预警没及时触发,差点出大事。
  • 状态量传感器:烟雾、气体(氢气、一氧化碳)、液位、门禁。这些主要用于安全监控。

重点提醒:温度传感器不是随便装几个就行。每个电池模组至少要有1-2个测温点,电池簇的正负极母线也要装。我曾经在一个项目中,客户为了省钱,一个簇只装了一个温度探头,结果中间某个电芯过温了,系统完全没发现。

传感器类型 测量参数 典型精度 安装位置
电压传感器 单体电压、总电压 ±0.5% 电池模组、电池簇
电流传感器 充放电电流 ±1% 电池簇主回路
温度传感器 电芯温度、环境温度 ±0.5℃ 电芯表面、风道出口
烟雾传感器 烟雾浓度 报警阈值可调 电池仓顶部

2.2 数据采集协议:Modbus 和 IEC 104

传感器采集到的数据,怎么传到后台?这就靠通信协议了。储能行业最常用的两个协议,一个是Modbus,一个是IEC 104。

2.2.1 Modbus 协议

Modbus 是老牌协议了,简单、稳定、兼容性好。几乎所有储能设备都支持。

它有两种模式:

  • Modbus RTU:走串口(RS-485),适合短距离、低速传输。我早期做的一个小储能站,用的就是RTU,一根双绞线能带32个设备。
  • Modbus TCP:走以太网,速度快,距离远。现在新建的大型储能项目,基本都是TCP。

我的经验:Modbus 有个坑——地址冲突。多个设备如果设了相同的地址,数据就会乱套。我建议在项目调试阶段,先用一个扫描工具把所有设备的地址扫一遍,确认没有重复再上线。

下面是一个用Python读取Modbus数据的简单示例:

from pymodbus.client import ModbusTcpClient

# 连接设备
client = ModbusTcpClient('192.168.1.100', port=502)
client.connect()

# 读取保持寄存器,从地址0开始,读10个寄存器
result = client.read_holding_registers(0, 10, unit=1)

if result.isError():
    print("读取失败,请检查连接")
else:
    for i, value in enumerate(result.registers):
        print(f"寄存器 {i}: {value}")

client.close()

2.2.2 IEC 104 协议

IEC 104 是电力系统的标准协议,储能作为新型电力系统的一部分,现在越来越多的项目要求用这个协议。

它比Modbus复杂,但功能更强:

  • 支持遥测(模拟量)、遥信(开关量)、遥控(控制命令)
  • 自带时间戳,数据带时标,方便历史追溯
  • 有确认机制,通信可靠性高

注意:IEC 104 的报文结构比较复杂,调试时建议用抓包工具(如Wireshark)分析报文。我曾经被一个报文格式错误折腾了两天,最后发现是字节序搞反了。

2.3 数据清洗与预处理

数据采集上来了,但别急着用。原始数据里全是「脏东西」:

  • 缺失值:传感器掉线、通信中断,数据就断了
  • 异常值:传感器故障、干扰,数据突然跳变
  • 重复值:同一个时间点采集了多次
  • 噪声:小幅度的随机波动

我常用的清洗步骤,就三步:

  1. 去重:按时间戳排序,删除重复记录
  2. 补缺:短时间缺失用插值法,长时间缺失直接标记为无效
  3. 滤波:用中值滤波或移动平均,去掉毛刺

举个例子,温度数据突然从25℃跳到85℃,然后又跳回来。这明显是传感器故障,不是真实温度变化。我会用「3σ原则」来检测这种异常:

import numpy as np

def detect_outliers(data, threshold=3):
    mean = np.mean(data)
    std = np.std(data)
    outliers = []
    for i, value in enumerate(data):
        z_score = (value - mean) / std
        if abs(z_score) > threshold:
            outliers.append(i)
    return outliers

# 假设温度数据
temperatures = [25.1, 25.3, 25.0, 85.2, 25.2, 25.4]
bad_indices = detect_outliers(temperatures)
print(f"异常数据索引: {bad_indices}")

避坑指南:我曾经在清洗数据时,把电池正常充放电的电压变化当成了异常值给滤掉了。后来发现,电池在充电时电压会自然上升,这不是故障。所以清洗前一定要先理解数据的物理意义,别一刀切。

2.4 本章知识体系总览

下面这张图,是我自己总结的数据采集知识框架,你一看就明白了:

数据采集知识体系 传感器类型 电气量 | 环境量 | 状态量 采集协议 Modbus | IEC 104 数据清洗 去重 | 补缺 | 滤波 传感器选型要点 • 精度满足系统要求 • 量程覆盖工作范围 • 防护等级适应环境 • 通信接口匹配 协议选择建议 • 小项目用Modbus RTU • 大项目用Modbus TCP • 电力并网用IEC 104 • 注意协议转换网关 清洗注意事项 • 保留原始数据备份 • 理解物理意义再清洗 • 异常值要人工复核 • 建立清洗日志 核心原则:数据质量决定分析质量 传感器选对 → 协议配好 → 清洗到位 → 数据可用

嗯,这张图基本把数据采集的脉络理清了。从传感器选型,到协议选择,再到数据清洗,每一步都不能马虎。

你想想看,如果传感器精度不够,采集到的数据本身就是错的,后面再怎么做可视化、做分析,都是白搭。所以我的建议是:在项目规划阶段,就把数据采集方案做扎实,别等到上线了再补。

好了,这一章就聊到这儿。数据采集是基础,但也是决定成败的关键。下一章咱们聊聊数据存储,看看采集上来的数据怎么存才高效。


公众号:蓝海资料掘金营,微信deep3321