# 数据契约 — 国电 GUP UP2000 2.0MW DFIG (枫香, 贵州; 混机型 UP2000-96 + UP2000-103) # 复用基 = gup_up2000_2mw.yaml (阜山); 本场英文SCADA码 + §1.2 实证修正 (2026-07-06, 台17 2023.06 proof) # ⚠ 草案: 待 contract_lint(CT-1) + validate_contract(CT-2) 过门; [待验]项须扩验后定稿 meta: oem: 国电联合动力 GUP model: UP2000-96 + UP2000-103 (混机型, 2MW/90m轮毂) topology: dfig_geared rated_kw: 2000 source_farm: 枫香 (贵州, 海拔~1380-1466m 高原) reuse_base: gup_up2000_2mw.yaml (阜山; 语义/陷阱复用, 列名/单位本场重验) mixed_model: # ★ 分机型铁律: 达成率/功率曲线必按叶轮变体分组 UP2000-96: "编号低 (1,2,...); 叶轮96m" UP2000-103: "编号高 (17,18,...); 叶轮103m" caveat: "分母按机型; 型内独立; 不 pool (同郭家店 W2000 三型)" layout: # ★ 本场特殊: 一文件一(台×信号) format: "_.csv; 2表头行(IO名称/描述) + rows: 时间戳,值" time_format: "DD-MM-YYYY HH:MM:SS (dayfirst)" assemble: "scripts/fengxiang_assemble.py (per-台 join 19信号 → 宽表)" sampling: layers: "10min(2023.06-2024.05) / 秒级1s或5s(2024.03-05) / 测风塔(2023.06-2024.02)" caveat: "混采; 秒级窗仅3月; 逐时段 t.diff() 测 (§1.2); 2023.06 实测部分月(06-12~06-19 8天)" # ---- 机组 SCADA (raw 列名 = 英文 SCADA 码; §1.2 台17 实证) ---- turbine: sampling_s: 600 # ✅实证: t.diff().median()=600s per月 (10min 层; 层A/B 同) required: [UNIT.CI_PcsActivePower, UNIT.CI_WindSpeed1, SCADAUSE.CI_RotorSpeed] columns: UNIT.CI_PcsActivePower: canonical_id: WAPC_active_power raw_unit: W # ✅实证: max 1533200 → W to_canonical: "/1000" valid_range_canonical: [-100, 2200] # ✅实证(531k行): 负端=停机辅助耗电 min -53kW(<-100:0行), 上端 max 2148<2200. [0]floor会NaN 6.2%停机点=丢idle态 block_if_raw_exceeds: 50000 UNIT.CI_WindSpeed1: canonical_id: WMET_wind_speed_nacelle unit: m/s valid_range: [-2, 40] # ✅实证: 负端=风速计零点偏置 密集带-0.8~-0.9(6.5%); <-2 仅0.04%(230行=真坏值→NaN). [0]floor会NaN 8%偏置点 self_ref_risk: true # ★ 机舱风自指 (但本场有测风塔 → 可交叉, §power-curve-ntf) SCADAUSE.CI_RotorSpeed: canonical_id: WROT_rotor_speed unit: rpm valid_range: [-1, 28] # ✅实证: 近零偏置带保留; -7坏值簇(296行)<-1→NaN; 上端26-27rpm瞬态2点保留(rated~17) SCADAUSE.CI_PcsMeasuredGeneratorSpeed: canonical_id: WGEN_generator_speed unit: rpm valid_range: [-60, 2000] # ✅实证: 负端=停机传感器偏置 min -52(<-100:0行); [0]floor会NaN 1.8%idle点 SCADAUSE.CI_PitchPositionA1: { canonical_id: WROT_pitch_1, raw_unit: deg, valid_range: [-2, 95] } # ✅实证[0,89]=度, 非阜山rad SCADAUSE.CI_PitchPositionA2: { canonical_id: WROT_pitch_2, raw_unit: deg, valid_range: [-2, 95] } SCADAUSE.CI_PitchPositionA3: { canonical_id: WROT_pitch_3, raw_unit: deg, valid_range: [-2, 95] } # --- 变桨电机电流 (motor parity 轴; §1.2 实证 2026-07-16, 层B 4周×9台 pooled) --- # ✅实证: 单位=安培A; 广播集控机 83% idle=0 (集距三电机同动, 低占空); 无负值/无哨兵; 活跃 p99.9≈280-290A, max 370-420A. # valid_range 保 idle 0 (非[0]floor), 上界500=物理天花板(>500=坏值→NaN, 非clamp); max420<500 无真值被切. UNIT.CI_PitchMotorCurrentS1: { canonical_id: WROT_pitch_motor_cur_1, unit: A, valid_range: [-5, 500], note: "变桨轴1电机电流; 集控广播机三电机同动 83%idle=0" } UNIT.CI_PitchMotorCurrentS2: { canonical_id: WROT_pitch_motor_cur_2, unit: A, valid_range: [-5, 500], note: "变桨轴2电机电流" } UNIT.CI_PitchMotorCurrentS3: { canonical_id: WROT_pitch_motor_cur_3, unit: A, valid_range: [-5, 500], note: "变桨轴3电机电流" } UNIT.CI_YawError1: canonical_id: WYAW_yaw_error raw_unit: rad # ✅实证: ±3.14 = rad to_canonical: "*57.2958" frame: nacelle # nacelle-frame; 偏航不作地理扇区 valid_range_canonical: [-180, 180] note: "★ 本场无 -99 哨兵 (异于阜山72.8%); 但 nacelle-frame 仍不可作地理" UNIT.CI_GearboxInletOilTemperature: { canonical_id: WGBX_oil_temp, unit: degC, valid_range: [-20, 90] } UNIT.CI_GearboxOutputShaftTemperature: { canonical_id: WGBX_hss_bearing_temp, unit: degC, valid_range: [-20, 110], note: "输出轴≈高速轴承; 探头偏分解参考=入口油" } UNIT.CI_GeneratorBearingTemperatureA: { canonical_id: WGEN_bearing_de, unit: degC, valid_range: [-20, 100] } UNIT.CI_GeneratorBearingTemperatureB: { canonical_id: WGEN_bearing_nde, unit: degC, valid_range: [-20, 100], note: "A/B=DE/NDE配对差可做; 待坐实A=DE还是NDE" } UNIT.CI_GeneratorWindingTemperatureU1: { canonical_id: WGEN_winding_u, unit: degC, valid_range: [-20, 155], note: "定子绕组U1; 全套U1/U2/V1/V2/W1/W2 已补 → 三相不对称判据解锁 (2026-07-16)" } # --- 更全温度套 (§1.2 实证 2026-07-16; 全 100% 非NaN liveness) --- # ✅实证绕组: U2/V1/V2/W1/W2 连续分布 p50≈56 p99≈124-127 max 134-141°C; F级155; 无325哨兵(绕组走独立DAQ路). UNIT.CI_GeneratorWindingTemperatureU2: { canonical_id: WGEN_winding_u2, unit: degC, valid_range: [-20, 155], note: "定子绕组U2" } UNIT.CI_GeneratorWindingTemperatureV1: { canonical_id: WGEN_winding_v1, unit: degC, valid_range: [-20, 155], note: "定子绕组V1" } UNIT.CI_GeneratorWindingTemperatureV2: { canonical_id: WGEN_winding_v2, unit: degC, valid_range: [-20, 155], note: "定子绕组V2" } UNIT.CI_GeneratorWindingTemperatureW1: { canonical_id: WGEN_winding_w1, unit: degC, valid_range: [-20, 155], note: "定子绕组W1" } UNIT.CI_GeneratorWindingTemperatureW2: { canonical_id: WGEN_winding_w2, unit: degC, valid_range: [-20, 155], note: "定子绕组W2" } # ✅实证: 非绕组温 4 通道共享 325.2 saturation 哨兵 (15行/0.043% 同行触发 = 传感总线故障), valid_range上界<325.2 → 界外NaN(非clamp)吞掉. UNIT.CI_GeneratorCoolingAirTemperature: { canonical_id: WGEN_cooling_air_temp, unit: degC, valid_range: [-20, 120], note: "发电机空冷温度; p99.9=95; 325.2哨兵→NaN" } UNIT.CI_GearboxOilSumpTemperature: { canonical_id: WGBX_oil_sump_temp, unit: degC, valid_range: [-20, 90], note: "齿箱油槽温度; p99.9=76; 325.2哨兵→NaN; NBM齿箱轴承冷浸参照候选" } UNIT.CI_MainBearingGearboxSideTemperature: { canonical_id: WMBR_temp_gbx_side, unit: degC, valid_range: [-20, 90], note: "主轴齿箱侧温度(脂润滑, 无油浴→NBM不配冷浸); p99.9=56; 325.2哨兵→NaN" } UNIT.CI_MainBearingRotorSideTemperature: { canonical_id: WMBR_temp_rotor_side, unit: degC, valid_range: [-20, 90], note: "主轴叶轮侧温度; 与齿箱侧配对差可做; p99.9=45; 325.2哨兵→NaN" } UNIT.CI_NacelleAirTemperature: { canonical_id: WNAC_air_temp, unit: degC, valid_range: [-40, 70] } UNIT.CI_OutsideAirTemperature: { canonical_id: WMET_ambient_temp, unit: degC, valid_range: [-40, 55] } UNIT.CI_NacellePosition: { canonical_id: WYAW_nacelle_position, frame: "[待验]", note: "阜山不可用(-5.7~10.7); 枫香范围待验" } UNIT.CI_IprTotalEnergyReal: { canonical_id: WTUR_total_energy, note: "累计量; 差分得区间发电" } UNIT.D_TotalTimeAvailable: { canonical_id: WAVL_avail_time, note: "可用时间累计" } UNIT.D_TotalTimeErrorShutDown: { canonical_id: WAVL_fault_time, note: "故障停机时间累计" } # ---- 测风塔 (3.测风塔数据 2023.06-2024.06) — ✅实证: 无实测塔, 仅 NWP 预报 (2026-07-06 分析⑤) ---- mast: status: "❌无可用实测塔 → 绝对功率曲线/达成率/Cp = INSUFFICIENT (power-curve-ntf 铁律)" actual: "3.测风塔数据/ 唯一文件=天气预报报表(15分钟).xlsx = NWP预报(预报风速/风向/温度/湿度/气压, 10/30/50/70m, 场站级单点)。非实测。" point_table_note: "风电场收资表::测风塔数据点表 声明应有 YC0001-YC0013 实测通道, 但未交付; 且点表坐标(123.4E/44.7N=吉林)=模板污染(枫香在贵州106E/27N)。" caveat: "最高层 70m < 90m 轮毂; 预报单点对9台零空间分辨率 → 不可替代自由来流。破 ws_nac 自指改用 rotor/power 双锚 (scripts/fengxiang_rotor_anchor.py)。" cleaning: physical: - "功率 raw W → /1000 kW; raw>50000 未换算 = BLOCK" - "变桨=度(本场), 勿套阜山 rad" - "对风 rad*57.3; 本场无-99哨兵但仍 nacelle-frame" semantic: - "分机型: UP2000-96 vs 103 达成率/功率曲线分组不 pool" traps: - "功率=瓦特: 盲用差1000倍 (同阜山)" - "变桨单位阜山=rad 本场=度: 照搬契约会差57倍 (§1.2 实证逮)" - "单位/哨兵/布局逐场重验: 同OEM(GUP)不同场 列名(中文↔英文码)+单位(rad↔deg)+哨兵(有↔无) 都变" - "混机型: 96/103 分母不可 pool (分机型铁律)" - "秒级窗仅2024.03-05 3月; 10min 2023.06起有断月(缺数说明.xlsx)"