# 数据契约 — 白山风电场 (国能/龙源, 黑龙江) — OEM不定谳 850kW DFIG (Ø58m/轮毂65m) # schema_v2. 校验: scripts/validate_contract.py (CT-2). lint: scripts/contract_lint.py (CT-1). # ★SCADA(min层)专线; CMS(wave)别线=/loop findings.json(94d53628)不动。 # ★OEM不定谳: 指纹(DFIG 850kW/Ø58m + DAC/RFC控制器 + Crowbar + Skiip[SEMIKRON] + 星三角并网 + NRG Icefree) # → 最强候选 Gamesa/Made G58-850 族 licensed变体, 但无铭牌/技术协议/OEM码表 → 未坐实。命名按实测850kW/DFIG。 schema_version: 2 meta: farm: 白山风电场 farm_code: BAISHAN oem: "不定谳 (指纹候选 Gamesa/Made G58-850 族; 无铭牌/技术协议未坐实)" model: "850kW DFIG geared, Ø58m rotor, 65m hub (额定功率列恒850/桨叶直径列58/塔筒高度列65 直读实证)" topology: dfig_geared rated_kw: 850 # 额定功率列全4台恒850 (nuniq=1直读, 非plateau推断); 总有功功率max~856(电网侧) rotor_diameter_m: 58 # 桨叶直径列=58 (选项52/58/80/83/87/90 中取58) hub_height_m: 65 # 塔筒高度列=65 province: 黑龙江 n_turbines_nameplate: unknown # 🔴无全机台表/无台账 → claimed台数无权威源 (白山实际装机远>4, 本收资仅4台稀疏子集非全场) n_turbines_with_data: 4 # 74/90/92/157 (非连续台号=稀疏抽样) sampling: turbine_sec_s_default: 60 # 台90/92/157 真60s per_turbine_override: {"74": 30, "90": 60, "92": 60, "157": 60} # 🔴混采样: 台74=30s (per台t.diff实证) windows: turbine_sec: "2025-03-01 ~ 2025-03-28 (单月窗~26-28天; 74:03-08~03-28 / 90:03-02~03-27 / 92:03-02~03-26 / 157:03-01~03-27)" met_mast: absent # 🔴无测风塔 → 风速=机舱风 self_ref → 绝对功率曲线/Cp/达成率 INSUFFICIENT (power-curve-ntf铁律) power_curve_table: absent event_table: present_status_code_inferred # ✅ 真状态机(风机状态/状态计算/风机运行状态), 语义=物理P/R推断非OEM码表→候选, 可用率物理派生为准 encoding: utf-8 # 直读无BOM; 时间列名='时间'; 尾列'Unnamed:516'空列装配丢弃 data_source: "/Volumes/WINDDATA/DATA2/国能/龙源/白山风电场-黑龙江-龙源/收资数据/min (23文件 74×7/90×5/92×5/157×6; 517列; 列名'NN#|信号'前缀; ⚠文件窗重叠→(台,时间)dedup)" provenance: "scripts/intake_scan.py→disk_manifest.json(1387文件/33层[含wave CMS]/1docx материал/1zip; reconcile PASS); §1.2实证=本会话 per台 describe+t.diff采样+状态码P/R交叉核+额定功率直读+风向dead+温度corrupt扫描; 无技术协议→OEM指纹判(不定谳)" # ============ turbine_sec 层 (混30/60s; 4台 74/90/92/157; 列名去'NN#|'前缀标准中文) ============ # 分析用核心子集 (517列全表未逐列入契约; 报警字/DAC/PLC状态字/累计计数器 等未纳入 = 事件层/元数据, 非本次分析信号)。 turbine_sec: sampling_s: 60 # 默认(多数台/多数行); 台74实为30s见 meta.per_turbine_override + traps required: [总有功功率, 风速] columns: 时间: {canonical_id: timestamp, role: timestamp, parse: datetime, note: "混30/60s栅格; 文件窗重叠→dedup(台,时间)"} 风速: {canonical_id: WMET_wind_speed_nacelle, unit: m/s, valid_range: [0, 40], observed_range: [0, 26], self_ref_risk: true, note: "机舱风; 无塔→绝对性能INSUFFICIENT"} 未过滤的风速: {canonical_id: WMET_wind_speed_raw, unit: m/s, valid_range: [0, 40], observed_range: [0, 26], self_ref_risk: true} 总有功功率: {canonical_id: WAPC_active_power, unit: kW, valid_range: [-50, 950], observed_range: [-27, 856], note: "电网侧; rated850; 用作达成率功率(self_ref风速下仅相对)"} 瞬时发电功率: {canonical_id: WTUR_power_instant, unit: kW, valid_range: [-50, 950], observed_range: [0, 850], note: "严格卡850上限量"} 理论功率: {canonical_id: WTUR_theoretical_power, unit: kW, valid_range: [0, 950], observed_range: [0, 850], note: "控制器理论值"} 额定功率: {canonical_id: _rated_power_const, unit: kW, valid_range: [800, 900], observed_range: [850, 850], dead_channel: true, note: "nameplate常量850(非信号); 直读坐实rated"} 发电机转速: {canonical_id: WGEN_speed, unit: rpm, valid_range: [-50, 1800], observed_range: [-85, 1671], note: "DFIG超同步~1670; idle小负值界外→NaN"} 转子转速: {canonical_id: WROT_speed, unit: rpm, valid_range: [-2, 32], observed_range: [-2, 28], note: "geared低速轴/风轮"} 变桨角度: {canonical_id: WROT_pitch, unit: deg, valid_range: [-5, 92], observed_range: [-5, 87], note: "顺桨~86.6; 🔴台157该窗max仅39.2(降额/特殊工况候选,分析层查); 仅单桨列→叶片不平衡不可判"} 变桨角度设定值: {canonical_id: WROT_pitch_setpoint, unit: deg, valid_range: [-5, 95], observed_range: [-3, 90]} 机舱位置: {canonical_id: WYAW_nacelle_position, unit: deg, valid_range: [0, 360], observed_range: [0, 360], note: "真偏航位置; 但无风向列配对→对风误差不可直算(仅位置分布/偏航动作)"} 风向角: {canonical_id: WMET_wind_direction_relative, role: state_enum, dead_channel: true, sentinel: [395, 605], note: "🔴dead/coded: 仅值395/605非物理度数(全台nuniq2-3, +少量0); sentinel→NaN; 勿作vane/风向/扇区/对风锚 (无可用风向源)"} A相总电流: {canonical_id: WCNV_current_phase_a, unit: A, valid_range: [0, 800], observed_range: [0, 706]} B相总电流: {canonical_id: WCNV_current_phase_b, unit: A, valid_range: [0, 800], observed_range: [0, 706]} C相总电流: {canonical_id: WCNV_current_phase_c, unit: A, valid_range: [0, 800], observed_range: [0, 706], note: "三相独立(非派生, 相互不恒等)"} 发电机驱动端轴承温度: {canonical_id: WGEN_bearing_de_temp, unit: degC, valid_range: [-40, 120], observed_range: [-2, 43]} 发电机非驱动段轴承温度: {canonical_id: WGEN_bearing_nde_temp, unit: degC, valid_range: [-40, 120], observed_range: [0, 54]} 发电机绕组温度: {canonical_id: WGEN_winding_temp, unit: degC, valid_range: [-40, 150], observed_range: [0, 71], note: "F级155阈内充裕"} 齿轮油温度: {canonical_id: WGBX_oil_temp, unit: degC, valid_range: [-40, 120], observed_range: [9, 71]} 齿轮箱轴承温度: {canonical_id: WGBX_bearing_temp, unit: degC, valid_range: [-40, 120], observed_range: [5, 72]} 液压油温: {canonical_id: WHYD_oil_temp, unit: degC, valid_range: [-40, 100], observed_range: [-8, 25]} 机舱温度: {canonical_id: WNAC_temp, unit: degC, valid_range: [-40, 80], observed_range: [-11, 11]} 环境温度: {canonical_id: WMET_ambient_temp, unit: degC, valid_range: [-45, 55], observed_range: [-22, 5], note: "黑龙江3月冷; 物理合理"} 塔底环境温度: {canonical_id: WTWR_ambient_temp, unit: degC, valid_range: [-40, 80], observed_range: [-40, 80], note: "🔴raw含±1619.2 corrupt对称尖峰(哨兵/ADC故障)已valid_range界外→NaN; 存活值疑仍不稳,分析慎用"} 控制柜温度: {canonical_id: WCNV_cabinet_temp, unit: degC, valid_range: [-40, 80], observed_range: [-40, 80], note: "🔴同塔底环境温度: ±1619.2 corrupt尖峰→NaN"} 电网频率: {canonical_id: WGRD_freq, unit: Hz, valid_range: [45, 55], observed_range: [49.9, 50.1]} 风机状态: {canonical_id: _status_code, role: state_enum, note: "{25/50停·75转不发·100发电·125故障停} 物理P/R推断非OEM码表→候选语义"} 状态计算: {canonical_id: _status_calc, role: state_enum, sentinel: [999], note: "1:1并行风机状态(11↔100/21↔75/24↔50/61↔25/71↔125); 999=通讯丢失哨兵→NaN"} 风机运行状态: {canonical_id: _running_flag, role: state_enum, note: "二值1=发电/0=非; 可用率物理派生辅证"} cleaning: physical: - "utf-8 读 (无BOM); 去'NN#|'台号前缀→标准中文名; 尾列'Unnamed:516'(空)丢弃" - "装配 concat 全文件 per台 → (台号,时间)dedup (文件窗重叠: 74:54727→46083 / 90:36005→21602 / 92:34565→34561 / 157:37446→37441 uniq)" - "各列按 valid_range 界外→NaN(非clamp); 状态计算哨兵999→NaN" - "🔴corrupt温度(塔底环境温度/控制柜温度 ±1619.2)靠valid_range[-40,80]界外→NaN; 风向角(395/605)界外→全NaN(dead)" - "发电机转速 idle小负值(-85~-40)/转子转速微负 界外→NaN" semantic: - "风速=机舱风 self_ref → 绝对功率曲线/Cp/达成率 INSUFFICIENT(无塔); 相对/fleet-relative 可用标 self_ref" - "无可用风向/vane(风向角dead) → 静/动态偏航对风误差 INSUFFICIENT(无失配信号); 机舱位置仅数偏航动作/位置分布" - "状态码语义=物理P/R推断(无OEM码表)→ 可用率/限电/停机型 物理派生为准(§4.3), 状态码候选辅证" - "混采样(74=30s/余60s): per台分析注意栅格差; 派生10min真时均层按台各自栅格聚合" derive_10min: "混采样→派生10min真时均层(§3.4, 非瞬时快照); 勿信内置'10分钟功率'列(台74 broken max=110)" traps: - "★ 混采样: 台74=30s / 台90·92·157=60s (per台t.diff实证; 契约sampling_s=60=多数台, CT-2采样断言为pooled-per月中位=60主导; 74栅格差按per_turbine_override)" - "★ 文件间时间窗重叠→有重复时间戳, 装配必(台,时间)dedup(否则74行数虚高18%/90虚高40%)" - "★ OEM不定谳: 指纹→Gamesa G58-850族候选未坐实; 判别器阈值须本OEM重标(G3: 结构U/阈值P, 未标压参考)" - "★ 4台稀疏(非全场)/单月2025-03窗 → 季节/长期趋势/fleet基线 面薄; 系统性claim(≥3台)样本仅4台须谨慎" - "🔴 风速self_ref(无塔) + 风向dead(无vane) → 绝对性能 + 偏航对风 双 INSUFFICIENT" - "🔴 风向角(395/605)/塔底环境温度·控制柜温度(±1619.2) = corrupt/dead列, 勿分析" - "🔴 claimed台数无权威源(无台账/技术协议); n_turbines_nameplate=unknown"