# 数据契约 — 湘电风能 XEMC XE72-2000 & XE82-2000 (骆驼沟风电场, 大唐2025科研) # schema: docs/OEM_KB §3. 校验器: scripts/validate_contract.py. oem-onboard skill 产出 2026-06-07 (第10家OEM). # 两机型共用同一 154 列 SCADA schema (ABB ACS800 变流器: INU/ISU/RMIO 温度=指纹); 仅转子/曲线/额定转速异. meta: oem: 湘电风能 XEMC model: XE72-2000 / XE82-2000 # 同契约两变体 (SCADA schema 一致) topology: geared_dfig # 有齿轮箱列(大河西可见)+发电机定子温度(DFIG/异步), 非直驱 rated_kw: 2000 variants: XE72-2000: {rotor_d_m: 70.65, swept_m2: 3918.3, hub_h_m: 65, rated_rpm: 22.45, cut_in_ms: 3.0, iec: IIB} XE82-2000: {rotor_d_m: 82.6, swept_m2: 5355, hub_h_m: 79.5, rated_rpm: 19.5, cut_in_ms: 3.0} converter: ABB ACS800 (INU/ISU/RMIO 温度列 = 指纹) source_farm: 骆驼沟 (河北承德丰宁, 海拔1750-2230m); 48台主力(坝头二期+骆驼沟二期, turbine_name 82-129) + 大河西074-081(独立regime,见下) model_assignment: "机型 per-turbine, 按 turbine_name join 机组信息_风电场_{72,82}.csv (★机型≠子阵: 坝头/骆驼沟二期两阵均混装72/82)" ground_truth: power_curve: "curv_power_hetong_{72,82}.csv (合同曲线, x=风速1-25 y=有功kW; 72@v13达2000 / 82@v16达2000)" status_enum: "configs/fault_dicts/xemc_xe2000_status_codes.csv (10态 0-9, cross-tab坐实)" event_codes: "风机故障代码及详细事件.xls (XE72型/XE82型 两sheet, 事件代码001-371, 表头在第3行)" spec_sheet: "风机参数.xls (XE72-2000 / XE82-2000)" turbine_info: "机组信息_风电场_{72,82}.csv (经纬度/轮毂/海拔/并网/标杆机)" met_mast: "测风塔数据.xls 3号塔@大河西村 — ⚠ 100%是2022年(机组2023), 零时间重叠 + 15-min + 远离主力阵. 仅气候态(风廓线/密度/风向参照), 不可逐时刻NTF (自由来流join不可用, 同finding89但塔救不了)" sampling: {default_s: 600, caveat: "10-min全年; ⚠混合日期格式(2023/1/1 0:00 vs 2023-01-01 00:00:00)需多格式兜底; 秒级Oct-Dec(33.9GB)+已清洗sec_scada_LTG_822.zip"} provenance: "oem-onboard 2026-06-07; survey 154列×3阵 + G-OEM 4台(72/82×两阵)全年实证 + 状态码cross-tab + 塔窗坐实" # 编码: gbk. raw 列名 = 中文无单位. turbine: required: [变频器电网侧有功功率, 风速] columns: 变频器电网侧有功功率: canonical_id: WAPC_active_power raw_unit: kW # ✓ 实测 max 2074-2148≈额定2000+裕量, 非瓦特(无1000×陷阱) valid_range: [-50, 2200] # 小负=寄生; 上限留裕量 block_if_raw_exceeds: 50000 # 单位守卫: 若喂瓦特(~2e6)立即BLOCK note: "唯一真输出功率列(无干净'有功功率'). 发电机功率设定点是其设定镜像; 风机有功功率设定点(2240常数)=cap非输出" 风速: canonical_id: WMET_wind_speed_nacelle unit: m/s valid_range: [0, 40] # 实测尖峰到37-44(持续不可能) → 门40 self_ref_risk: true # ★机舱风非自由来流. XE82低风段读高(v4比合同2.0x, v13收敛1.0)=自指, finding89族 note: "塔在2022不可救(无重叠). 绝对功率曲线只可机群相对+合同比, 低风绝对值标INSUFFICIENT" 风向: canonical_id: WMET_wind_direction unit: deg frame: geographic_unverified # range 0-360, 分布真实 → 疑绝对风向(非nacelle相对: p50≠偏航对风角度映射). 待北偏移标定 valid_range: [0, 360] note: "作扇区需先验北偏移; 偏航误差用 偏航对风角度 (直接量)" 偏航对风角度: canonical_id: WYAW_yaw_error unit: deg frame: nacelle # 真偏航误差(风-机舱失准): range±180, 中位-1~+2°, p5-p95±16-31° valid_range: [-180, 180] note: "偏航分析用此(观测级); 真零点回收需lidar(同findings87/88)" 轮毂角度: canonical_id: WYAW_nacelle_position unit: deg frame: unknown_wrapped # ⚠ range -327~327 (非0-360非累积) = 怪编码, 未解 unusable: true note: "±327异常编码, 解码前勿用作机舱航向" 气压: canonical_id: WMET_pressure dead_channel: true # ★死值: nunique=2 {1.0:99.9%, 0.0}, 非真气压(塔实测793hPa@2000m) sentinel: [1.0, 0.0] # 必转NaN; 密度走ISA/塔气候态 note: "raw 全=1.0 → 校验门BLOCK(残留哨兵), 清洗NaN后PASS (dogfood信号)" 叶片1变桨角度: canonical_id: WROT_pitch_angle_1 unit: deg valid_range: [-4, 92] # ★负≈-1°是设定最小角(XEMC版DEC pitch-1): <-2°仅0.01%, 非坏值 note: "仅叶片1/2有瞬时桨距(无叶片3变桨角度列); 叶片1/2/3总变桨角度是累积计数" 叶片2变桨角度: canonical_id: WROT_pitch_angle_2 unit: deg valid_range: [-4, 92] 轮毂转速: canonical_id: WROT_rotor_speed unit: rpm valid_range: [-5, 30] # XE72额定~22.5 XE82~19.5; 小负=停机噪声(p1≈0)正常 spike_below: -5 外界温度: canonical_id: WMET_ambient_temp unit: degC valid_range: [-45, 45] # 高原冬季 min-37 是真值, 无哨兵(<-50=0%) 发电机定子温度1: canonical_id: WGEN_stator_temp_1 unit: degC valid_range: [-45, 130] 发电机轴承温度1: canonical_id: WGEN_bearing_temp_1 unit: degC valid_range: [-45, 130] 机舱温度: canonical_id: WNAC_nacelle_temp unit: degC valid_range: [-45, 60] 有功功率限定值: canonical_id: WAPC_power_limit unit: kW valid_range: [0, 2200] semantic_ambiguous: true # ⚠ 部分机62-80% <1900: 不可直接判限电(C4教训), 限电用功率封顶法 note: "082/109全=0(未报), 086/106有值; <2000≠必限电" 风机PLC功率限制设定值: canonical_id: WAPC_plc_power_limit unit: kW valid_range: [0, 2200] note: "名义2000(额定上限设定), 非动态限电" 总产生的有功电量: canonical_id: WTUR_total_active_energy unit: kWh # 累积计数器(单调增); 大河西无瞬时功率时可 diff×6 反推kW note: "counter, 非瞬时; 反推功率注意翻转/复位" 风机当前状态: canonical_id: WTUR_state unit: enum status_enum_ref: configs/fault_dicts/xemc_xe2000_status_codes.csv note: "6=正常发电(76.7%); 1/2/3=待机顺桨(非故障); 5=启动; 0=离线" cleaning: physical: - "气压 == 1.0 或 0.0 → NaN (死值占位, 非真气压; 不可用作密度)" - "风速 >40 → 尖峰剔 (持续不可能)" - "轮毂转速 / 风速 小负值(>-5) = 停机噪声, 保留; <-5 尖峰剔" semantic: - "变频器电网侧有功功率 小负 = 待机寄生功耗, 非坏值" - "叶片变桨角度 ≈-1° = 设定最小角(非坏值, 同DEC pitch-1)" - "风速 = 机舱风(self_ref), 勿作绝对功率曲线; 用合同曲线比 + 机群相对" - "风向 = 绝对(未标北偏移), 作扇区前必验; 偏航误差用 偏航对风角度" - "有功功率限定值 <2000 勿直接判限电 (C4教训, 用功率封顶法)" status_enum_ref: configs/fault_dicts/xemc_xe2000_status_codes.csv traps: - "机型≠子阵: 坝头二期/骆驼沟二期两阵均混装XE72+XE82, 必按turbine_name join机组信息定机型(配错合同曲线=假欠发)" - "气压死值=1.0/0.0(非-99/9999), nunique=2 揪出; 塔实测793hPa@2000m 反证" - "XE82机舱风低风段读高(v4比合同2.0x→v13收敛1.0)=自指(finding89族), 大转子更重; 绝对功率不可信" - "测风塔100%是2022(机组2023)零重叠 + 15-min + 在大河西远离主力阵 → 自由来流join不可用(塔救不了自指, 不同于阜山有重叠)" - "混合日期格式(2023/1/1 0:00 vs 2023-01-01 00:00:00): 坝头106全年时间只解出Jan = 漏11月! ingestion必多格式兜底+断言行数" - "大河西074-081独立regime: 不在机组信息 + 仅10-12月 + 半数列全空(无瞬时功率/转速/状态字, 有齿轮箱温度+时间戳秒) → 不同采集系统, 单独track, 功率只能电量diff反推" - "无叶片3变桨角度瞬时列(只1/2); 齿轮箱入口油温在主力阵全空(仅大河西有) → 主力阵无齿轮箱MSET" - "状态码两套: 风机当前状态(0-9状态机) vs 事件代码(001-371, XE72/XE82两sheet) — 勿混" # 大河西 074-081 独立子契约 (列子集不同, 仅10-12月) mast: required: [] note: "3号测风塔 2022全年 15-min, 14列(TIME WS10/30/50/70/HUB DIR×5 TEMP PRESSURE RH). header在xls第3行(row idx2), data从row idx5. PRESSURE真实(778-805hPa). 仅气候态用." columns: PRESSURE: canonical_id: WMET_pressure_mast raw_unit: hPa valid_range: [700, 850] # 2000m海拔 ~793hPa WSHUB: canonical_id: WMET_wind_speed_mast_hub unit: m/s valid_range: [0, 40]