2. 风场数据采集与治理:SCADA系统、激光雷达测风、数据清洗与标准化

各位工程师,大家好。这一章我们来聊聊风场的数据底座——数据采集与治理。说白了,就是搞清楚“数据从哪来、怎么来、来了之后怎么处理才能用”。

我见过不少项目,仿真模型建得漂漂亮亮,结果一跑起来跟实际风场差了十万八千里。为什么?数据源头就没整明白。你想想看,数字孪生讲究的是“以虚映实”,如果喂进去的数据都是脏的、乱的、有偏差的,那孪生出来的东西能准吗?

所以,这一章我们重点啃三块硬骨头:SCADA系统激光雷达测风,以及数据清洗与标准化。这三者构成了风场数字孪生的数据供应链。

2.1 SCADA系统:风场的“神经末梢”

SCADA,全称是监控与数据采集系统。你可以把它理解成风场的神经系统。每台风机上几十上百个传感器,把温度、振动、转速、功率、桨距角、偏航位置……一股脑儿地往SCADA服务器上报。

我个人习惯把SCADA数据分成三类:

  • 运行数据:有功功率、无功功率、发电机转速、电网频率等。这些是秒级或毫秒级的数据,用来做实时监控和短期预测。
  • 状态数据:风机运行/停机/故障/维护状态。这些是事件触发的,比如“报故障了,停机!”
  • 环境数据:机舱风速仪测的风速风向、环境温度、气压等。注意,这里的风速是机舱风速,不是自由流风速,后面会讲区别。

SCADA的数据量有多大?一个100MW的风场,50台2MW风机,一天就能产生几个GB的数据。嗯,这里要注意,数据量大不是问题,问题是数据质量。

⚠️ 我曾经踩过的坑: 某风场SCADA系统里,风速传感器因为结冰,连续三个月报的都是0.5m/s的恒定值。整个团队愣是没发现,直到做功率曲线分析时才发现不对劲。所以,SCADA数据一定要做“合理性校验”,不能拿来就用。

2.2 激光雷达测风:给风场装上“千里眼”

SCADA的机舱风速仪有个硬伤——它测的是风机转起来之后的气流,已经被叶片搅乱了。说白了,它测的不是“风来了多少”,而是“风被风机干扰后还剩多少”。

这时候,激光雷达(LiDAR)就派上用场了。它用激光脉冲测量大气中的气溶胶粒子运动,直接测出自由流风速。我建议在风场的前沿、后排、以及复杂地形区域,至少各部署一台激光雷达。

激光雷达能给我们带来什么?

  • 提前感知:可以测出前方200米到500米的风速风向,相当于给风机一个“预判”能力。偏航系统可以提前动作,减少载荷。
  • 风廓线测量:不同高度的风速是不一样的。激光雷达可以测出从地面到轮毂高度以上几十米的风速垂直分布。这对评估风切变、湍流强度至关重要。
  • 功率曲线验证:用激光雷达测的自由流风速,去对比SCADA测的发电功率,才能得到真实的功率曲线。机舱风速仪测的功率曲线,往往偏“好看”,但实际没那么好。
💡 一个小技巧: 激光雷达的数据采样频率通常比SCADA低(比如1Hz vs 10Hz),而且容易受雨雪、浓雾影响。我一般会把激光雷达数据做10分钟平均,再跟SCADA的10分钟平均数据对齐。这样两个数据源才能“对上话”。

2.3 数据清洗:把“垃圾”筛出去

数据采集回来了,但里面什么妖魔鬼怪都有。我总结了一下,常见的数据“脏”类型有这几种:

脏数据类型 典型表现 产生原因
缺失值 某段时间风速为NaN或0 传感器故障、通信中断
异常值 风速突然跳到100m/s 传感器受干扰、雷击
重复值 同一时间戳出现多条记录 数据重传、缓存机制bug
死值 连续几小时数值不变 传感器卡死、结冰
时序错乱 时间戳不连续或倒序 时钟同步失败

数据清洗的流程,我一般按这个顺序来:

  1. 去重:按时间戳+风机ID去重,保留第一条或最后一条。
  2. 缺失值处理:短时间缺失(<5分钟)用线性插值;长时间缺失直接剔除该时段。
  3. 异常值过滤:用3σ原则或箱线图法,把超出物理极限的值干掉。比如风速超过35m/s(切出风速以上)的,直接标记为无效。
  4. 死值检测:如果某个变量连续N个点数值完全一样,且N>阈值(比如60个点),判定为死值,整段剔除。
  5. 时间戳对齐:把所有数据重采样到统一的频率(比如10分钟平均)。
# 一个简单的Python清洗示例(伪代码)
import pandas as pd
import numpy as np

def clean_scada_data(df):
    # 1. 去重
    df = df.drop_duplicates(subset=['timestamp', 'turbine_id'])
    
    # 2. 异常值过滤(风速)
    df = df[(df['wind_speed'] >= 0) & (df['wind_speed'] <= 35)]
    
    # 3. 死值检测(功率)
    df['power_diff'] = df['active_power'].diff().abs()
    df = df[df['power_diff'] > 0.01]  # 功率变化小于0.01kW视为死值
    
    # 4. 缺失值插值(短时间)
    df = df.set_index('timestamp').resample('10T').mean()
    df = df.interpolate(method='linear', limit=5)  # 最多插5个点
    
    return df.reset_index()

2.4 数据标准化:让不同数据源“说同一种语言”

数据洗干净了,但还没完。SCADA的数据格式、激光雷达的数据格式、气象站的数据格式……五花八门。有的风速单位是m/s,有的是km/h;有的时间戳是UTC,有的是本地时间;有的功率单位是kW,有的是MW。

标准化,就是把这些数据统一成一个“通用格式”。我建议遵循以下规则:

  • 时间标准:统一使用UTC时间,精确到秒。本地时间作为辅助字段保留。
  • 物理单位:风速用m/s,风向用度(0-360°),功率用kW,温度用℃。别搞混。
  • 命名规范:变量名用英文小写+下划线。比如 wind_speed_hubactive_powerpitch_angle
  • 数据频率:统一为10分钟平均值。这是风能行业的通用标准,也是IEC 61400-12规定的功率曲线测试标准。
🔑 核心原则: 数据标准化不是为了“好看”,而是为了让数字孪生模型能够无缝对接不同数据源。你想想看,如果SCADA说“风速”是机舱风速,激光雷达说“风速”是自由流风速,模型到底该听谁的?所以,标准化时一定要带上数据来源标签测量位置标签

2.5 知识体系总览

下面这张图,是我梳理的本章知识体系。你可以把它当成一个“数据流地图”,从采集到治理,每一步都环环相扣。

风场数据采集与治理知识体系 SCADA系统 激光雷达测风 气象站/其他 数据清洗 去重 → 缺失值处理 → 异常值过滤 → 死值检测 → 时间戳对齐 数据标准化 时间标准(UTC) → 物理单位统一 → 命名规范 → 频率统一(10min) 数字孪生标准数据集 数据流方向 →

这张图把整个流程串起来了。从左侧的三个数据源出发,经过中间的清洗和标准化,最终汇入右侧的数字孪生标准数据集。每一步都有坑,每一步也都有技巧。

好了,这一章的内容就到这里。数据是数字孪生的血液,把数据治理好,后面的仿真和调试才能事半功倍。希望各位在实际项目中,能把这些方法用起来,少走一些我曾经走过的弯路。


专注资料整理