Deploy test site / deploy (push) Successful in 48s
The order to investigate for a fired boiler (biomass such as rice husk, or LPG): first a flue-gas economizer, second as much clean, hot condensate back to T-1 as possible, third the heat pump HP-1 where the press return has enough heat and the combined heating and cooling economics justify it. - Diagram: new ECON-1 (option, fired boilers only) between the feed pumps and the boiler manifold, with a bypass for an electric bank and the flue-gas path from the boilers; feed in 90 to 95 C, outlet and stack temperature are vendor figures. HP-1 is now drawn as an option and labelled the third measure. AT conductivity on the condensate return to T-1; off-spec condensate goes to the warm tank. - Found in Newbilt's offer 240620-04: steam and cooling water share the mould channels, with one steam/water outlet valve and steam trap per mould, so the condensate is only as clean as the cooling loop. Noted in the T-1 detail, sustainability.md and as a Newbilt RFQ question. - With most condensate returned (about 15 % flashes at atmospheric pressure, estimate) the feed tank needs only a fraction of the ~70 kW that heating all make-up takes, so HP-1 may not pay. - RFQ: economizer outlet feed and stack temperature, corrosion limit, pressure drop; rice husk ash is high in silica and abrasive, so fouling, cleaning, wear protection and a bypass. - sustainability.md: the order, before the exclusions. biomass.md: new "Recovering heat at the boiler". Checked headless (scripts/pw_sc_check.py): 33 boxes, 20 tags, no overlap or overflow, no unstyled pipes, no card or page overflow at 1600, 1258 and 390 px in all four cases, every box opens its detail, no errors.
383 lines
44 KiB
HTML
383 lines
44 KiB
HTML
<!doctype html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title>CNX Vinyl · Steam and cooling plant (five-press fleet)</title>
|
||
<script>
|
||
(function(){var t=null;try{t=localStorage.getItem("cnx-theme")}catch(e){}
|
||
if(t!=="light"&&t!=="dark")t=window.matchMedia&&matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";
|
||
document.documentElement.setAttribute("data-theme",t);})();
|
||
</script>
|
||
<style>
|
||
:root{color-scheme:dark;
|
||
--bg:#0a0f1a;--card:#0f1626;--box:#121a2b;--stroke:#2a3a56;--head:#1a2640;--fg:#d6deeb;--mute:#8a97b0;--ink:#e6ecf7;
|
||
--sel:#7fb2ff;--warn:#ffbf1f;--alarm:#ff3b3b;--ok:#3ddc84;
|
||
--st:#ff5a3c;--cd:#c96a4e;--fw:#2fb5a0;--rw:#8aa3c0;--cws:#3aa0ff;--cwr:#7fc0ff;--pri:#2e7fd0;--prw:#9c7bd9;--hr:#f5a623;--bd:#b48ead;--fl:#9aa4b2;
|
||
--mono:ui-monospace,"Cascadia Mono",Consolas,"Liberation Mono",monospace}
|
||
html[data-theme=light]{color-scheme:light;
|
||
--bg:#eef2f7;--card:#ffffff;--box:#ffffff;--stroke:#c3cede;--head:#e3e9f3;--fg:#1b2533;--mute:#5b6880;--ink:#1b2533;
|
||
--sel:#1f5fbf;--warn:#c98a00;--alarm:#e0352b;--ok:#16a35a;
|
||
--st:#e2462a;--cd:#b0573c;--fw:#14907e;--rw:#6d86a3;--cws:#1f84e0;--cwr:#4f9be0;--pri:#2468b0;--prw:#7b5cc0;--hr:#d48600;--bd:#8e6a8a;--fl:#7a8494}
|
||
*{box-sizing:border-box;margin:0;padding:0}
|
||
body{background:var(--bg);color:var(--fg);font:14px/1.5 -apple-system,"Segoe UI",Roboto,Arial,sans-serif}
|
||
header{display:flex;flex-wrap:wrap;gap:8px 16px;align-items:center;padding:10px 16px;background:var(--card);border-bottom:1px solid var(--stroke);position:sticky;top:0;z-index:2}
|
||
h1{font-size:16px;font-weight:600}h1 span{color:var(--mute);font-weight:400}
|
||
.ctl{display:flex;flex-wrap:wrap;gap:6px;margin-left:auto}
|
||
button{background:var(--head);color:var(--fg);border:1px solid var(--stroke);border-radius:4px;padding:4px 10px;font-size:12px;cursor:pointer}
|
||
button.on{border-color:var(--sel);box-shadow:inset 0 0 0 1px var(--sel)}
|
||
main{display:grid;grid-template-columns:minmax(0,1fr) 360px;gap:12px;padding:12px 16px}
|
||
.card{background:var(--card);border:1px solid var(--stroke);border-radius:6px;padding:10px 14px;min-width:0}
|
||
.card h2{font-size:14px;margin-bottom:6px}.card h3{font-size:11px;color:var(--mute);text-transform:uppercase;letter-spacing:.06em;margin:8px 0 2px}
|
||
.card p,.card li{font-size:13px}.card ul{padding-left:18px}
|
||
.wrap{overflow-x:auto}
|
||
svg{display:block;width:100%;min-width:1100px;height:auto}
|
||
.side{display:flex;flex-direction:column;gap:12px;min-width:0}
|
||
table{border-collapse:collapse;width:100%;font-size:12.5px}
|
||
td,th{border-bottom:1px solid var(--stroke);padding:3px 6px;text-align:left;vertical-align:top}
|
||
th{color:var(--mute);font-weight:600}
|
||
td.n{font-family:var(--mono)}
|
||
td.pc{white-space:nowrap}
|
||
.card td,.card p,.card li{overflow-wrap:break-word}
|
||
#caseCard table{font-size:12px}
|
||
td.low{color:var(--warn);font-weight:600}
|
||
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(420px,100%),1fr));gap:12px;padding:0 16px 16px}
|
||
.b{display:inline-block;font-size:10px;border-radius:3px;padding:0 4px;margin-left:4px;border:1px solid var(--stroke);color:var(--mute)}
|
||
.b.v{border-color:var(--ok);color:var(--ok)}.b.e{border-color:var(--warn);color:var(--warn)}
|
||
.legend{display:grid;grid-template-columns:1fr 1fr;gap:2px 14px;font-size:12.5px}
|
||
.legend i{display:inline-block;width:26px;border-top:3px solid;margin-right:6px;vertical-align:middle}
|
||
.legend i.d{border-top-style:dashed}
|
||
.tpl{display:inline-block;font:10px var(--mono);border:1.2px solid var(--mute);border-radius:7px;padding:0 5px;margin-right:6px}
|
||
.tpl.v{border-color:var(--ok)}.tpl.e{border-color:var(--warn)}.tpl.t{border-style:dashed;color:var(--mute)}
|
||
.note{color:var(--mute);font-size:12px;margin-top:6px}
|
||
@media (max-width:1100px){main{grid-template-columns:minmax(0,1fr)}.grid{grid-template-columns:minmax(0,1fr)}}
|
||
/* diagram */
|
||
.bx{fill:var(--box);stroke:var(--stroke);stroke-width:1}
|
||
.hd{fill:var(--head)}
|
||
.bt{fill:var(--ink);font-size:12px;font-weight:600}
|
||
.bl{fill:var(--fg);font:10.5px var(--mono)}
|
||
.eq{cursor:pointer}.eq:hover .bx{stroke:var(--sel)}
|
||
.eq.sel .bx{stroke:var(--sel);stroke-width:1.5}
|
||
.eq.opt .bx{stroke-dasharray:5 4}
|
||
.eq.dim{opacity:.38}
|
||
.eq.out .bx{stroke:var(--alarm);stroke-width:1.5}
|
||
.eq.out .bl:last-of-type{fill:var(--alarm)}
|
||
.p{fill:none;stroke-width:2.2;stroke-linejoin:round}
|
||
.p.st{stroke:var(--st);stroke-width:3}.p.cd{stroke:var(--cd);stroke-dasharray:7 4}.p.fw{stroke:var(--fw)}.p.rw{stroke:var(--rw)}
|
||
.p.cws{stroke:var(--cws);stroke-width:2.6}.p.cwr{stroke:var(--cwr);stroke-dasharray:7 4}.p.pri{stroke:var(--pri)}.p.prw{stroke:var(--prw);stroke-dasharray:7 4}
|
||
.p.hr{stroke:var(--hr);stroke-width:2.6}.p.fg{stroke:var(--fl);stroke-width:3;stroke-dasharray:1 4;stroke-linecap:round}.p.bd{stroke:var(--bd);stroke-dasharray:3 3}.p.opt{stroke-dasharray:3 5;opacity:.8}
|
||
.ar{stroke:none}.ar.st{fill:var(--st)}.ar.cd{fill:var(--cd)}.ar.cws{fill:var(--cws)}.ar.cwr{fill:var(--cwr)}.ar.pri{fill:var(--pri)}.ar.prw{fill:var(--prw)}.ar.hr{fill:var(--hr)}.ar.fw{fill:var(--fw)}
|
||
.vv{fill:var(--card);stroke:var(--fg);stroke-width:1.2}
|
||
.trap{fill:var(--card);stroke:var(--cd);stroke-width:1.4}
|
||
.tt{fill:var(--fg);font:bold 7px var(--mono);text-anchor:middle}
|
||
.ib{fill:var(--card);stroke:var(--mute);stroke-width:1.2}
|
||
.lead{stroke:var(--mute);stroke-width:1;stroke-dasharray:2 2}
|
||
.lane{fill:var(--mute);font-size:10.5px;font-weight:600;letter-spacing:.14em}
|
||
.lbl{fill:var(--mute);font-size:9.5px;paint-order:stroke;stroke:var(--card);stroke-width:3px;stroke-linejoin:round}
|
||
.tp rect{fill:var(--card);stroke:var(--mute);stroke-width:1.2}.tp text{fill:var(--ink);font:9px var(--mono)}
|
||
.tp.v rect{stroke:var(--ok)}.tp.e rect{stroke:var(--warn)}.tp.t rect{stroke-dasharray:3 2}.tp.t text{fill:var(--mute)}.tp.dim{opacity:.38}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<header>
|
||
<h1>CNX Vinyl <span>· Steam and cooling plant · five-press fleet · proposed concept</span></h1>
|
||
<div class="ctl" id="cases">
|
||
<button data-case="launch">Launch</button>
|
||
<button data-case="d1">Duplex system 1</button>
|
||
<button data-case="full" class="on">Start fleet, 5 presses</button>
|
||
<button data-case="down">One module down</button>
|
||
<button id="themeBtn" title="Switch light / dark mode">☀</button>
|
||
</div>
|
||
</header>
|
||
<main>
|
||
<div class="card">
|
||
<div class="wrap">
|
||
<svg id="svg" viewBox="0 0 1800 1000" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Steam and process cooling diagram">
|
||
<g id="gPipe"></g><g id="gSym"></g><g id="gBox"></g><g id="gTxt"></g><g id="gTmp"></g>
|
||
</svg>
|
||
</div>
|
||
<p class="note">Concept for the RFQs, not a construction drawing. Machine figures are Newbilt's published site requirements per press, extruder and hydraulic unit; boiler and chiller banks, tank sizes and pump duties are this repository's proposals and estimates until vendors quote. Click any piece of equipment.</p>
|
||
</div>
|
||
<div class="side">
|
||
<div class="card" id="caseCard"></div>
|
||
<div class="card" id="detail"><h2>Click any equipment</h2><p>Each box explains what it does, the figures behind it with their source, and what the RFQ still has to settle. The buttons above switch between operating cases: which presses run, which modules are installed, and whether the plant covers the demand.</p></div>
|
||
</div>
|
||
</main>
|
||
<div class="grid">
|
||
<div class="card">
|
||
<h2>Design basis</h2>
|
||
<table>
|
||
<tr><th>Item</th><th>Figure</th><th>Source</th></tr>
|
||
<tr><td>Fleet</td><td>2 Duplex systems (4 HRP 12, 2 EX 50, 2 EX 35) + 1 Classic with built-in extruder; one central hydraulic and one air plant</td><td>pressing-line.md<span class="b">doc</span></td></tr>
|
||
<tr><td>Steam per press</td><td class="n">150 to 180 kg/h, min. 10 bar, 9.5 to 10.5 bar operating</td><td>Newbilt site requirements 3.2.3<span class="b v">vendor</span></td></tr>
|
||
<tr><td>Press cooling water</td><td class="n">up to 100 l/min, ~53 l/min used, in 20 to 25 °C at 10 bar, out ~60 °C, max. 2 bar (open)</td><td>site requirements 3.2.2<span class="b v">vendor</span></td></tr>
|
||
<tr><td>Press cooling capacity</td><td class="n">up to 125 kW per press, by cycle time</td><td>site requirements 3.2.2<span class="b v">vendor</span></td></tr>
|
||
<tr><td>Extruder cooling</td><td class="n">~4 l/min, 2 to 3 kW, in 20 to 25 °C, 5 to 10 bar</td><td>site requirements 3.3.3<span class="b v">vendor</span></td></tr>
|
||
<tr><td>Hydraulic oil cooler</td><td class="n">~8 l/min, up to 5 kW per aggregate (2.5 kW per press)</td><td>site requirements 3.4.2<span class="b v">vendor</span></td></tr>
|
||
<tr><td>Cooling water quality</td><td class="n">7 to 8 °dH, pH 7 to 9, ≤ 200 µm, ≤ 500 µS/cm, Cl ≤ 20 mg/l</td><td>site requirements 3.1.2<span class="b v">vendor</span></td></tr>
|
||
<tr><td>Classic</td><td>counted as one HRP 12 + one extruder; Toolex Alpha cross-check 1.2 kg steam, 15 l water per cycle</td><td>fleet calculator<span class="b e">estimate</span></td></tr>
|
||
<tr><td>Five presses, full demand</td><td class="n">steam 750 to 900 kg/h · cooling 652.5 kW · water 305 to 540 l/min</td><td>sum of the above<span class="b">doc</span></td></tr>
|
||
<tr><td>Chiller electrical input</td><td class="n">~80 to 125 kW per 250 kW of cooling (air-cooled, hot season)</td><td>scale.md<span class="b e">estimate</span></td></tr>
|
||
<tr><td>Electric boiler alternative</td><td class="n">~0.68 kWh per kg of steam at 98 %</td><td>fleet calculator<span class="b e">estimate</span></td></tr>
|
||
<tr><td>Annual steam heat</td><td class="n">~1,170 MWh at 1.0 M records, ~1,750 MWh at the start fleet's full ~1.5 M</td><td>fleet calculator, biomass.md<span class="b e">estimate</span></td></tr>
|
||
</table>
|
||
<p class="note">Circulating water is not consumption: the loop recirculates. Boiler make-up is about 0.75 to 0.9 m³/h before condensate return, much less with it.</p>
|
||
</div>
|
||
<div class="card">
|
||
<h2>Equipment schedule (proposed)</h2>
|
||
<table>
|
||
<tr><th>Tag</th><th>Item</th><th>Duty</th><th>Phase</th><th>Status</th></tr>
|
||
<tr><td>WT-1</td><td>Duplex softener, dosing</td><td class="n">~1.0 to 1.2 m³/h</td><td>launch</td><td>estimate</td></tr>
|
||
<tr><td>T-1</td><td>Feed tank / hotwell</td><td class="n">~1.5 m³, 90 to 95 °C</td><td>launch</td><td>estimate</td></tr>
|
||
<tr><td>P-1</td><td>Feed pumps, duty/standby</td><td class="n">~1 m³/h, ~13 bar</td><td>launch</td><td>estimate</td></tr>
|
||
<tr><td>B-1, B-2</td><td>Boiler modules, lead/lag</td><td class="n">2 × 500 kg/h, 10.5 bar</td><td>B-1 launch, B-2 with Duplex 2</td><td>proposal</td></tr>
|
||
<tr><td>B-3</td><td>Third module for N+1</td><td class="n">500 kg/h</td><td>option</td><td>RFQ option</td></tr>
|
||
<tr><td>ECON-1</td><td>Flue-gas economizer, fired boilers</td><td class="n">feed in 90 to 95 °C, out by vendor</td><td>with a fired bank</td><td>1st measure</td></tr>
|
||
<tr><td>ACC-1</td><td>Steam accumulator</td><td class="n">by cycle overlap</td><td>option</td><td>Newbilt option</td></tr>
|
||
<tr><td>HP-1</td><td>Heat-recovery heat pump</td><td class="n">feed tank to 90 to 95 °C</td><td>if it pays</td><td>3rd measure</td></tr>
|
||
<tr><td>CH-1 to CH-3</td><td>Air-cooled chillers at 40 °C ambient</td><td class="n">3 × 250 kW</td><td>one per press stage</td><td>proposal</td></tr>
|
||
<tr><td>CH-4</td><td>Fourth module for N+1</td><td class="n">250 kW</td><td>option</td><td>RFQ option</td></tr>
|
||
<tr><td>HX-1</td><td>Plate heat exchanger</td><td class="n">~650 kW, ~2 K approach</td><td>launch, sized for 5</td><td>estimate</td></tr>
|
||
<tr><td>TK-3, TK-2</td><td>Warm return / cold buffer tanks</td><td class="n">~5 m³ each</td><td>launch</td><td>estimate</td></tr>
|
||
<tr><td>P-2, P-3, P-4</td><td>Transfer, VFD supply, primary pumps</td><td class="n">up to ~540 l/min</td><td>launch, staged</td><td>estimate</td></tr>
|
||
<tr><td>TC-1</td><td>Dry cooler ahead of HX-1</td><td class="n">~650 to 750 kW reject</td><td>option</td><td>RFQ option</td></tr>
|
||
<tr><td>GC</td><td>Galvanics cooling, separate</td><td class="n">12 to 20 °C, 10 L/min per PDPU</td><td>phase 5</td><td>open</td></tr>
|
||
</table>
|
||
</div>
|
||
<div class="card">
|
||
<h2>Open for the RFQs</h2>
|
||
<h3>Newbilt (re-quote)</h3>
|
||
<ul>
|
||
<li>Classic: steam, cooling, power, weight; can it run from the central hydraulic plant?</li>
|
||
<li>Press return temperature over the cycle: 53 l/min at ~60 °C out of 20 to 25 °C is ~140 kW, more than the stated 125 kW peak. The real profile sizes HP-1, HX-1 and TC-1.</li>
|
||
<li>Is the accumulator needed with a modular boiler bank, and how big?</li>
|
||
<li>Condensate: the 2024 offer has one steam/water outlet valve and a steam trap per mould. How much cooling water reaches the trap per cycle, and can that condensate go back to boiler feed?</li>
|
||
</ul>
|
||
<h3>Boilers (Miura, Bangkok Industrial Boilers, STE)</h3>
|
||
<ul>
|
||
<li>2 × 500 kg/h against 3 × 500 kg/h and 1 × 1 t/h: price, footprint, lead/lag control, service from Chiang Mai.</li>
|
||
<li>Fuel: electric, biomass or LPG (sustainability.md, biomass.md); the electric bank draws ~520 to 625 kW.</li>
|
||
<li>Economizer on a fired bank: outlet feed and stack temperature, corrosion limit, pressure drop; rice husk ash is high in silica and abrasive, so fouling, cleaning, wear protection and a bypass.</li>
|
||
<li>Blowdown cooling to the effluent limit; boiler registration and licensed operator (facility-security.md).</li>
|
||
</ul>
|
||
<h3>Chillers (Trane, Carrier, Daikin Applied, Hitachi)</h3>
|
||
<ul>
|
||
<li>3 × 250 kW against 3 × 350 kW (N+1), rated at 40 °C ambient; part-load efficiency.</li>
|
||
<li>Plate heat exchanger and tanks in scope; dry cooler TC-1 as a priced option.</li>
|
||
</ul>
|
||
<h3>Site</h3>
|
||
<ul>
|
||
<li>Water analysis before either RFQ: it decides softener or RO and the loop treatment.</li>
|
||
<li>Grid: ~800 to 1,000 kVA without electric steam, 1,250 to 1,600 kVA with it (scale.md).</li>
|
||
</ul>
|
||
</div>
|
||
<div class="card">
|
||
<h2>Legend</h2>
|
||
<div class="legend">
|
||
<div><i style="border-color:var(--st)"></i>Saturated steam 10 bar</div>
|
||
<div><i class="d" style="border-color:var(--cd)"></i>Condensate return</div>
|
||
<div><i style="border-color:var(--fw)"></i>Treated feedwater</div>
|
||
<div><i style="border-color:var(--rw)"></i>Raw / make-up water</div>
|
||
<div><i style="border-color:var(--cws)"></i>Process cooling supply 20 to 25 °C</div>
|
||
<div><i class="d" style="border-color:var(--cwr)"></i>Process cooling return, open</div>
|
||
<div><i style="border-color:var(--pri)"></i>Chiller loop, cold</div>
|
||
<div><i class="d" style="border-color:var(--prw)"></i>Chiller loop, warm</div>
|
||
<div><i style="border-color:var(--hr)"></i>Heat recovery feedwater loop</div>
|
||
<div><i class="d" style="border-color:var(--bd)"></i>Blowdown, drains</div>
|
||
<div><i class="d" style="border-color:var(--fl)"></i>Flue gas</div>
|
||
<div><span class="tpl v">°C</span>Temperature, Newbilt figure</div>
|
||
<div><span class="tpl e">°C</span>Design target or estimate</div>
|
||
<div><span class="tpl t">TBD</span>Set by the vendor or by measurement</div>
|
||
</div>
|
||
<p class="note">Dashed boxes are options. Bow-ties are isolation or control valves (a stem marks a control valve), squares strainers, T a steam trap. Circles are instruments: PT pressure, TT temperature, FT flow, AT conductivity (off-spec condensate goes to the warm tank); every one is logged to the plant data platform (digital-factory.md). Flow times supply and return temperature on each branch gives that press's cooling load; steam flow against records pressed gives steam per record.</p>
|
||
</div>
|
||
</div>
|
||
<script>
|
||
(function(){
|
||
'use strict';
|
||
const NS='http://www.w3.org/2000/svg',$=id=>document.getElementById(id);
|
||
const L={pipe:$('gPipe'),sym:$('gSym'),box:$('gBox'),txt:$('gTxt'),tmp:$('gTmp')};
|
||
function el(t,a,p,txt){const e=document.createElementNS(NS,t);for(const k in a)e.setAttribute(k,a[k]);if(txt!=null)e.textContent=txt;(p||L.box).appendChild(e);return e;}
|
||
// header band with top corners concentric with the box (rx 4, inset 1)
|
||
const headD=(x,y,w)=>`M${x+1},${y+19}V${y+4}a3,3 0 0 1 3,-3H${x+w-4}a3,3 0 0 1 3,3V${y+19}Z`;
|
||
const BOX={};
|
||
function box(id,x,y,w,h,title,lines,o){o=o||{};const g=el('g',{class:'eq'+(o.opt?' opt':''),id:'b_'+id});
|
||
el('rect',{x,y,width:w,height:h,rx:4,class:'bx'},g);el('path',{d:headD(x,y,w),class:'hd'},g);
|
||
el('text',{x:x+7,y:y+14,class:'bt'},g,title);
|
||
const t=lines.map((s,i)=>el('text',{x:x+7,y:y+32+i*13,class:'bl'},g,s));
|
||
BOX[id]={g,x,y,w,h,t,det:o.det||id};g.addEventListener('click',()=>select(id));return BOX[id];}
|
||
const pipe=(d,c)=>el('path',{d,class:'p '+c},L.pipe);
|
||
function arrow(x,y,dir,c){const s=5,P={e:`${x-s},${y-s} ${x+s},${y} ${x-s},${y+s}`,w:`${x+s},${y-s} ${x-s},${y} ${x+s},${y+s}`,
|
||
n:`${x-s},${y+s} ${x},${y-s} ${x+s},${y+s}`,s:`${x-s},${y-s} ${x},${y+s} ${x+s},${y-s}`}[dir];el('polygon',{points:P,class:'ar '+c},L.sym);}
|
||
function valve(x,y,v){el('polygon',{points:v?`${x-5},${y-6} ${x+5},${y-6} ${x-5},${y+6} ${x+5},${y+6}`:`${x-6},${y-5} ${x-6},${y+5} ${x+6},${y-5} ${x+6},${y+5}`,class:'vv'},L.sym);}
|
||
function cvalve(x,y){valve(x,y,true);el('line',{x1:x,y1:y,x2:x+10,y2:y,class:'vv'},L.sym);el('rect',{x:x+10,y:y-4,width:6,height:8,class:'vv'},L.sym);}
|
||
function strainer(x,y){el('rect',{x:x-4,y:y-4,width:8,height:8,class:'vv'},L.sym);el('line',{x1:x-4,y1:y-4,x2:x+4,y2:y+4,class:'vv'},L.sym);}
|
||
function trap(x,y){el('circle',{cx:x,cy:y,r:5.5,class:'trap'},L.sym);el('text',{x,y:y+2.5,class:'tt'},L.sym,'T');}
|
||
const BUB=[];
|
||
function bubble(x,y,tag,lx,ly){if(lx!=null)el('line',{x1:lx,y1:ly,x2:x,y2:y,class:'lead'},L.sym);el('circle',{cx:x,cy:y,r:9,class:'ib'},L.sym);el('text',{x,y:y+2.5,class:'tt'},L.sym,tag);BUB.push({x,y});}
|
||
const lbl=(x,y,s)=>el('text',{x,y,class:'lbl'},L.txt,s);
|
||
const lane=(x,y,s)=>el('text',{x,y,class:'lane'},L.txt,s);
|
||
|
||
/* ---------------- band A: steam generation */
|
||
lane(20,28,'STEAM AND CONDENSATE');
|
||
box('RW',20,70,150,64,'RW · raw water',['mains or well','analysis first']);
|
||
box('WT1',200,64,170,76,'WT-1 · treatment',['duplex softener','dosing · RO if needed','~1.0 to 1.2 m³/h']);
|
||
box('T1',400,60,170,90,'T-1 · feed tank',['condensate + make-up','held at 90 to 95 °C','~1.5 m³ (estimate)']);
|
||
box('P1',600,80,140,64,'P-1 · feed pumps',['duty / standby','~13 bar']);
|
||
box('B1',780,50,190,64,'B-1 · boiler',['500 kg/h · 10.5 bar','running'],{det:'boiler'});
|
||
box('B2',780,124,190,64,'B-2 · boiler',['500 kg/h · 10.5 bar','running'],{det:'boiler'});
|
||
box('B3',780,198,190,64,'B-3 · boiler',['500 kg/h · for N+1','RFQ option'],{opt:true});
|
||
box('SEP1',1030,120,170,64,'SEP-1 · separator',['FT-101 · PT-101','dry steam to header']);
|
||
box('BD1',1030,230,170,64,'BD-1 · blowdown',['flash, cooled to drain','safety valves vent out']);
|
||
box('ACC1',1240,40,170,64,'ACC-1 · accumulator',['option (Newbilt)','rides cycle peaks'],{opt:true});
|
||
box('HP1',400,196,170,74,'HP-1 · heat pump',['3rd measure, if it pays','feed to 90 to 95 °C','from warm press return'],{opt:true});
|
||
box('ECON1',605,196,145,76,'ECON-1 · economizer',['fired boilers only','feed in 90 to 95 °C','out, stack: vendor'],{opt:true});
|
||
pipe('M170,102 H200','rw');pipe('M370,102 H400','fw');pipe('M570,112 H600','fw');
|
||
pipe('M720,144 V196 M750,234 H765 V82 H780 M765,156 H780','fw');pipe('M765,234 H780','fw opt');pipe('M740,112 H765','fw opt');arrow(720,172,'s','fw');
|
||
pipe('M820,262 V286 H700 V272','fg');lbl(704,300,'flue gas from the boilers');
|
||
pipe('M970,82 H1000 V156 M970,156 H1000 M1000,152 H1030','st');pipe('M970,230 H1000 V156','st opt');
|
||
pipe('M970,104 H985 M970,178 H985 M985,104 V250 H1030','bd');pipe('M1200,262 H1240','bd');lbl(1246,266,'to drain, cooled');
|
||
pipe('M1325,104 V152','st opt');
|
||
pipe('M450,150 V196 M520,196 V150','hr');arrow(450,176,'s','hr');arrow(520,170,'n','hr');lbl(458,177,'feed loop');
|
||
pipe('M1200,152 H1740 V350 H620','st');arrow(1500,152,'e','st');arrow(1740,250,'s','st');arrow(1150,350,'w','st');
|
||
lbl(1430,172,'steam main 10 bar · insulated · falls with the flow');
|
||
|
||
/* ---------------- band B: consumers */
|
||
lane(20,336,'CONSUMERS · FIVE PRESSES, EXTRUDERS, HYDRAULICS');
|
||
lbl(700,340,'steam header, branch from top');
|
||
const PR=[['D1A','D1-A · HRP 12','Duplex 1 · EX 50 + EX 35'],['D1B','D1-B · HRP 12','Duplex 1 · shared extruders'],
|
||
['D2A','D2-A · HRP 12','Duplex 2 · EX 50 + EX 35'],['D2B','D2-B · HRP 12','Duplex 2 · shared extruders'],['C1','C · Classic, automatic','built-in extruder']];
|
||
PR.forEach(([id,t,s],i)=>{const px=640+i*220,c=id==='C1';
|
||
box(id,px,420,190,120,t,[s,c?'steam 150 to 180 (est.)':'steam 150 to 180 kg/h',c?'cooling ≤ 125 kW (est.)':'cooling ≤ 125 kW',c?'water ≤ 100 l/min (est.)':'water 53 to 100 l/min','running'],{det:c?'classic':'press'});
|
||
pipe(`M${px+40},350 V420`,'st');valve(px+40,364,true);strainer(px+40,382);cvalve(px+40,402);bubble(px+72,390,'PT',px+56,398);
|
||
pipe(`M${px+50},540 V580`,'cd');trap(px+50,558);
|
||
pipe(`M${px+130},650 V540`,'cws');valve(px+130,600,true);
|
||
pipe(`M${px+160},540 V690`,'cwr');valve(px+160,566,true);bubble(px+180,598,'FT',px+160,598);bubble(px+180,622,'TT',px+160,622);});
|
||
pipe('M620,350 V580','cd');trap(620,372);pipe('M1740,350 V580','cd');trap(1740,372);
|
||
pipe('M1740,580 H590 V135 H570','cd');arrow(1110,580,'w','cd');lbl(642,598,'condensate return to T-1');bubble(566,430,'AT',590,430);
|
||
box('EX1',30,400,180,76,'EX · extruder cooling',['~4 l/min · 2 to 3 kW each','2 EX 50, 2 EX 35, Classic']);
|
||
box('HY1',230,400,180,76,'HY · oil cooler',['central hydraulic plant','~8 l/min per aggregate']);
|
||
pipe('M90,650 V476 M270,650 V476','cws');pipe('M170,476 V690 M350,476 V690','cwr');
|
||
|
||
/* ---------------- band C: process cooling */
|
||
lane(20,624,'PROCESS COOLING');
|
||
pipe('M60,650 H1700','cws');arrow(1550,650,'e','cws');lbl(835,644,'supply, ~10 bar');
|
||
pipe('M1700,690 H115 V760','cwr');arrow(1550,690,'w','cwr');lbl(835,706,'return, open, ≤ 2 bar');bubble(140,725,'TT',115,725);
|
||
box('TK3',30,760,170,76,'TK-3 · warm tank',['open, vented return','~5 m³ (estimate)']);
|
||
box('P2',230,770,150,56,'P-2 · pumps',['duty / standby','constant flow']);
|
||
box('WT2',290,880,170,64,'WT-2 · loop treatment',['side-stream filter','dosing · make-up']);
|
||
box('GC1',30,880,240,76,'GC · galvanics cooling',['separate: 12 to 20 °C, 5 bar','10 L/min per PDPU','own chiller or HX branch'],{opt:true});
|
||
box('TC1',560,860,170,64,'TC-1 · dry cooler',['option, ahead of HX-1','when ambient allows'],{opt:true});
|
||
box('HX1',760,760,170,76,'HX-1 · plate HX',['separates chiller loop','process side open','approach ~2 K (est.)']);
|
||
box('TK2',960,760,160,76,'TK-2 · cold tank',['buffer, 20 to 25 °C','~5 m³ (estimate)']);
|
||
box('P3',1150,770,150,56,'P-3 · supply',['VFD duty / standby','~10 bar at presses']);
|
||
box('P4',1150,860,150,56,'P-4 · primary',['duty / standby','constant flow']);
|
||
[['CH1',712],['CH2',776],['CH3',840],['CH4',904]].forEach(([id,y])=>box(id,1380,y,190,56,id.replace('CH','CH-')+' · chiller',
|
||
id==='CH4'?['250 kW · for N+1','RFQ option']:['250 kW · air-cooled','running'],id==='CH4'?{opt:true}:{det:'chiller'}));
|
||
box('AS1',1625,900,160,56,'AS-1 · air separator',['expansion vessel','pressurised, closed']);
|
||
pipe('M200,798 H230','cwr');pipe('M380,798 H440 V270','cwr');pipe('M530,270 V798 H760','cwr');arrow(440,560,'n','cwr');arrow(530,560,'s','cwr');
|
||
pipe('M410,880 V798','cwr');pipe('M600,798 V860 M690,860 V798','cwr opt');
|
||
pipe('M930,798 H960 M1120,798 H1150 M1225,770 V650','cws');
|
||
bubble(1258,712,'PT',1225,712);bubble(1258,738,'TT',1225,738);bubble(1192,725,'FT',1225,725);
|
||
pipe('M1380,730 H1350 M1380,794 H1350 M1380,858 H1350 M1350,730 V888 H1300 M1150,888 H900 V836','pri');pipe('M1380,922 H1350 V870','pri opt');arrow(1050,888,'w','pri');
|
||
pipe('M800,836 V975 H1600 V750 H1570 M1600,814 H1570 M1600,878 H1570 M1600,928 H1625','prw');pipe('M1600,942 H1570','prw opt');arrow(1200,975,'e','prw');
|
||
lbl(1000,992,'chiller loop, closed and clean');
|
||
|
||
/* ---------------- temperatures: v = Newbilt figure, e = design target or estimate, t = to be set */
|
||
function temp(x,y,txt,k){const g=el('g',{class:'tp '+k},L.tmp);const r=el('rect',{x,y,height:13,rx:6.5},g);
|
||
const t=el('text',{x:x+4,y:y+9.5},g,txt);r.setAttribute('width',(t.getBBox().width+8).toFixed(1));return g;}
|
||
temp(20,141,'~28 to 30 °C','e'); // raw water: ground temperature
|
||
temp(600,151,'feed 90 to 95 °C','e'); // feed tank to the boilers
|
||
temp(528,163,'≤ 95 °C','e'); // heat pump feed loop back to T-1
|
||
temp(1215,133,'10 bar · ~180 °C','v'); // steam main
|
||
temp(950,331,'~180 °C','v'); // steam header to the presses
|
||
temp(596,296,'≤ 100 °C','e'); // condensate after the traps, atmospheric return
|
||
const PRT={};PR.forEach(([id],i)=>{PRT[id]=temp(640+i*220+193,616,'~60 °C','v');}); // press outlets
|
||
temp(176,560,'≤ 35 °C','e'); // extruder returns
|
||
temp(356,560,'≤ 35 °C','v'); // oil cooler return: supply + max 10 K
|
||
temp(446,470,'≤ 60 °C','e'); // heat pump source in
|
||
temp(536,470,'TBD','t'); // heat pump source out
|
||
temp(915,634,'20 to 25 °C','v'); // supply header
|
||
temp(945,699,'up to ~60 °C','e'); // return header, mixed
|
||
temp(153,718,'mixed, TBD','t'); // warm tank
|
||
temp(960,893,'~18 to 23 °C','e'); // chiller loop to HX-1
|
||
temp(1240,957,'TBD','t'); // chiller loop return
|
||
|
||
/* ---------------- details */
|
||
const D={
|
||
RW:{t:'RW · Raw water',w:'Mains or well water feeds the boiler make-up and the cooling loop make-up. Which one depends on the site, and the water analysis decides how much treatment both need.',f:['Boiler make-up ~0.75 to 0.9 m³/h at full output before condensate return, far less with it (estimate)','Cooling make-up is small: the chillers are closed, losses are the open return tank and side-stream blowdown','Raw water ~28 to 30 °C: the ground sits at 28 to 30 °C year-round (sustainability.md, estimate)'],q:['Water analysis (hardness, silica, TDS, chloride) for the site, before the boiler and chiller RFQs']},
|
||
WT1:{t:'WT-1 · Boiler feedwater treatment',w:'A duplex softener (one regenerates while the other works) and chemical dosing (oxygen scavenger, pH) protect the boilers. RO only if the analysis demands low TDS; it is an option row, not the baseline.',f:['Duplex softener 120k to 300k THB, sized up for the five-press fleet (utilities CSV, market estimate)','RO skid 200k to 500k THB, option only (utilities CSV)'],q:['Softener alone or softener plus RO, after the water analysis']},
|
||
T1:{t:'T-1 · Feed tank and hotwell',w:'Collects the condensate returning from the presses and the treated make-up, warmed by HP-1, and holds the feedwater at 90 to 95 °C so little oxygen stays dissolved. The boiler then only does the final lift to 180 °C.',f:['Feedwater at 90 to 95 °C and the boiler only doing the final lift (sustainability.md)','Heat recovery plus condensate return save roughly 10 to 15 % of steam energy (sustainability.md)','~1.5 m³, about 1.5 h of feed at full output (estimate); level LT logged','Condensate leaves each trap near saturation (~180 °C at the press) and flashes to about 100 °C in the atmospheric return (estimate); the flash steam is heat that could be recovered','Steam and cooling water share the mould channels, with one outlet valve and steam trap per mould (Newbilt offer 240620-04): the condensate is only as clean as the cooling loop, so AT conductivity on the return diverts off-spec condensate to the warm tank (proposal)','Order of heat recovery for the feedwater: flue-gas economizer, condensate return, then HP-1 (sustainability.md)'],q:['Atmospheric hotwell or pressurised deaerator: boiler vendor\'s call at this size']},
|
||
P1:{t:'P-1 · Boiler feed pumps',w:'Duty and standby multistage pumps feed every boiler module through one manifold, so a pump failure never stops steam.',f:['~1 m³/h each against ~13 bar (estimate, above the 10.5 bar boiler pressure)'],q:['Supplied with the boiler bank or separately']},
|
||
boiler:{t:'B-1 and B-2 · Boiler modules, 500 kg/h each',w:'Two modules run lead and lag at ~10.5 bar so the presses see 9.5 to 10.5 bar after the line. B-1 comes with the launch press and covers all of Duplex system 1 (300 to 360 kg/h); B-2 comes with Duplex system 2 and also carries the Classic. Fuel is open: electric, biomass or LPG.',f:['Newbilt: 150 to 180 kg/h per press, Duplex up to 360 kg/h, min. 10 bar, 9.5 to 10.5 bar operating (site requirements 3.2.3, vendor)','Five presses: 750 to 900 kg/h, against 1,000 kg/h installed (111 to 133 %)','The 2024 Newbilt quote excludes a ~400 kg/h steam generator: one Duplex system (pressing-line.md)','Electric alternative ~350 kW input per module, 520 to 625 kW at full demand (0.68 kWh/kg at 98 %, estimate)','With one module down, 500 kg/h runs about three presses','Boiler bank 4.5M to 7M THB installed (utilities CSV, estimate)'],q:['2 × 500 kg/h against 3 × 500 kg/h (B-3) and a single 1 t/h boiler: price, footprint, the cost of a lost shift','Fuel decision (biomass.md, sustainability.md)','Service response from Chiang Mai: the candidates are Bangkok-based']},
|
||
ECON1:{t:'ECON-1 · Flue-gas economizer (fired boilers)',w:'On a fired boiler bank (biomass such as rice husk, or LPG) the flue gas leaves hot. An economizer between the feed pumps and the boilers recovers part of that heat into the feedwater: the first of the three heat-recovery measures to investigate. An electric boiler has no flue gas and runs on the bypass.',f:['Feedwater in at 90 to 95 °C from T-1 (sustainability.md)','Outlet feed and stack temperatures are vendor figures: how far the gas can be cooled depends on its temperature and the corrosion limit','The gas-fired package row in the utilities CSV already includes an economizer; the biomass row does not yet'],q:['Outlet feed and stack temperature, pressure drop, corrosion limit','Rice husk ash is high in silica and abrasive: fouling, cleaning, wear protection and a bypass']},
|
||
B3:{t:'B-3 · Third boiler module (option)',w:'A third 500 kg/h module keeps all five presses running with any one module out. Without it a boiler fault costs about two presses until it is fixed.',f:['3 × 500 kg/h = 1,500 kg/h, full demand with one module out'],q:['Priced as an option in the boiler RFQ; decided against measured cycle overlap and the cost of a lost shift']},
|
||
BD1:{t:'BD-1 · Blowdown vessel and safety-valve discharge',w:'Boiler blowdown and drains flash in a vessel; the flash steam vents outside, the water is cooled before it reaches the drain. Safety valves discharge to a safe place outside the boiler hall.',f:['Boiler in its own room, Department of Industrial Works rules, licensed boiler operator (facility-security.md)','Detached boiler hall of ~66 m² with a 14 m flue (scale.md)'],q:['Drain temperature and quality against the industrial effluent limit']},
|
||
SEP1:{t:'SEP-1 · Separator and steam metering',w:'Removes entrained water so the moulds get dry steam. FT-101 and PT-101 log steam flow and pressure: steam per record pressed becomes a plant KPI next to the traceability record.',f:['Telegraf/MQTT acquisition into the plant data platform (digital-factory.md)','Saturated steam: Newbilt states 10 bar and 180 °C; 180 °C is saturation at 10 bar absolute, at 10 bar gauge it would be ~184 °C (to confirm which Newbilt means)'],q:['Meter type and turndown for 150 to 1,000 kg/h']},
|
||
ACC1:{t:'ACC-1 · Steam accumulator (option)',w:'Each press draws steam in bursts during its steam phase. An accumulator rides those peaks so the boilers see a steadier load. It does not add capacity: the bank must still cover the hourly demand.',f:['Already a Newbilt option (sustainability.md)'],q:['Needed at all with two modules? Size from the presses\' cycle overlap (Newbilt re-quote)']},
|
||
HP1:{t:'HP-1 · Heat-recovery heat pump',w:'Third of the three heat-recovery measures for the feedwater, after the flue-gas economizer and condensate return. A water-to-water heat pump takes heat from the warm press return before it reaches the chillers and heats the feed tank. It runs only where the tank still needs heat, the press return has enough of it, and the combined saving on boiler fuel and chiller power beats its own electricity. With most condensate returned the remaining tank load is small, so HP-1 may not pay.',f:['Press return ~60 °C, feedwater 90 to 95 °C, 10 to 15 % steam saving with condensate return (sustainability.md)','Heating all make-up from 20 to 90 °C at full output is only ~70 kW thermal, small against ~650 kW of cooling (estimate)','Source side in up to ~60 °C from the return header, out set by the heat pump vendor; feed loop back to T-1 at up to 95 °C (sustainability.md)','About 15 % of the condensate flashes to steam when it drops from ~180 °C to atmospheric pressure (estimate); with the rest returned the feed tank needs only a fraction of the ~70 kW'],q:['Real return temperature profile from Newbilt: it sets the heat pump\'s lift and COP','Second use for recovered heat: label oven, HVAC reheat (sustainability.md)']},
|
||
press:{t:'Duplex presses · HRP 12 (Newbilt)',w:'Each press takes steam from the top of the header through an isolation valve, strainer and control valve, with its own pressure transmitter, and returns condensate through its own trap. Cooling water comes from the 10 bar supply header and drains open to the warm tank; flow and return temperature on each branch give that press\'s cooling load.',f:['Steam 150 to 180 kg/h, min. 10 bar, G 1 connection (site requirements 3.2.3, vendor)','Cooling water up to 100 l/min, ~53 l/min used, in 20 to 25 °C at 10 bar, out max. 2 bar open, average outlet ~60 °C, up to 125 kW (site requirements 3.2.2, vendor)','Water quality 7 to 8 °dH, pH 7 to 9, particles ≤ 200 µm, ≤ 500 µS/cm (site requirements 3.1.2, vendor)'],q:['53 l/min warming from 20 to 25 °C to ~60 °C is ~140 kW, above the stated 125 kW peak: ask for the measured return profile over a cycle']},
|
||
classic:{t:'Classic · automatic press (Newbilt)',w:'Fully automatic, with its own extruder. Newbilt has published no steam, cooling or power figures, so it is drawn and counted as one HRP 12 press plus one extruder.',f:['Toolex Alpha leaflet (the Classic\'s base): 1.2 kg steam and 15 l cooling water per cycle, ~144 kg/h of steam at 2 cycles a minute (fleet calculator, cross-check)','Monitors steam temperature, cooling water temperature and flow; cooling by time or delivered volume (2024 flyer)'],q:['Steam, cooling, power and weight for the re-quote; whether it runs from the central hydraulic plant']},
|
||
EX1:{t:'EX · Extruder cooling',w:'Every extruder needs a little cooling water at the same 20 to 25 °C. The EX 35 and the Classic\'s built-in extruder are counted like the EX 50 until Newbilt states theirs.',f:['~4 l/min, 2 to 3 kW, in 20 to 25 °C at 5 to 10 bar, outlet nearly without pressure (site requirements 3.3.3, vendor)','Five extruders at the start fleet: ~20 l/min, ~15 kW','Outlet ~30 to 35 °C: 2 to 3 kW at 4 l/min is a 7 to 11 K rise (estimate)'],q:['EX 35 and Classic extruder cooling figures']},
|
||
HY1:{t:'HY · Hydraulic oil cooler (central plant)',w:'The central hydraulic plant feeding all presses rejects its heat through one oil cooler on the same loop.',f:['Per aggregate ~8 l/min, ΔT max ~10 °C, up to 5 kW (site requirements 3.4.2, vendor); 2.5 kW per press in the calculator','~12.5 kW and ~20 l/min for five presses (estimate)','Outlet at most ~35 °C: supply 20 to 25 °C plus the maximum ~10 °C rise (site requirements 3.4.2)'],q:['Central plant cooler duty from Newbilt']},
|
||
TK3:{t:'TK-3 · Warm return tank',w:'Newbilt\'s press outlets run open at max. 2 bar with ideally no back pressure, so the returns drain into a vented tank instead of a pressurised header. Transfer pumps take it on through heat recovery and the heat exchanger.',f:['Outlet max. 2 bar, open system (site requirements 3.2.2, vendor)','~5 m³ (estimate); level and TT-302 logged','Mixed temperature below the ~60 °C press outlet, because the extruder and oil cooler returns are cooler; set it from the measured return profile Newbilt is asked for'],q:['Height of the return header above the tank, from the hall layout']},
|
||
P2:{t:'P-2 · Transfer pumps',w:'Duty and standby pumps move the warm return at a steady flow through HP-1, the optional dry cooler and HX-1 into the cold tank, so neither the heat exchanger nor the chillers see the presses\' flow swings.',f:['Up to ~540 l/min for five presses (estimate)'],q:[]},
|
||
TC1:{t:'TC-1 · Dry cooler (option)',w:'With returns near 40 to 60 °C, outside air removes much of the heat for most of the year before the chillers trim the rest. A hybrid of tower or dry cooler plus trim chiller is the efficiency-optimal design; the chiller is the safe choice for the hot-season wet bulb.',f:['Utilities CSV: tower + HX alternative 2M to 3.5M THB at ~650 to 750 kW reject, not in the baseline'],q:['Priced as an option with the chillers; savings against Chiang Mai weather']},
|
||
HX1:{t:'HX-1 · Plate heat exchanger',w:'Separates the open process side (air and dust get in at the warm tank) from the closed, clean chiller loop, so the chiller evaporators never see dirty, oxygenated water.',f:['~650 kW at ~2 K approach (estimate)'],q:['Single or two plates for maintenance without stopping production']},
|
||
TK2:{t:'TK-2 · Cold buffer tank',w:'Holds water at 20 to 25 °C between the steady chiller side and the bursty presses: overlapping cooling phases draw from the tank, and the chillers do not short-cycle.',f:['Newbilt inlet 20 to 25 °C (site requirements 3.2.2, vendor)','~5 m³ (estimate)'],q:[]},
|
||
P3:{t:'P-3 · Supply pumps',w:'Variable-speed duty and standby pumps hold ~10 bar at the press inlets however many presses run. PT-301, TT-301 and FT-301 log the supply.',f:['Press inlet 10 bar, extruders and oil cooler 5 to 10 bar (site requirements, vendor)','Up to ~540 l/min for five presses (estimate)'],q:[]},
|
||
P4:{t:'P-4 · Primary pumps',w:'Duty and standby pumps circulate the closed chiller loop between the chiller bank and HX-1.',f:['Sized with the chiller bank (estimate)'],q:[]},
|
||
chiller:{t:'CH-1 to CH-3 · Air-cooled chillers, 250 kW each',w:'Three modules phased with the presses: CH-1 with the launch press and Duplex system 1, CH-2 with system 2, CH-3 with the Classic. Rated at 40 °C ambient, because Chiang Mai\'s April afternoons are when all presses cool hardest.',f:['Five presses up to 652.5 kW (625 presses, 15 extruders, 12.5 hydraulics) against 750 kW installed (115 %)','Electrical input ~80 to 125 kW per 250 kW: ~210 to 325 kW at the peak (scale.md, estimate)','One 250 kW module matches the ~250 kW cooling system the 2024 quote excludes for one Duplex (pressing-line.md)','Chiller bank 6.5M to 10.5M THB installed with HX, tanks and pumps (utilities CSV, estimate)','Chiller loop to HX-1 ~18 to 23 °C for a 20 to 25 °C process supply at a ~2 K approach (estimate); its return temperature comes with the chiller selection'],q:['3 × 250 kW against 3 × 350 kW for N+1; part-load efficiency; derating at 40 °C']},
|
||
CH4:{t:'CH-4 · Fourth chiller (option)',w:'Without it one chiller out leaves 500 kW, ~77 % of the peak: the cold tank and the presses\' cycle diversity carry most hours, not the hottest afternoons. A fourth module, or 3 × 350 kW, makes it N+1.',f:['4 × 250 kW = 1,000 kW'],q:['Priced as an option']},
|
||
AS1:{t:'AS-1 · Air and dirt separator, expansion vessel',w:'Keeps the closed chiller loop pressurised and free of air and debris.',f:[],q:[]},
|
||
WT2:{t:'WT-2 · Loop treatment',w:'The open return tank picks up air and dust, so side-stream filtration and dosing keep the process water inside Newbilt\'s limits. Make-up comes softened from WT-1.',f:['7 to 8 °dH, pH 7 to 9, particles ≤ 200 µm, ≤ 500 µS/cm, chlorine ≤ 20 mg/l (site requirements 3.1.2, vendor)','200k to 500k THB (utilities CSV, estimate)'],q:[]},
|
||
GC1:{t:'GC · Galvanics cooling (separate circuit)',w:'The Pheenix PDPU wants colder water than the presses and very little of it, so it does not share the press loop: either a small dedicated chiller or a separately controlled branch through its own heat exchanger. Phase 5.',f:['PDPU: 12 to 20 °C at 5 bar, 10 L/min through its titanium coil (galvanics.md, vendor)','OMS thinks passive cooling may do; open whether that holds above 30 °C ambient (galvanics.md)'],q:['Galvanics vendor\'s final requirement; HVAC for the clean room is separate']},
|
||
};
|
||
const CASES={
|
||
launch:{t:'Launch',s:'One press (Newbilt Single 2.1, the first half of Duplex system 1)',P:['D1A'],E:1,B:['B1'],C:['CH1'],out:[],ex:'EX 50'},
|
||
d1:{t:'Duplex system 1',s:'Two presses on the EX 50 with the EX 35 for colour',P:['D1A','D1B'],E:2,B:['B1'],C:['CH1'],out:[],ex:'EX 50 + EX 35'},
|
||
full:{t:'Start fleet, five presses',s:'Two Duplex systems and the Classic, all cooling on a hot afternoon',P:['D1A','D1B','D2A','D2B','C1'],E:5,B:['B1','B2'],C:['CH1','CH2','CH3'],out:[],ex:'2 EX 50, 2 EX 35, Classic'},
|
||
down:{t:'One module down',s:'Start fleet with B-2 and CH-2 out at once (worst-case drill)',P:['D1A','D1B','D2A','D2B','C1'],E:5,B:['B1'],C:['CH1','CH3'],out:['B2','CH2'],ex:'2 EX 50, 2 EX 35, Classic'}};
|
||
const f0=v=>Math.round(v).toLocaleString('en-US');
|
||
function setCase(k){const c=CASES[k];
|
||
document.querySelectorAll('#cases [data-case]').forEach(b=>b.classList.toggle('on',b.dataset.case===k));
|
||
PR.forEach(([id])=>{const on=c.P.includes(id);BOX[id].g.classList.toggle('dim',!on);BOX[id].t[4].textContent=on?'running':'not yet installed';});
|
||
['B1','B2'].forEach(id=>{const out=c.out.includes(id),on=c.B.includes(id);BOX[id].g.classList.toggle('out',out);BOX[id].g.classList.toggle('dim',!on&&!out);
|
||
BOX[id].t[1].textContent=out?'OUT (fault drill)':on?'running':'with Duplex 2';});
|
||
['CH1','CH2','CH3'].forEach(id=>{const out=c.out.includes(id),on=c.C.includes(id);BOX[id].g.classList.toggle('out',out);BOX[id].g.classList.toggle('dim',!on&&!out);
|
||
BOX[id].t[1].textContent=out?'OUT (fault drill)':on?'running':'later stage';});
|
||
BOX.EX1.t[1].textContent=c.ex;
|
||
PR.forEach(([id])=>PRT[id].classList.toggle('dim',!c.P.includes(id)));
|
||
const P=c.P.length,E=c.E,st=[150*P,180*P],cool=125*P+3*E+2.5*P,fl=[53*P+4*E+4*P,100*P+4*E+4*P];
|
||
const bc=500*c.B.length,cc=250*c.C.length,pc=(a,b)=>Math.round(100*a/b);
|
||
const stLo=bc<st[1],ccLo=cc<cool;
|
||
$('caseCard').innerHTML=`<h2>${c.t}</h2><p>${c.s}.</p><table>
|
||
<tr><th></th><th>Demand</th><th>Installed</th><th>Covers</th></tr>
|
||
<tr><td>Steam, kg/h</td><td class="n">${f0(st[0])} to ${f0(st[1])}</td><td class="n">${f0(bc)}</td><td class="n pc${stLo?' low':''}">${pc(bc,st[1])} to ${pc(bc,st[0])} %</td></tr>
|
||
<tr><td>Cooling peak, kW</td><td class="n">${f0(cool)}</td><td class="n">${f0(cc)}</td><td class="n pc${ccLo?' low':''}">${pc(cc,cool)} %</td></tr>
|
||
<tr><td>Circulating water</td><td class="n" colspan="3">${f0(fl[0])} to ${f0(fl[1])} l/min</td></tr>
|
||
<tr><td>Chiller input at peak</td><td class="n" colspan="3">~${f0(cool*0.32)} to ${f0(cool*0.5)} kW electrical</td></tr>
|
||
<tr><td>Electric boilers instead</td><td class="n" colspan="3">~${f0(st[0]*0.68/0.98)} to ${f0(st[1]*0.68/0.98)} kW electrical</td></tr></table>
|
||
<p class="note">${ccLo&&k==='d1'?'Just under the peak: the cold tank carries overlapping cooling phases, or CH-2 comes forward. ':''}${k==='down'?'The cold tank and cycle diversity carry most hours; a boiler fault costs about two presses until fixed, which is what B-3 and CH-4 would buy back. ':''}Demand at Newbilt's per-machine figures; installed capacity is the proposal on this page.</p>`;}
|
||
let sel=null;
|
||
function select(id){const b=BOX[id];if(sel)sel.g.classList.remove('sel');sel=b;b.g.classList.add('sel');const d=D[b.det];const p=$('detail');p.innerHTML='';
|
||
const add=(t,txt)=>{const e=document.createElement(t);e.textContent=txt;p.appendChild(e);return e;};
|
||
add('h2',d.t);add('p',d.w);
|
||
[['Figures and sources',d.f],['Open for the RFQ',d.q]].forEach(([h,a])=>{if(!a||!a.length)return;add('h3',h);const ul=document.createElement('ul');a.forEach(x=>{const li=document.createElement('li');li.textContent=x;ul.appendChild(li);});p.appendChild(ul);});}
|
||
document.querySelectorAll('#cases [data-case]').forEach(b=>b.addEventListener('click',()=>setCase(b.dataset.case)));
|
||
setCase('full');
|
||
window.__sc={BOX,BUB,D,CASES,setCase};
|
||
})();
|
||
(function(){
|
||
var b=document.getElementById("themeBtn"),de=document.documentElement;
|
||
function set(t,save){de.setAttribute("data-theme",t);if(save){try{localStorage.setItem("cnx-theme",t)}catch(e){}}
|
||
b.textContent=t==="light"?"☾":"☀";b.title="Switch to "+(t==="light"?"dark":"light")+" mode";}
|
||
set(de.getAttribute("data-theme")||"dark",false);
|
||
b.addEventListener("click",function(){set(de.getAttribute("data-theme")==="light"?"dark":"light",true);b.blur();});
|
||
var mq=window.matchMedia&&matchMedia("(prefers-color-scheme: light)");
|
||
if(mq&&mq.addEventListener)mq.addEventListener("change",function(e){var s=null;try{s=localStorage.getItem("cnx-theme")}catch(_){}if(!s)set(e.matches?"light":"dark",false);});
|
||
})();
|
||
</script>
|
||
</body>
|
||
</html>
|