第三章:风电运维数据采集——SCADA、振动、油液、气象数据的采集与清洗

各位同行,咱们做风电运维的,都知道一个道理:数据就是眼睛。没有准确的数据,你连风机在“喊疼”都听不见。这一章,我就把SCADA数据、振动数据、油液数据和气象数据这四类核心数据的采集与清洗,掰开了揉碎了讲清楚。

核心观点:数据采集不是“接根线就完事”,清洗也不是“删掉空值就收工”。这两步做不好,后面的智能检索和故障诊断全是空中楼阁。

3.1 SCADA数据采集与清洗

SCADA系统,说白了就是风机的“黑匣子”。它记录着风机几乎所有的运行参数:功率、转速、温度、电压、电流……我见过不少新入行的同事,上来就对着SCADA数据做分析,结果发现模型根本不准。为什么?因为数据没洗干净。

3.1.1 采集要点

  • 采样频率:通常为1秒或10秒一次。我个人习惯,做振动分析时用1秒数据,做功率曲线分析时用10秒数据,够用就行,别贪多。
  • 数据字段:至少包含时间戳、有功功率、风速、发电机转速、桨距角、机舱温度、齿轮箱油温。少了这几个,你后面做相关性分析会很难受。
  • 采集方式:通过OPC UA或Modbus TCP协议从风机主控PLC读取。嗯,这里要注意,有些老风机用的是Modbus RTU,需要串口转以太网。

3.1.2 清洗方法

SCADA数据最常见的坑有三个:空值、异常值、时间戳错乱

我的经验:我曾经处理过一个风场的数据,发现某台风机连续三天功率为零,但风速正常。查了半天,原来是通讯模块死机了。这种数据如果不剔除,会严重拉低整个风场的平均发电量。

# 一个简单的SCADA数据清洗流程(Python伪代码)
import pandas as pd
import numpy as np

# 1. 加载数据
df = pd.read_csv('scada_data.csv')

# 2. 删除空值超过50%的列
df = df.dropna(thresh=len(df)*0.5, axis=1)

# 3. 处理时间戳:统一为UTC格式
df['timestamp'] = pd.to_datetime(df['timestamp'], utc=True)

# 4. 剔除停机数据(功率 < 0 或 风速 < 切入风速)
df = df[(df['active_power'] > 0) & (df['wind_speed'] >= 3.0)]

# 5. 功率曲线异常点剔除(3-sigma原则)
mean_power = df['active_power'].mean()
std_power = df['active_power'].std()
df = df[(np.abs(df['active_power'] - mean_power) <= 3 * std_power)]

3.2 振动数据采集与清洗

振动数据是诊断齿轮箱和轴承故障的“听诊器”。但说实话,振动数据也是最容易“脏”的数据。你想想看,传感器安装在高速运转的部件上,电磁干扰、安装松动、线缆破损……随便哪个问题都能让数据变成一团乱麻。

3.2.1 采集要点

  • 传感器类型:加速度传感器(IEPE型)最常用,频率范围0.5Hz-10kHz。我建议在齿轮箱高速轴、发电机驱动端和非驱动端各装一个。
  • 采样频率:至少2.56倍于最高分析频率。比如你要分析到2kHz,采样频率就得设到5.12kHz以上。
  • 数据长度:每次采集至少1秒的连续数据,做FFT时分辨率才够。

3.2.2 清洗方法

振动数据清洗,核心是去趋势项去噪

注意:千万不要直接对原始振动数据做均值滤波!这会抹掉冲击信号的特征。我曾经见过有人把轴承早期故障的冲击信号给滤没了,白白错过了最佳维修窗口。

# 振动数据清洗示例(去趋势 + 带通滤波)
from scipy import signal

# 1. 去趋势(消除直流分量和低频漂移)
detrended_data = signal.detrend(vibration_data)

# 2. 设计带通滤波器(保留10Hz-1000Hz的故障特征频率)
b, a = signal.butter(4, [10/(fs/2), 1000/(fs/2)], btype='band')
filtered_data = signal.filtfilt(b, a, detrended_data)

# 3. 剔除异常峰值(超过5倍RMS值的点视为传感器敲击)
rms = np.sqrt(np.mean(filtered_data**2))
clean_data = filtered_data[np.abs(filtered_data) < 5 * rms]

3.3 油液数据采集与清洗

油液数据,说白了就是齿轮箱的“血液检测报告”。颗粒计数、水分含量、粘度、酸值……这些指标能直接反映齿轮箱的磨损程度和润滑状态。但油液数据有个特点:采样频率低,通常一个月甚至一季度才采一次。所以每一组数据都特别珍贵。

3.3.1 采集要点

  • 采样位置:一定要在油路循环的“下游”采样,比如回油管。在油箱底部采样?那测出来的全是沉淀物,没有代表性。
  • 关键指标:ISO清洁度代码(如ISO 4406)、水分含量(ppm)、40℃运动粘度、酸值(mg KOH/g)。
  • 采样容器:用专用的清洁瓶,别用矿泉水瓶!我曾经见过有人用可乐瓶装油样,结果塑料瓶里的增塑剂溶进油里,检测结果直接报废。

3.3.2 清洗方法

油液数据清洗,主要是异常值剔除趋势平滑

指标 正常范围 异常判断 清洗策略
ISO清洁度 18/16/13 以下 突然跳升3级以上 标记为可疑,需复检
水分含量 < 200 ppm > 500 ppm 剔除,可能为采样污染
40℃粘度 标称值 ± 10% 偏差 > 20% 剔除,可能混入其他油品
酸值 < 0.5 mg KOH/g > 1.0 mg KOH/g 保留,但标记为严重警告

3.4 气象数据采集与清洗

气象数据,主要是风速、风向、温度、气压、湿度。这些数据看似简单,但坑最多。为什么?因为气象站安装在机舱顶部,风机偏航、叶片遮挡、甚至鸟粪都能影响测量结果。

3.4.1 采集要点

  • 风速仪:超声波风速仪比机械式更可靠,但贵。机械式风速仪容易结冰,北方风场尤其要注意。
  • 风向标:安装时要校准到正北方向。我见过一个风场,所有风向标都偏了15度,导致偏航控制一直不准,发电量损失了3%。
  • 数据频率:建议与SCADA同步,1秒或10秒一次。

3.4.2 清洗方法

气象数据清洗,核心是剔除机舱效应修正尾流影响

避坑指南:我曾经处理过一个风场的数据,发现某台风机在偏航对风时,风速突然从8m/s掉到3m/s。一开始以为是风速仪坏了,后来才发现是叶片正好转到风速仪前方,形成了遮挡。这种数据必须剔除,否则功率曲线会严重失真。

# 气象数据清洗示例(剔除机舱效应)
# 假设数据包含:timestamp, wind_speed, wind_direction, yaw_position

# 1. 计算相对风向(风向 - 机舱朝向)
df['relative_wind_dir'] = (df['wind_direction'] - df['yaw_position']) % 360

# 2. 剔除叶片遮挡区域(相对风向在 -30° 到 30° 之间时,风速可能被遮挡)
df = df[(df['relative_wind_dir'] < -30) | (df['relative_wind_dir'] > 30)]

# 3. 剔除极端风速(超过切出风速或低于切入风速)
df = df[(df['wind_speed'] >= 3.0) & (df['wind_speed'] <= 25.0)]

# 4. 对风速做3点滑动平均,平滑湍流影响
df['wind_speed_smoothed'] = df['wind_speed'].rolling(window=3, center=True).mean()

3.5 数据融合与知识图谱构建

四类数据都洗干净了,接下来就是融合。我个人习惯,以SCADA数据的时间戳为主轴,把振动、油液、气象数据按时间对齐。对齐之后,才能做真正的智能检索和故障诊断。

核心逻辑:SCADA数据提供“发生了什么”,振动数据提供“哪里在响”,油液数据提供“磨损到什么程度”,气象数据提供“外部环境如何”。四者结合,才能还原故障的全貌。

风电运维数据采集与清洗知识体系 SCADA数据 振动数据 油液数据 气象数据 数据清洗层(空值处理、异常剔除、去噪、对齐) 数据融合层(时间戳对齐、特征提取) 智能检索与故障诊断知识库

嗯,这一章的内容就到这里。数据采集和清洗是风电运维数据分析的“地基”,地基不牢,上面盖再高的楼也是危房。希望各位在实际工作中,能把这些方法用起来,少走一些我当年走过的弯路。

专注资料整理