# 数据契约 — 上海电气 SEWIND W2000/W2100N-135-90 齿箱DFIG (华电莱州夏邱 98MW, 山东莱州 / 华电) # schema_v2 SOP 标准件 (2026-07-18, 新场 onboard)。 # # ★ 主分析层 = 嵌哈希目录 zip 内 GBK CSV (实时数据查询 (N).zip → /YYYYMMDD-..~YYYYMMDD-..csv 半月窗, 全49台一文件); # 契约验原始 CSV 列名 (单位嵌列名, 非归一化)。 # ★ OEM 判定 = docx风机参数(上海电气 W2000-135-90/2000kW/49台/98MW) + 保护定值(上海电气 W2100N-135-90/额定2100kW) # + 合同(卖方 上海电气风电集团, 华电山东物资采购) + CMS季度报告抬头(上海电气) — 非猜, 四源坐实。 # reuse: 上海电气 SEWIND W2000 家族 (库内 sewind_w2000_nanshu / sewind_w2500_146_dehui 语义层); 本场 135m 变体重验。 schema_version: 2 meta: oem: 上海电气 SEWIND model: W2000-135-90 (2MW 齿箱DFIG; 保护定值平台型号 W2100N-135-90) topology: dfig_geared # ✅三点支撑双馈异步变速变桨(保护定值); 齿箱杭齿/南高齿FD2400B ratio132.38; 发电机上海电机厂YFSKY500-4空-空冷; 变频器日风IDIF; 变桨WPPC-85-C rated_kw: 2100 # ⚠双值: 保护定值W2100N/额定2100kW + docx文'单机容量2.1MW' + SCADA有功plateau p99~2175/p999~2203 → 2100级; 但docx表'额定功率2000kW' + 98MW项目=49×2000kW铭牌。达成率分析须先确认参考额定(2000 vs 2100), 见 self_ref_note。 rated_kw_note: "98MW项目铭牌口径=2000kW/台(49×2.0=98MW); 平台/保护定值口径=2100kW(W2100N); SCADA plateau物理口径~2100(p99=2175). 三口径均记, 勿单值定谳。" rotor_d_m: 135 # ✅docx+保护定值 风轮直径135m hub_height_m: 90 # ✅docx塔筒中心高度90m/保护定值轮毂中心高度90m source_farm: 华电莱州夏邱风电场(98MW, 山东省烟台市莱州市 夏邱镇/虎头崖镇/沙河镇, 华电) commissioned: "2020-12-31 全部并网" n_machines: 49 # ✅风机名称 A1(1#)..A49(46#) 全49台有数据 = docx49台 = 坐标表49行 = 功率曲线jpg gearbox: "杭齿S2100 / 南高齿FD2400B-01-00R2; 速比 132.69/132.38; 无齿箱温度通道入10min层(见 absent_channels_note)" absent_channels_note: "10min SCADA层无: 齿轮箱温度(油温/高低速轴承温 — 保护定值有阈但通道不在10min层, 仅30s层有) → 齿箱冷浸comp N/A(温度NBM冷浸仅可对发电机轴承但无油浴参照, 脂润滑不配); 无限电/限功率0/1旗标 → 限电剥离须功率-风约束推断; 无逐相绕组(仅定子UVW三相); 无齿箱双压dP。30s高频层(2、秒级SCADA 20列)另含 桨距角1/2/3 per叶 + 高速/低速轴承温 + 齿轮箱油温 + 舱外温度 → 三叶不平衡/齿箱热/齿箱冷浸comp 须走30s层。" secondary_layers: turbine_30s: "登记非清洗(GB级按需拉): 2、秒级SCADA高频数据/30s/实时数据查询 (1..6).zip; zip5正常zip, zip1-4/6=流式zip(无中央目录, python zipfile BadZipFile; 窗从local header读)。窗=2025-07-01~2025-09-30(6半月块), 30s采样(dt.median=30s实证)。20列schema=风机名称/时间/有功功率/机舱位置/桨距角1/2/3(★per叶)/发电机定子UVW温/发电机前后轴承温/发电机转速/高速轴承温/低速轴承温/舱内温/舱外温/10min平均风速/风轮转速/齿轮箱油温 — richer: per叶桨距+高低速轴承温+齿箱油温+舱外温; 缺电机温度/塔底柜/风向角/偏航位置/环境温度/风机状态。" event_fault: "7、机组状态、事件、故障数据: 故障记录_{2023,2024,2025}.csv (GBK). 列=风机名/状态码值/状态码描述/激活时间/复位时间; 逐文件验年 2023(1015条)/2024(5641)/2025-01~08-30(5723) 文件名年=内容年无跨年错配(memory event-layer-verify-year-first); 时间' YYYY-MM-DD HH:MM:SS:mmm'(前导空格+毫秒冒号)。未装配parquet(Phase-2 A_op/故障分型可建)。" layout: format: "嵌哈希目录 zip: 实时数据查询 (N).zip (N=1..40) → /YYYYMMDD-HH_MM_SS~YYYYMMDD-HH_MM_SS.csv (半月窗, 全49台); 22列单位嵌列名" encoding: gbk time_format: "YYYY-MM-DD HH:MM:SS" machine_token: "风机名称列内台号 A1(1#)..A49(46#) (A序号 + (原#号); # 号非连续, 见6机位坐标)" assemble: "outputs/xiaqiu/sop/assemble_xiaqiu.py (zipfile逐zip GBK内部csv → name-based → to_numeric → (风机名称,时间)concat+dedup跨月0915重叠 → 排序 raw parquet)" sampling: turbine_10min_s: 600 # ✅ t.diff().median() per台=600s (49台 min=median=max=600) window: "2024-01-01 23:50 ~ 2025-08-31 23:50 (约20月, 40半月块CSV, 连续无缺月; 4,023,831行/49台)" turbine_10min: sampling_s: 600 required: ["有功功率(kW)", "10min平均风速(m/s)"] machine_col: 风机名称 time_col: 时间 columns: "有功功率(kW)": canonical_id: WAPC_active_power raw_unit: kW valid_range: [-150, 2450] observed_range: [-100, 2312] # ✅ p99~2175/p999~2203(rated~2100 plateau); 负=空转寄生真物理禁clip self_ref_note: "本场无测风塔(目录3标'无') → 机舱风self_ref → 绝对达成率/Cp INSUFFICIENT(机舱风铁律); 达成率参考额定须先定(2000 vs 2100)" "10min平均风速(m/s)": canonical_id: WMET_horWdSpd unit: m/s valid_range: [0, 40] observed_range: [0, 24.26] self_ref_risk: high note: "机舱风(10min平均) self_ref; 无测风塔不可解" "风轮转速(rpm)": {canonical_id: WROT_RotSpd, unit: rpm, valid_range: [-2, 20], observed_range: [0, 13.48], semantic: "★rotor侧(rated 12.77rpm 保护定值); vs 发电机转速高速轴"} "发电机转速(rpm)": {canonical_id: WGEN_Spd, unit: rpm, valid_range: [-2, 2000], observed_range: [0, 3264], semantic: "★高速轴p50=1048(齿箱DFIG, 速比132.38; rated~1690, 范围600-1800 docx); max3264/p999~2220=编码器过速尖峰→界外NaN"} # ---- 变桨 (★10min层=集距单列; per叶独立仅30s层有 桨距角1/2/3) ---- "桨距角(°)": {canonical_id: WROT_PtAng, unit: deg, valid_range: [-5, 95], observed_range: [-128.9, 168.85], semantic: "★集距 collective 单列(below-rated p50~0封桨; above-rated~89顺桨) → 三叶不平衡 N/A(10min层); min-128.9/max168.85=界外尖峰→NaN"} # ---- 温度: 发电机(定子三相+前后轴承) + 变桨电机 + 塔底柜/舱内/环境; ⚠无齿箱温度入10min层 ---- "发电机定子U温度(℃)": {canonical_id: WGEN_TmpStaU, unit: degC, valid_range: [-40, 200], observed_range: [-23.4, 203.8], semantic: "★定子三相U/V/W → 相间不平衡可做; 0值=停机冷态(发电态P>50过滤); 保护绕组max145/报警140"} "发电机定子V温度(℃)": {canonical_id: WGEN_TmpStaV, unit: degC, valid_range: [-40, 200], observed_range: [-27.4, 181.0]} "发电机定子W温度(℃)": {canonical_id: WGEN_TmpStaW, unit: degC, valid_range: [-40, 200], observed_range: [-169.4, 143.9]} "发电机前轴承温度(℃)": {canonical_id: WGEN_TmpBrgFront, unit: degC, valid_range: [-40, 130], observed_range: [-118.5, 150.0], semantic: "★发电机前/后轴承双端 → 配对差可做; 保护轴承max95/报警90; 负尖峰/150→界外NaN"} "发电机后轴承温度(℃)": {canonical_id: WGEN_TmpBrgRear, unit: degC, valid_range: [-40, 130], observed_range: [-192.0, 102.6]} "电机温度1(℃)": {canonical_id: WROT_TmpPtMotor1, unit: degC, valid_range: [-40, 150], observed_range: [-1.1, 134.2], semantic: "★变桨电机1/2/3温度(per叶变桨电机; 桨角本身10min层为集距单列)"} "电机温度2(℃)": {canonical_id: WROT_TmpPtMotor2, unit: degC, valid_range: [-40, 150], observed_range: [0, 133.9]} "电机温度3(℃)": {canonical_id: WROT_TmpPtMotor3, unit: degC, valid_range: [-40, 150], observed_range: [-0.6, 142.5]} "塔底柜温度(℃)": {canonical_id: WTOW_TmpTowerBaseCab, unit: degC, valid_range: [-40, 80], observed_range: [-9.1, 55.4]} "舱内温度(℃)": {canonical_id: WNAC_IntTmp, unit: degC, valid_range: [-40, 80], observed_range: [-303.63, 258.43], trap: "min-303/max258=传感尖峰→界外NaN(非物理)"} "环境温度(℃)": {canonical_id: WMET_EnvTmp, unit: degC, valid_range: [-40, 55], observed_range: [0, 44.47], liveness: "⚠partial: 死(0% non-NaN) 2024-01~2025-04-30, 2025-05-01起上线(zip33 4% → 2025-06-16起~98%); 全窗仅15.1% non-NaN → 温度NBM去季节仅2025夏后窗可用, 早期用舱内/塔底柜代参照"} # ---- 位置/风向 ---- "机舱位置(°)": {canonical_id: WNAC_Dir, unit: deg, valid_range: [0, 360], observed_range: [0, 360], semantic: "机舱绝对方位角[0,360) → 扇区/风玫瑰可做(非扭角); 与风向角配出绝对风前过 pseudo-geo 三件套"} "风向角(°)": {canonical_id: WYAW_YawErr, unit: deg, valid_range: [-180, 180], observed_range: [-180.4, 180.0], semantic: "★机舱相对风向=对风误差(yaw error); p50=0 对中好; 静态/动态偏航可做; 非绝对地理风向(self_ref)"} "偏航位置(deg)": {canonical_id: WYAW_CableTwist, unit: deg, valid_range: [-720, 720], observed_range: [-327.66, 327.66], semantic: "解缆/扭缆位置(unwrap; 保护偏航绝对值max设定715deg)", liveness: "⚠partial: 同环境温度, 死 2024-01~2025-04-30, 2025-05起上线; 全窗15.1% non-NaN → 动态偏航/解缆分析仅2025夏后窗"} # ---- 状态码 (语义先验真) ---- "风机状态": {canonical_id: WTUR_status, unit: code, valid_range: [0, 100], observed_range: [0, 51], semantic: "运行状态码(15枚举: 8最多~60%=发电/并网态, 3/10/11/6/2/1/5/51/9/14/4/7/0/12); 语义先验真; 事件层故障码(状态码值30150/301101/20008等 6位)另在目录7 故障记录csv 带状态码描述"} cleaning: physical: - "有功功率负值=空转寄生真物理禁clip; valid_range界外→NaN非clamp" - "无850哨兵/无明显离散哨兵族(扫全窗): 极端值(桨距-128.9/168.85, 发电机转速3264, 舱内±300, 轴承-192, 定子-169)均由valid_range界外→NaN统一捕获, 非discrete sentinel match" - "温度0值=停机冷态(发电态P>50过滤剔)" semantic: - "风速self_ref+无测风塔 → 绝对达成率/Cp INSUFFICIENT" - "机舱位置=方位角[0,360)→扇区(过pseudo-geo三件套); 风向角=对风误差[-180,180]非地理; 偏航位置=扭缆位置" - "环境温度/偏航位置 partial-liveness(2025-05起) → 下游按段切窗, 非死列(apply_contract_gate all-NaN判死不误伤)" derive: - "10min已是时均层(SEWIND原生); 嵌哈希zip逐zip GBK CSV concat+dedup(跨月0915重叠去49行)" traps: - "★**嵌哈希目录 zip**: 每zip内 <随机hash>SS/*.csv (如 SadehJuXUeQNuPEA0m4tagSS/); zipfile逐zip读内部csv, GBK; name-based禁positional" - "★**齿箱DFIG 2MW SEWIND W2000/W2100N**: 库复用sewind_w2000家族; 10min层缺齿箱温度(仅30s层有)" - "★**桨距角10min层=集距单列**(三叶不平衡须走30s层桨距角1/2/3); 定子三相U/V/W + 发电机前后轴承 配对差可做" - "★**rated 2000/2100 双口径**: docx表2000/docx文2.1MW/保护定值W2100N-2100/SCADA plateau~2100 — 达成率前须定参考额定" - "★**环境温度+偏航位置 partial-liveness 2025-05起**: 早期死列(0% non-NaN), 非坏 — 下游按段切窗; apply_contract_gate all-NaN判死用全窗non-NaN>0不误伤" - "无测风塔(目录3'无') → 机舱风self_ref → 绝对达成率INSUFFICIENT" - "流式30s zip(1-4/6)无中央目录 → python zipfile BadZipFile; 窗从local file header parse(huishan流式zip同族trap)"