# -*- coding: utf-8 -*- """生成「涡激振荡仿真台」交互单页。 上半 = 可交互正演 (涡脱频率/锁频带/Scruton, 工程经验模型, 非 CFD); 下半 = 真实实测 (9 台秒级: 抗涡激动作标志 + 塔筒双向加速度), 已脱敏。""" import json, pathlib SRC = "/Users/yuanying/wind-analytics/outputs/_combined/safety_assessment.json" rows = json.load(open(SRC, encoding="utf-8"))["per_turbine"] # 脱敏: 场名 -> 甲/乙, 台号重编 fmap, out, n = {}, [], 0 for r in rows: f = r["farm"] if f not in fmap: fmap[f] = "甲场" if not fmap else "乙场" n += 1 out.append({"t": f"{fmap[f]} #{n}", "viv": r["抗涡激触发pct"], "stop": r["塔停机max"], "gen": r["塔发电p95"], "all": r["塔全窗max"], "chain": r["振动安全链跌pct"], "blade": r["三叶极差p99"], "sec": r["n_sec"]}) DATA = json.dumps(out, ensure_ascii=False) HTML = f'''
涡激振荡的机理与机型对比,看配套的涡激共振模拟器(十二款机型预设、三种机理可切换)。 本页只回答一个问题:某批机组的抗涡激动作一次都没触发,这到底是「真没事」还是「监测面根本没在工作」? 这是所有阴性结论都要过的一关。
数据来自两个风场共九台机组的秒级长窗,每台 43200 秒。机组本身带一个 「变桨执行抗涡激动作」的状态标志,加上塔筒驱动侧与非驱动侧的加速度通道。已脱敏:场名与台号均已重编。
| 证据 | 本例实测 | 它单独够不够 |
|---|---|---|
| 抗涡激动作标志 | 0 % 触发 | 不够 —— 得先证明这个标志位是活的 |
| 塔筒加速度(停机工况) | 0.11 – 0.43 m/s² | 关键 —— 有量值有分布,证明通道活 |
| 塔筒加速度(发电 p95) | 0.16 – 0.21 m/s² | 关键 —— 两工况可分,非死值 |
| 振动安全链 | 0 % 跌落 | 不够 —— 同上,需活性证据 |
| 变桨速度 p95(查 hunting) | < 0.5 – 0.75 °/s | 旁证 |
| 三叶桨距极差(查 1P) | 0 ° | 旁证 —— 集距机型本就同步 |