# 数据契约 — 国电联合动力 GUP UP2000 2.0MW DFIG (阜山, 山东招远 / 国电招远) # schema_v2 SOP 标准件 (2026-07-17, legacy-completion onboard). data-first §1.2 实证 (A1/A5/A11/A20 冬夏池, ~36k行 + 全月抽样)。 # 复用基 lineage = gup_up2000_2mw.yaml(旧阜山18台base) + gup_up2000_fengxiang.yaml(同OEM); 本场中文列名 + 独立实证 override。 # ★★ 本场独有价值: 唯一真·多高度测风塔 (10/30/50/70m 全年实测 + 轮毂高层Oct2023起) → 绝对性能/达成率/NTF/Cp 可做 (区别所有 self_ref-only 场; 见 mast section + power-curve-ntf skill)。 # ⚠ legacy 产物别扰: outputs/fushan/*.parquet (E映射/DEL/塔振 ad-hoc) 保留; 本契约只驱动 cleaned/turbine_10min.parquet + cleaned/mast.parquet。 schema_version: 2 meta: oem: 国电联合动力 GUP model: UP2000 2.0MW DFIG (geared) topology: dfig_geared rated_kw: 2080 # ✅实证: 功率设定plateau=2080000W(2080kW); 变频器有功 p99.9≈2081-2103kW, max~2160kW. 铭牌名义2000, 运行封顶/设定=2080 source_farm: 阜山 (山东招远, 国电招远/国网) reuse_base: gup_up2000_2mw.yaml + gup_up2000_fengxiang.yaml (同OEM; 中文列名/单位/哨兵本场重验) n_machines: 18 # ✅实证: A1-A25 目录名义25台, 实际有数据=18台 (A1,A2,A3,A4,A5,A6,A7,A11,A12,A13,A15,A16,A17,A18,A19,A20,A22,A25; 缺A8,A9,A10,A14,A21,A23,A24). ON-1⑤ 台数双键: 目录名≠有数据台数 layout: format: "SCADA_Minute_阜山[风场|风电场]_[号风机]_.csv (GBK); 2表头行(行1=中文名/行2=英文SCADA码 UNIT.CI_*/SCADAUSE.CI_*) + rows: 时间,值..." encoding: GBK time_format: "YYYY-MM-DD HH:MM:SS" assemble: "scripts/fushan_assemble.py (per台per月 name-based concat; skiprows=[1] 用中文表头; tid=re _(A\\d+); 冬夏schema漂移 name-based 容差)" schema_drift: "主集(A1-A25目录 1-9月)=51信号; 后期月列数漂移(10月=50/11月=57/12月=62)但CORE(功率/风速/变桨/温度)全在 → name-based映射, 多出列(发电机空冷温度/高速轴刹车压力/电能质量/额外桨叶反馈)本cleaned不纳(记account, 需时另取)" sampling: turbine_10min_s: 600 # ✅实证: t.diff().median()=600s per文件 per月 (全月抽样, 单台=600s; 多台long格式全局diff=0是交织伪影, sampling真值=per台) mast_s: 300 # ✅实证: 测风塔 5-min (00:00/00:05/00:10) caveat: "10min turbine 覆盖 2023-01~2023-12(+2024-01首日); mast 覆盖 2023-01~2024-01(13月度文件)" # ---- 机组 SCADA 10-min (raw 中文列名; canonical 换算在 assembler: 功率/设定 /1000→kW, 风向1/2 *57.2958→deg; 余列已 canonical 单位) ---- turbine_10min: sampling_s: 600 required: [变频器有功, 风速1, 变桨轴1位置反馈] columns: 变频器有功: canonical_id: WAPC_active_power raw_unit: W # ✅实证 raw max ~2.16e6 = W (瓦特陷阱; 盲用差1000×) to_canonical: "/1000" # → kW (assembler 预换算) valid_range_canonical: [-150, 2200] # ✅实证(池36k): kW; 负端=停机辅助耗电 min -119kW; 上端 max~2161<2200 observed_range: [-120, 2160] block_if_raw_exceeds: 50000 # raw>5e4 = 仍瓦特未换算 → BLOCK 功率设定: canonical_id: WAPC_setpoint raw_unit: W to_canonical: "/1000" valid_range_canonical: [0, 2200] observed_range: [0, 2080] semantic: "<2080kW = 限电/降功率标志 (设定枚举 {0,1829,2029,2030,2050,2080}kW; plateau 2080=额定)" 风速1: canonical_id: WMET_wind_speed_nacelle unit: m/s valid_range: [-2, 40] observed_range: [0, 22] self_ref_risk: true # ★ 机舱风自指; 但本场有真测风塔 → 绝对性能改用 mast (非 INSUFFICIENT) 风速2: canonical_id: WMET_wind_speed_nacelle2 unit: m/s valid_range: [-2, 40] observed_range: [0, 23] self_ref_risk: true note: "第二机舱风速计; ✅实证 per台liveness: 16/18台活(med~5), A12死(med0.43 nuniq23), A13降级(med0.47) → 跨机死列判定按台, 非全局死" 风向1: canonical_id: WYAW_yaw_error raw_unit: rad # ✅实证 ±3.14 主体 = rad to_canonical: "*57.2958" frame: nacelle # nacelle-frame → 偏航不作地理扇区 valid_range_canonical: [-180, 180] observed_range: [-180, 180] note: "★ raw min-4.71rad(>π, 同红阳)=wrap/量程artifact; *57.3后>180°者界外→NaN. 无-99哨兵. nacelle-frame不可作地理(伪地理三件套: 无独立地理列)" 风向2: canonical_id: WYAW_yaw_error_2 raw_unit: rad to_canonical: "*57.2958" frame: nacelle valid_range_canonical: [-180, 180] observed_range: [-180, 180] note: "第二对风角; 与风向1交叉" 机舱位置: canonical_id: WYAW_nacelle_position frame: na unusable: true valid_range: [-360, 360] observed_range: [-6, 12] note: "★ 实证范围 -3.5~10.8 = 非0-360航向(编码器局部偏移/未标定) → 不可作地理heading/绝对偏航锚 (同旧阜山base)" 发电机转速(pcs): canonical_id: WGEN_generator_speed unit: rpm valid_range: [-60, 2000] observed_range: [-45, 1880] note: "权威发电机转速; 负端=停机传感器偏置 min-42" 发电机转速反馈: canonical_id: WGEN_speed_fb_scaled valid_range: [-60, 2000] observed_range: [-5, 200] note: "⚠标度异于pcs(p50~128 vs 1219, 比~9.5)→单位/标度待核; 用『发电机转速(pcs)』为权威转速" 叶轮转速1: canonical_id: WROT_rotor_speed unit: rpm valid_range: [-1, 25] observed_range: [0, 16] note: "-6.99坏值簇 <-1 → NaN; 近零偏置保留; rated~14rpm" 叶轮转速2: canonical_id: WROT_rotor_speed_2 unit: rpm valid_range: [-1, 25] observed_range: [0, 16] 变桨轴1位置反馈: canonical_id: WROT_pitch_1 raw_unit: deg # ✅实证 [-0.05,89.08]=度 (本场度, 同枫香; 异于红阳/旧阜山base的rad → 照搬差57×) valid_range: [-5, 95] observed_range: [-2, 90] 变桨轴2位置反馈: { canonical_id: WROT_pitch_2, raw_unit: deg, valid_range: [-5, 95], observed_range: [-2, 90] } 变桨轴3位置反馈: { canonical_id: WROT_pitch_3, raw_unit: deg, valid_range: [-5, 95], observed_range: [-2, 90] } 变桨轴1位置指令: canonical_id: WROT_pitch_demand_1 raw_unit: deg valid_range: [-5, 95] observed_range: [-2, 90] note: "★集距(collective)铁证: 三轴指令极差 p50=p95=0 (广播单指令); 反馈三叶极差 p95=0.07°<<1° → 非IPC. per-blade反馈存在(3真传感器)→三叶不平衡诊断可做, 但控制=集距" 变桨轴2位置指令: { canonical_id: WROT_pitch_demand_2, raw_unit: deg, valid_range: [-5, 95], observed_range: [-2, 90] } 变桨轴3位置指令: { canonical_id: WROT_pitch_demand_3, raw_unit: deg, valid_range: [-5, 95], observed_range: [-2, 90] } 齿轮箱入口油温: { canonical_id: WGBX_oil_inlet_temp, unit: degC, valid_range: [-20, 90], observed_range: [5, 60] } 齿轮箱输入轴轴温: { canonical_id: WGBX_lss_shaft_temp, unit: degC, valid_range: [-20, 110], observed_range: [15, 85], note: "低速轴(输入轴)温" } 齿轮箱油槽温度: { canonical_id: WGBX_oil_sump_temp, unit: degC, valid_range: [-20, 90], observed_range: [15, 70], note: "NBM齿箱轴承冷浸参照候选(同浴)" } 齿轮箱输出轴轴温: { canonical_id: WGBX_hss_bearing_temp, unit: degC, valid_range: [-20, 110], observed_range: [15, 82], note: "输出轴≈高速轴承" } 齿箱润滑油内部油压: canonical_id: WGBX_oil_pressure raw_unit: Pa valid_range: [-500000, 2000000] observed_range: [-400000, 1400000] note: "raw~Pa (标称p50~5.9bar); 负值=停机; 非核心信号" 发电机轴承A温度: { canonical_id: WGEN_bearing_a, unit: degC, valid_range: [-20, 100], observed_range: [3, 75], note: "A/B配对差可做; A=DE还是NDE待坐实" } 发电机轴承B温度: { canonical_id: WGEN_bearing_b, unit: degC, valid_range: [-20, 100], observed_range: [1, 86] } 发电机定子绕组温度U1: { canonical_id: WGEN_winding_u1, unit: degC, valid_range: [-20, 155], observed_range: [10, 120], note: "全套U1/U2/V1/V2/W1/W2 → 三相不对称判据解锁; F级155; 无325哨兵" } 发电机定子绕组温度U2: { canonical_id: WGEN_winding_u2, unit: degC, valid_range: [-20, 155], observed_range: [10, 120] } 发电机定子绕组温度V1: { canonical_id: WGEN_winding_v1, unit: degC, valid_range: [-20, 155], observed_range: [10, 120] } 发电机定子绕组温度V2: { canonical_id: WGEN_winding_v2, unit: degC, valid_range: [-20, 155], observed_range: [10, 120] } 发电机定子绕组温度W1: { canonical_id: WGEN_winding_w1, unit: degC, valid_range: [-20, 155], observed_range: [10, 120] } 发电机定子绕组温度W2: { canonical_id: WGEN_winding_w2, unit: degC, valid_range: [-20, 155], observed_range: [10, 120] } 主轴齿箱侧温度: { canonical_id: WMBR_temp_gbx_side, unit: degC, valid_range: [-20, 90], observed_range: [8, 50], note: "主轴脂润滑无油浴 → NBM不配冷浸参照" } 主轴叶轮侧侧温度: { canonical_id: WMBR_temp_rotor_side, unit: degC, valid_range: [-20, 90], observed_range: [1, 40], note: "与齿箱侧配对差可做 (原始列名双'侧'非笔误)" } 机舱空气温度: { canonical_id: WNAC_air_temp, unit: degC, valid_range: [-40, 70], observed_range: [-9, 41] } 机舱柜温度: { canonical_id: WNAC_cabinet_temp, unit: degC, valid_range: [-40, 70], observed_range: [-3, 41] } 机舱外环境温度: canonical_id: WMET_ambient_temp unit: degC sentinel: [311.7] # ✅实证: 311.7 饱和哨兵 (p999=max=311.7) → NaN valid_range: [-40, 55] observed_range: [-27, 40] note: "环境温度; 311.7哨兵→NaN; 冬季实测低至-26℃" 塔底柜温度: { canonical_id: WTUR_tower_base_cabinet_temp, unit: degC, valid_range: [-40, 80], observed_range: [-2, 57] } 变桨轴1轮毂温度: { canonical_id: WROT_pitch_hub_temp_1, unit: degC, valid_range: [-40, 70], observed_range: [-4, 36] } 变桨轴2轮毂温度: { canonical_id: WROT_pitch_hub_temp_2, unit: degC, valid_range: [-40, 70], observed_range: [-4, 36] } 变桨轴3轮毂温度: { canonical_id: WROT_pitch_hub_temp_3, unit: degC, valid_range: [-40, 70], observed_range: [-4, 36] } 变频器转矩反馈: { canonical_id: WCNV_torque_fb, valid_range: [-2000, 15000], observed_range: [0, 11300], note: "发电转矩反馈(Nm级); 削峰/控制律参考" } 变频器转矩给定: { canonical_id: WCNV_torque_demand, valid_range: [-2000, 15000], observed_range: [0, 11300] } 变频器无功: canonical_id: WAPC_reactive_power raw_unit: var valid_range: [-1500000, 1500000] observed_range: [-620000, 580000] note: "无功功率 raw var (±~610kvar); A25台缺此列" 变频器无功给定反馈: { canonical_id: WAPC_reactive_setpoint, raw_unit: var, valid_range: [-1500000, 1500000], observed_range: [-620000, 580000] } 机舱前后振动加速度: canonical_id: WNAC_vib_foreaft_raw sentinel: [-1] valid_range: [30000, 50000] observed_range: [38000, 42000] note: "★raw counts (~39000偏置, 非物理m/s²; 勿入mean); -1哨兵→NaN; 振动统计须median. 秒级层另有真塔振(legacy fushan_wind用)" 机舱左右振动值: canonical_id: WNAC_vib_sidebyside dead_channel: true valid_range: [-1, 1] observed_range: [0, 0] note: "✅实证恒0 死通道 (弃, 勿当缺失填补)" 机舱X轴振动值: { canonical_id: WNAC_vib_x, valid_range: [-1, 1], observed_range: [-0.05, 0.05], note: "小幅g级; 少量-0.75离群" } 机舱Y轴振动值: { canonical_id: WNAC_vib_y, valid_range: [-1, 1], observed_range: [-0.05, 0.05] } 总电量: canonical_id: WTUR_total_energy observed_range: [0, 100000000] note: "累计发电量计数器 (kWh, ~24.9-37M区间, per台各自累积); 差分得区间发电; 非valid_range门(单调累积)" 发电量统计: canonical_id: WTUR_energy_stat observed_range: [0, 200000000000000] note: "累计发电量统计计数器 (~1e14; 与'发电量统计.1'重列同值); 累积量非门" 无功统计: canonical_id: WTUR_reactive_stat observed_range: [0, 10000000000000] note: "累计无功统计计数器 (~4e12; 50%liveness); 累积量非门" # ---- 测风塔 (国电招远阜山风场测风塔数据/, 13月度csv UTF-8-BOM, 5-min, 设备编号=1单塔) ---- # ★★ 本场核心价值: 唯一真·多高度实测测风塔 → 绝对功率曲线/达成率/NTF/Cp 可做 (self_ref-only 场做不了) mast: sampling_s: 300 required: [10米瞬时风速(m/s), 70米瞬时风速(m/s)] n_masts: 1 # ✅实证 设备编号=1 单塔 → 18台共用 → power-curve-ntf 空间代表性门必过后才 per-turbine 绝对裁决 height_layers: "10/30/50/70m 全年实测(-99=0, 单调剪切 p50 3.8/4.5/5.1/5.7); 轮毂高层 -99至2023-09, Oct2023起活(51%)→Dec全活(0%-99)" columns: 10米瞬时风速(m/s): { canonical_id: WMET_ws_10m, unit: m/s, sentinel: [-99], valid_range: [0, 50], observed_range: [0, 25], frame: geographic } 10米瞬时风向(°): { canonical_id: WMET_wd_10m, unit: deg, sentinel: [-99], valid_range: [0, 360], observed_range: [0, 360], frame: geographic } 30米瞬时风速(m/s): { canonical_id: WMET_ws_30m, unit: m/s, sentinel: [-99], valid_range: [0, 50], observed_range: [0, 25], frame: geographic } 30米瞬时风向(°): { canonical_id: WMET_wd_30m, unit: deg, sentinel: [-99], valid_range: [0, 360], observed_range: [0, 360], frame: geographic } 50米瞬时风速(m/s): { canonical_id: WMET_ws_50m, unit: m/s, sentinel: [-99], valid_range: [0, 50], observed_range: [0, 25], frame: geographic } 50米瞬时风向(°): { canonical_id: WMET_wd_50m, unit: deg, sentinel: [-99], valid_range: [0, 360], observed_range: [0, 360], frame: geographic } 70米瞬时风速(m/s): { canonical_id: WMET_ws_70m, unit: m/s, sentinel: [-99], valid_range: [0, 50], observed_range: [0, 25], frame: geographic, note: "最高全年实测层; <90m轮毂 → shear外推补轮毂高" } 70米瞬时风向(°): { canonical_id: WMET_wd_70m, unit: deg, sentinel: [-99], valid_range: [0, 360], observed_range: [0, 360], frame: geographic } 轮毂高瞬时风速(m/s): canonical_id: WMET_ws_hub unit: m/s sentinel: [-99] valid_range: [0, 50] observed_range: [0, 25] frame: geographic note: "轮毂高层; -99(全NaN)至2023-09; Oct2023起活(51%)→2024-01全活. 与SCADA重叠活窗=Oct-Dec2023; 全年可 10/30/50/70m shear外推补" 轮毂高瞬时风向(°): { canonical_id: WMET_wd_hub, unit: deg, sentinel: [-99], valid_range: [0, 360], observed_range: [0, 360], frame: geographic } 瞬时温度(℃): { canonical_id: WMET_ambient_temp_mast, unit: degC, valid_range: [-40, 50], observed_range: [-20, 35] } 瞬时湿度(%): { canonical_id: WMET_humidity, unit: "%", valid_range: [0, 100], observed_range: [15, 100] } 瞬时气压(KPa): canonical_id: WMET_pressure unit: kPa valid_range: [80, 110] observed_range: [95, 102] note: "★×10污染子集 (~1005 KPa, 实为100.5) >110 → NaN; rho 计算前必过此门 (同旧阜山base rho污染教训)" cleaning: physical: - "功率/功率设定 raw W → /1000 kW (assembler预换算); raw>50000未换算=BLOCK" - "变桨=度(本场) → 勿套红阳/旧base的rad" - "对风 风向1/2 rad*57.3→deg; raw>π(max4.71)wrap artifact → *57.3后>180界外NaN; nacelle-frame不作地理" - "机舱外环境温度 311.7哨兵→NaN; 叶轮转速-6.99簇<-1→NaN; 前后振动-1哨兵→NaN" - "mast: -99哨兵→NaN (全高度层); 气压∉[80,110]→NaN (×10污染)" semantic: - "功率设定<2080kW = 限电/降功率标志 (非坏值)" - "机舱左右振动=死通道弃; 机舱位置非地理弃作heading; 发电机转速反馈标度待核用pcs" - "风速2 per台死列判定(A12死/A13降级), 非全局" - "n=18台(非目录名义25); 达成率/功率曲线分母按18台" traps: - "功率=瓦特: 盲用差1000× (同枫香/红阳/旧阜山)" - "★变桨单位: 阜山=度, 红阳/旧base=rad — 同OEM不同场单位变, 照搬差57×" - "采样混采名义: turbine=600s(真), mast=300s; 多台long格式全局t.diff=0是交织伪影(sampling真值per台)" - "轮毂高mast层 Jan-Sep全-99, 误当0/缺失填补=错; 真活窗Oct2023起" - "机舱外环境温度311.7 / 前后振动-1 / 叶轮转速-6.99 = 场内哨兵, 统计前必转NaN" - "★self_ref例外: 本场有真测风塔 → 绝对性能非天然INSUFFICIENT (区别所有self_ref-only场); 但单塔18台 → power-curve-ntf空间代表性门必过 + 结论带不确定度带"