shell.html 135 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896
  1. <!DOCTYPE html><html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>观澜中文系统 · 详细分析</title><style>:root{--ground:#070C14;--ground-2:#0B1220;--panel:#101A2B;--panel-2:#152238;--line:#1F2E44;--hair:#2A3B55;--ink:#E6EDF5;--ink-2:#C2CEDB;--muted:#8393A8;--accent:#3FC1D3;--accent-deep:#1F8FA0;--accent-soft:#0F2A35;--critical:#E4645C;--warning:#E0A43A;--good:#4CC39B;--excellent:#9AD8C4;--sans:"PingFang SC","Hiragino Sans GB","Microsoft YaHei",Inter,ui-sans-serif,system-ui,sans-serif;--mono:"SF Mono",Menlo,Consolas,monospace;--r:8px}
  2. *{box-sizing:border-box;margin:0} html{background:var(--ground)} body{background:var(--ground);color:var(--ink);font:14px/1.6 var(--sans)} a{color:var(--accent);text-decoration:none} a:hover{text-decoration:underline}
  3. .top{height:56px;display:flex;align-items:center;gap:18px;padding:0 24px;border-bottom:1px solid var(--line);background:#0A1120;position:sticky;top:0;z-index:5} .logo{width:30px;height:30px;border-radius:7px;background:linear-gradient(135deg,#1F8FA0,#0F2A35);display:grid;place-items:center;color:#fff;font-weight:700} .brand{font-weight:600} .brand small{display:block;color:var(--muted);font-size:11px;font-weight:400;letter-spacing:.08em}
  4. .tabs{display:flex;gap:2px;margin-left:12px} .tabs a{padding:8px 12px;color:var(--ink-2);border-bottom:2px solid transparent} .tabs a.on{color:var(--ink);border-color:var(--accent)} .tabs a:hover{text-decoration:none;color:var(--ink)} .live{margin-left:auto;border:1px solid var(--accent-deep);color:var(--accent);border-radius:6px;padding:6px 12px;font-size:13px}
  5. .wrap{max-width:1180px;margin:0 auto;padding:0 24px} .hero{background:var(--ground-2) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cpath d='M32 0H0V32' fill='none' stroke='%233FC1D3' stroke-opacity='.06'/%3E%3C/svg%3E");border-bottom:1px solid var(--line);padding:64px 0 44px} .kicker{font:12px var(--mono);letter-spacing:.14em;color:var(--accent);text-transform:uppercase} h1{font-size:42px;line-height:1.15;font-weight:600;margin:12px 0 16px;max-width:820px} .lead{color:var(--ink-2);max-width:700px;font-size:16.5px} h2{font-size:24px;font-weight:600;margin:0 0 6px} h3{font-size:15px;font-weight:600;margin-bottom:8px}
  6. section{padding:44px 0;border-bottom:1px solid var(--line)} .sub{color:var(--muted);margin-bottom:22px} .grid{display:grid;gap:16px} .g2{grid-template-columns:repeat(2,1fr)} .g3{grid-template-columns:repeat(3,1fr)} .g4{grid-template-columns:repeat(4,1fr)} .g5{grid-template-columns:repeat(5,1fr)} .g6{grid-template-columns:repeat(6,1fr)}
  7. .card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:18px 20px;box-shadow:0 1px 2px #0006} .card .k{font:11px var(--mono);letter-spacing:.12em;color:var(--accent);text-transform:uppercase;margin-bottom:8px} .card p{color:var(--ink-2);font-size:13.5px} .card .num{font:600 34px/1.1 var(--mono);margin:6px 0 4px} .card .num span{font-size:14px;color:var(--muted);font-weight:400;margin-left:4px}
  8. .chips{display:flex;gap:8px;flex-wrap:wrap;margin-top:16px} .chip{font-size:12px;padding:4px 10px;border-radius:99px;border:1px solid var(--hair);color:var(--ink-2)} .chip.ev{border-color:var(--accent-deep);color:var(--accent)} .chip.s{border-color:transparent;color:#07151a;font-weight:600} .chip.al{background:var(--critical)} .chip.ob{background:var(--warning)} .chip.gd{background:var(--good)}
  9. .rail{display:grid;grid-template-columns:repeat(var(--n,5),1fr);position:relative;margin:18px 0 6px} .rail:before{content:"";position:absolute;left:8%;right:8%;top:14px;height:1px;background:var(--hair)} .node{text-align:center;position:relative;padding:0 6px} .node i{display:inline-grid;place-items:center;width:28px;height:28px;border-radius:50%;background:var(--panel-2);border:1px solid var(--hair);font:12px var(--mono);color:var(--ink-2);font-style:normal} .node.on i{border-color:var(--accent);color:var(--accent);box-shadow:0 0 0 1px #3FC1D340,0 0 18px #3FC1D330} .node b{display:block;margin-top:8px;font-size:13.5px} .node small{display:block;color:var(--muted);font-size:11.5px;margin-top:2px}
  10. .arrow{display:flex;gap:10px;align-items:center;color:var(--ink-2);font-size:13px;flex-wrap:wrap} .arrow b{background:var(--panel-2);border:1px solid var(--hair);border-radius:6px;padding:6px 10px;font-weight:500} .arrow i{color:var(--accent);font-style:normal}
  11. .callout{border-left:3px solid var(--accent);background:var(--accent-soft);padding:14px 16px;border-radius:0 var(--r) var(--r) 0;color:var(--ink-2);font-size:13.5px} .warn{border-left-color:var(--warning);background:#2a2110}
  12. .foot{color:var(--muted);font:11.5px var(--mono);padding:16px 24px;display:flex;gap:18px;border-top:1px solid var(--line)} .form{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:26px} .form label{display:block;font-size:12px;color:var(--muted);margin:12px 0 6px} .form input{width:100%;background:var(--ground-2);border:1px solid var(--hair);border-radius:6px;color:var(--ink);padding:10px 12px;font:14px var(--sans)} .btn{display:inline-block;margin-top:16px;background:var(--accent);color:#07151a;font-weight:600;padding:10px 18px;border-radius:6px} .btn:hover{text-decoration:none}
  13. table{border-collapse:collapse;font-size:13px;width:100%} th,td{border-bottom:1px solid var(--line);padding:8px 10px;text-align:left;vertical-align:top} th{color:var(--muted);font-weight:500;font-size:12px} td.n{font-family:var(--mono);text-align:right} iframe{width:100%;height:860px;border:1px solid var(--line);border-radius:var(--r);background:#fff}
  14. @media (max-width:1100px){.top{height:auto;flex-wrap:wrap;padding:8px 16px;row-gap:4px} .tabs{order:9;flex-basis:100%;flex-wrap:wrap;margin-left:0} .tabs a{padding:6px 9px;font-size:13px}} @media (max-width:900px){.g2,.g3,.g4,.g5,.g6{grid-template-columns:1fr 1fr} h1{font-size:30px}}
  15. .pg{display:none} .pg.on{display:block} .ov{position:fixed;inset:0;background:#070C14ee;z-index:50;display:none;flex-direction:column} .ov.on{display:flex} .ov .bar{height:44px;display:flex;align-items:center;gap:12px;padding:0 16px;border-bottom:1px solid var(--line);color:var(--ink-2)} .ov .bar b{flex:1} .ov iframe{flex:1;border:0;background:#fff;height:auto} .x{cursor:pointer;border:1px solid var(--hair);border-radius:6px;padding:4px 10px;color:var(--accent)}
  16. </style>
  17. <style id="file-direct-fallback">
  18. /* 当文件被直接打开且脚本未执行时,仍按 #锚点显示对应页面。 */
  19. .pg:target{display:block!important}
  20. </style><style id="guanlan-english-parity">
  21. .pg{scroll-margin-top:145px}
  22. :root{--ground:#F5F7F8;--ground-2:#F5F7F8;--panel:#fff;--panel-2:#E8F2F6;--ink:#1B2430;--ink-2:#5C6B78;--muted:#5C6B78;--line:#DDE3E8;--hair:#C9D1D8;--accent:#1F6F8B;--accent-deep:#175A71;--accent-soft:#E8F2F6;--r:10px;--critical:#bd3832;--warning:#a56a13;--good:#2E8B6A;--excellent:#2E8B6A}
  23. html{background:#E9EEF1;color-scheme:light}body{max-width:1440px;margin:auto;background:#F5F7F8;color:#1B2430;-webkit-font-smoothing:antialiased;box-shadow:0 0 0 1px #1733440a}
  24. .top{position:sticky;top:0;height:auto;min-height:0;display:flex;flex-wrap:wrap;gap:10px 18px;margin:0;padding:16px 30px 12px;background:#F5F7F8;border:0;box-shadow:none;z-index:10}.logo{width:28px;height:28px;border-radius:6px;background:linear-gradient(135deg,#175A71,#2E8B6A);box-shadow:none}.brand{color:#123344;font-size:15px}.brand small{color:#5C6B78;font-size:10px}.tabs{order:3;flex-basis:100%;display:flex;flex-wrap:nowrap;overflow-x:auto;gap:3px;margin:0;padding:6px;background:#fff;border:1px solid #DDE3E8;border-radius:10px;scrollbar-width:thin}.tabs a{flex:0 0 auto;padding:9px 13px;color:#5C6B78;font-size:13px;border:0;border-radius:6px;white-space:nowrap}.tabs a.on{background:#1F6F8B;color:white;box-shadow:none}.tabs a:hover{background:#E8F2F6;color:#175A71}.tabs a.on:hover{background:#175A71;color:white}.live{color:#175A71;background:#fff;border:1px solid #C9D1D8;padding:8px 12px;border-radius:7px;font-size:12px}
  25. .wrap{max-width:1240px;padding:0 30px}.hero{padding:54px 0 42px;background:#F5F7F8;border-bottom:1px solid #DDE3E8}.hero .kicker{font-size:11px;letter-spacing:.14em;font-weight:500}.hero h1{font-size:42px;line-height:1.25;letter-spacing:-.025em;max-width:920px;margin:16px 0 20px;color:#1B2430}.lead{font-size:16px;line-height:1.8;max-width:850px;color:#5C6B78}section{padding:36px 0;border-bottom:1px solid #DDE3E8;background:transparent}.kicker{font-size:11px;color:#1F6F8B;margin-bottom:10px}h2{font-size:27px;line-height:1.35;letter-spacing:-.014em;color:#1B2430;font-weight:600;margin-bottom:14px}h3{color:#1B2430}.sub{font-size:14px;line-height:1.75;color:#5C6B78;max-width:1000px;margin-bottom:22px}
  26. .grid{gap:14px;align-items:stretch}.g3{grid-template-columns:repeat(3,minmax(0,1fr))}.g2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid>*{min-width:0}.card{padding:22px;border:1px solid #DDE3E8;border-radius:10px;background:white;box-shadow:0 2px 8px #17334405;display:flex;flex-direction:column}.card .k{font-size:10.5px;letter-spacing:.1em;color:#73808B;line-height:1.6;margin-bottom:10px}.card h3{font-size:17px;line-height:1.4;font-weight:600;color:#1B2430;background:none;border:0;padding:0;margin:0 0 10px}.card p{font-size:13.5px;line-height:1.75;color:#5C6B78}.card>.chips{margin-top:auto;padding-top:18px}.card .num{font-size:30px;color:#1B2430}.chip{border-radius:6px;padding:6px 10px;font-size:12px;background:white;color:#425260;border-color:#C9D1D8}.chip.ev{background:#E8F2F6;color:#175A71;border-color:#BFDCE6}.chip.s{color:white}.chip.gd{background:#2E8B6A}.chip.al{background:#bd3832}
  27. #index>section:nth-of-type(3){background:#E8F2F6}#sim .grid.g3>.card:first-child{border-top:3px solid #1F6F8B}#sim .grid.g3>.card:nth-child(2){border-top:3px solid #2E8B6A}#sim .grid.g3>.card:nth-child(3){border-top:3px solid #C9D1D8}.rail{gap:12px}.rail:before{display:none}.node{padding:18px 16px;background:white;border:1px solid #C9D1D8;border-radius:9px;text-align:left}.node i{border:0;background:transparent;color:#1F6F8B;width:auto;height:auto}.node b{font-size:15px;margin-top:12px}.node small{color:#5C6B78;line-height:1.6}.node:last-child{background:#E8F2F6;border-color:#1F6F8B}.arrow b{background:#E8F2F6;color:#175A71;border:0}.callout{background:#E8F2F6;color:#425260;border-left:3px solid #1F6F8B;border-radius:7px;padding:14px 18px;box-shadow:none}.warn{background:#FDF7EC;border-color:#D48A1E}
  28. table{font-size:13px}th{background:#E8F2F6;color:#425260;font-size:12px;font-weight:600}td,th{padding:12px 14px;border-bottom:1px solid #DDE3E8}iframe{border:1px solid #C9D1D8;border-radius:10px;background:white}.form{background:white;border:1px solid #DDE3E8;box-shadow:none;border-radius:10px}.form input{background:#F5F7F8;color:#1B2430;border:1px solid #C9D1D8}.btn{background:#1F6F8B;color:white;border-radius:7px}.ov{background:#E9EEF1}.ov .bar{height:54px;background:#fff;border-bottom:1px solid #DDE3E8;color:#1B2430}.ov iframe{border-radius:0}.x{background:#E8F2F6;color:#175A71}.foot{background:#F5F7F8;color:#5C6B78;font-size:10.5px;flex-wrap:wrap}a:focus-visible,button:focus-visible{outline:3px solid #8FCBB5;outline-offset:3px}
  29. @media(max-width:900px){.g3,.g4,.g5,.g6{grid-template-columns:repeat(2,minmax(0,1fr))}.top{padding:12px 20px}.wrap{padding:0 20px}.hero h1{font-size:34px}.rail{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:600px){.g2,.g3,.g4,.g5,.g6{grid-template-columns:minmax(0,1fr)}.hero{padding:30px 0}.hero h1{font-size:29px}.lead{font-size:14px}h2{font-size:23px}.card{padding:20px}section{padding:28px 0}.top{gap:8px}.live{font-size:11px}.brand small{display:none}.foot{gap:8px}.ov .bar b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}
  30. </style><style id="guanlan-visual-five">:root{--fleet-art:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20520%20320%22%3E%3Cdefs%3E%3Cpattern%20id%3D%22g%22%20width%3D%2226%22%20height%3D%2226%22%20patternUnits%3D%22userSpaceOnUse%22%3E%3Cpath%20d%3D%22M26%200H0V26%22%20fill%3D%22none%22%20stroke%3D%22%2372b8c3%22%20stroke-opacity%3D%22.1%22%2F%3E%3C%2Fpattern%3E%3C%2Fdefs%3E%3Cpath%20fill%3D%22url%28%23g%29%22%20d%3D%22M0%200h520v320H0z%22%2F%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%2367bbb9%22%20stroke-width%3D%221.7%22%20opacity%3D%22.65%22%3E%3Cpath%20d%3D%22M22%20262Q142%20224%20272%20257T505%20245M22%20276Q142%20238%20272%20271T505%20259M22%20290Q142%20252%20272%20285T505%20273%22%2F%3E%3Cpath%20d%3D%22M152%20253V131m0%200%204-81%206%202-5%2074%2061%2039-4%205-66-36-58%2046-4-5%2060-49M291%20246V98m0%200%204-79%206%202-5%2072%2061%2039-4%205-66-36-58%2046-4-5%2060-49M405%20264V158m0%200%203-62%205%202-4%2057%2047%2030-3%204-52-29-45%2036-3-4%2048-36%22%2F%3E%3Ccircle%20cx%3D%22152%22%20cy%3D%22131%22%20r%3D%224%22%20fill%3D%22%2367bbb9%22%2F%3E%3Ccircle%20cx%3D%22291%22%20cy%3D%2298%22%20r%3D%224%22%20fill%3D%22%2367bbb9%22%2F%3E%3Ccircle%20cx%3D%22405%22%20cy%3D%22158%22%20r%3D%224%22%20fill%3D%22%2367bbb9%22%2F%3E%3Cpath%20d%3D%22M35%20248v-53h63v50m-68-51%208-9h60l7%209zm16%202v48m17-48v45m17-45v46M40%20172h39m-21-12h41%22%2F%3E%3Cpath%20stroke-dasharray%3D%224%206%22%20d%3D%22M78%20250Q240%20190%20452%20238%22%2F%3E%3C%2Fg%3E%3Ccircle%20cx%3D%22465%22%20cy%3D%2228%22%20r%3D%2273%22%20fill%3D%22none%22%20stroke%3D%22%238fcbb5%22%20stroke-opacity%3D%22.12%22%2F%3E%3Ccircle%20cx%3D%22465%22%20cy%3D%2228%22%20r%3D%2299%22%20fill%3D%22none%22%20stroke%3D%22%238fcbb5%22%20stroke-opacity%3D%22.06%22%20stroke-width%3D%2220%22%2F%3E%3C%2Fsvg%3E");--signal-art:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20520%20320%22%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%2372b8c3%22%20opacity%3D%22.18%22%3E%3Cpath%20d%3D%22M40%2060h440M40%20110h440M40%20160h440M40%20210h440M40%20260h440M80%2035v245m80-245v245m80-245v245m80-245v245m80-245v245%22%2F%3E%3C%2Fg%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%2378d1c3%22%20stroke-width%3D%222%22%3E%3Cpath%20d%3D%22M35%20170h45l9-12%2010%2023%2013-38%2015%2050%2016-35%2013%2012h37l12-12%2012%2026%2016-69%2014%2099%2017-64%2015%2025%2013-5h34l14-18%2014%2029%2016-85%2014%20120%2018-63%2014%2026%2014-9h54%22%2F%3E%3Ccircle%20cx%3D%22350%22%20cy%3D%22180%22%20r%3D%2278%22%20opacity%3D%22.25%22%2F%3E%3Ccircle%20cx%3D%22350%22%20cy%3D%22180%22%20r%3D%2296%22%20opacity%3D%22.12%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}
  31. body{background:linear-gradient(120deg,#f1f7f9,#edf5f7);}.hero{background:transparent;padding:44px 0 38px}.hero>.wrap{position:relative;min-height:290px;padding-right:440px}.hero>.wrap:after{content:"";display:block;position:absolute;right:30px;top:0;bottom:0;width:350px;min-height:255px;border:1px solid #326274;border-radius:18px;background-color:#103848;background-image:var(--fleet-art),linear-gradient(125deg,#0b293a,#124b5b);background-size:cover;background-position:center;box-shadow:0 10px 28px #17334412}.hero h1{font-size:36px;line-height:1.32;max-width:100%;margin-top:12px}.hero .lead{font-size:15px;line-height:1.85}.hero .kicker{color:#1F6F8B;font-size:11px}#cms>.hero>.wrap:after{background-image:var(--signal-art),linear-gradient(125deg,#0b293a,#124b5b)}h2{position:relative;padding-left:16px}h2:before{content:"";position:absolute;left:0;top:.15em;bottom:.15em;width:4px;border-radius:3px;background:linear-gradient(#078594,#48c4b2)}.card{border-color:#d2e3e9;box-shadow:0 5px 18px #17334407;border-radius:13px}.grid>.card{border-top:3px solid #78aebf}.grid>.card:nth-child(3n+2){border-top-color:#59a58e}.grid>.card:nth-child(3n){border-top-color:#8397a5}.card .num{color:#133d50}.tabs{background:#e3eff3;border-color:#cce0e7;padding:7px}.tabs a{padding:10px 14px}.tabs a.on{background:#007c8a;box-shadow:0 3px 9px #075b7120}.logo{width:36px;height:36px;background:#0d4354;border:1px solid #58999e;color:#7ee0cd;font-size:22px}.brand{font-size:18px}.callout{background:#e8f3f6}.ov .bar{background:#123b4d;color:#fff}.ov .x{background:#eaf5f7;color:#123b4d}.hero .chips{gap:7px}.hero .chip{font-size:11px}
  32. @media(max-width:1050px){.hero>.wrap{padding-right:360px}.hero>.wrap:after{width:290px}.hero h1{font-size:31px}}
  33. @media(max-width:760px){.hero>.wrap{padding:0 20px;min-height:0}.hero>.wrap:after{position:relative;right:auto;top:auto;bottom:auto;width:100%;height:170px;min-height:0;margin-top:24px;background-size:auto 250px,cover;background-repeat:no-repeat}.hero h1{font-size:29px}.hero{padding-top:28px}.card{border-radius:11px}}
  34. .hero>.wrap:after{background-size:contain,cover;background-repeat:no-repeat;background-position:center}#findings>section:nth-of-type(2) .grid.g4>.card:first-child{background:#123b4d;border-color:#326274}#findings>section:nth-of-type(2) .grid.g4>.card:first-child h3,#findings>section:nth-of-type(2) .grid.g4>.card:first-child .num{color:#fff}#findings>section:nth-of-type(2) .grid.g4>.card:first-child p,#findings>section:nth-of-type(2) .grid.g4>.card:first-child .k,#findings>section:nth-of-type(2) .grid.g4>.card:first-child .num span{color:#bfdce6}@media(max-width:760px){.top{position:relative}.tabs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));overflow:visible;gap:4px}.tabs a{text-align:center;font-size:11px;padding:9px 4px}.pg{scroll-margin-top:0}.hero>.wrap:after{border-radius:13px}}</style><style id="guanlan-page-identities">#architecture>.hero>.wrap:after{background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20520%20320%22%3E%3Cdefs%3E%3Cpattern%20id%3D%22grid%22%20width%3D%2226%22%20height%3D%2226%22%20patternUnits%3D%22userSpaceOnUse%22%3E%3Cpath%20d%3D%22M26%200H0V26%22%20fill%3D%22none%22%20stroke%3D%22%2381bac5%22%20stroke-opacity%3D%22.1%22%2F%3E%3C%2Fpattern%3E%3C%2Fdefs%3E%3Crect%20width%3D%22520%22%20height%3D%22320%22%20fill%3D%22url%28%23grid%29%22%2F%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%237bcbbb%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20opacity%3D%22.8%22%3E%3Cpath%20d%3D%22M95%2090H260V155H425M95%20230H260V155M260%2055V255%22%2F%3E%3Crect%20x%3D%2271%22%20y%3D%2270%22%20width%3D%2248%22%20height%3D%2240%22%20rx%3D%227%22%20fill%3D%22%23154858%22%2F%3E%3Crect%20x%3D%2271%22%20y%3D%22210%22%20width%3D%2248%22%20height%3D%2240%22%20rx%3D%227%22%20fill%3D%22%23154858%22%2F%3E%3Crect%20x%3D%22236%22%20y%3D%2235%22%20width%3D%2248%22%20height%3D%2240%22%20rx%3D%227%22%20fill%3D%22%23154858%22%2F%3E%3Crect%20x%3D%22236%22%20y%3D%22135%22%20width%3D%2248%22%20height%3D%2240%22%20rx%3D%227%22%20fill%3D%22%23154858%22%2F%3E%3Crect%20x%3D%22236%22%20y%3D%22235%22%20width%3D%2248%22%20height%3D%2240%22%20rx%3D%227%22%20fill%3D%22%23154858%22%2F%3E%3Crect%20x%3D%22401%22%20y%3D%22135%22%20width%3D%2248%22%20height%3D%2240%22%20rx%3D%227%22%20fill%3D%22%23154858%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),linear-gradient(125deg,#0b293a,#124b5b)}#method>.hero>.wrap:after{background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20520%20320%22%3E%3Cdefs%3E%3Cpattern%20id%3D%22grid%22%20width%3D%2226%22%20height%3D%2226%22%20patternUnits%3D%22userSpaceOnUse%22%3E%3Cpath%20d%3D%22M26%200H0V26%22%20fill%3D%22none%22%20stroke%3D%22%2381bac5%22%20stroke-opacity%3D%22.1%22%2F%3E%3C%2Fpattern%3E%3C%2Fdefs%3E%3Crect%20width%3D%22520%22%20height%3D%22320%22%20fill%3D%22url%28%23grid%29%22%2F%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%237bcbbb%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20opacity%3D%22.8%22%3E%3Cpath%20d%3D%22M65%20170H455%22%2F%3E%3Crect%20x%3D%2250%22%20y%3D%22140%22%20width%3D%2265%22%20height%3D%2265%22%20rx%3D%2210%22%20fill%3D%22%23154858%22%2F%3E%3Cpath%20d%3D%22M68%20165l10%2010%2020-24%22%2F%3E%3Crect%20x%3D%22165%22%20y%3D%22125%22%20width%3D%2265%22%20height%3D%2265%22%20rx%3D%2210%22%20fill%3D%22%23154858%22%2F%3E%3Cpath%20d%3D%22M183%20150l10%2010%2020-24%22%2F%3E%3Crect%20x%3D%22280%22%20y%3D%22140%22%20width%3D%2265%22%20height%3D%2265%22%20rx%3D%2210%22%20fill%3D%22%23154858%22%2F%3E%3Cpath%20d%3D%22M298%20165l10%2010%2020-24%22%2F%3E%3Crect%20x%3D%22395%22%20y%3D%22125%22%20width%3D%2265%22%20height%3D%2265%22%20rx%3D%2210%22%20fill%3D%22%23154858%22%2F%3E%3Cpath%20d%3D%22M413%20150l10%2010%2020-24%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),linear-gradient(125deg,#0b293a,#124b5b)}#findings>.hero>.wrap:after{background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20520%20320%22%3E%3Cdefs%3E%3Cpattern%20id%3D%22grid%22%20width%3D%2226%22%20height%3D%2226%22%20patternUnits%3D%22userSpaceOnUse%22%3E%3Cpath%20d%3D%22M26%200H0V26%22%20fill%3D%22none%22%20stroke%3D%22%2381bac5%22%20stroke-opacity%3D%22.1%22%2F%3E%3C%2Fpattern%3E%3C%2Fdefs%3E%3Crect%20width%3D%22520%22%20height%3D%22320%22%20fill%3D%22url%28%23grid%29%22%2F%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%237bcbbb%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20opacity%3D%22.8%22%3E%3Ccircle%20cx%3D%22280%22%20cy%3D%22160%22%20r%3D%22105%22%20opacity%3D%22.3%22%2F%3E%3Ccircle%20cx%3D%22280%22%20cy%3D%22160%22%20r%3D%2275%22%20opacity%3D%22.3%22%2F%3E%3Cpath%20d%3D%22M70%20255L135%20222%20205%20233%20272%20180%20335%20193%20425%2098%22%2F%3E%3Ccircle%20cx%3D%22135%22%20cy%3D%22222%22%20r%3D%225%22%20fill%3D%22%237ecaba%22%2F%3E%3Ccircle%20cx%3D%22205%22%20cy%3D%22233%22%20r%3D%225%22%20fill%3D%22%237ecaba%22%2F%3E%3Ccircle%20cx%3D%22272%22%20cy%3D%22180%22%20r%3D%225%22%20fill%3D%22%237ecaba%22%2F%3E%3Ccircle%20cx%3D%22335%22%20cy%3D%22193%22%20r%3D%225%22%20fill%3D%22%237ecaba%22%2F%3E%3Ccircle%20cx%3D%22425%22%20cy%3D%2298%22%20r%3D%225%22%20fill%3D%22%237ecaba%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),linear-gradient(125deg,#0b293a,#124b5b)}#case_hydraulic>.hero>.wrap:after{background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20520%20320%22%3E%3Cdefs%3E%3Cpattern%20id%3D%22grid%22%20width%3D%2226%22%20height%3D%2226%22%20patternUnits%3D%22userSpaceOnUse%22%3E%3Cpath%20d%3D%22M26%200H0V26%22%20fill%3D%22none%22%20stroke%3D%22%2381bac5%22%20stroke-opacity%3D%22.1%22%2F%3E%3C%2Fpattern%3E%3C%2Fdefs%3E%3Crect%20width%3D%22520%22%20height%3D%22320%22%20fill%3D%22url%28%23grid%29%22%2F%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%237bcbbb%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20opacity%3D%22.8%22%3E%3Cpath%20d%3D%22M90%20210V90H420V210H90M250%2090V210M175%20210V245H335V210%22%2F%3E%3Ccircle%20cx%3D%2290%22%20cy%3D%22155%22%20r%3D%2225%22%20fill%3D%22%23154858%22%2F%3E%3Cpath%20d%3D%22m78%20167%2023-13-23-13z%22%2F%3E%3Crect%20x%3D%22226%22%20y%3D%22120%22%20width%3D%2248%22%20height%3D%2270%22%20rx%3D%2220%22%20fill%3D%22%23154858%22%2F%3E%3Cpath%20d%3D%22M229%20155h43%22%2F%3E%3Crect%20x%3D%22395%22%20y%3D%22123%22%20width%3D%2250%22%20height%3D%2260%22%20fill%3D%22%23154858%22%2F%3E%3Cpath%20d%3D%22M420%20125v58m-14-30h28%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),linear-gradient(125deg,#0b293a,#124b5b)}#cms>.hero>.wrap:after{background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20520%20320%22%3E%3Cdefs%3E%3Cpattern%20id%3D%22grid%22%20width%3D%2226%22%20height%3D%2226%22%20patternUnits%3D%22userSpaceOnUse%22%3E%3Cpath%20d%3D%22M26%200H0V26%22%20fill%3D%22none%22%20stroke%3D%22%2381bac5%22%20stroke-opacity%3D%22.1%22%2F%3E%3C%2Fpattern%3E%3C%2Fdefs%3E%3Crect%20width%3D%22520%22%20height%3D%22320%22%20fill%3D%22url%28%23grid%29%22%2F%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%237bcbbb%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20opacity%3D%22.8%22%3E%3Cpath%20d%3D%22M45%20170h45l12-16%2012%2034%2014-53%2016%2070%2017-41h35l16%2018%2017-84%2017%20124%2018-63h36l17-29%2017%2065%2017-100%2017%20120%2017-47h55%22%2F%3E%3Ccircle%20cx%3D%22275%22%20cy%3D%22160%22%20r%3D%22103%22%20opacity%3D%22.2%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),linear-gradient(125deg,#0b293a,#124b5b)}#sim>.hero>.wrap:after{background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20520%20320%22%3E%3Cdefs%3E%3Cpattern%20id%3D%22grid%22%20width%3D%2226%22%20height%3D%2226%22%20patternUnits%3D%22userSpaceOnUse%22%3E%3Cpath%20d%3D%22M26%200H0V26%22%20fill%3D%22none%22%20stroke%3D%22%2381bac5%22%20stroke-opacity%3D%22.1%22%2F%3E%3C%2Fpattern%3E%3C%2Fdefs%3E%3Crect%20width%3D%22520%22%20height%3D%22320%22%20fill%3D%22url%28%23grid%29%22%2F%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%237bcbbb%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20opacity%3D%22.8%22%3E%3Cpath%20d%3D%22M75%20225C165%20225%20170%20155%20235%20155S360%20156%20455%20156%22%20stroke-dasharray%3D%226%207%22%2F%3E%3Cpath%20d%3D%22M75%20230C125%20230%20140%2077%20200%2090S270%20231%20320%20171%20390%2090%20455%20125%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),linear-gradient(125deg,#0b293a,#124b5b)}#documents>.hero>.wrap:after{background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20520%20320%22%3E%3Cdefs%3E%3Cpattern%20id%3D%22grid%22%20width%3D%2226%22%20height%3D%2226%22%20patternUnits%3D%22userSpaceOnUse%22%3E%3Cpath%20d%3D%22M26%200H0V26%22%20fill%3D%22none%22%20stroke%3D%22%2381bac5%22%20stroke-opacity%3D%22.1%22%2F%3E%3C%2Fpattern%3E%3C%2Fdefs%3E%3Crect%20width%3D%22520%22%20height%3D%22320%22%20fill%3D%22url%28%23grid%29%22%2F%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%237bcbbb%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20opacity%3D%22.8%22%3E%3Crect%20x%3D%22155%22%20y%3D%2250%22%20width%3D%22190%22%20height%3D%22225%22%20rx%3D%2210%22%2F%3E%3Cpath%20d%3D%22M185%2091h128m-128%2025h80m-80%2028h128m-128%2085h130M190%20207v-35m35%2035v-20m35%2020v-51m35%2051v-65%22%2F%3E%3Cpath%20d%3D%22m352%20206%2017%2017%2035-41%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),linear-gradient(125deg,#0b293a,#124b5b)}#admin>.hero>.wrap:after{background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20520%20320%22%3E%3Cdefs%3E%3Cpattern%20id%3D%22grid%22%20width%3D%2226%22%20height%3D%2226%22%20patternUnits%3D%22userSpaceOnUse%22%3E%3Cpath%20d%3D%22M26%200H0V26%22%20fill%3D%22none%22%20stroke%3D%22%2381bac5%22%20stroke-opacity%3D%22.1%22%2F%3E%3C%2Fpattern%3E%3C%2Fdefs%3E%3Crect%20width%3D%22520%22%20height%3D%22320%22%20fill%3D%22url%28%23grid%29%22%2F%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%237bcbbb%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20opacity%3D%22.8%22%3E%3Cpath%20d%3D%22M100%20160H420M260%2080v160%22%2F%3E%3Crect%20x%3D%2265%22%20y%3D%22140%22%20width%3D%22105%22%20height%3D%2240%22%20rx%3D%227%22%20fill%3D%22%23154858%22%2F%3E%3Ccircle%20cx%3D%2283%22%20cy%3D%22160%22%20r%3D%224%22%20fill%3D%22%237ecaba%22%2F%3E%3Cpath%20d%3D%22M101%20160h48%22%2F%3E%3Crect%20x%3D%22205%22%20y%3D%2265%22%20width%3D%22105%22%20height%3D%2240%22%20rx%3D%227%22%20fill%3D%22%23154858%22%2F%3E%3Ccircle%20cx%3D%22223%22%20cy%3D%2285%22%20r%3D%224%22%20fill%3D%22%237ecaba%22%2F%3E%3Cpath%20d%3D%22M241%2085h48%22%2F%3E%3Crect%20x%3D%22205%22%20y%3D%22140%22%20width%3D%22105%22%20height%3D%2240%22%20rx%3D%227%22%20fill%3D%22%23154858%22%2F%3E%3Ccircle%20cx%3D%22223%22%20cy%3D%22160%22%20r%3D%224%22%20fill%3D%22%237ecaba%22%2F%3E%3Cpath%20d%3D%22M241%20160h48%22%2F%3E%3Crect%20x%3D%22205%22%20y%3D%22215%22%20width%3D%22105%22%20height%3D%2240%22%20rx%3D%227%22%20fill%3D%22%23154858%22%2F%3E%3Ccircle%20cx%3D%22223%22%20cy%3D%22235%22%20r%3D%224%22%20fill%3D%22%237ecaba%22%2F%3E%3Cpath%20d%3D%22M241%20235h48%22%2F%3E%3Crect%20x%3D%22350%22%20y%3D%22140%22%20width%3D%22105%22%20height%3D%2240%22%20rx%3D%227%22%20fill%3D%22%23154858%22%2F%3E%3Ccircle%20cx%3D%22368%22%20cy%3D%22160%22%20r%3D%224%22%20fill%3D%22%237ecaba%22%2F%3E%3Cpath%20d%3D%22M386%20160h48%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),linear-gradient(125deg,#0b293a,#124b5b)}#login>.hero>.wrap:after{background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20520%20320%22%3E%3Cdefs%3E%3Cpattern%20id%3D%22grid%22%20width%3D%2226%22%20height%3D%2226%22%20patternUnits%3D%22userSpaceOnUse%22%3E%3Cpath%20d%3D%22M26%200H0V26%22%20fill%3D%22none%22%20stroke%3D%22%2381bac5%22%20stroke-opacity%3D%22.1%22%2F%3E%3C%2Fpattern%3E%3C%2Fdefs%3E%3Crect%20width%3D%22520%22%20height%3D%22320%22%20fill%3D%22url%28%23grid%29%22%2F%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%237bcbbb%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20opacity%3D%22.8%22%3E%3Cpath%20d%3D%22M260%2048l100%2040v76c0%2062-54%2097-100%20116-46-19-100-54-100-116V88z%22%2F%3E%3Crect%20x%3D%22222%22%20y%3D%22140%22%20width%3D%2276%22%20height%3D%2266%22%20rx%3D%2210%22%2F%3E%3Cpath%20d%3D%22M239%20140v-19a21%2021%200%200%201%2042%200v19M260%20166v20%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),linear-gradient(125deg,#0b293a,#124b5b)}
  35. .hero h1{font-family:"PingFang SC","Hiragino Sans GB",sans-serif;font-weight:650;letter-spacing:-.03em}.hero .kicker,.card .k{font-family:"SF Mono",Menlo,monospace;letter-spacing:.13em;font-weight:500}.card h3{font-size:18px;font-weight:600;letter-spacing:-.015em}.card p,.lead{font-family:"PingFang SC","Microsoft YaHei",sans-serif;font-weight:400}.card .num{font-family:"SF Mono",Menlo,monospace;font-weight:600;font-variant-numeric:tabular-nums}#findings .hero h1{font-family:"Songti SC","STSong",serif;font-size:40px;letter-spacing:.035em;font-weight:700}#method .hero h1,#architecture .hero h1{font-weight:700;letter-spacing:-.02em}#documents .hero h1{font-weight:500;line-height:1.45}@media(max-width:760px){#findings .hero h1{font-size:31px}.card h3{font-size:17px}}
  36. </style><style id="guanlan-actions">.return-dock{position:fixed;right:22px;bottom:18px;z-index:30;display:flex;gap:8px;padding:8px;background:#ffffffed;border:1px solid #bfd4df;border-radius:10px;box-shadow:0 4px 20px #143b4d1c}.return-dock a{padding:8px 12px;border-radius:6px;color:#175a71;font-size:12px}.return-dock a:first-child{border:1px solid #bfd4df}.chips a:first-child.ev,.btn{background:#087c8a;color:#fff;border-color:#087c8a}.chips a:not(:first-child){background:white;color:#175a71}.ov .x{font:600 14px sans-serif;padding:9px 16px;border:1px solid #bfdce6}.foot{padding-bottom:85px}@media(max-width:600px){.return-dock{left:10px;right:10px;bottom:8px;justify-content:center;gap:2px}.return-dock a{padding:7px;font-size:11px}}</style><style id="guanlan-composition-variety">
  37. #index>.hero>.wrap{padding:178px 30px 0;min-height:0}#index>.hero>.wrap:after{top:0;left:30px;right:30px;bottom:auto;width:auto;height:145px;min-height:0;background-size:auto 220px,cover;background-position:85% center,center;border-radius:18px}#index>.hero h1{max-width:850px;font-size:40px}
  38. #architecture>.hero>.wrap,#case_hydraulic>.hero>.wrap{padding-left:440px;padding-right:30px}#architecture>.hero>.wrap:after,#case_hydraulic>.hero>.wrap:after{left:30px;right:auto;width:350px}
  39. #method>.hero>.wrap{padding:0 30px;min-height:0}#method>.hero>.wrap:after{position:relative;left:auto;right:auto;top:auto;bottom:auto;width:100%;height:160px;min-height:0;margin-top:26px;background-size:auto 270px,cover;border-radius:12px}#method>.hero h1{max-width:900px}
  40. #cms>.hero>.wrap{padding:0 30px 165px;min-height:0}#cms>.hero>.wrap:after{left:30px;right:30px;bottom:0;top:auto;width:auto;height:140px;min-height:0;background-size:auto 250px,cover;border-radius:12px}#cms>.hero h1{max-width:950px}
  41. #documents>.hero>.wrap{padding:12px 30px;min-height:290px;isolation:isolate}#documents>.hero>.wrap>*{position:relative;z-index:1;max-width:780px}#documents>.hero>.wrap:after{z-index:0;width:35%;border:0;border-radius:0;box-shadow:none;background-color:transparent;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20520%20320%22%3E%3Cdefs%3E%3Cpattern%20id%3D%22grid%22%20width%3D%2226%22%20height%3D%2226%22%20patternUnits%3D%22userSpaceOnUse%22%3E%3Cpath%20d%3D%22M26%200H0V26%22%20fill%3D%22none%22%20stroke%3D%22%2381bac5%22%20stroke-opacity%3D%22.1%22%2F%3E%3C%2Fpattern%3E%3C%2Fdefs%3E%3Crect%20width%3D%22520%22%20height%3D%22320%22%20fill%3D%22url%28%23grid%29%22%2F%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%237bcbbb%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20opacity%3D%22.8%22%3E%3Crect%20x%3D%22155%22%20y%3D%2250%22%20width%3D%22190%22%20height%3D%22225%22%20rx%3D%2210%22%2F%3E%3Cpath%20d%3D%22M185%2091h128m-128%2025h80m-80%2028h128m-128%2085h130M190%20207v-35m35%2035v-20m35%2020v-51m35%2051v-65%22%2F%3E%3Cpath%20d%3D%22m352%20206%2017%2017%2035-41%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");opacity:.45;background-size:contain}#admin>.hero>.wrap{padding:0 30px;min-height:0}#admin>.hero>.wrap:after{position:relative;left:auto;right:auto;top:auto;bottom:auto;width:100%;height:130px;min-height:0;margin-top:22px;background-size:auto 235px,cover;border-radius:10px}
  42. #login>.hero>.wrap:after{width:285px;right:60px;border-radius:110px 110px 18px 18px}#login>.hero>.wrap{padding-right:410px}
  43. @media(max-width:1050px) and (min-width:761px){#architecture>.hero>.wrap,#case_hydraulic>.hero>.wrap{padding-left:360px}#architecture>.hero>.wrap:after,#case_hydraulic>.hero>.wrap:after{width:290px}}
  44. @media(max-width:760px){#index>.hero>.wrap{padding:148px 20px 0}#index>.hero>.wrap:after{position:absolute;left:20px;right:20px;top:0;height:125px;margin:0;width:auto;background-size:auto 180px,cover}#index>.hero h1{font-size:29px}#architecture>.hero>.wrap,#case_hydraulic>.hero>.wrap,#method>.hero>.wrap,#admin>.hero>.wrap,#login>.hero>.wrap{padding:0 20px}#architecture>.hero>.wrap:after,#case_hydraulic>.hero>.wrap:after,#login>.hero>.wrap:after{position:relative;left:auto;right:auto;width:100%;height:160px;border-radius:12px}#method>.hero>.wrap:after{height:130px;background-size:auto 230px,cover}#cms>.hero>.wrap{padding:0 20px 150px}#cms>.hero>.wrap:after{position:absolute;left:20px;right:20px;bottom:0;width:auto;height:130px;margin:0}#documents>.hero>.wrap{padding:0 20px;min-height:0}#documents>.hero>.wrap:after{display:none}#admin>.hero>.wrap:after{height:115px}}
  45. </style><style id="guanlan-touch-targets">@media(max-width:760px){.tabs a,.return-dock a,.chips a,.btn,.x{min-height:44px;display:inline-flex;align-items:center;justify-content:center}.return-dock{flex-wrap:wrap}.foot{padding-bottom:115px}}</style></head><body>
  46. <div class="top"><div class="logo">≋</div><div class="brand">观澜<small>WIND ASSET INTELLIGENCE</small></div><nav class="tabs"><a href="#index" data-nav="index">总览</a><a href="#architecture" data-nav="architecture">系统架构</a><a href="#method" data-nav="method">方法</a><a href="#findings" data-nav="findings">经验发现</a><a href="#case_hydraulic" data-nav="case_hydraulic">案例·液压</a><a href="#cms" data-nav="cms">振动·CMS</a><a href="#sim" data-nav="sim">仿真与回放</a><a href="#documents" data-nav="documents">交付文档</a><a href="#admin" data-nav="admin">系统状态</a><a href="http://127.0.0.1:18033/v2">登录</a></nav></div>
  47. <div class="pg" id="index" data-title="总览"><section class="hero"><div class="wrap"><div class="kicker">Wind asset intelligence · 机群诊断与分析服务</div><h1>从运行证据到检修决策</h1><p class="lead">观澜把运行数据、状态监测与检修记录落到正确的部件上,然后给出一个带证据与边界的决定。</p>
  48. <div class="chips"><a class="chip ev" href="#sim" data-nav="sim">进入仿真与回放 →</a><a class="chip ev" href="#cms" data-nav="cms">振动 · CMS 在线系统 →</a><a class="chip" href="#method" data-nav="method">读方法</a><a class="chip" href="#case_hydraulic" data-nav="case_hydraulic">看一个发现案例:液压系统</a><a class="chip" href="#documents" data-nav="documents">看交付文档</a></div></div></section>
  49. <section><div class="wrap"><div class="kicker">证据到决定的系统</div><h2>多源证据分析与检修后验证</h2><p class="sub">十分钟与秒级 SCADA · 状态监测 · 报警 · 工单 · 油样与检查 · 技术文档</p>
  50. <div class="rail" style="--n:4"><div class="node"><i>01</i><b>鉴定</b><small>这条记录撑得起这个问题吗</small></div><div class="node"><i>02</i><b>落位</b><small>它描述的是哪个设备对象</small></div><div class="node on"><i>03</i><b>评估</b><small>什么机制与证据相符</small></div><div class="node"><i>04</i><b>决定</b><small>监视、计划还是动作</small></div></div>
  51. <div class="grid g4" style="margin-top:22px"><div class="card"><div class="k">六类证据</div><h3>同一时段互相检查</h3><p>谱、标量、时域、告警、工单、油样各算一族,同族不算互证。</p></div><div class="card"><div class="k">三种决定状态</div><h3>监视 · 计划 · 动作</h3><p>每个决定带后果、责任人、到期日与闭合证据。</p></div><div class="card"><div class="k">证据可追</div><h3>每条结论打开就是源记录</h3><p>台号与数字必有出处;引文回抓闸不通过不上屏。</p></div><div class="card"><div class="k">人来批准</div><h3>授权工程师控制现场动作</h3><p>系统不签工单;高成本动作由人批准。</p></div></div></div></section>
  52. <section><div class="wrap"><div class="kicker">工程本体</div><h2>每条记录都落到正确的设备对象上</h2><p class="sub">本体保留机型、配置、有效期与来源。映射不清的记录停在未分配,不进入诊断。</p>
  53. <div class="arrow"><b>资产</b><i>→</i><b>系统</b><i>→</i><b>总成</b><i>→</i><b>部件</b><i>→</i><b>测点</b></div><p class="sub" style="margin-top:12px">信号、告警、规程与工单通过带类型的关系和来源定位符挂到这些对象上。如东实例:19,321 个对象,25 类,写入闸 C1–C17。</p></div></section>
  54. <section><div class="wrap"><div class="kicker">标准化地基 (新)</div><h2>按机型与风场配置分析系统</h2>
  55. <div class="grid g3"><div class="card"><div class="k">机型包</div><h3>远景 1.5MW · SWT-4.0-130</h3><p>标签字典、码表、失效模式、固有线、阈值来源;本场反推的常量标明出处层。</p></div><div class="card"><div class="k">场实例</div><h3>如东 · 王家湾 · 神木</h3><p>布局、分辨率、限电制度、季节、测风塔、逐窗校准结果。</p></div><div class="card"><div class="k">发布快照</div><h3>可回放</h3><p>数据指纹 + 代码指纹 + 覆盖面 + 裁决集 + 记录归档 + 审级件,一条命令重放。</p></div></div>
  56. <div class="chips"><a class="chip ev" href="#" data-open="standard_panel_zh.html">标准化面板 →</a><a class="chip ev" href="#" data-open="coverage_ch0_zh.html">覆盖面第 0 章 →</a></div></div></section>
  57. </div><div class="pg" id="architecture" data-title="系统架构"><section class="hero"><div class="wrap"><div class="kicker">技术白皮书 · 系统架构</div><h1>从证据分析到处置建议</h1><p class="lead">五个相连的系统层:保留来源身份、落位设备上下文、检验机制、准备可问责的决定,并从检修结果中学习。</p></div></section>
  58. <section><div class="wrap"><div class="chips"><span class="chip">十分钟 SCADA</span><span class="chip">秒级数据</span><span class="chip">CMS</span><span class="chip">报警</span><span class="chip">工单</span><span class="chip">油样与检查</span><span class="chip">技术文档</span></div>
  59. <div class="rail" style="--n:5;margin-top:26px"><div class="node"><i>01</i><b>数据地基</b><small>每条记录能被辨识和解释吗?</small></div><div class="node"><i>02</i><b>设备本体</b><small>每条记录指向哪个物理对象与配置?</small></div><div class="node on"><i>03</i><b>证据引擎</b><small>证据支持某个具体机制吗?</small></div><div class="node"><i>04</i><b>决策服务</b><small>现在有什么动作是有依据的?</small></div><div class="node"><i>05</i><b>检修学习</b><small>动作改变了预期指标吗?</small></div></div>
  60. <div class="grid g2" style="margin-top:22px"><div class="callout"><b>验证过的现场结果</b> → 本体 + 证据史 → 下一轮分析</div><div class="callout warn"><b>必需证据缺失</b> → 点名采集任务 → 停止升级</div></div>
  61. <p class="sub" style="margin-top:12px">身份、来源完整性或必需证据未解决时,系统失败关闭;验证过的检修结果成为可复用的证据。</p></div></section>
  62. <section><div class="wrap"><div class="kicker">01 · 数据地基 · 登记与契约</div><h2>每条记录能被辨识和解释吗?</h2><div class="grid g2" style="margin-top:14px"><div class="card"><p>保留原始证据,定义每个通道:登记来源位置、指纹、时间覆盖与格式,不改原文件;十分钟与秒级数据核单位、采样间隔、时间戳、哨兵值、通道活性与运行状态。</p></div><div class="card"><div class="k">输出</div><p>来源登记簿、通道定义、可用时段与排除项。</p></div></div></div></section><section><div class="wrap"><div class="kicker">02 · 设备本体 · 落位</div><h2>每条记录指向哪个物理对象与配置?</h2><div class="grid g2" style="margin-top:14px"><div class="card"><p>通过受控的工程图谱连接证据:资产、系统、总成、部件、测点与通道、告警、规程、工单、文档相连;机型、配置、有效期与来源约束每一条映射,含糊的对象停在未分配。</p></div><div class="card"><div class="k">输出</div><p>按机型限定的设备对象、带类型的关系与出处。</p></div></div></div></section><section><div class="wrap"><div class="kicker">03 · 证据引擎 · 检验机制</div><h2>证据支持某个具体机制吗?</h2><div class="grid g2" style="margin-top:14px"><div class="card"><p>先验测量链与物理界,再比较绝对水平、同工况机群残差、变化、分布形状与合格谱证据;证据族分开,相互矛盾的记录保持可见。</p></div><div class="card"><div class="k">输出</div><p>有界的发现、疑似机制、支持证据、矛盾项,或「需更多数据」。</p></div></div></div></section><section><div class="wrap"><div class="kicker">04 · 决策服务 · 限定动作</div><h2>现在有什么动作是有依据的?</h2><div class="grid g2" style="margin-top:14px"><div class="card"><p>写一个可问责的决定对象:状态、机制、置信、后果、选项、责任人、到期日与闭合证据放在一起;系统准备监视/计划/动作三种选项,授权工程师批准现场与高成本动作。</p></div><div class="card"><div class="k">输出</div><p>可审阅的决定、批准人与执行边界。</p></div></div></div></section><section><div class="wrap"><div class="kicker">05 · 检修学习 · 验证与复用</div><h2>动作改变了预期指标吗?</h2><div class="grid g2" style="margin-top:14px"><div class="card"><p>工作包写明部件、规程、检查点与必需记录;检修后在同工况下比较同一指标,改善支持闭合,无改善则重开机制;验证过的结果挂回本体,供下一个相似案例。</p></div><div class="card"><div class="k">输出</div><p>现场记录、修后比较、闭合或重开的调查。</p></div></div></div></section>
  63. <section><div class="wrap"><div class="kicker">受保护的内容</div><h2>资产专属参考保持在受保护工作区内</h2><p class="sub">特征频率、业主与场站标识、私有技术文档与台级证据留在受保护工作区;公开图只展示架构。</p></div></section>
  64. </div><div class="pg" id="method" data-title="方法"><section class="hero"><div class="wrap"><div class="kicker">工程方法</div><h1>六步分析与决策依据</h1><p class="lead">观澜把运行数据、设备上下文与检修历史连在一起,不隐藏不确定性。每个结果保留来源、时段与下一步验证。</p></div></section>
  65. <section><div class="wrap"><div class="kicker">输入</div><h2>十分钟 SCADA + 秒级数据</h2><div class="grid g3"><div class="card"><div class="k">十分钟 SCADA</div><h3>运行状态、热行为、负荷与机群比较</h3><p></p></div><div class="card"><div class="k">秒级数据</div><h3>快速暂态、控制响应与事件序列</h3><p></p></div><div class="card"><div class="k">CMS</div><h3>状态监测标量与合格谱</h3><p></p></div><div class="card"><div class="k">报警</div><h3>码按适用的整机厂码表解析</h3><p></p></div><div class="card"><div class="k">检修</div><h3>工单、检查、油样与换件</h3><p></p></div><div class="card"><div class="k">技术来源</div><h3>按机型限定的图纸、手册、规程与配置记录</h3><p></p></div></div>
  66. <div class="callout" style="margin-top:16px">单位、采样间隔、时间戳、哨兵值与通道活性在使用前核验。<b>有这一列不等于有活信号。</b></div></div></section>
  67. <section><div class="wrap"><div class="kicker">执行路径</div><h2>六步</h2><div class="rail" style="--n:6"><div class="node"><i>01</i><b>登记</b><small>来源:指纹与覆盖</small></div><div class="node"><i>02</i><b>落位</b><small>身份:机型与配置</small></div><div class="node"><i>03</i><b>验证</b><small>测量:单位、时间与活性</small></div><div class="node"><i>04</i><b>比较</b><small>状态:绝对与同工况对照</small></div><div class="node on"><i>05</i><b>检验</b><small>机制:支持与矛盾</small></div><div class="node"><i>06</i><b>发布</b><small>决定:动作、责任人与闭合</small></div></div></div></section>
  68. <section><div class="wrap"><div class="kicker">四道控制</div><h2>诊断结论的验证要求</h2><div class="grid g4"><div class="card"><div class="k">01</div><h3>先验测量链</h3><p>算特征之前先查静态偏置、缺失或默认值、时间戳对齐与真实采样行为。</p></div><div class="card"><div class="k">02</div><h3>匹配状态与时段</h3><p>同工况、同证据窗比较;检修与配置变更开启新时段。</p></div><div class="card"><div class="k">03</div><h3>证据保持独立</h3><p>同一传感器的多个特征仍是一族证据;共享预处理或共同测量链不构成互证。</p></div><div class="card"><div class="k">04</div><h3>缺必需证据就停</h3><p>缺必需证据只产出&quot;需更多数据&quot;,点名采集任务,禁止升级到更强的结论。</p></div></div></div></section>
  69. <section><div class="wrap"><div class="kicker">决定与检修</div><h2>从发现到验证过的现场结果</h2><div class="grid g3"><div class="card"><div class="k">发现</div><h3>陈述状态</h3><p>部件、疑似机制、幅度、证据、矛盾与置信。</p></div><div class="card"><div class="k">决定</div><h3>选择 监视 / 计划 / 动作</h3><p>给出后果、选项、责任人、到期日、批准与闭合证据。</p></div><div class="card"><div class="k">现场结果</div><h3>看变了什么</h3><p>同工况下比较同一指标;闭合、继续或重开机制。</p></div></div><div class="callout" style="margin-top:16px">系统准备可审阅的工作范围与闭合所需证据;<b>不签发工作许可</b>,授权工程师批准现场与高成本动作。</div></div></section>
  70. <section><div class="wrap"><div class="kicker">边界保持可见</div><h2>记录决定边界</h2><div class="grid g2"><div class="card"><div class="k">十分钟数据</div><h3>分不开秒级作用的机制</h3><p>秒级数据改善时序证据,但本身不建立因果。</p></div><div class="card"><div class="k">相对偏差</div><h3>只是筛查结果</h3><p>直到有绝对物理量与适用边界支持为止。</p></div><div class="card"><div class="k">无确认阳性的阈值</div><h3>可排序、可筛查</h3><p>不能确认诊断。</p></div><div class="card"><div class="k">语言模型</div><h3>解释受控对象并引用记录</h3><p>不能发明关系、补缺输入或批准检修。</p></div></div></div></section>
  71. </div><div class="pg" id="findings" data-title="经验发现"><section class="hero"><div class="wrap"><div class="kicker">现场经验</div><h1>现场经验与工程判断</h1><p class="lead">在 1.5 到 6 MW 机群上的工作,形成了一套鉴定证据、检验机制、支持检修决定的实用方法。</p><div class="chips"><span class="chip ev">59 项内部检查 → 8 条公开教训</span></div></div></section>
  72. <section><div class="wrap"><div class="grid g4"><div class="card"><div class="k">分析足迹</div><h3>60+ 个风场</h3><p>陆上 + 海上</p></div><div class="card"><div class="k">容量范围</div><h3>1.5–6 MW</h3><p></p></div><div class="card"><div class="k">架构</div><h3>双馈 · 直驱 · 半直驱</h3><p></p></div><div class="card"><div class="k">平台</div><h3>远景 · 金风 · 明阳 · 西门子</h3><p></p></div></div><p class="sub" style="margin-top:12px">项目身份、业主、场站、机组标识与资产专属诊断参数不公开。</p></div></section>
  73. <section><div class="wrap"><div class="kicker">八条反复出现的教训</div><h2>会改变工程结论的检查</h2><div class="grid g4" style="margin-top:14px"><div class="card"><div class="k">A · 采样</div><h3>让样本匹配问题</h3><p>比较机组或机群之前,先声明独立单位、聚合层级、对照组、分母与时间窗。</p></div><div class="card"><div class="k">B · 归因</div><h3>要机制,也要时间顺序</h3><p>共现与相关只能筛查假设;因果归因还需要物理机制、预期方向与事件级先后。</p></div><div class="card"><div class="k">C · 测量</div><h3>先验测量链</h3><p>有值的字段、固定偏置或安静的通道未必是活信号;先查单位、时间戳、采样、哨兵、偏置与传感器状态。</p></div><div class="card"><div class="k">D · 聚合</div><h3>先保留事件再汇总</h3><p>平均会抹掉极端、持续时长与受影响比例;出机群统计前先看点级形状、缺口与边界。</p></div><div class="card"><div class="k">E · 判据</div><h3>写明每条判据的适用域</h3><p>单位、阈值、方差、运行状态、控制时长、必需输入与边界附近的情形都随结果一起给出。</p></div><div class="card"><div class="k">F · 守护</div><h3>验证守护真的在跑</h3><p>文档里的检查在触发条件与生产调用路径确认前不提供任何保护,且失败必须可见。</p></div><div class="card"><div class="k">G · 管线</div><h3>让检查器失败来测它</h3><p>向隔离的样例注入已知错误,证明真实入口拒绝它,再恢复有效输入证明通过。</p></div><div class="card"><div class="k">H · 决定</div><h3>筛查与动作分开</h3><p>技术发现只有在范围、不确定性、后果、选项、责任人与批准明确后,才成为检修决定。</p></div></div></div></section>
  74. <section><div class="wrap"><div class="kicker">经验怎么用</div><h2>从异常发现到检修建议</h2><div class="rail" style="--n:3"><div class="node"><i>01</i><b>鉴定证据</b><small>现有数据能支持什么、不能支持什么、哪项检查补上缺口</small></div><div class="node"><i>02</i><b>落位设备上下文</b><small>通过本体映射到正确的机型、配置、部件、测点与疑似机制</small></div><div class="node on"><i>03</i><b>准备决定</b><small>给出监视/计划/动作选项、后果、现场范围、必需记录、批准人与闭合证据</small></div></div>
  75. <div class="callout" style="margin-top:22px"><b>经验边界。</b>经验横跨陆上与海上;换环境或换不熟悉的配置,复用任何判据或结论前都要重新验证控制、测量链、部件结构与运行制度。</div></div></section>
  76. </div><div class="pg" id="case_hydraulic" data-title="案例·液压"><section class="hero"><div class="wrap"><div class="kicker">发现案例 · 系统① 液压 · 变桨回路与高速轴制动回路</div><h1>八台机组变桨蓄能器失效</h1><p class="lead">如东海上 38 台 SWT-4.0-130。通过泵加载特征评估 70 号蓄能器储能能力,形成逐台复核与处置建议。证据状态以各项记录为准。</p>
  77. <div class="chips"><span class="chip s gd">健康 26 台</span><span class="chip s al">气容丧失 8 台</span><span class="chip s ob">边界 / 参数侧 5 台</span><span class="chip ev">证据窗 运行 → 2026-07-07</span><span class="chip ev">已处置 1 台 (4#) · 恢复基准待核对</span></div></div></section>
  78. <section><div class="wrap"><div class="kicker">01 · 问</div><h2>评估对象、监测量与适用条件</h2><div class="grid g5"><div class="card"><div class="k">系统</div><h3>液压 · 变桨回路</h3><p>一个油箱、两条回路:变桨大站 400 L / 245 bar,HS 制动器由大站经 P BRAKE 分出。</p></div><div class="card"><div class="k">监测量</div><h3>泵单次加载输出量 V_cyc</h3><p>加载时长 × 排量 36.8 L/min,来自 10-min 与秒级 SCADA 的泵启停信号。</p></div><div class="card"><div class="k">方向</div><h3>V_cyc 降低:单次进油量减少</h3><p>蓄能器气容丧失后,每次加载只能推进很少的油。</p></div><div class="card"><div class="k">评估限制</div><h3>缺 Δp 或未逐台落值</h3><p>横坐标缺失的台不外推;档案给组区间的台按区间画,不当单点。</p></div><div class="card"><div class="k">缺失资料</div><h3>轮毂 106 号无连续通道</h3><p>只能靠机组自检容量检查记录(235 bar 起测)。</p></div></div></div></section>
  79. <section><div class="wrap"><div class="kicker">02 · 证</div><h2>两组蓄能器,分工完全不同,判据只对 70 号有效</h2><div class="grid g2"><div class="card"><div class="k">70 号 · 泵站近端缓冲</div><h3>10 L / 180 bar</h3><p>活塞式,经 ø7 节流直连泵压主管,全额参与蓄能循环;A 类失效全在此件。系统总容变按仿真标定式分解:C = C管路 + C70 + 0.095·C106;预充 180 bar 由 38 台实测容变反算证实 (0.0839 ≈ 实测 0.087 L/bar)。</p></div><div class="card"><div class="k">106 号 · 轮毂顺桨主源</div><h3>6 × 30 L / 125 bar</h3><p>无连续 SCADA 通道,经长管 + 旋转接头 + 118 单向阀,对蓄能循环仅弱耦合 (系数 0.095)。有自检容量检查可查;最近记录 140 bar @20 ℃ = 正常。</p></div></div>
  80. <div class="grid g2" style="margin-top:16px"><div class="card"><div class="k">健康 · 26 台</div><h3>3.1 – 7.2 L</h3><p>全部机群带中位 4.4 L。独立核验:按变桨活动带标定的仿真健康点 4.9 L 落在带内,与中位差 12%,仿真结果与运行统计对照;独立性需另行核查。同期泵周期 96 s、加载 6 次/10 min、带宽 50 bar、油温 38 ℃、超压 0%。</p></div><div class="card"><div class="k">气容丧失 · 8 台</div><h3>0.52 L</h3><p>A 类中位 0.85 秒,为健康中位的 1/8.5。本质是系统总容变 C 由 0.087 塌到 0.0037 L/bar = 23 倍(剩下的只有纯管路柔度)。8# 实测同期:周期 2.6 s、加载 228 次/10 min、带宽 135、油温 51 ℃、超压占时 98.3%。</p></div></div></div></section>
  81. <section><div class="wrap"><div class="kicker">03 · 裁</div><h2>失效机理与鉴别依据</h2><div class="grid g3"><div class="card"><div class="k">阶跃变化的机理解释</div><h3>循环尖峰 → 铁片抬升 → 118 单向阀闭 → 轮毂 106 退出循环</h3><p>C 直接塌到纯管路 ≈0.003(对齐 8# 实测 0.0037)。一旦越过这个连锁点,指标阶跃下落,没有中间态。</p></div><div class="card"><div class="k">为什么不是漏油</div><h3>外漏只增每循环消耗,不改系统容变 C</h3><p>25# 泵输出 1.46× 而容变 C 仍在健康区 0.62 ⇒ 主导因素在消耗侧,先查漏点。但 C 已非满值,不能断言蓄能器完好,该台已补&quot;同次测预充&quot;。</p></div><div class="card"><div class="k">为什么不是泵磨损</div><h3>排量下降会拉长单次加载而不改频次</h3><p>实测 8# 是频次由 6 升到 228 次/10 min(38×)且单次时长反缩短,该特征不支持单独以泵磨损解释,仍需结合现场检查。</p></div></div><div class="callout" style="margin-top:16px">口径边界:反算出的 C 绝对值依赖假定排量 36.8 L/min;分型与健康带用的是实测 V_cyc,不受此影响。</div></div></section>
  82. <section><div class="wrap"><div class="kicker">04 · 分型</div><h2>V_cyc × Δp 二维判别:分型与处置参考</h2><div class="grid g4"><div class="card"><div class="k">右下</div><h3>换 70 号蓄能器</h3><p>压力波动范围扩大,单次进油量降低。7#、10#、8#、3#、20#、2#、35#。</p></div><div class="card"><div class="k">右上</div><h3>不换蓄能器</h3><p>压力波动范围扩大,但单次进油量保持 ⟹ 漏油或参数。25#。</p></div><div class="card"><div class="k">左上</div><h3>正常 · 30 台</h3><p>Δp 锁定 52,进油量满。</p></div><div class="card"><div class="k">左下 / 未落值</div><h3>参数侧 · 先测</h3><p>Δp 过窄属参数侧;Δp 未落值的台横坐标无处安放,未测 ≠ 正常。7#、10# 档案无 Δp,不因缺少坐标而取消现场复核。</p></div></div></div></section>
  83. <section><div class="wrap"><div class="kicker">05 · 改</div><h2>逐台处置建议</h2><table><tr><th>台</th><th>V_cyc (L/次) 原 → 现</th><th>Δp</th><th>判别</th><th>处置</th></tr><tr><td>7#</td><td class="n">9.61 → 1.8</td><td>—</td><td>气容丧失 · 全场衰减最快</td><td>换 70 号蓄能器</td></tr><tr><td>10#</td><td class="n">2.9 → 0.47</td><td>—</td><td>气容丧失 · 最新一起阶跃下降</td><td>换 70 号蓄能器</td></tr><tr><td>3# / 20# / 2# / 35#</td><td class="n">0.47–0.63 (组区间)</td><td>宽</td><td>气容丧失 · 档案未逐台落值</td><td>换 70 号蓄能器 (逐台落值后下单)</td></tr><tr><td>8#</td><td class="n">1.45 → 0.5</td><td>宽</td><td>气容丧失 · 频次 6 → 228 次/10 min</td><td>换 70 号蓄能器</td></tr><tr><td>21# / 28# / 19#</td><td class="n">0.98 / 1.15 / 0.52</td><td>宽</td><td>边界台</td><td>先测预充定型, 再定</td></tr><tr><td>25#</td><td class="n">4.33</td><td>宽 (泵输出 1.46×)</td><td>漏油或参数, 不是蓄能器</td><td>先现场核, 不换蓄能器</td></tr><tr><td>14# / 32#</td><td class="n">3.4–4.4 (健康带内)</td><td>窄</td><td>压力带宽问题</td><td>参数侧核</td></tr><tr><td>4#</td><td class="n">0.53 → 4.84</td><td>—</td><td>已处置 · 恢复基准待核对</td><td>验收:核对基准后同工况复核</td></tr></table><div class="callout warn" style="margin-top:14px">备件:70 号蓄能器 物资编码 A9B10051506(10 L / 180 bar 活塞式),编码取自备件系统「物资编码」字段;库存列表无导出日期,下单前必核 ERP 现存量,禁按本表采购。凡标「件号待确认」的条目,采购前联系现场核实。</div></div></section>
  84. <section><div class="wrap"><div class="kicker">06 · 顺桨安全</div><h2>顺桨储能与自检证据</h2><div class="grid g3"><div class="card"><div class="k">70 号失效</div><h3>SCADA 循环特征变化明显</h3><p>失电顺桨主源是轮毂 106(103 → 121 路),70 号不在此路。数据窗内 4 次全场停电全部安全顺桨、零超速。</p></div><div class="card"><div class="k">106 失氮(假设情形)</div><h3>SCADA 循环指标识别能力有限</h3><p>循环侧只有中度变化(吞吐约 2 L),与个体基线难分辨;能看见它的只有机组自检容量检查(UP03284 组,从轮毂 235 bar 起测)。后果最重:失电顺桨失去能量源。</p></div><div class="card"><div class="k">两者同时失效</div><h3>SCADA 上与单独 70 号失效不可分辨</h3><p>而实际后果是顺桨失败 ⇒ 不能仅凭 SCADA 排除液压失效。两套监测互补、同时关注。</p></div></div><div class="callout" style="margin-top:16px">将现有自检记录按月归档,用于跟踪 106 号蓄能器的容量变化。</div></div></section>
  85. <section><div class="wrap"><div class="kicker">07 · 量</div><h2>修后验证</h2><div class="grid g3"><div class="card"><div class="k">同工况复核</div><h3>同一指标 V_cyc,同一变桨活动带</h3><p>4# 已处置:0.53 → 4.84 L。4.84 L 低于此处所列 5.0–11.7 L 下限,与页面另一处 3.1–7.2 L 基准不一致。须核对工况与基准来源,当前不能据此确认修后恢复。</p></div><div class="card"><div class="k">阴性对照</div><h3>换蓄能器不该改变能量产出</h3><p>4# 换件在 E1 阴性对照池中(优化窗 22 天 &lt; 28 → INSUFFICIENT,未出数),不夸大收益。</p></div><div class="card"><div class="k">记录归档</div><h3>工单 → 复核 → 台账</h3><p>每台的处置进检修任务,复核结果挂回本体;106 号自检记录进月度台账。</p></div></div><div class="chips" style="margin-top:14px"></div><p class="sub" style="margin-top:12px">依据:U6_变桨液压仿真台(SWT-4.0-130,图纸 1034384 / 1034386;参数标定自本场 38 台实测与原厂图纸,2026-08-13 现场证实)。本页数字全部来自《如东_液压系统治理清单_v1.2》,未重跑。<a href="#sim" data-nav="sim">仿真台在"仿真与回放"页可交互 →</a></p></div></section>
  86. </div><div class="pg" id="cms" data-title="振动·CMS"><section class="hero"><div class="wrap"><div class="kicker">状态监测 · 振动诊断 (windcms)</div><h1>振动与 SCADA 联合分析</h1><p class="lead">六层模型:数据完整性 → ISO 标量 → 主轴承 rms → 台内自适应基线 → 谱线八闸 → 六枚举裁决。厂商判据与模型融合,机制未定不命名部件。</p>
  87. <div class="chips"><span class="chip s al">需关注 11 台</span><span class="chip s gd">未见异常 27 台</span><span class="chip ev">证据窗末 2026-08-11</span><span class="chip ev">TCM 六采集窗 · 320 万记录 · 160 万谱</span></div></div></section>
  88. <section><div class="wrap"><div class="kicker">振动分析 · 方法与证据边界</div><div class="grid g3"><div class="card"><div class="k">比较基准</div><h3>异常比较先核实基准</h3><p>先确认测点、工况、处理链和频带可比,再结合线能量占比与机群分布识别异常。阈值须注明来源、样本和适用范围;本底接近检测下限时,倍数不宜单独解释,诊断仍需补充证据。</p></div><div class="card"><div class="k">证据关联</div><h3>多种特征不等于独立证据</h3><p>频谱、标量和时域特征若来自同一波形,应保留共同来源,避免重复计票。跨测点或跨窗口的一致性也需核查共同工况与采集依赖;结论升级应结合独立检修等证据,不以特征数量替代证据质量。</p></div><div class="card"><div class="k">结论边界</div><h3>结论强度与证据匹配</h3><p>使用“持续恶化”“单调”或“唯一”等表述前,应明确观察范围、比较对象、样本依赖和对应检验。端段差异不能代替全程趋势证据;复核发现支持不足时,补充验证或降低结论强度,并保留不确定性。</p></div></div></div></section>
  89. <section><div class="wrap"><div class="kicker">在线 · 客户版</div><h2>CMS 振动分析工作台</h2><p class="sub">左栏"需关注 / 未见异常"按台展开四个测点判级;工作台可选机组、测点、分析类即时出图;交互页可提问。演示只停客户版与一次工作台运行。</p><iframe src="http://127.0.0.1:18020/?theme=light" style="height:920px"></iframe><div class="chips" style="margin-top:12px"><a class="chip ev" href="http://127.0.0.1:18020/?theme=light" target="_blank">新窗口打开 windcms →</a><a class="chip ev" href="http://127.0.0.1:18020/workbench.html?theme=light" target="_blank">工作台 →</a></div></div></section>
  90. </div><div class="pg" id="sim" data-title="仿真与回放"><section class="hero"><div class="wrap"><div class="kicker">仿真台 · 实际运行回放</div><h1>运行数据回放与机理仿真</h1><p class="lead">回放只用已有记录,不生成故障场景、不补造波形、不推演寿命;仿真台只用来标定物理底座(如液压容变分解、预充反算),判据仍以实测为准。</p></div></section>
  91. <section><div class="wrap"><div class="kicker">技术先进性 · 物理仿真台标定判据</div><h2>变桨液压回路仿真台 · SWT-4.0-130(图纸 1034384 / 1034386)</h2><p class="sub">按原厂图纸搭的物理回路模型:一个油箱、变桨大站与高速轴制动两条回路、70 号与 106 号两组蓄能器。可注入失效(蓄能器失氮、外漏、泵排量下降),实时看 SCADA 派生指标(滚动 10 分钟)与活塞进油量逐循环的变化。<b>判据不是从数据里"拟合"出来的,是先在物理上算出来、再用 38 台实测反过来验证的</b>:预充 180 bar 由实测容变反算证实;三种失效在 SCADA 上留下的签名方向各不相同,所以案例页能区分"蓄能器丢气 / 漏油 / 泵磨损"。这就是对机组的全面了解:从图纸到回路到信号,再到每一台的处置。</p>
  92. <iframe srcdoc="&lt;meta charset=&quot;utf-8&quot;&gt;
  93. &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,initial-scale=1&quot;&gt;
  94. &lt;title&gt;变桨液压回路仿真台 · SWT-4.0-130&lt;/title&gt;
  95. &lt;meta name=&quot;google&quot; content=&quot;notranslate&quot;&gt;
  96. &lt;style&gt;
  97. :root{
  98. --bg:#F4F6F8; --panel:#FFFFFF; --panel2:#EDF0F3; --ink:#10151B; --sub:#5A6472;
  99. --line:#D8DDE3; --grid:#E4E8EC;
  100. --hp:#C8302B; --lp:#1E7FC2; --gas:#D99A2B; --ok:#2E8B57; --warn:#B7791F;
  101. --chipbg:#EDF0F3; --focus:#1E7FC2;
  102. }
  103. @media (prefers-color-scheme: dark){:root{
  104. --bg:#0D1117; --panel:#151B23; --panel2:#1C242E; --ink:#E8EBEF; --sub:#93A0AD;
  105. --line:#2A3340; --grid:#222B36;
  106. --hp:#E05A50; --lp:#4FA3DC; --gas:#E2AC4A; --ok:#4CAF7D; --warn:#D9A24A;
  107. --chipbg:#1C242E;
  108. }}
  109. :root[data-theme=&quot;dark&quot;]{
  110. --bg:#0D1117; --panel:#151B23; --panel2:#1C242E; --ink:#E8EBEF; --sub:#93A0AD;
  111. --line:#2A3340; --grid:#222B36;
  112. --hp:#E05A50; --lp:#4FA3DC; --gas:#E2AC4A; --ok:#4CAF7D; --warn:#D9A24A;
  113. --chipbg:#1C242E;
  114. }
  115. :root[data-theme=&quot;light&quot;]{
  116. --bg:#F4F6F8; --panel:#FFFFFF; --panel2:#EDF0F3; --ink:#10151B; --sub:#5A6472;
  117. --line:#D8DDE3; --grid:#E4E8EC;
  118. --hp:#C8302B; --lp:#1E7FC2; --gas:#D99A2B; --ok:#2E8B57; --warn:#B7791F;
  119. --chipbg:#EDF0F3;
  120. }
  121. *{box-sizing:border-box}
  122. body{margin:0;background:var(--bg);color:var(--ink);
  123. font:14px/1.55 -apple-system,&quot;PingFang SC&quot;,&quot;Microsoft YaHei&quot;,sans-serif;}
  124. .mono{font-family:ui-monospace,&quot;SF Mono&quot;,SFMono-Regular,Menlo,Consolas,monospace;
  125. font-variant-numeric:tabular-nums;}
  126. header{padding:14px 18px 10px;border-bottom:1px solid var(--line)}
  127. header h1{margin:0;font-size:17px;font-weight:700;letter-spacing:.02em}
  128. header .sub{color:var(--sub);font-size:12px;margin-top:2px}
  129. .bar{display:flex;flex-wrap:wrap;gap:8px 14px;align-items:center;padding:10px 18px;
  130. border-bottom:1px solid var(--line);background:var(--panel)}
  131. .bar .grp{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
  132. .bar .lab{font-size:11px;color:var(--sub);letter-spacing:.08em;text-transform:uppercase}
  133. button{font:inherit;color:var(--ink);background:var(--chipbg);border:1px solid var(--line);
  134. border-radius:5px;padding:5px 12px;cursor:pointer}
  135. button:hover{border-color:var(--sub)}
  136. button:focus-visible{outline:2px solid var(--focus);outline-offset:1px}
  137. button.on{background:var(--ink);color:var(--bg);border-color:var(--ink)}
  138. button.estop{border-color:var(--hp);color:var(--hp);font-weight:700}
  139. button.estop.on{background:var(--hp);color:#fff}
  140. main{display:grid;grid-template-columns:305px minmax(430px,1fr) 355px;gap:12px;
  141. padding:12px 18px;align-items:start}
  142. .card{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:12px 14px}
  143. .card h3{margin:0 0 8px;font-size:12px;letter-spacing:.08em;color:var(--sub);
  144. text-transform:uppercase;font-weight:600}
  145. .fault{margin-bottom:14px}
  146. .fault .name{display:flex;justify-content:space-between;align-items:baseline;font-weight:600;font-size:13px}
  147. .fault .val{color:var(--hp)}
  148. .fault input[type=range]{width:100%;accent-color:var(--hp)}
  149. .fault .hint{font-size:11.5px;color:var(--sub);margin-top:1px}
  150. .presets{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}
  151. .presets button{font-size:12px;padding:3px 9px}
  152. table.mx{width:100%;border-collapse:collapse;font-size:12.5px}
  153. table.mx th,table.mx td{padding:3.5px 4px;text-align:right;border-bottom:1px solid var(--grid)}
  154. table.mx th:first-child,table.mx td:first-child{text-align:left}
  155. table.mx thead th{color:var(--sub);font-weight:600;font-size:11px}
  156. canvas{display:block;width:100%;border:1px solid var(--line);border-radius:8px;background:var(--panel)}
  157. .split{display:grid;grid-template-columns:290px 1fr;gap:12px;margin-top:12px}
  158. .verdict{margin-top:10px;padding:9px 12px;border-radius:6px;font-size:13px;display:none}
  159. .verdict.ok{display:block;background:rgba(46,139,87,.12);border:1px solid var(--ok)}
  160. .verdict.bad{display:block;background:rgba(200,48,43,.12);border:1px solid var(--hp)}
  161. .chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
  162. .chip{font-size:11.5px;background:var(--chipbg);border:1px solid var(--line);
  163. border-radius:4px;padding:3px 8px;color:var(--sub)}
  164. footer{padding:6px 18px 26px;color:var(--sub);font-size:12px;max-width:1100px}
  165. footer b{color:var(--ink)}
  166. label.tg{display:inline-flex;gap:5px;align-items:center;cursor:pointer;font-size:12.5px}
  167. input[type=checkbox]{accent-color:var(--hp)}
  168. @media (max-width:1240px){main{grid-template-columns:290px 1fr}.right{grid-column:1/-1;
  169. display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:12px}}
  170. @media (max-width:860px){main{grid-template-columns:1fr}.split{grid-template-columns:1fr}}
  171. @media (prefers-reduced-motion: reduce){.anim{display:none}}
  172. &lt;/style&gt;&lt;style id=&quot;guanlan-pitch-light&quot;&gt;
  173. :root,:root[data-theme=&quot;dark&quot;],:root[data-theme=&quot;light&quot;]{color-scheme:light;--bg:#f2f7fa;--panel:#fff;--panel2:#eaf3f9;--ink:#19374b;--sub:#526d80;--line:#ccdee9;--grid:#e1ebf2;--chipbg:#edf5fa;--focus:#216b8a;--hp:#C8302B;--lp:#1E7FC2;--gas:#D99A2B;--ok:#2E8B57;--warn:#B7791F}
  174. body{background:var(--bg);color:var(--ink)}header{padding:24px 26px;background:linear-gradient(115deg,#e4f1f9,#f3f9fc);border-bottom:1px solid #c8deeb}header h1{font-size:22px;line-height:1.5;color:#16455f}header .sub{max-width:1150px;line-height:1.8;margin-top:8px}.bar{padding:14px 24px;gap:12px 20px;background:#fff}button{border-radius:8px;padding:7px 12px}button.on:not(.estop){background:#216b8a;border-color:#216b8a;color:#fff}main{padding:20px 24px;gap:18px}.card{border-radius:12px;padding:18px;box-shadow:0 3px 14px #214e6c08}.card h3{color:#216b8a;background:#edf5fa;border-left:3px solid #469ab8;padding:9px 11px;border-radius:4px;letter-spacing:.03em;font-size:13px}.fault{margin-bottom:18px}.fault .hint{line-height:1.7}canvas{border-radius:10px}table.mx th,table.mx td{padding:7px 5px}table.mx thead{background:#edf5fa}.chip{border-radius:6px;padding:5px 8px}footer{padding:12px 24px 28px}@media(max-width:600px){main{padding:12px;gap:12px}header{padding:18px}header h1{font-size:18px}.bar{padding:12px}.right{grid-template-columns:minmax(0,1fr)}}
  175. &lt;/style&gt;
  176. &lt;style id=&quot;pitch-visual-banner&quot;&gt;header{position:relative;isolation:isolate;overflow:hidden;background:linear-gradient(110deg,#0c2e40,#124c5d);border-color:#326274;padding:26px}header:after{content:&quot;&quot;;position:absolute;z-index:-1;right:0;top:0;width:40%;height:100%;opacity:.32;background-image:url(&quot;data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20520%20320%22%3E%3Cdefs%3E%3Cpattern%20id%3D%22g%22%20width%3D%2226%22%20height%3D%2226%22%20patternUnits%3D%22userSpaceOnUse%22%3E%3Cpath%20d%3D%22M26%200H0V26%22%20fill%3D%22none%22%20stroke%3D%22%2372b8c3%22%20stroke-opacity%3D%22.1%22%2F%3E%3C%2Fpattern%3E%3C%2Fdefs%3E%3Cpath%20fill%3D%22url%28%23g%29%22%20d%3D%22M0%200h520v320H0z%22%2F%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%2367bbb9%22%20stroke-width%3D%221.7%22%20opacity%3D%22.65%22%3E%3Cpath%20d%3D%22M22%20262Q142%20224%20272%20257T505%20245M22%20276Q142%20238%20272%20271T505%20259M22%20290Q142%20252%20272%20285T505%20273%22%2F%3E%3Cpath%20d%3D%22M152%20253V131m0%200%204-81%206%202-5%2074%2061%2039-4%205-66-36-58%2046-4-5%2060-49M291%20246V98m0%200%204-79%206%202-5%2072%2061%2039-4%205-66-36-58%2046-4-5%2060-49M405%20264V158m0%200%203-62%205%202-4%2057%2047%2030-3%204-52-29-45%2036-3-4%2048-36%22%2F%3E%3Ccircle%20cx%3D%22152%22%20cy%3D%22131%22%20r%3D%224%22%20fill%3D%22%2367bbb9%22%2F%3E%3Ccircle%20cx%3D%22291%22%20cy%3D%2298%22%20r%3D%224%22%20fill%3D%22%2367bbb9%22%2F%3E%3Ccircle%20cx%3D%22405%22%20cy%3D%22158%22%20r%3D%224%22%20fill%3D%22%2367bbb9%22%2F%3E%3Cpath%20d%3D%22M35%20248v-53h63v50m-68-51%208-9h60l7%209zm16%202v48m17-48v45m17-45v46M40%20172h39m-21-12h41%22%2F%3E%3Cpath%20stroke-dasharray%3D%224%206%22%20d%3D%22M78%20250Q240%20190%20452%20238%22%2F%3E%3C%2Fg%3E%3Ccircle%20cx%3D%22465%22%20cy%3D%2228%22%20r%3D%2273%22%20fill%3D%22none%22%20stroke%3D%22%238fcbb5%22%20stroke-opacity%3D%22.12%22%2F%3E%3Ccircle%20cx%3D%22465%22%20cy%3D%2228%22%20r%3D%2299%22%20fill%3D%22none%22%20stroke%3D%22%238fcbb5%22%20stroke-opacity%3D%22.06%22%20stroke-width%3D%2220%22%2F%3E%3C%2Fsvg%3E&quot;);background-size:contain;background-repeat:no-repeat;background-position:right center}header h1{color:#fff}header h1 span{color:#bfdce6!important}header .sub{color:#bfdce6;font-size:12px;line-height:1.8}.card{border-top:3px solid #75aebd}.card h3{background:#eaf3f7;border-left-color:#1f8296}@media(max-width:600px){header{padding:18px}header:after{width:100%;opacity:.13}}&lt;/style&gt;&lt;header&gt;
  177. &lt;h1&gt;变桨液压回路仿真台 &lt;span class=&quot;mono&quot; style=&quot;font-weight:400;color:var(--sub)&quot;&gt;SWT-4.0-130 · 图纸 1034384/1034386&lt;/span&gt;&lt;/h1&gt;
  178. &lt;div class=&quot;sub&quot;&gt;泵持续运转 + 25 号阀滞环卸荷 + &lt;b&gt;双蓄能器&lt;/b&gt;(泵站 70 号 10L/180bar 近端缓冲 · 轮毂 106 6×30L/125bar 顺桨主源)—— 参数标定自本场 38 台实测与原厂图纸;分别注入失效,看两者的签名有何不同&lt;/div&gt;
  179. &lt;/header&gt;
  180. &lt;div class=&quot;bar&quot;&gt;
  181. &lt;div class=&quot;grp&quot;&gt;&lt;span class=&quot;lab&quot;&gt;工况&lt;/span&gt;
  182. &lt;button id=&quot;m-reg&quot; class=&quot;on&quot;&gt;运行调节&lt;/button&gt;
  183. &lt;button id=&quot;m-close&quot;&gt;收桨 0→82°&lt;/button&gt;
  184. &lt;button id=&quot;m-open&quot;&gt;开桨 82→0°&lt;/button&gt;
  185. &lt;button id=&quot;m-estop&quot; class=&quot;estop&quot;&gt;紧急顺桨&lt;/button&gt;
  186. &lt;/div&gt;
  187. &lt;div class=&quot;grp&quot;&gt;&lt;span class=&quot;lab&quot;&gt;电源&lt;/span&gt;
  188. &lt;button id=&quot;pw&quot; class=&quot;on&quot;&gt;有电&lt;/button&gt;
  189. &lt;/div&gt;
  190. &lt;div class=&quot;grp&quot;&gt;&lt;span class=&quot;lab&quot;&gt;倍速&lt;/span&gt;
  191. &lt;input id=&quot;spd&quot; type=&quot;range&quot; min=&quot;1&quot; max=&quot;40&quot; value=&quot;10&quot; style=&quot;width:110px&quot;&gt;
  192. &lt;span id=&quot;spdv&quot; class=&quot;mono&quot; style=&quot;font-size:12px&quot;&gt;10×&lt;/span&gt;
  193. &lt;/div&gt;
  194. &lt;div class=&quot;grp&quot;&gt;&lt;span class=&quot;lab&quot;&gt;预设&lt;/span&gt;
  195. &lt;div class=&quot;presets&quot;&gt;
  196. &lt;button data-p=&quot;healthy&quot;&gt;健康台&lt;/button&gt;
  197. &lt;button data-p=&quot;early&quot;&gt;70号早期失氮&lt;/button&gt;
  198. &lt;button data-p=&quot;collapse&quot;&gt;70号失效=复现 8#&lt;/button&gt;
  199. &lt;button data-p=&quot;hubfail&quot;&gt;106失氮(假设)&lt;/button&gt;
  200. &lt;button data-p=&quot;bothfail&quot;&gt;双失效(最不利)&lt;/button&gt;
  201. &lt;button data-p=&quot;leak&quot;&gt;复现 25# 泄漏&lt;/button&gt;
  202. &lt;button data-p=&quot;pumpint&quot;&gt;复现 14# 泵间歇&lt;/button&gt;
  203. &lt;button data-p=&quot;stuck&quot;&gt;70号卡滞(假设)&lt;/button&gt;
  204. &lt;/div&gt;
  205. &lt;/div&gt;
  206. &lt;/div&gt;
  207. &lt;main&gt;
  208. &lt;div&gt;
  209. &lt;div class=&quot;card&quot;&gt;
  210. &lt;h3&gt;失效注入&lt;/h3&gt;
  211. &lt;div class=&quot;fault&quot;&gt;
  212. &lt;div class=&quot;name&quot;&gt;&lt;span&gt;① 泵站70号失氮 &lt;span style=&quot;color:var(--sub);font-weight:400&quot;&gt;10L/180bar&lt;/span&gt;&lt;/span&gt;
  213. &lt;span class=&quot;val mono&quot; id=&quot;v-p070&quot;&gt;180 bar&lt;/span&gt;&lt;/div&gt;
  214. &lt;input type=&quot;range&quot; id=&quot;s-p070&quot; min=&quot;0&quot; max=&quot;180&quot; value=&quot;180&quot; step=&quot;1&quot;&gt;
  215. &lt;div class=&quot;hint&quot;&gt;180=铭牌 · ≈0–2 匹配 8# 实测(带宽135/周期2.6s) · A 类失效部位(现场证实, 4# 换件先例)&lt;/div&gt;
  216. &lt;label class=&quot;tg&quot; style=&quot;margin-top:4px&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;s-stuck&quot;&gt;
  217. 70号活塞卡滞 &lt;span style=&quot;color:var(--sub)&quot;&gt;— 候选机理(未证实),油气零交换&lt;/span&gt;&lt;/label&gt;
  218. &lt;/div&gt;
  219. &lt;div class=&quot;fault&quot;&gt;
  220. &lt;div class=&quot;name&quot;&gt;&lt;span&gt;② 轮毂106失氮 &lt;span style=&quot;color:var(--sub);font-weight:400&quot;&gt;6×30L/125bar&lt;/span&gt;&lt;/span&gt;
  221. &lt;span class=&quot;val mono&quot; id=&quot;v-p0H&quot;&gt;125 bar&lt;/span&gt;&lt;/div&gt;
  222. &lt;input type=&quot;range&quot; id=&quot;s-p0H&quot; min=&quot;0&quot; max=&quot;160&quot; value=&quot;125&quot; step=&quot;1&quot;&gt;
  223. &lt;div class=&quot;hint&quot;&gt;125=铭牌@20℃ · 2026-08 现场气侧实测≈140(夏季温修内,正常) · 拖低=假设情形: 循环仅中度变化、失电顺桨失败&lt;/div&gt;
  224. &lt;/div&gt;
  225. &lt;div class=&quot;fault&quot;&gt;
  226. &lt;div class=&quot;name&quot;&gt;&lt;span&gt;③ 系统泄漏&lt;/span&gt;&lt;span class=&quot;val mono&quot; id=&quot;v-leak&quot;&gt;1.0×&lt;/span&gt;&lt;/div&gt;
  227. &lt;input type=&quot;range&quot; id=&quot;s-leak&quot; min=&quot;10&quot; max=&quot;60&quot; value=&quot;10&quot; step=&quot;1&quot;&gt;
  228. &lt;div class=&quot;hint&quot;&gt;泄漏基线 2.2 L/min(+调节变桨≈1.0=实测总消耗3.2)· 25# ≈ 2.8×&lt;/div&gt;
  229. &lt;/div&gt;
  230. &lt;div class=&quot;fault&quot;&gt;
  231. &lt;div class=&quot;name&quot;&gt;&lt;span&gt;④ 泵性能&lt;/span&gt;&lt;span class=&quot;val mono&quot; id=&quot;v-pump&quot;&gt;100%&lt;/span&gt;&lt;/div&gt;
  232. &lt;input type=&quot;range&quot; id=&quot;s-pump&quot; min=&quot;20&quot; max=&quot;100&quot; value=&quot;100&quot; step=&quot;1&quot;&gt;
  233. &lt;div class=&quot;hint&quot;&gt;磨损/容积效率下降 → 加载时间变长&lt;/div&gt;
  234. &lt;div class=&quot;name&quot; style=&quot;margin-top:6px&quot;&gt;&lt;span&gt; 间歇失供&lt;/span&gt;&lt;span class=&quot;val mono&quot; id=&quot;v-int&quot;&gt;关&lt;/span&gt;&lt;/div&gt;
  235. &lt;input type=&quot;range&quot; id=&quot;s-int&quot; min=&quot;0&quot; max=&quot;100&quot; value=&quot;0&quot; step=&quot;1&quot;&gt;
  236. &lt;div class=&quot;hint&quot;&gt;随机掉供数十秒—数分钟 → 复现 14#/32# 的分钟级低压塌陷&lt;/div&gt;
  237. &lt;/div&gt;
  238. &lt;div class=&quot;verdict&quot; id=&quot;verdict&quot;&gt;&lt;/div&gt;
  239. &lt;/div&gt;
  240. &lt;div class=&quot;card&quot; style=&quot;margin-top:12px&quot;&gt;
  241. &lt;h3&gt;SCADA 派生指标(滚动 10 min)&lt;/h3&gt;
  242. &lt;table class=&quot;mx mono&quot;&gt;
  243. &lt;thead&gt;&lt;tr&gt;&lt;th&gt;指标&lt;/th&gt;&lt;th&gt;仿真&lt;/th&gt;&lt;th&gt;健康实测&lt;/th&gt;&lt;th&gt;8# 实测&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
  244. &lt;tbody id=&quot;mx&quot;&gt;&lt;/tbody&gt;
  245. &lt;/table&gt;
  246. &lt;/div&gt;
  247. &lt;/div&gt;
  248. &lt;div&gt;
  249. &lt;div id=&quot;circuit-mode-caption&quot; style=&quot;padding:14px 18px;background:#eaf4f7;color:#163546;line-height:1.8;border:1px solid #cfe1e8;border-radius:10px 10px 0 0;overflow-wrap:anywhere&quot;&gt;&lt;/div&gt;&lt;canvas id=&quot;cv&quot; height=&quot;520&quot; data-aspect=&quot;0.5&quot;&gt;&lt;/canvas&gt;
  250. &lt;div class=&quot;split&quot;&gt;
  251. &lt;canvas id=&quot;pv&quot; height=&quot;330&quot;&gt;&lt;/canvas&gt;
  252. &lt;div class=&quot;card&quot;&gt;
  253. &lt;h3&gt;活塞与进油量 · 逐循环&lt;/h3&gt;
  254. &lt;table class=&quot;mx mono&quot;&gt;&lt;tbody id=&quot;pistab&quot;&gt;&lt;/tbody&gt;&lt;/table&gt;
  255. &lt;div class=&quot;chips&quot;&gt;
  256. &lt;span class=&quot;chip mono&quot;&gt;ΔV = C · Δp&lt;/span&gt;
  257. &lt;span class=&quot;chip mono&quot;&gt;C = 管路 + C70 + 0.095·C106&lt;/span&gt;
  258. &lt;span class=&quot;chip mono&quot;&gt;Cᵢ = Vᵢ·p₀ᵢ / p²&lt;/span&gt;
  259. &lt;span class=&quot;chip mono&quot;&gt;周期 ≈ C·带宽 ÷ 消耗&lt;/span&gt;
  260. &lt;/div&gt;
  261. &lt;/div&gt;
  262. &lt;/div&gt;
  263. &lt;/div&gt;
  264. &lt;div class=&quot;right&quot;&gt;
  265. &lt;canvas id=&quot;c1&quot; height=&quot;200&quot;&gt;&lt;/canvas&gt;
  266. &lt;canvas id=&quot;c2&quot; height=&quot;170&quot;&gt;&lt;/canvas&gt;
  267. &lt;canvas id=&quot;c3&quot; height=&quot;170&quot;&gt;&lt;/canvas&gt;
  268. &lt;/div&gt;
  269. &lt;/main&gt;
  270. &lt;footer&gt;
  271. &lt;b&gt;边界与简化(读图前请先知道):&lt;/b&gt;
  272. ① 单节点压力模型 + 「棘轮」叠加显示;双蓄能器按失效部位改判(v47p,2026-08-13 现场证实)的定量闭合参数化:
  273. 泵站 70 号(10L/180bar,ø7.0 节流+20×2.5 管)直连泵压主管&lt;b&gt;全额参与&lt;/b&gt;充能循环,
  274. 轮毂 106(6×30L/125bar)经长管+旋转接头+118 单向阀&lt;b&gt;弱耦合&lt;/b&gt;(kH=0.095 标定,健康总 C 对齐实测 0.087 L/bar);
  275. 70 号垮塌 → 循环尖峰 → 棘轮抬升 → 118 恒闭 → 轮毂被踢出循环(C 塌到纯管路 ≈0.003,对齐 8# 实测 0.0037)——此连锁按参数化关系建模,非流网求解;
  276. ② &lt;b&gt;三种失效的签名差异(本台的教学核心)&lt;/b&gt;:70 号失效 = SCADA 循环签名剧变(吞吐 0.5L/周期 2.6s/带宽 135)而失电顺桨不受影响(数据窗 4 次全场停电全部安全顺桨、零超速 = 实证);
  277. 106 失氮 = 循环仅中度变化(吞吐 ~2L,与个体基线难分辨)而失电顺桨失去能量源 —— SCADA 判据对它几乎盲,覆盖它的是机组自检容量检查(UP03284 组,从轮毂 235bar 起测);
  278. 双失效 = SCADA 上与单独 70 号失效不可分辨 + 顺桨失败。&lt;b&gt;两套监测互补,缺一即盲&lt;/b&gt;;
  279. ③ 紧急顺桨用轮毂 106 设计容量 6×30L 与等温气体定律,缸驱动背压取 25 bar(气动力矩未建模)——「低预充仍勉强完成」是理想下界,实机以现场实测为准;70 号对顺桨的贡献(&amp;lt;2L,约 7%)未建模;
  280. ④ 预设「复现 X# 签名」意为让派生指标匹配该台实测,其 p₀ 数值不是实测氮压;「106失氮」是&lt;b&gt;假设情形&lt;/b&gt;——本场 106 已实测正常(2026-08 气侧 ≈140 bar)。
  281. 数据源:图纸 1034384/1034386 · 实机参数 UP07200/07228(245/195)· 38 台 SCADA 实测(2025-01→2026-07)· 2026-08-13 现场核实(70 号换件履历 + 106 气侧实测)。
  282. &lt;/footer&gt;
  283. &lt;script&gt;
  284. &#x27;use strict&#x27;;
  285. /* ================= 物理内核(标定值,来源见页脚) ================= */
  286. const K = {
  287. Qp: 36.8/60, // 变桨泵 L/s(25.4ccm×1450rpm)
  288. pLoad: 194, pUnload: 246, pRelief: 280,
  289. dLoad: 0.80, dUnload: 0.14, // 加载/卸荷响应延迟 s(五台反推 0.80±0.03)
  290. V70: 10, p70n: 180, // 泵站 70 号手刹蓄能器 10 L / 180 bar(ø7.0 节流+20×2.5 管直连泵压主管)
  291. V0H: 180, p0Hn: 125, // 轮毂 106 蓄能器 6×30 L / 125 bar(旋转接头+118 之后,顺桨主源)
  292. kH: 0.095, // 轮毂对充能循环的弱耦合系数(标定: 健康总 C 对齐实测 0.087 L/bar)
  293. Cline: 0.0025, // 管路/油柔度残余容变 L/bar(对齐 8# 塌陷签名 0.50L/2.6s/带宽135)
  294. LpD: 0.2642, LpDb: 0.0881, // 总/单叶片 L/度(环形腔 ø125/90×611)
  295. qLeak0: 2.2/60, // 泄漏基线 L/s @220bar (总消耗3.2 = 此项 + 调节变桨≈1.0)
  296. driveP: 25, // 缸驱动背压假设 bar
  297. d121: 2.4, // 顺桨节流孔 mm(每叶片块一只)
  298. rho: 870, Cd: 0.62,
  299. T0: 38, TperKW: 3.2, Ttau: 240, // 油温:+4 K/kW,τ=240 s
  300. };
  301. const orifQ = (mm, dp) =&gt; dp&lt;=0 ? 0 :
  302. K.Cd*Math.PI/4*(mm/1000)**2*Math.sqrt(2*dp*1e5/K.rho)*1000; // L/s
  303. /* ================= 状态 ================= */
  304. const S = {
  305. t:0, p:220, pH:238, th:2, mode:&#x27;reg&#x27;, power:true,
  306. v25:false, v25cmd:false, delayT:0, // 阀 25(true=得电=加载)
  307. Vgas:0, // 顺桨期气腔体积(动态)
  308. estop:null, // {t0, done, stall...}
  309. oilT:38, thCmd:2, regPh:0,
  310. intState:0, intT:0, // 间歇失供状态机
  311. cyc:[], lastUnload:0, loadStart:null, lastVc:null, lastPer:null,
  312. buf:[], acc:0, ratchet:238,
  313. };
  314. const F = { p070:180, p0H:125, stuck:false, leak:1.0, pump:1.0, inter:0 };
  315. /* 单罐等温容变 L/bar(V=总容积, p0=预充;p≤p0 活塞顶死, 只剩止点软区) */
  316. function accC(V, p0, p){
  317. if (p0 &lt; 0.5) return 0;
  318. if (p &lt;= p0) return 0.02;
  319. return V*p0/(p*p);
  320. }
  321. /* 70号垮塌 → 尖峰 → 棘轮抬升 → 118 恒闭 → 轮毂被踢出循环(v47p 连锁, 参数化) */
  322. function hubGate(){
  323. return F.stuck ? 0 : Math.max(0, Math.min(1, (F.p070-20)/60));
  324. }
  325. /* 充能循环等效容变 = 管路 + 泵站70号(全额) + 轮毂106(弱耦合×连锁门) */
  326. function Ccharge(p){
  327. let c = K.Cline;
  328. if (!F.stuck) c += accC(K.V70, F.p070, p);
  329. c += K.kH * hubGate() * accC(K.V0H, F.p0H, p);
  330. return c;
  331. }
  332. /* 稳态气腔占比(显示用) */
  333. function gasFrac(p, p0){
  334. if (p0 &lt; 0.5) return 0;
  335. if (p &lt;= p0) return 1;
  336. return Math.min(1, p0/p);
  337. }
  338. /* ================= 仿真步 ================= */
  339. function step(dt){
  340. S.t += dt;
  341. const perEst = Math.max(1.6, S.lastPer ?? 90);
  342. const qCycle = 0.45/perEst; // 阀切换/瞬态每循环开销 ≈0.45 L (健康台 0.3 L/min, 塌陷台 ~10 L/min)
  343. const leak = K.qLeak0*F.leak*(S.p/220) + qCycle;
  344. /* 泵可用性 */
  345. let pumpOn = S.power &amp;&amp; S.mode!==&#x27;estop&#x27;;
  346. if (pumpOn &amp;&amp; F.inter&gt;0){ // 间歇失供
  347. S.intT -= dt;
  348. if (S.intState===0 &amp;&amp; S.intT&lt;=0){ S.intState=1; S.intT=15+F.inter*165*Math.random(); }
  349. else if (S.intState===1 &amp;&amp; S.intT&lt;=0){ S.intState=0; S.intT=(30+120*Math.random())/(0.3+F.inter); }
  350. if (S.intState===1) pumpOn=false;
  351. } else S.intState=0;
  352. /* 桨距指令 */
  353. let rate=0;
  354. if (S.mode===&#x27;reg&#x27;){
  355. S.regPh+=dt;
  356. S.thCmd = 3.2+2.4*Math.sin(2*Math.PI*S.regPh/300)+0.9*Math.sin(2*Math.PI*S.regPh/67);
  357. rate = Math.max(-3,Math.min(3,(S.thCmd-S.th)/2.5)); // 实测量级: 平均|rate|≈0.08°/s ⇒ 变桨耗油≈1.2 L/min
  358. } else if (S.mode===&#x27;close&#x27;){ rate = S.th&lt;82?3:0; }
  359. else if (S.mode===&#x27;open&#x27;){ rate = S.th&gt;0?-3:0; }
  360. if (S.mode!==&#x27;estop&#x27;){
  361. if (S.p &lt; K.driveP+8) rate=0; // 无压则动不了
  362. S.th = Math.max(0,Math.min(82,S.th+rate*dt));
  363. }
  364. const qPitch = Math.abs(rate)*K.LpD; // L/s(进给由 HP 供)
  365. /* 阀 25 滞环 + 延迟 */
  366. if (S.mode===&#x27;estop&#x27; || !S.power){ S.v25cmd=false; }
  367. else if (!S.v25cmd &amp;&amp; S.p&lt;=K.pLoad){ S.v25cmd=true; S.delayT=K.dLoad; }
  368. else if ( S.v25cmd &amp;&amp; S.p&gt;=K.pUnload){ S.v25cmd=false; S.delayT=K.dUnload; }
  369. if (S.delayT&gt;0){ S.delayT-=dt; }
  370. else if (S.v25 !== S.v25cmd){
  371. S.v25 = S.v25cmd;
  372. if (S.v25){ S.loadStart=S.t; }
  373. else if (S.loadStart!=null){ // 一个循环完成
  374. const tl=S.t-S.loadStart, per=S.t-S.lastUnload;
  375. S.lastVc=tl*K.Qp*F.pump; S.lastPer=per;
  376. S.cyc.push({t:S.t, tl, per}); S.lastUnload=S.t;
  377. if (S.cyc.length&gt;4000) S.cyc.shift();
  378. }
  379. }
  380. /* 压力动力学(单节点) */
  381. const Qin = (S.v25&amp;&amp;pumpOn) ? K.Qp*F.pump : 0;
  382. const C = Ccharge(S.p);
  383. if (S.mode!==&#x27;estop&#x27;){
  384. S.p += (Qin - leak - qPitch)/C*dt;
  385. if (S.p&gt;K.pRelief) S.p=K.pRelief;
  386. if (S.p&lt;2) S.p=2;
  387. }
  388. /* 轮毂侧显示:健康跟随 vs 棘轮锁定, 按耦合健康度 h 连续混合 */
  389. if (S.mode!==&#x27;estop&#x27;){
  390. const h = Math.max(0, Math.min(1, (Ccharge(230)-0.006)/(0.055-0.006)));
  391. if (S.p &gt;= S.ratchet) S.ratchet=S.p; // 118 单向: 峰值被锁
  392. else S.ratchet = Math.max(S.p, S.ratchet - (0.15 + qPitch/0.006)*dt);
  393. const pHealthy = S.v25 ? S.p-2 : Math.min(244, S.p+26); // 实测: 健康台叶片 p99=244, 中位=站侧+26
  394. S.pH = h*pHealthy + (1-h)*S.ratchet;
  395. }
  396. /* 紧急顺桨(全阀失电, 轮毂106→103→121→缸;70号不在此路, 其失效不碍顺桨) */
  397. if (S.mode===&#x27;estop&#x27; &amp;&amp; S.estop &amp;&amp; !S.estop.done){
  398. const e=S.estop;
  399. // 气腔压力: 等温 p·V=p0·V0. Vgas 随放油增大, 单调, 不会发散.
  400. const alive = (F.p0H&gt;=0.5);
  401. let pAcc = alive ? (K.V0H*F.p0H)/Math.max(S.Vgas, 1) : Math.max(2, S.pH*Math.exp(-e.dV/8));
  402. if (!isFinite(pAcc)) pAcc=2;
  403. const dp = pAcc - K.driveP;
  404. const Q = (S.th&lt;82 &amp;&amp; dp&gt;0.5) ? 3*orifQ(K.d121, dp) : 0;
  405. S.th = Math.min(82, S.th + (Q/K.LpD)*dt);
  406. if (alive) S.Vgas = Math.min(K.V0H, S.Vgas + Q*dt);
  407. e.dV += Q*dt; e.pMin=Math.min(e.pMin,pAcc); S.pH=pAcc; S.p=Math.max(4,S.p-8*dt);
  408. e.stallT = (Q&lt;=0.002) ? (e.stallT||0)+dt : 0;
  409. if (S.th&gt;=81.9){ e.done=true; e.ok=true; e.tEnd=S.t; showVerdict(); }
  410. else if (e.stallT&gt;2.5){ e.done=true; e.ok=false; e.tEnd=S.t; showVerdict(); }
  411. else if (S.t-e.t0&gt;180){ e.done=true; e.ok=false; e.tEnd=S.t; showVerdict(); } // 硬超时兜底
  412. }
  413. /* NaN 断路器: 任何一步失稳立即复位, 防止渲染层死循环 */
  414. if (!isFinite(S.p)||!isFinite(S.pH)||!isFinite(S.th)){
  415. S.p=220; S.pH=238; S.th=Math.max(0,Math.min(82,S.th||2));
  416. S.ratchet=238; S.Vgas=0; if(S.estop){S.estop.done=true;S.estop.ok=false;}
  417. }
  418. /* 油温 (duty 每 0.5 s 才重算一次, 避免每步扫全 cyc 数组) */
  419. S.dutyAcc=(S.dutyAcc||0)+dt;
  420. if (S.dutyC==null || S.dutyAcc&gt;=0.5){ S.dutyAcc=0; S.dutyC=dutyNow(); }
  421. const Pheat = S.dutyC*K.Qp*F.pump*220/10 + (F.leak-1)*0.5; // kW
  422. const Ttar = K.T0 + Math.max(0,(Pheat-1.2))*K.TperKW;
  423. S.oilT += (Ttar-S.oilT)/K.Ttau*dt;
  424. /* 采样 */
  425. S.acc+=dt;
  426. if (S.acc&gt;=0.25){ S.acc=0;
  427. S.buf.push({t:S.t,p:S.p,pH:S.pH,th:S.th,v:S.v25?1:0});
  428. if (S.buf.length&gt;4800) S.buf.shift();
  429. }
  430. }
  431. function dutyNow(){
  432. const w=S.cyc.filter(c=&gt;c.t&gt;S.t-600);
  433. if (!w.length) return S.v25?0.5:0.08;
  434. const span=Math.min(600, Math.max(60, S.t - (S.cyc[0]?.t ?? 0) + 60));
  435. return Math.min(0.95, w.reduce((a,c)=&gt;a+c.tl,0)/span);
  436. }
  437. /* ================= 指标 ================= */
  438. const MEAS_H={vc:&#x27;4.9&#x27;,per:&#x27;96&#x27;,cnt:&#x27;6&#x27;,band:&#x27;50&#x27;,duty:&#x27;7.5&#x27;,oil:&#x27;38&#x27;,ov:&#x27;0.0&#x27;};
  439. const MEAS_8={vc:&#x27;0.50&#x27;,per:&#x27;2.6&#x27;,cnt:&#x27;228&#x27;,band:&#x27;135&#x27;,duty:&#x27;32.3&#x27;,oil:&#x27;51&#x27;,ov:&#x27;98.3&#x27;};
  440. function metrics(){
  441. const w=S.cyc.filter(c=&gt;c.t&gt;S.t-600);
  442. const pb=S.buf.filter(b=&gt;b.t&gt;S.t-600);
  443. const band = pb.length? (Math.max(...pb.map(b=&gt;b.p))-Math.min(...pb.map(b=&gt;b.p))) : 0;
  444. const ov = pb.length? pb.filter(b=&gt;b.pH&gt;246).length/pb.length*100 : 0;
  445. const cnt = w.length? Math.round(w.length*600/Math.min(600,Math.max(60,S.t))) : 0;
  446. const vc = S.lastVc!=null? S.lastVc.toFixed(2):&#x27;—&#x27;;
  447. const per= S.lastPer!=null? S.lastPer.toFixed(1):&#x27;—&#x27;;
  448. return [
  449. [&#x27;每次进油量 L&#x27;, vc, MEAS_H.vc, MEAS_8.vc],
  450. [&#x27;充能周期 s&#x27;, per, MEAS_H.per, MEAS_8.per],
  451. [&#x27;加载次数 /10min&#x27;, cnt||&#x27;—&#x27;, MEAS_H.cnt, MEAS_8.cnt],
  452. [&#x27;压力带宽 bar&#x27;, band?band.toFixed(0):&#x27;—&#x27;, MEAS_H.band, MEAS_8.band],
  453. [&#x27;加载占空比 %&#x27;, (dutyNow()*100).toFixed(1), MEAS_H.duty, MEAS_8.duty],
  454. [&#x27;液压油温 ℃&#x27;, S.oilT.toFixed(1), MEAS_H.oil, MEAS_8.oil],
  455. [&#x27;叶片侧&gt;246 %&#x27;, ov.toFixed(1), MEAS_H.ov, MEAS_8.ov],
  456. ];
  457. }
  458. function pistonRows(){
  459. const inEstop = S.mode===&#x27;estop&#x27; &amp;&amp; F.p0H&gt;=0.5 &amp;&amp; S.Vgas&gt;0;
  460. const Vg70 = K.V70*gasFrac(S.p, F.stuck?0:F.p070);
  461. const VgH = inEstop ? S.Vgas : K.V0H*gasFrac(S.pH, F.p0H);
  462. const pg70 = (F.p070&lt;0.5||F.stuck)? &#x27;—&#x27; : (S.p&gt;F.p070? S.p.toFixed(0):F.p070.toFixed(0));
  463. const pgH = (F.p0H&lt;0.5)? &#x27;—&#x27; : (inEstop? (K.V0H*F.p0H/Math.max(VgH,1e-6)).toFixed(0)
  464. : (S.pH&gt;F.p0H? S.pH.toFixed(0):F.p0H.toFixed(0)));
  465. return [
  466. [&#x27;70号 预充 / 气压&#x27;, (F.stuck?&#x27;卡滞&#x27;:F.p070.toFixed(0))+&#x27; / &#x27;+pg70+&#x27; bar&#x27;],
  467. [&#x27;70号 储油(10 L 罐)&#x27;, (K.V70-Vg70).toFixed(1)+&#x27; L&#x27;],
  468. [&#x27;106 预充 / 气压&#x27;, F.p0H.toFixed(0)+&#x27; / &#x27;+pgH+&#x27; bar&#x27;],
  469. [&#x27;106 储油(6 只合计)&#x27;, (K.V0H-VgH).toFixed(1)+&#x27; L&#x27;],
  470. [&#x27;等效容变 C(充能)&#x27;, Ccharge(S.p).toFixed(4)+&#x27; L/bar&#x27;],
  471. [&#x27;本循环吞吐 ΔV&#x27;, S.lastVc!=null? S.lastVc.toFixed(2)+&#x27; L&#x27;:&#x27;—&#x27;],
  472. [&#x27;顺桨需求(压超速/全程)&#x27;, &#x27;5.3 / 21.7 L&#x27;],
  473. ];
  474. }
  475. /* ================= 绘制 ================= */
  476. const css=v=&gt;getComputedStyle(document.documentElement).getPropertyValue(v).trim();
  477. function fit(cv){ const d=window.devicePixelRatio||1, w=cv.clientWidth;
  478. if(!cv.dataset.h) cv.dataset.h=cv.getAttribute(&#x27;height&#x27;); // 设计高度只记一次
  479. const asp=+cv.dataset.aspect||0; // aspect: 高=宽×aspect(回路图铺满不留白)
  480. /* 迟滞死区+限频: 宽度变化&gt;16px 且距上次重设&gt;500ms 才重设画布 —
  481. 每帧重设会与滚动条出没形成布局振荡, Chrome 主线程被打死(2026-08-21 实测根因);
  482. Safari 滚动条不占宽故无感。绘制端使用画布实际尺寸, CSS 拉伸差≤16px 无感。 */
  483. const lw=+(cv.dataset.lw||0), lt=+(cv.dataset.lt||0), tn=performance.now();
  484. if (w&gt;0 &amp;&amp; (!lw || (Math.abs(w-lw)&gt;16 &amp;&amp; tn-lt&gt;500))){
  485. const h=asp? Math.round(w*asp) : +cv.dataset.h;
  486. if (cv.width!==Math.round(w*d)||cv.height!==Math.round(h*d)){
  487. cv.width=Math.round(w*d); cv.height=Math.round(h*d); cv.style.height=h+&#x27;px&#x27;; }
  488. cv.dataset.lw=w; cv.dataset.lt=tn;
  489. }
  490. const g=cv.getContext(&#x27;2d&#x27;); g.setTransform(d,0,0,d,0,0);
  491. return [g, cv.width/d, cv.height/d]; }
  492. /* Safari&lt;16.4 无 canvas roundRect -&gt; 手绘圆角 */
  493. function rr(g,x,y,w,h,r){ g.beginPath(); g.moveTo(x+r,y);
  494. g.arcTo(x+w,y,x+w,y+h,r); g.arcTo(x+w,y+h,x,y+h,r);
  495. g.arcTo(x,y+h,x,y,r); g.arcTo(x,y,x+w,y,r); g.closePath(); }
  496. /* Safari canvas fillStyle 不认 color-mix -&gt; JS 混色 */
  497. function hex2rgb(h){ h=h.trim(); if(h[0]===&#x27;#&#x27;){const v=parseInt(h.slice(1),16);
  498. return [(v&gt;&gt;16)&amp;255,(v&gt;&gt;8)&amp;255,v&amp;255];} const m=h.match(/\d+/g)||[240,240,240];
  499. return [+m[0],+m[1],+m[2]]; }
  500. function mix(a,b,t){ const A=hex2rgb(a),B=hex2rgb(b);
  501. return &#x27;rgb(&#x27;+Math.round(A[0]*t+B[0]*(1-t))+&#x27;,&#x27;+Math.round(A[1]*t+B[1]*(1-t))+&#x27;,&#x27;+Math.round(A[2]*t+B[2]*(1-t))+&#x27;)&#x27;; }
  502. let dashOff=0;
  503. function pcol(p){ // 压力→红色深浅 (JS 混色, 兼容 Safari canvas)
  504. const a=Math.max(.12,Math.min(1,p/260));
  505. return mix(css(&#x27;--hp&#x27;), css(&#x27;--panel2&#x27;), a);
  506. }
  507. function seg(g,pts,color,wd,flow){
  508. g.strokeStyle=color; g.lineWidth=wd; g.lineJoin=&#x27;round&#x27;; g.beginPath();
  509. pts.forEach((p,i)=&gt;i?g.lineTo(p[0],p[1]):g.moveTo(p[0],p[1])); g.stroke();
  510. if (flow&gt;0.02 &amp;&amp; !matchMedia(&#x27;(prefers-reduced-motion: reduce)&#x27;).matches){
  511. g.save(); g.strokeStyle=css(&#x27;--bg&#x27;); g.lineWidth=Math.max(1.4,wd-2.4);
  512. g.setLineDash([3,9]); g.lineDashOffset=-dashOff*Math.min(6,flow*8);
  513. g.beginPath(); pts.forEach((p,i)=&gt;i?g.lineTo(p[0],p[1]):g.moveTo(p[0],p[1]));
  514. g.stroke(); g.restore();
  515. }
  516. }
  517. function label(g,x,y,t,c,sz){ g.fillStyle=c||css(&#x27;--sub&#x27;);
  518. g.font=(sz||10.5)+&#x27;px ui-monospace,Menlo,monospace&#x27;; g.fillText(t,x,y); }
  519. function box(g,x,y,w,h,id){ g.strokeStyle=css(&#x27;--sub&#x27;); g.lineWidth=1;
  520. g.strokeRect(x,y,w,h); if(id){ g.font=&#x27;9.5px ui-monospace,monospace&#x27;;
  521. g.fillStyle=css(&#x27;--sub&#x27;); g.fillText(id,x,y-3);} }
  522. function drawCircuit(){
  523. const [g,W,H]=fit(cv); g.clearRect(0,0,W,H);
  524. const s=W/1040;
  525. g.save(); g.translate(0,(H-520*s)/2); g.scale(s,s);
  526. const HP=pcol(S.p), HPh=pcol(S.pH), LP=css(&#x27;--lp&#x27;), ink=css(&#x27;--ink&#x27;), sub=css(&#x27;--sub&#x27;);
  527. const Qflow=(S.v25&amp;&amp;S.power&amp;&amp;S.mode!==&#x27;estop&#x27;&amp;&amp;S.intState!==1)?1:0;
  528. const byp=(!S.v25&amp;&amp;S.power&amp;&amp;S.mode!==&#x27;estop&#x27;&amp;&amp;S.intState!==1)?1:0;
  529. const pitch=(S.mode!==&#x27;estop&#x27;&amp;&amp;Math.abs(S.th-(S.buf.length?S.buf[S.buf.length-1].th:S.th))&gt;0)?0.4:
  530. (S.mode===&#x27;close&#x27;||S.mode===&#x27;open&#x27;)?0.8:(S.mode===&#x27;reg&#x27;?0.3:0);
  531. const est=(S.mode===&#x27;estop&#x27;&amp;&amp;S.estop&amp;&amp;!S.estop.done)?1:0;
  532. /* ---- 油箱 &amp; 泵 ---- */
  533. g.strokeStyle=sub; g.strokeRect(60,455,180,42);
  534. label(g,66,449,&#x27;油箱 23 · 400 L&#x27;);
  535. // 电机+双泵
  536. g.beginPath(); g.arc(110,420,13,0,7); g.stroke(); label(g,104,424,&#x27;M&#x27;,ink,11);
  537. g.beginPath(); g.arc(146,420,13,0,7); g.stroke();
  538. g.fillStyle=ink; g.beginPath(); g.moveTo(146,411); g.lineTo(152,424); g.lineTo(140,424); g.closePath(); g.fill();
  539. label(g,310,464,&#x27;25.4 ccm · 1450 rpm ⇒ 36.8 L/min&#x27;,&#x27;&#x27;,9.5);
  540. label(g,310,446,S.power&amp;&amp;S.intState!==1?&#x27;泵连续运转&#x27;:&#x27;泵停&#x27;,S.power&amp;&amp;S.intState!==1?css(&#x27;--ok&#x27;):css(&#x27;--hp&#x27;),10.5);
  541. seg(g,[[146,433],[146,455]],LP,3,0.3); // 吸油
  542. seg(g,[[146,407],[146,352]],HP,4,Qflow||byp?1:0); // 泵出口
  543. /* ---- 25 号卸荷阀 ---- */
  544. seg(g,[[146,352],[240,352]],HP,3.5,byp);
  545. box(g,240,338,44,28,&#x27;25&#x27;);
  546. g.fillStyle=S.v25?css(&#x27;--hp&#x27;):css(&#x27;--chipbg&#x27;);
  547. g.fillRect(285,341,10,22);
  548. label(g,240,332,S.v25?&#x27;得电=封闭(加载)&#x27;:&#x27;失电=泄回(卸荷)&#x27;,S.v25?css(&#x27;--hp&#x27;):sub,10);
  549. seg(g,[[284,366],[284,455]].map(p=&gt;[p[0]-22,p[1]]),LP,3.5,byp); // 回油箱
  550. /* 12 单向阀 */
  551. seg(g,[[146,352],[146,318]],HP,4,Qflow);
  552. g.fillStyle=ink; g.beginPath(); g.moveTo(140,318); g.lineTo(152,318); g.lineTo(146,306); g.closePath(); g.fill();
  553. label(g,156,315,&#x27;12&#x27;);
  554. /* 滤芯 11 */
  555. seg(g,[[146,306],[146,282]],HP,4,Qflow);
  556. g.save(); g.translate(146,270); g.rotate(Math.PI/4); g.strokeRect(-9,-9,18,18); g.restore();
  557. label(g,160,272,&#x27;11 β25µm&#x27;);
  558. /* 溢流 10 */
  559. seg(g,[[146,258],[146,196]],HP,4,Qflow);
  560. seg(g,[[146,232],[210,232]],HP,2.5,S.p&gt;=K.pRelief?1:0);
  561. box(g,210,222,26,20,&#x27;10&#x27;); label(g,240,236,&#x27;280 bar&#x27;,sub);
  562. /* ---- 泵站 70 号手刹蓄能器 10 L(ø7.0 节流 + 20×2.5 管, 12 之后同段) ---- */
  563. const a7x=64,a7y=210,a7w=38,a7h=62, f70=gasFrac(S.p, F.stuck?0:F.p070);
  564. seg(g,[[a7x+a7w/2,a7y+a7h],[a7x+a7w/2,258],[146,258]],HP,3,0);
  565. g.strokeStyle=ink; g.lineWidth=1.6; g.strokeRect(a7x,a7y,a7w,a7h);
  566. const g7=Math.max(2,(a7h-6)*Math.min(1,f70));
  567. g.fillStyle=css(&#x27;--gas&#x27;); g.fillRect(a7x+1.5,a7y+1.5,a7w-3,g7);
  568. g.fillStyle=sub; g.fillRect(a7x+1.5,a7y+1.5+g7,a7w-3,4);
  569. g.fillStyle=css(&#x27;--hp&#x27;); g.globalAlpha=.75;
  570. g.fillRect(a7x+1.5,a7y+5.5+g7,a7w-3,a7h-7-g7); g.globalAlpha=1;
  571. if (F.stuck){ g.strokeStyle=css(&#x27;--hp&#x27;); g.beginPath();
  572. g.moveTo(a7x,a7y); g.lineTo(a7x+a7w,a7y+a7h); g.moveTo(a7x+a7w,a7y); g.lineTo(a7x,a7y+a7h); g.stroke(); }
  573. label(g,36,a7y-8,&#x27;70 · 10 L p₀=&#x27;+(F.stuck?&#x27;卡滞&#x27;:F.p070.toFixed(0)),ink,10);
  574. label(g,36,a7y+a7h+14,&#x27;近端主缓冲&#x27;,&#x27;&#x27;,9);
  575. /* 传感器 17 */
  576. g.beginPath(); g.arc(180,196,15,0,7); g.strokeStyle=sub; g.stroke();
  577. const a0=Math.PI*.75+S.p/300*Math.PI*1.5;
  578. g.strokeStyle=ink; g.beginPath(); g.moveTo(180,196);
  579. g.lineTo(180+11*Math.cos(a0),196+11*Math.sin(a0)); g.stroke();
  580. label(g,166,177,&#x27;17&#x27;,sub);
  581. label(g,150,166,S.p.toFixed(0)+&#x27; bar&#x27;,ink,15);
  582. label(g,150,152,&#x27;泵站侧 (SCADA 液压压力)&#x27;,&#x27;&#x27;,9.5);
  583. /* ---- P HUB → 旋转接头 → 118 ---- */
  584. seg(g,[[146,196],[146,120],[330,120]],HP,4,Qflow);
  585. g.strokeStyle=sub;
  586. g.beginPath(); g.arc(352,120,16,-1.2,1.2); g.stroke();
  587. g.beginPath(); g.arc(362,120,16,Math.PI-1.2,Math.PI+1.2); g.stroke();
  588. label(g,332,96,&#x27;旋转接头&#x27;);
  589. seg(g,[[378,120],[430,120]],HP,4,Qflow);
  590. g.fillStyle=ink; g.beginPath(); g.moveTo(430,113); g.lineTo(430,127); g.lineTo(444,120); g.closePath(); g.fill();
  591. label(g,412,72,&#x27;118 单向&#x27;,sub);
  592. label(g,390,87,&#x27;← 泵→轮毂 单向 · 棘轮之源&#x27;,&#x27;&#x27;,9);
  593. /* ---- 轮毂总管 ---- */
  594. seg(g,[[444,120],[980,120]],HPh,4,Qflow||est?1:0);
  595. /* 传感器107 */
  596. g.beginPath(); g.arc(505,158,15,0,7); g.strokeStyle=sub; g.stroke();
  597. const a1=Math.PI*.75+S.pH/300*Math.PI*1.5;
  598. g.strokeStyle=ink; g.beginPath(); g.moveTo(505,158);
  599. g.lineTo(505+11*Math.cos(a1),158+11*Math.sin(a1)); g.stroke();
  600. seg(g,[[505,143],[505,120]],HPh,2.5,0);
  601. label(g,580,151,&#x27;107&#x27;,sub);
  602. label(g,580,168,S.pH.toFixed(0)+&#x27; bar&#x27;,ink,14);
  603. label(g,580,184,&#x27;叶片侧 (桨叶油压)&#x27;,&#x27;&#x27;,9.5);
  604. /* ---- 蓄能器 106(合并示意) ---- */
  605. const ax=590,ay=28,aw=54,ah=86;
  606. seg(g,[[ax+aw/2,ay+ah],[ax+aw/2,120]],HPh,3.5,Qflow*0.7);
  607. g.strokeStyle=ink; g.lineWidth=1.6; g.strokeRect(ax,ay,aw,ah);
  608. const gf=gasFrac(S.mode===&#x27;estop&#x27;&amp;&amp;F.p0H&gt;=0.5? K.V0H*F.p0H/Math.max(S.Vgas,1e-6):S.pH, F.p0H);
  609. const gh=Math.max(2,(ah-8)*Math.min(1,(S.mode===&#x27;estop&#x27;&amp;&amp;S.Vgas&gt;0&amp;&amp;F.p0H&gt;=0.5)?S.Vgas/K.V0H:gf));
  610. g.fillStyle=css(&#x27;--gas&#x27;); g.fillRect(ax+1.5,ay+1.5,aw-3,gh);
  611. g.fillStyle=sub; g.fillRect(ax+1.5,ay+1.5+gh,aw-3,5); // 活塞
  612. g.fillStyle=css(&#x27;--hp&#x27;); g.globalAlpha=.75;
  613. g.fillRect(ax+1.5,ay+6.5+gh,aw-3,ah-8-gh); g.globalAlpha=1;
  614. label(g,ax-4,ay-8,&#x27;106 · 6×30 L 合并示意 · 顺桨主源 · p₀=&#x27;+F.p0H.toFixed(0),ink,10);
  615. /* ---- 比例阀 102 → 缸 ---- */
  616. seg(g,[[700,120],[700,206]],HPh,3.5,pitch);
  617. box(g,672,206,56,30,&#x27;102&#x27;);
  618. const pv=S.mode===&#x27;estop&#x27;?&#x27;—&#x27;:(rateDir()&gt;0?&#x27;b 位&#x27;:rateDir()&lt;0?&#x27;a 位&#x27;:&#x27;中位&#x27;);
  619. label(g,676,226,&#x27;比例阀 &#x27;+pv,ink,10);
  620. seg(g,[[728,221],[790,221]],HPh,3,pitch);
  621. /* 缸 */
  622. g.strokeStyle=ink; g.strokeRect(790,204,120,34);
  623. const rod=790+18+(S.th/82)*76;
  624. g.fillStyle=sub; g.fillRect(790+2,206,rod-792,30);
  625. g.strokeStyle=ink; g.beginPath(); g.moveTo(rod,221); g.lineTo(rod+56,221); g.stroke();
  626. label(g,792,198,&#x27;124/125 · ø125/90×611 ×2缸×3叶&#x27;,sub,9.5);
  627. /* 叶片角 */
  628. g.save(); g.translate(952,221); g.rotate(-S.th*Math.PI/180);
  629. g.fillStyle=css(&#x27;--lp&#x27;); g.globalAlpha=.85;
  630. g.beginPath(); g.ellipse(0,0,34,9,0,0,7); g.fill(); g.globalAlpha=1; g.restore();
  631. label(g,928,262,&#x27;θ = &#x27;+S.th.toFixed(1)+&#x27;°&#x27;,ink,14);
  632. /* ---- 紧急旁路 103→121 ---- */
  633. seg(g,[[560,120],[560,300],[770,300],[770,238]],est?HPh:css(&#x27;--grid&#x27;),3, est);
  634. box(g,596,288,40,24,&#x27;103&#x27;); label(g,600,304,&#x27;失电=通&#x27;,est?ink:sub,9.5);
  635. // 节流孔 121
  636. g.strokeStyle=est?ink:sub; g.beginPath();
  637. g.moveTo(690,292); g.lineTo(702,300); g.lineTo(690,308); g.moveTo(718,292); g.lineTo(706,300); g.lineTo(718,308); g.stroke();
  638. label(g,682,324,&#x27;121 ø2.4 顺桨限速&#x27;,est?css(&#x27;--hp&#x27;):sub,10);
  639. /* ---- 回油 ---- */
  640. seg(g,[[700,236],[700,398],[146,398]],LP,3.5,pitch||est?0.6:0.15);
  641. g.strokeStyle=sub; g.beginPath();
  642. g.moveTo(640,392); g.lineTo(650,398); g.lineTo(640,404); g.moveTo(664,392); g.lineTo(654,398); g.lineTo(664,404); g.stroke();
  643. label(g,628,416,&#x27;116/122 ø1.8 回油&#x27;,sub,9.5);
  644. seg(g,[[146,398],[146,455]],LP,3.5,0.3);
  645. label(g,955,114,&#x27;P&#x27;,sub); label(g,60,392,&#x27;T&#x27;,sub);
  646. /* 模式标注 */
  647. const mtxt={reg:&#x27;运行调节:比例阀 102 微调;泵站 70 号=滞环循环的近端主缓冲,轮毂 106 经 118 弱参与&#x27;,
  648. close:&#x27;收桨:102 换向 b 位,需 47 L/min &gt; 泵 36.8 ⇒ 蓄能器补差额&#x27;,
  649. open:&#x27;开桨:102 换向 a 位(116 同时得电)&#x27;,
  650. estop:&#x27;紧急顺桨:全阀失电 → 轮毂 106 经 103→121 推缸(70 号不在此路,其失效不碍顺桨)&#x27;};
  651. document.getElementById(&#x27;circuit-mode-caption&#x27;).textContent=mtxt[S.mode];
  652. if (S.intState===1) document.getElementById(&#x27;circuit-mode-caption&#x27;).textContent+=&#x27; · ⚠ 泵间歇失供中…&#x27;;
  653. g.restore(); dashOff+=1;
  654. }
  655. function rateDir(){ if(S.mode===&#x27;close&#x27;)return 1; if(S.mode===&#x27;open&#x27;)return -1;
  656. const d=S.thCmd-S.th; return Math.abs(d)&gt;.1?Math.sign(d):0; }
  657. /* 活塞特写:双罐并排(左=泵站70号, 右=轮毂106单只) */
  658. function drawPiston(){
  659. const [g,W,H]=fit(pv); g.clearRect(0,0,W,H);
  660. const ink=css(&#x27;--ink&#x27;), sub=css(&#x27;--sub&#x27;);
  661. label(g,14,18,&#x27;蓄能器剖面 · 泵站70号 vs 轮毂106&#x27;,ink,12);
  662. const y=44, h=142, w=64;
  663. function tank(x, frac, ttl, cap, stuck){
  664. label(g,x-4,y-8,ttl,ink,10);
  665. g.strokeStyle=ink; g.lineWidth=2; rr(g,x,y,w,h,8); g.stroke();
  666. const gh=Math.max(3,(h-10)*Math.min(1,frac));
  667. g.save(); rr(g,x+2,y+2,w-4,h-4,6); g.clip();
  668. g.fillStyle=css(&#x27;--gas&#x27;); g.fillRect(x,y,w,gh+3);
  669. for(let i=7;i&lt;gh;i+=12){ g.strokeStyle=&#x27;rgba(0,0,0,.10)&#x27;; g.beginPath();
  670. g.moveTo(x+5,y+i); g.lineTo(x+w-5,y+i+3); g.stroke(); }
  671. g.fillStyle=sub; g.fillRect(x,y+gh+1,w,8);
  672. g.fillStyle=css(&#x27;--hp&#x27;); g.globalAlpha=.8; g.fillRect(x,y+gh+9,w,h-gh-9); g.globalAlpha=1;
  673. g.restore();
  674. if (stuck){ g.strokeStyle=css(&#x27;--hp&#x27;); g.lineWidth=2.5;
  675. g.beginPath(); g.moveTo(x+6,y+gh-14); g.lineTo(x+w-6,y+gh+22);
  676. g.moveTo(x+w-6,y+gh-14); g.lineTo(x+6,y+gh+22); g.stroke(); }
  677. label(g,x-4,y+h+13,cap,sub,9);
  678. }
  679. tank(24, gasFrac(S.p, F.stuck?0:F.p070),
  680. &#x27;70号 10L/&#x27;+(F.stuck?&#x27;卡滞&#x27;:F.p070.toFixed(0)), &#x27;泵压主管 · 近端缓冲&#x27;, F.stuck);
  681. const inEstop=S.mode===&#x27;estop&#x27;&amp;&amp;F.p0H&gt;=0.5&amp;&amp;S.Vgas&gt;0;
  682. tank(122, inEstop? Math.min(1,S.Vgas/K.V0H) : gasFrac(S.pH,F.p0H),
  683. &#x27;106单只 30L/&#x27;+F.p0H.toFixed(0), &#x27;叶片块×6 · 顺桨主源&#x27;, false);
  684. label(g,200,y+8,&#x27;黄=氮气&#x27;,css(&#x27;--gas&#x27;),9.5);
  685. label(g,200,y+22,&#x27;灰=活塞&#x27;,sub,9.5);
  686. label(g,200,y+36,&#x27;红=油侧&#x27;,css(&#x27;--hp&#x27;),9.5);
  687. // 吞吐条 + 三态要点
  688. const by=y+h+30, bw=W-40;
  689. label(g,20,by,&#x27;本循环吞吐 ΔV &#x27;+(S.lastVc!=null?S.lastVc.toFixed(2):&#x27;—&#x27;)+&#x27; L(健康 4.9 · 8# 0.50)&#x27;,ink,11);
  690. g.strokeStyle=css(&#x27;--grid&#x27;); g.strokeRect(20,by+7,bw,12);
  691. const v=Math.min(6,S.lastVc??0);
  692. g.fillStyle=css(&#x27;--hp&#x27;); g.fillRect(20,by+7,bw*v/6,12);
  693. label(g,20,by+36,&#x27;70号失氮 → 循环签名剧变(快循环/宽带宽)· 顺桨不受影响&#x27;,sub,9.5);
  694. label(g,20,by+52,&#x27;106失氮 → 循环仅中度变化 · 失电顺桨失去能量源&#x27;,sub,9.5);
  695. label(g,20,by+68,&#x27;双失效 → SCADA 签名与单独70号失效不可分辨 + 顺桨失败&#x27;,sub,9.5);
  696. label(g,20,by+84,&#x27;气体定律 p·V=p₀·V₀(等温)· 气少=硬弹簧 · 无气=钢块&#x27;,sub,9.5);
  697. }
  698. /* 走线图 */
  699. function chart(cv,rows,ylo,yhi,fmt,refs,title){
  700. const [g,W,H]=fit(cv); g.clearRect(0,0,W,H);
  701. const L=44,R=10,T=22,B=18, ink=css(&#x27;--ink&#x27;), sub=css(&#x27;--sub&#x27;);
  702. label(g,L,14,title,ink,11.5);
  703. const win=120, t1=S.t, t0=t1-win;
  704. const X=t=&gt;L+(t-t0)/win*(W-L-R), Y=v=&gt;T+(1-(v-ylo)/(yhi-ylo))*(H-T-B);
  705. g.strokeStyle=css(&#x27;--grid&#x27;);
  706. for(let i=0;i&lt;=4;i++){ const v=ylo+(yhi-ylo)*i/4;
  707. g.beginPath(); g.moveTo(L,Y(v)); g.lineTo(W-R,Y(v)); g.stroke();
  708. label(g,4,Y(v)+3,fmt(v),sub,9.5); }
  709. (refs||[]).forEach(r=&gt;{ g.strokeStyle=r[2]; g.setLineDash([5,4]);
  710. g.beginPath(); g.moveTo(L,Y(r[0])); g.lineTo(W-R,Y(r[0])); g.stroke(); g.setLineDash([]);
  711. label(g,W-R-58,Y(r[0])-3,r[1],r[2],9); });
  712. rows.forEach(rw=&gt;{
  713. g.strokeStyle=rw.c; g.lineWidth=rw.w||1.6; g.beginPath(); let pen=false;
  714. for(const b of S.buf){ if(b.t&lt;t0)continue; const v=rw.f(b);
  715. if(v==null){pen=false;continue;}
  716. const x=X(b.t),y=Y(Math.max(ylo,Math.min(yhi,v)));
  717. pen?g.lineTo(x,y):g.moveTo(x,y); pen=true; }
  718. g.stroke();
  719. if(S.buf.length){ const last=rw.f(S.buf[S.buf.length-1]);
  720. if(last!=null) label(g,W-R-46,Y(Math.max(ylo,Math.min(yhi,last)))-5,rw.n+&#x27; &#x27;+fmt(last),rw.c,9.5); }
  721. });
  722. }
  723. /* ================= 判定与 UI ================= */
  724. function showVerdict(){
  725. const e=S.estop, el=document.getElementById(&#x27;verdict&#x27;);
  726. if(!e||!e.done) return;
  727. const dt=(e.tEnd-e.t0).toFixed(1);
  728. if(e.ok){ el.className=&#x27;verdict ok&#x27;;
  729. const n70=(F.p070&lt;90||F.stuck)? &#x27;当前 70 号已注入失效但顺桨仍完成 —— 顺桨主源是轮毂 106(与数据窗 4 次停电全部安全顺桨的实证一致)。&#x27;
  730. : &#x27;等温理想下界 —— 低预充“勉强完成”不代表实机安全,以现场实测为准。&#x27;;
  731. el.innerHTML=`✓ 顺桨完成:82° 用时 &lt;b class=&quot;mono&quot;&gt;${dt} s&lt;/b&gt; · 放油 &lt;b class=&quot;mono&quot;&gt;${e.dV.toFixed(1)} L&lt;/b&gt; · 最低压 &lt;b class=&quot;mono&quot;&gt;${e.pMin.toFixed(0)} bar&lt;/b&gt;&lt;br&gt;&lt;span style=&quot;color:var(--sub);font-size:12px&quot;&gt;${n70}&lt;/span&gt;`;
  732. } else { el.className=&#x27;verdict bad&#x27;;
  733. el.innerHTML=`✗ 顺桨失败:卡滞在 &lt;b class=&quot;mono&quot;&gt;${S.th.toFixed(0)}°&lt;/b&gt;(用时 ${dt} s)· 已放 ${e.dV.toFixed(1)} L · 压力 ${e.pMin.toFixed(0)} bar &amp;lt; 驱动需求 ${K.driveP} bar&lt;br&gt;&lt;span style=&quot;color:var(--sub);font-size:12px&quot;&gt;轮毂 106 失氮 ⇒ 失电顺桨无源。SCADA 充能循环判据对 106 几乎不敏感(循环仅中度变化)——覆盖它的是机组自检容量检查(UP03284 组);两套监测互补,缺一即盲&lt;/span&gt;`; }
  734. }
  735. function setMode(m){
  736. S.mode=m;
  737. document.querySelectorAll(&#x27;#m-reg,#m-close,#m-open,#m-estop&#x27;)
  738. .forEach(b=&gt;b.classList.remove(&#x27;on&#x27;));
  739. document.getElementById({reg:&#x27;m-reg&#x27;,close:&#x27;m-close&#x27;,open:&#x27;m-open&#x27;,estop:&#x27;m-estop&#x27;}[m]).classList.add(&#x27;on&#x27;);
  740. const el=document.getElementById(&#x27;verdict&#x27;);
  741. if(m===&#x27;estop&#x27;){
  742. S.estop={t0:S.t,done:false,dV:0,pMin:S.pH};
  743. S.Vgas=(F.p0H&gt;=0.5)? Math.max(K.V0H*F.p0H/K.pRelief, K.V0H*F.p0H/Math.max(S.pH,F.p0H+1)) : 0;
  744. el.className=&#x27;verdict&#x27;; el.style.display=&#x27;none&#x27;;
  745. } else { el.className=&#x27;verdict&#x27;; S.estop=null; }
  746. }
  747. const $=id=&gt;document.getElementById(id);
  748. $(&#x27;m-reg&#x27;).onclick=()=&gt;setMode(&#x27;reg&#x27;); $(&#x27;m-close&#x27;).onclick=()=&gt;setMode(&#x27;close&#x27;);
  749. $(&#x27;m-open&#x27;).onclick=()=&gt;setMode(&#x27;open&#x27;); $(&#x27;m-estop&#x27;).onclick=()=&gt;setMode(&#x27;estop&#x27;);
  750. $(&#x27;pw&#x27;).onclick=()=&gt;{ S.power=!S.power; $(&#x27;pw&#x27;).textContent=S.power?&#x27;有电&#x27;:&#x27;失电&#x27;;
  751. $(&#x27;pw&#x27;).classList.toggle(&#x27;on&#x27;,S.power); };
  752. $(&#x27;spd&#x27;).oninput=e=&gt;{ $(&#x27;spdv&#x27;).textContent=e.target.value+&#x27;×&#x27;; };
  753. function bind(id,vid,set,fmt){ $(id).oninput=e=&gt;{ set(+e.target.value);
  754. $(vid).textContent=fmt(+e.target.value); }; }
  755. bind(&#x27;s-p070&#x27;,&#x27;v-p070&#x27;,v=&gt;F.p070=v,v=&gt;v+&#x27; bar&#x27;);
  756. bind(&#x27;s-p0H&#x27;,&#x27;v-p0H&#x27;,v=&gt;F.p0H=v,v=&gt;v+&#x27; bar&#x27;);
  757. bind(&#x27;s-leak&#x27;,&#x27;v-leak&#x27;,v=&gt;F.leak=v/10,v=&gt;(v/10).toFixed(1)+&#x27;×&#x27;);
  758. bind(&#x27;s-pump&#x27;,&#x27;v-pump&#x27;,v=&gt;F.pump=v/100,v=&gt;v+&#x27;%&#x27;);
  759. bind(&#x27;s-int&#x27;,&#x27;v-int&#x27;,v=&gt;F.inter=v/100,v=&gt;v?(v+&#x27;%&#x27;):&#x27;关&#x27;);
  760. $(&#x27;s-stuck&#x27;).onchange=e=&gt;F.stuck=e.target.checked;
  761. const PRESETS={
  762. healthy: {p070:180,p0H:125,leak:10,pump:100,int:0,stuck:false},
  763. early: {p070:90, p0H:125,leak:10,pump:100,int:0,stuck:false},
  764. collapse:{p070:1, p0H:125,leak:10,pump:100,int:0,stuck:false},
  765. hubfail: {p070:180,p0H:1, leak:10,pump:100,int:0,stuck:false},
  766. bothfail:{p070:1, p0H:1, leak:10,pump:100,int:0,stuck:false},
  767. leak: {p070:180,p0H:125,leak:22,pump:100,int:0,stuck:false},
  768. pumpint: {p070:180,p0H:125,leak:10,pump:100,int:55,stuck:false},
  769. stuck: {p070:180,p0H:125,leak:10,pump:100,int:0,stuck:true},
  770. };
  771. document.querySelectorAll(&#x27;.presets button&#x27;).forEach(b=&gt;b.onclick=()=&gt;{
  772. const p=PRESETS[b.dataset.p];
  773. $(&#x27;s-p070&#x27;).value=p.p070; F.p070=p.p070; $(&#x27;v-p070&#x27;).textContent=p.p070+&#x27; bar&#x27;;
  774. $(&#x27;s-p0H&#x27;).value=p.p0H; F.p0H=p.p0H; $(&#x27;v-p0H&#x27;).textContent=p.p0H+&#x27; bar&#x27;;
  775. $(&#x27;s-leak&#x27;).value=p.leak; F.leak=p.leak/10; $(&#x27;v-leak&#x27;).textContent=(p.leak/10).toFixed(1)+&#x27;×&#x27;;
  776. $(&#x27;s-pump&#x27;).value=p.pump; F.pump=p.pump/100; $(&#x27;v-pump&#x27;).textContent=p.pump+&#x27;%&#x27;;
  777. $(&#x27;s-int&#x27;).value=p.int; F.inter=p.int/100; $(&#x27;v-int&#x27;).textContent=p.int?(p.int+&#x27;%&#x27;):&#x27;关&#x27;;
  778. $(&#x27;s-stuck&#x27;).checked=p.stuck; F.stuck=p.stuck;
  779. S.cyc.length=0; S.lastVc=null; S.lastPer=null; S.ratchet=S.pH;
  780. });
  781. /* ================= 主循环 ================= */
  782. const cv=$(&#x27;cv&#x27;), pv=$(&#x27;pv&#x27;);
  783. let last=performance.now(), carry=0;
  784. /* 表格 DOM 低频差量更新:每帧 innerHTML 重写会把翻译/监控类浏览器扩展的
  785. MutationObserver 打爆导致整页无响应(Chrome+扩展实测)。4 Hz + 无变化不写。 */
  786. let uiAcc=1, mxHtml=&#x27;&#x27;, ptHtml=&#x27;&#x27;;
  787. function frame(now){
  788. /* rAF 时间戳可早于 performance.now()(macOS26+Chrome151 实测: 首帧 now&lt;last)
  789. → 负 dt 会让 while(n--) 从负数无限递减 = 死循环白屏。负值双重钳制。 */
  790. const dtR=Math.max(0, Math.min(0.06,(now-last)/1000)); last=now;
  791. const speed=+$(&#x27;spd&#x27;).value;
  792. carry+=dtR*speed; const DT=0.02;
  793. let n=Math.max(0, Math.min(400,Math.floor(carry/DT))); carry-=n*DT;
  794. if (carry&lt;0) carry=0;
  795. while(n--) step(DT);
  796. try{ drawCircuit(); }catch(e){}
  797. try{ drawPiston(); }catch(e){}
  798. chart($(&#x27;c1&#x27;),[
  799. {n:&#x27;叶片侧&#x27;,c:css(&#x27;--lp&#x27;),w:1.8,f:b=&gt;b.pH},
  800. {n:&#x27;泵站侧&#x27;,c:css(&#x27;--hp&#x27;),w:1.6,f:b=&gt;b.p}],
  801. 100,290,v=&gt;v.toFixed(0),
  802. [[194,&#x27;194 加载&#x27;,css(&#x27;--ok&#x27;)],[246,&#x27;246 卸荷&#x27;,css(&#x27;--hp&#x27;)]],
  803. &#x27;系统压力 bar · 滚动 120 s&#x27;);
  804. chart($(&#x27;c2&#x27;),[{n:&#x27;θ&#x27;,c:css(&#x27;--ink&#x27;),w:1.8,f:b=&gt;b.th}],
  805. -4,92,v=&gt;v.toFixed(0),[[82,&#x27;82° 顺桨&#x27;,css(&#x27;--sub&#x27;)]],&#x27;桨距角 °&#x27;);
  806. chart($(&#x27;c3&#x27;),[{n:&#x27;25号阀&#x27;,c:css(&#x27;--gas&#x27;),w:1.6,f:b=&gt;b.v*0.9+0.05}],
  807. -0.08,1.15,v=&gt;v&gt;0.9?&#x27;得电&#x27;:(v&lt;0.1?&#x27;失电&#x27;:&#x27;&#x27;),[],&#x27;25 号卸荷阀状态(得电=加载)&#x27;);
  808. uiAcc+=dtR;
  809. if (uiAcc&gt;=0.25){ uiAcc=0;
  810. const h1=metrics().map(r=&gt;
  811. `&lt;tr&gt;&lt;td&gt;${r[0]}&lt;/td&gt;&lt;td&gt;&lt;b&gt;${r[1]}&lt;/b&gt;&lt;/td&gt;&lt;td style=&quot;color:var(--sub)&quot;&gt;${r[2]}&lt;/td&gt;&lt;td style=&quot;color:var(--hp)&quot;&gt;${r[3]}&lt;/td&gt;&lt;/tr&gt;`).join(&#x27;&#x27;);
  812. if (h1!==mxHtml){ mxHtml=h1; $(&#x27;mx&#x27;).innerHTML=h1; }
  813. const h2=pistonRows().map(r=&gt;
  814. `&lt;tr&gt;&lt;td style=&quot;text-align:left;color:var(--sub)&quot;&gt;${r[0]}&lt;/td&gt;&lt;td&gt;&lt;b&gt;${r[1]}&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;`).join(&#x27;&#x27;);
  815. if (h2!==ptHtml){ ptHtml=h2; $(&#x27;pistab&#x27;).innerHTML=h2; }
  816. }
  817. requestAnimationFrame(frame);
  818. }
  819. requestAnimationFrame(frame);
  820. &lt;/script&gt;
  821. " style="height:820px"></iframe>
  822. <div class="chips" style="margin-top:12px"><a class="chip ev" href="#" data-open="U6_变桨液压仿真台.html">新窗口打开仿真台 →</a><a class="chip" href="#case_hydraulic" data-nav="case_hydraulic">回案例页看它怎么用</a></div></div></section>
  823. <section><div class="wrap"><div class="grid g3">
  824. <div class="card" style="border-top:4px solid #087e8c"><div class="k">SWT-4.0-130 · 联调总览</div><h3>四系统联调</h3><p>将偏航、传动链与功率、发电机热管理、变桨轮毂液压放在同一视图中联动查看。</p><div class="chips"><a class="chip ev" href="http://127.0.0.1:18792/0_四系统合页.html">打开四系统联调 →</a></div></div>
  825. <div class="card"><div class="k">🧭 SWT-4.0-130 · 偏航</div><h3>偏航系统</h3><p>拖动风速、风向扰动与时间;可直接拖动罗盘改变风向,查看死区、延时与解缆过程。</p><div class="chips"><a class="chip ev" href="http://127.0.0.1:18792/1_偏航系统.html">打开偏航系统 →</a></div></div><div class="card"><div class="k">⚙ SWT-4.0-130 · 传动链</div><h3>传动链与功率</h3><p>调整风速与时间,观察转速、功率与塔筒 3P 禁带附近的控制响应。</p><div class="chips"><a class="chip ev" href="http://127.0.0.1:18792/2_传动链与功率.html">打开传动链与功率 →</a></div></div><div class="card"><div class="k">🌡 SWT-4.0-130 · 发电机</div><h3>发电机与热管理</h3><p>调整风速、环境温度与时间,观察温升、散热和保护温度的裕度变化。</p><div class="chips"><a class="chip ev" href="http://127.0.0.1:18792/3_发电机与热管理.html">打开发电机与热管理 →</a></div></div><div class="card"><div class="k">🔧 SWT-4.0-130 · 变桨</div><h3>变桨与轮毂液压</h3><p>调整风速与时间,查看轮毂共轨、变桨动作和回路压力的动态响应。</p><div class="chips"><a class="chip ev" href="http://127.0.0.1:18792/4_变桨轮毂液压.html">打开变桨与轮毂液压 →</a></div></div><div class="card"><div class="k">三维工作台 · 中文版</div><h3>风机三维拆装工作台</h3><p>轮毂、叶片轴承等部件的三维拆装与物料定位;可在工作台内选择部件查看。</p><div class="chips"><a class="chip ev" href="#" onclick="var f=document.getElementById('ovf');f.removeAttribute('srcdoc');document.getElementById('ovt').textContent='风机三维拆装工作台';f.src='http://127.0.0.1:64292/unit-workbench.html?component=hub-1-2&amp;rev=hub-review-v1';document.getElementById('ov').classList.add('on');return false">内嵌打开工作台 →</a><a class="chip" href="http://127.0.0.1:64292/unit-workbench.html?component=hub-1-2&amp;rev=hub-review-v1" target="_blank" rel="noopener">独立打开 ↗</a></div></div><div class="card"><div class="k">SC1 · 4 MW</div><h3>整机联调仿真</h3><p>风况、运行模式与保护停机的联动演示。独立参数集,不与 SWT 机型混用。</p><div class="chips"><a class="chip ev" href="#" data-open="sc1-local.html">打开联调仿真 →</a></div></div>
  826. <div class="card"><div class="k">传动链实际运行回放 · 38 台</div><h3>24 h 一分钟 SCADA + TCM 真实波形/频谱</h3><p>功率、风速、低速轴/发电机转速、主轴承与齿轮箱油温、三桨平均桨距;同步派生转矩明确标注非实测;16 台候选机组在问题窗的真实波形与频谱同一触发时刻。</p><div class="chips"><a class="chip ev" href="#" data-open="如东传动链实际运行诊断_单文件版.html">打开单文件版 →</a></div></div>
  827. </div><div class="callout" style="margin-top:16px">边界:回放页与仿真台都是"看现在"的工具;任何"未来状态 / 剩余寿命"都不由它们输出。</div></div></section>
  828. </div><div class="pg" id="documents" data-title="交付文档"><section class="hero"><div class="wrap"><div class="kicker">交付文档</div><h1>报告与治理清单</h1><p class="lead">按系统查看评估报告、治理对象与处置建议。用于安排复核和检修,不替代现场停机标准。</p></div></section><section id="governance-library"><div class="wrap"><div class="kicker">治理清单 · 分册全套</div><h2>分系统治理清单</h2><p class="sub">总目录、9 个治理分册与故障负担榜;液压清单沿用本页已有版本。各册保留原文中的证据范围、处置建议和适用边界。</p><div class="grid g4"><div class="card"><div class="k">阅读导航</div><h3>总目录</h3><div class="chips"><a class="chip ev" href="#" data-open="governance-0.html">浏览总目录 →</a></div></div><div class="card"><div class="k">分册 02</div><h3>变桨执行</h3><div class="chips"><a class="chip " href="#" data-open="governance-2.html">打开分册 →</a></div></div><div class="card"><div class="k">分册 03</div><h3>偏航系统</h3><div class="chips"><a class="chip " href="#" data-open="governance-3.html">打开分册 →</a></div></div><div class="card"><div class="k">分册 04</div><h3>变流器</h3><div class="chips"><a class="chip " href="#" data-open="governance-4.html">打开分册 →</a></div></div><div class="card"><div class="k">分册 05</div><h3>主控与传感网</h3><div class="chips"><a class="chip " href="#" data-open="governance-5.html">打开分册 →</a></div></div><div class="card"><div class="k">分册 06</div><h3>电气并网</h3><div class="chips"><a class="chip " href="#" data-open="governance-6.html">打开分册 →</a></div></div><div class="card"><div class="k">分册 07</div><h3>塔架与基础</h3><div class="chips"><a class="chip " href="#" data-open="governance-7.html">打开分册 →</a></div></div><div class="card"><div class="k">分册 08</div><h3>润滑与冷却辅助</h3><div class="chips"><a class="chip " href="#" data-open="governance-8.html">打开分册 →</a></div></div><div class="card"><div class="k">分册 09</div><h3>CMS 监测面</h3><div class="chips"><a class="chip " href="#" data-open="governance-9.html">打开分册 →</a></div></div><div class="card"><div class="k">分册 10</div><h3>参数与管理</h3><div class="chips"><a class="chip " href="#" data-open="governance-10.html">打开分册 →</a></div></div><div class="card"><div class="k">分册 11</div><h3>故障负担榜</h3><div class="chips"><a class="chip " href="#" data-open="governance-11.html">打开分册 →</a></div></div></div></div></section>
  829. <section><div class="wrap"><div class="grid g5"><div class="card"><div class="k">项目</div><h3>项目 R-01</h3><p></p></div><div class="card"><div class="k">机型 / 台数</div><h3>SWT-4.0-130 · 38 台</h3><p></p></div><div class="card"><div class="k">范围</div><h3>系统① 液压系统</h3><p>变桨回路 + 高速轴制动回路</p></div><div class="card"><div class="k">证据窗</div><h3>运行 → 2026-07-07</h3><p></p></div><div class="card"><div class="k">版本</div><h3>v1.2 · 2026-09-01</h3><p>部件命名按上海电气设备结构树</p></div></div></div></section>
  830. <section><div class="wrap"><div class="kicker">液压评估依据</div><h2>循环特征与失效区分</h2><div class="grid g3">
  831. <div class="card"><div class="k">判据</div><h3>泵单次加载输出量 V_cyc</h3><p>加载时长 × 排量 36.8 L/min。系统总容变按仿真标定式分解,70 号 10 L 罐占主导(轮毂 180 L 只 9.5% 参与);预充 180 bar 由 38 台实测容变反算证实。</p><div class="chips"><span class="chip gd">健康 26 台 · 3.1–7.2 L</span><span class="chip al">气容丧失 8 台 · 0.52 L</span></div></div>
  832. <div class="card"><div class="k">为什么不是漏油、不是泵磨损</div><h3>三条反证</h3><p>外漏只增每循环消耗、不改系统容变 C,25# 泵输出 1.46× 而 C 仍在健康区;排量下降会拉长单次加载而不改频次,实测 8# 是频次 6 → 228 次/10 min、单次时长反缩短。</p></div>
  833. <div class="card"><div class="k">顺桨安全</div><h3>顺桨储能与自检证据</h3><p>失电顺桨主源是轮毂 106(103 → 121 路),70 号不在此路;106 无连续 SCADA 通道,能看见它的只有机组自检容量检查(235 bar 起测),最近记录 140 bar @20 ℃ = 正常。两套监测互补,同时关注。</p></div>
  834. </div><div class="callout" style="margin-top:16px">口径边界:「—」= 该台该项档案未逐台落值,不是正常,是没测;命中 n/m 的分母只数该台有值的项。备件编码取自备件系统「物资编码」字段,下单前必核 ERP 现存量,禁按本表采购。</div></div></section>
  835. <section><div class="wrap"><div class="kicker">原文</div><h2>如东液压系统治理清单 · 网页版</h2><p class="sub">网页版交付清单;客户交付物,仅限受保护工作区,不上公网。</p><iframe src="http://127.0.0.1:28084/如东/如东治理清单_交付_20260901/02_治理清单/如东_液压系统治理清单_v1.2_2026-09-01.html" title="如东液压系统治理清单 · 网页版" style="width:100%;height:860px;border:1px solid var(--line);border-radius:8px;background:#fff"></iframe></div></section>
  836. <section><div class="wrap"><div class="kicker">评估与数据范围</div><h2>报告 · 面板 · 覆盖面</h2><div id="selected-system-reports" class="grid g4" style="margin-bottom:24px"><div class="card"><div class="k">分系统报告 · V2.0</div><h3>主轴承系统</h3><p>主轴承状态、异常机组分析与维护建议。</p><div class="chips"><a class="chip ev" href="#" data-open="report-主轴承.html">阅读报告 →</a></div></div><div class="card"><div class="k">分系统报告 · V2.0</div><h3>齿轮箱系统</h3><p>轴系、润滑过滤与冷却系统的状态评估。</p><div class="chips"><a class="chip ev" href="#" data-open="report-齿轮箱.html">阅读报告 →</a></div></div><div class="card"><div class="k">分系统报告 · V2.0</div><h3>发电机系统</h3><p>绕组与轴承温升、润滑、散热及防凝露评估。</p><div class="chips"><a class="chip ev" href="#" data-open="report-发电机.html">阅读报告 →</a></div></div><div class="card"><div class="k">分系统报告 · V2.0</div><h3>变桨系统</h3><p>轴承润滑、蓄能调压、执行反馈与油路密封评估。</p><div class="chips"><a class="chip ev" href="#" data-open="report-变桨.html">阅读报告 →</a></div></div></div><div class="grid g4"><div class="card"><div class="k">发现案例</div><h3>液压系统 · 八台蓄能器气容丧失</h3><p>处置依据、检修建议与修后验证。</p><div class="chips"><a class="chip ev" href="#case_hydraulic" data-nav="case_hydraulic">打开 →</a></div></div><div class="card"><div class="k">综合诊断报告</div><h3>整机综合诊断与风险评估 V2.1</h3><p>主轴冲击分析与整机风险评估。</p><div class="chips"><a class="chip ev" href="#" data-open="如东海上风电场_整机综合诊断与风险评估_主轴冲击深挖修订版V2.1.html">打开 →</a></div></div><div class="card"><div class="k">标准化面板</div><h3>机型包 · 场实例 · 字典 · 发布指纹</h3><p>每张表带来源文件与 sha16。</p><div class="chips"><a class="chip ev" href="#" data-open="standard_panel_zh.html">打开 →</a></div></div><div class="card"><div class="k">数据覆盖范围</div><h3>覆盖范围与缺项</h3><p>38 台 × 19 月有效率、台 × 九系统判级、明示未覆盖。</p><div class="chips"><a class="chip ev" href="#" data-open="coverage_ch0_zh.html">打开 →</a></div></div></div></div></section>
  837. </div><div class="pg" id="admin" data-title="系统状态"><section class="hero"><div class="wrap"><div class="kicker">系统状态 · 管理视图</div><h1>系统运行与配置</h1><p class="lead">数据层、模型档、审级与队列。每一项都是本机实测,不是宣传口径。</p></div></section>
  838. <section><div class="wrap"><div class="kicker">数据层</div><h2>如东 · 五层原生 WPS 已装配</h2><div class="grid g4"><div class="card"><div class="k">10-min / 1-min</div><h3>1min 2025-01-01 → 2026-06-30 (99.87%)</h3><p>cnt 层至 2026-07-07;交叠 546 天;136 号文断点 2025 旧机制 / 2026 新机制。</p></div><div class="card"><div class="k">温度 / 电网 / 标志 / 日汇总</div><h3>native_scturtemp · scturgrid · scturflag · dailysummary</h3><p>parquet 7.1 GB,指纹文件同目录。</p></div><div class="card"><div class="k">告警 / 工单 / 油样</div><h3>alarm.tsv 2016→ · 工单 4,298 · 油样 506</h3><p>本体对象:告警码 555、工单 4,298、油样 506。</p></div><div class="card"><div class="k">CMS · TCM</div><h3>2026-01-27 单窗 + 06-29→08-11 五窗</h3><p>320 万记录 / 160 万谱 / 7,688 条波形。</p></div></div></div></section>
  839. <section><div class="wrap"><div class="kicker">模型档</div><h2>分析规则与模型配置</h2><div class="grid g4"><div class="card"><div class="k">本地 · 轻量</div><h3>qwen3:8b</h3><p>本体问答 8–10 s;接地闸通过才上屏。</p></div><div class="card"><div class="k">本地 · 标准</div><h3>qwen3.8:27b / qwen3:32b</h3><p>交叉审与长文;本地审核票只作初筛(已知硬伤命中 0/4)。</p></div><div class="card"><div class="k">本地 · 推理</div><h3>deepseek-r1:14b / 32b</h3><p>已下载,未标定。</p></div><div class="card"><div class="k">云端</div><h3>DeepSeek · 千问</h3><p>训练与提案侧;密钥从环境读,不落盘。</p></div></div></div></section>
  840. <section><div class="wrap"><div class="kicker">审级与队列</div><h2>本体 19,321 个对象 · 写入闸 C1–C17</h2><div class="grid g4"><div class="card"><div class="k">审级</div><h3>云端跨厂商双票 = 最低审级</h3><p>上云 / 含经济数字 / 确诊 / 跨机系统性 触发。</p></div><div class="card"><div class="k">月度滚动</div><h3>新数据 → 重跑 → 本体增量 → 只报变化</h3><p>验收状态机:29# 修后首例。</p></div><div class="card"><div class="k">审计六项</div><h3>悬空引用 / 孤儿 / 链接密度 / 字段覆盖 / …</h3><p>第七项(引用未审定)待加。</p></div><div class="card"><div class="k">回归</div><h3>paradigm 14/14 · windscada 4/5 · ontology 25/28</h3><p>失败项 = 原始 CSV 硬路径缺 / 测试与对象库状态耦合,非功能故障。</p></div></div></div></section>
  841. </div><div class="pg" id="login" data-title="登录"><section class="hero" style="padding-bottom:64px"><div class="wrap"><div class="kicker">Wind asset intelligence</div><h1>欢迎来到观澜。</h1><p class="lead">面向复杂运营的 AI 辅助风电资产智能,为清晰决策而建。</p><div class="chips"><span class="chip ev">● 风电智能</span><span class="chip ev">● AI 辅助</span><span class="chip ev">● 访问受控</span></div></div></section>
  842. <section><div class="wrap" style="max-width:560px"><div class="form"><div class="kicker">受保护工作区</div><h2 style="margin-top:8px">欢迎回来</h2><p class="sub">登录以进入受保护的观澜工作区(本机演示:直接进入在线系统)。</p><label>用户名</label><input placeholder="username"><label>密码</label><input type="password" placeholder="••••••••"><a class="btn" href="http://127.0.0.1:18033/v2">进入详细分析 →</a></div></div></section>
  843. </div>
  844. <div class="foot"><span>观澜中文系统 · 详细分析</span><span>判断在证据 · 模型只转述</span><span>本机交互模块按对应入口启用</span></div>
  845. <nav class="return-dock" aria-label="返回导航"><a href="#index">← 返回总览 / 重新选页</a><a href="#sim">仿真入口</a><a href="#cms">振动入口</a></nav><div class="ov" id="ov"><div class="bar"><b id="ovt"></b><button type="button" class="x" id="ovx">← 返回当前页面</button></div><iframe id="ovf"></iframe></div>
  846. <!--@TEMPLATE:tpl-U6_变桨液压仿真台.html--><!--@TEMPLATE:tpl-standard_panel_zh.html--><!--@TEMPLATE:tpl-coverage_ch0_zh.html--><!--@TEMPLATE:tpl-如东传动链实际运行诊断_单文件版.html--><!--@TEMPLATE:tpl-U6_液压公共站健康报告_客户版.html--><!--@TEMPLATE:tpl-如东海上风电场_整机综合诊断与风险评估_主轴冲击深挖修订版V2.1.html-->
  847. <script>
  848. (function(){
  849. function show(k){document.querySelectorAll('.pg').forEach(p=>p.classList.toggle('on',p.id===k));document.querySelectorAll('.tabs a').forEach(a=>a.classList.toggle('on',a.dataset.nav===k));window.scrollTo(0,0)}
  850. function route(){var k=(location.hash||'#index').slice(1);if(!document.getElementById(k))k='index';show(k)}
  851. window.addEventListener('hashchange',route);route();
  852. document.addEventListener('click',function(e){var a=e.target.closest('a[data-open]');if(!a)return;e.preventDefault();var t=document.getElementById('tpl-'+a.dataset.open);if(!t)return;document.getElementById('ovt').textContent=a.dataset.open;document.getElementById('ovf').srcdoc=t.content.textContent;/*guanlan-anchor-fix-v2*/(function(){var f=document.getElementById('ovf');if(!f||f._afix)return;f._afix=1;f.addEventListener('load',function(){try{var d=f.contentDocument;if(!d||d._afix)return;d._afix=1;d.addEventListener('click',function(ev){var a=ev.target&&ev.target.closest?ev.target.closest('a[href^="#"]'):null;if(!a)return;ev.preventDefault();var id=decodeURIComponent((a.getAttribute('href')||'#').slice(1));if(!id){d.defaultView.scrollTo(0,0);return}var el=d.getElementById(id)||(d.getElementsByName(id)||[])[0];if(el&&el.scrollIntoView)el.scrollIntoView({block:'start'})},true)}catch(e){}})})();document.getElementById('ov').classList.add('on')});
  853. document.addEventListener('keydown',function(e){if(e.key==='Escape'&&document.getElementById('ov').classList.contains('on'))document.getElementById('ovx').click()});
  854. document.getElementById('ovx').onclick=function(){var f=document.getElementById('ovf');document.getElementById('ov').classList.remove('on');f.removeAttribute('srcdoc');f.removeAttribute('src')};
  855. })();
  856. </script><!--@TEMPLATE:tpl-swt40_控制律仪表台_外发版.html--><!--@TEMPLATE:tpl-report-主轴承.html--><!--@TEMPLATE:tpl-report-齿轮箱.html--><!--@TEMPLATE:tpl-report-发电机.html--><!--@TEMPLATE:tpl-report-变桨.html--><script type="application/json" id="system-report-sources">[{"title": "主轴承系统状态评估报告", "version": "修订版 V2.0", "source": "脱敏资料索引/资料-002.docx", "sha256": "7d2820a5d4b75afae66907b8499029dddbccbe3bcab9d15ac363af4e30189f69", "tables": 5, "images": 10}, {"title": "齿轮箱系统状态评估报告", "version": "修订版 V2.0", "source": "脱敏资料索引/资料-003.docx", "sha256": "c9dd406c18935a95069127497fd06ae1a342d73c69113ef4dec9184a0f85ee27", "tables": 12, "images": 39}, {"title": "发电机系统状态评估报告", "version": "修订版 V2.0", "source": "脱敏资料索引/资料-004.docx", "sha256": "5764810bca15b7964d7488a7946c934de73bfa93bcb2af8e1edc7b1bfe4ae77d", "tables": 3, "images": 13}, {"title": "变桨系统状态评估报告", "version": "修订版 V2.0", "source": "脱敏资料索引/资料-005.docx", "sha256": "feaa735242588966a97a94ba00e07a484b2ac0dfb0b9620158c9e0c87d0f324b", "tables": 4, "images": 10}]</script><!--@TEMPLATE:tpl-governance-0.html--><!--@TEMPLATE:tpl-governance-1.html--><!--@TEMPLATE:tpl-governance-2.html--><!--@TEMPLATE:tpl-governance-3.html--><!--@TEMPLATE:tpl-governance-4.html--><!--@TEMPLATE:tpl-governance-5.html--><!--@TEMPLATE:tpl-governance-6.html--><!--@TEMPLATE:tpl-governance-7.html--><!--@TEMPLATE:tpl-governance-8.html--><!--@TEMPLATE:tpl-governance-9.html--><!--@TEMPLATE:tpl-governance-10.html--><!--@TEMPLATE:tpl-governance-11.html--><script type="application/json" id="governance-sources"><!--@GOVERNANCE_SOURCES--></script><!--@TEMPLATE:tpl-sc1-local.html--><!--@TEMPLATE:tpl-swt-subsystem-1.html--><!--@TEMPLATE:tpl-swt-subsystem-2.html--><!--@TEMPLATE:tpl-swt-subsystem-3.html--><!--@TEMPLATE:tpl-swt-subsystem-4.html--><script type="application/json" id="subsystem-sources">[{"title": "偏航系统", "template": "swt-subsystem-1.html", "path": "脱敏资料索引/资料-018.html", "sha256": "5668146593541105ab096839b848a26cbf0b1f7ec314397c9ca4eece418bc96e"}, {"title": "传动链与功率", "template": "swt-subsystem-2.html", "path": "脱敏资料索引/资料-019.html", "sha256": "259c6299eacc8ba667f4ace12744aba2875b448698d6533632b962c02cd1e5af"}, {"title": "发电机与热管理", "template": "swt-subsystem-3.html", "path": "脱敏资料索引/资料-020.html", "sha256": "646c9b940295c9ccf4ca2b7b882812eab548e69b795b7600e8361741629de7f6"}, {"title": "变桨与轮毂液压", "template": "swt-subsystem-4.html", "path": "脱敏资料索引/资料-021.html", "sha256": "b4c80ff4667b12170170df171e9ab59f9f985d77f0f62026f024cc02b4ad0d66"}]</script></body></html>