第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 数据清洗与预处理
数据采集上来了,但别急着用。原始数据里全是「脏东西」:
- 缺失值:传感器掉线、通信中断,数据就断了
- 异常值:传感器故障、干扰,数据突然跳变
- 重复值:同一个时间点采集了多次
- 噪声:小幅度的随机波动
我常用的清洗步骤,就三步:
- 去重:按时间戳排序,删除重复记录
- 补缺:短时间缺失用插值法,长时间缺失直接标记为无效
- 滤波:用中值滤波或移动平均,去掉毛刺
举个例子,温度数据突然从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 本章知识体系总览
下面这张图,是我自己总结的数据采集知识框架,你一看就明白了:
嗯,这张图基本把数据采集的脉络理清了。从传感器选型,到协议选择,再到数据清洗,每一步都不能马虎。
你想想看,如果传感器精度不够,采集到的数据本身就是错的,后面再怎么做可视化、做分析,都是白搭。所以我的建议是:在项目规划阶段,就把数据采集方案做扎实,别等到上线了再补。
好了,这一章就聊到这儿。数据采集是基础,但也是决定成败的关键。下一章咱们聊聊数据存储,看看采集上来的数据怎么存才高效。
公众号:蓝海资料掘金营,微信deep3321