第三章:SCADA数据采集与预处理
大家好,我是老张。在风电运维这行摸爬滚打了十几年,今天咱们聊聊SCADA数据。说实话,很多刚入行的朋友觉得SCADA就是个数据记录器,其实远不止这么简单。
我见过太多项目,数据采集了一大堆,真正能用上的不到三成。为什么?因为预处理没做好。你想想看,垃圾数据进去,再好的模型也白搭。所以这一章,咱们把SCADA数据从采集到预处理,掰开了揉碎了讲清楚。
3.1 SCADA系统架构
SCADA系统,说白了就是风电场的"神经系统"。它负责把每台风机、每个传感器的数据,实时传回控制中心。
典型的SCADA架构分三层:
- 现场层:风机上的传感器、PLC控制器。我习惯叫它"前线哨兵"。
- 通信层:光纤、4G/5G、或者卫星通信。负责把数据传回来。
- 监控层:中控室的服务器、操作员站。数据在这里汇总、展示、存储。
嗯,这里要注意。很多风场为了省钱,通信层用的设备太差。我在内蒙古一个项目遇到过,冬天零下30度,光纤接头冻裂了,数据直接断流。后来我们换了工业级的光端机,才算彻底解决。
核心要点:SCADA架构的可靠性,取决于最薄弱的那个环节。通信层往往是瓶颈。
3.2 数据采集频率与类型
SCADA采集什么数据?这个问题我问过很多学员,答案五花八门。其实归纳起来就三类:
| 数据类型 | 典型参数 | 采集频率 |
|---|---|---|
| 状态量 | 启停状态、故障代码、并网状态 | 1秒~10秒 |
| 模拟量 | 风速、功率、转速、温度、振动 | 1秒~1分钟 |
| 累计量 | 发电量、运行小时数、桨距动作次数 | 1分钟~1小时 |
我个人习惯,做机器学习模型时,模拟量用1秒或10秒的数据。为什么?因为风速变化太快,1分钟的平均值会丢失很多细节。你想想看,一个阵风过来,可能就几秒钟的事,1分钟的数据根本抓不住。
但也不是频率越高越好。我记得有个项目,客户要求所有数据都按1秒采集。结果呢?一台风机一天产生800多万条记录,存储成本翻了三倍,模型效果却没提升多少。所以,采集频率要跟你的分析目标匹配。
3.3 数据清洗
数据清洗,这是最磨人的活。我常说,做数据清洗的时间,至少占整个项目的一半。为什么?因为SCADA数据太"脏"了。
3.3.1 缺失值处理
缺失值,说白了就是数据"断片"了。原因很多:传感器故障、通信中断、存储异常等等。
处理缺失值,我一般分三步走:
- 先判断缺失比例。如果某个参数缺失超过30%,我建议直接扔掉这个特征。别心疼,留着也是祸害。
- 再分析缺失模式。是随机缺失?还是连续缺失?连续缺失往往意味着设备故障。
- 最后选择填充方法。常用的有均值填充、前向填充、插值法。
我的经验:对于风速、功率这种连续变化的参数,用线性插值效果最好。对于状态量,用前向填充更合理。
# 一个简单的插值示例
import pandas as pd
# 读取SCADA数据
df = pd.read_csv('scada_data.csv')
# 线性插值填充风速缺失值
df['wind_speed'] = df['wind_speed'].interpolate(method='linear')
# 前向填充状态量
df['status'] = df['status'].ffill()
3.3.2 异常值处理
异常值,这是最头疼的。我曾经遇到过一个案例,某台风机的齿轮箱温度突然飙到120度,SCADA报了警。结果一查,是温度传感器被鸟粪糊住了。你说这算不算异常?算,但不是设备异常,是数据异常。
所以,处理异常值之前,先要搞清楚:是传感器坏了,还是设备真出问题了?
常用的方法有:
- 3σ原则:超出均值±3倍标准差的数据,视为异常。简单粗暴,但有效。
- IQR方法:四分位距法。对非正态分布的数据更友好。
- 领域规则:比如风速超过30m/s还发电,这肯定有问题。因为风机早就切出了。
避坑指南:千万不要一刀切地删除所有异常值。我曾经因为删得太狠,把一个齿轮箱早期故障的特征给删掉了,导致模型漏报。后来我学乖了,异常值先标记,再人工复核。
3.4 数据标准化
数据标准化,说白了就是把不同量纲的数据,拉到同一个尺度上。比如风速是0~30m/s,功率是0~2000kW,温度是-20~80度。如果不标准化,机器学习模型会"偏袒"数值大的特征。
常用的标准化方法:
| 方法 | 公式 | 适用场景 |
|---|---|---|
| Z-score标准化 | (x - μ) / σ | 数据近似正态分布 |
| Min-Max归一化 | (x - min) / (max - min) | 数据有明确边界 |
| Robust标准化 | (x - median) / IQR | 数据有较多异常值 |
我个人习惯,做风电功率预测时,用Z-score标准化。因为风速、功率的分布,其实挺接近正态的。但如果是做故障诊断,我建议用Robust标准化。为什么?因为故障数据往往包含异常值,Min-Max会被这些异常值"带偏"。
# Z-score标准化示例
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df[['wind_speed', 'power', 'temp']] = scaler.fit_transform(
df[['wind_speed', 'power', 'temp']]
)
3.5 知识体系总览
说了这么多,咱们用一张图把SCADA数据采集与预处理的脉络理清楚。这张图是我自己画的,你一看就明白。
这张图把整个流程串起来了。从数据采集开始,经过清洗、标准化,最后得到高质量的训练数据。每一步都环环相扣,缺一不可。
最后说一句:预处理做得好,模型就成功了一半。别嫌麻烦,这块功夫下到位了,后面会省很多事。