Steam and cooling: water and steam temperatures on the diagram
Deploy test site / deploy (push) Successful in 47s

Twenty temperature tags on the pipes, each styled by its basis: green
border for a Newbilt figure, amber for a design target or estimate,
dashed for a value the vendor or a measurement still has to set.

- Newbilt: steam main 10 bar ~180 C, header to the presses ~180 C,
  press outlets ~60 C (one per press, dimmed with the press when it is
  not installed in the selected case), supply header 20 to 25 C, oil
  cooler return <= 35 C (supply plus max. 10 K).
- Design target or estimate: raw water ~28 to 30 C (ground
  temperature), feed to the boilers 90 to 95 C, heat pump feed loop
  <= 95 C, condensate after the traps <= 100 C (atmospheric return),
  extruder returns <= 35 C (2 to 3 kW at 4 l/min), heat pump source in
  <= 60 C, return header up to ~60 C mixed, chiller loop to HX-1 ~18
  to 23 C (~2 K approach).
- To be set: heat pump source out, warm tank mixed temperature, chiller
  loop return.

The clicked details say where each figure comes from, including that
Newbilt's 180 C is saturation at 10 bar absolute (~184 C at 10 bar
gauge, to confirm). Legend explains the three tag styles.

Checked headless (scripts/pw_sc_check.py, now also tag overflow and tag
overlap with boxes, labels, symbols and each other): 20 tags, none
overlapping or overflowing; no SVG or HTML overflow at 1600, 1258 and
390 px in all four cases; 32 boxes open their detail; no unstyled pipes;
no errors.
This commit is contained in:
grabowski committed 2026-10-14 10:33:38 +07:00
1 parent eb0039179b
commit b1c18cb040
1 file changed
+39 -11
+39 -11
View File
@@ -47,6 +47,8 @@ td.low{color:var(--warn);font-weight:600}
.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 */
@@ -72,6 +74,8 @@ td.low{color:var(--warn);font-weight:600}
.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>
@@ -89,7 +93,7 @@ td.low{color:var(--warn);font-weight:600}
<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="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>
@@ -178,6 +182,9 @@ td.low{color:var(--warn);font-weight:600}
<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><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; 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>
@@ -186,7 +193,7 @@ td.low{color:var(--warn);font-weight:600}
(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')};
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`;
@@ -249,7 +256,7 @@ 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 20 to 25 °C, ~10 bar');
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']);
@@ -271,30 +278,50 @@ pipe('M1380,730 H1350 M1380,794 H1350 M1380,858 H1350 M1350,730 V888 H1300 M1150
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'],q:['Water analysis (hardness, silica, TDS, chloride) for the site, before the boiler and chiller RFQs']},
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'],q:['Atmospheric hotwell or pressurised deaerator: boiler vendor\'s call at this size']},
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'],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']},
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)'],q:['Meter type and turndown for 150 to 1,000 kg/h']},
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:'A water-to-water heat pump takes heat from the warm press return before it reaches the chillers and lifts the boiler feedwater to 90 to 95 °C. Each kWh it uses cuts boiler work and chiller load at the same time.',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)'],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)']},
HP1:{t:'HP-1 · Heat-recovery heat pump',w:'A water-to-water heat pump takes heat from the warm press return before it reaches the chillers and lifts the boiler feedwater to 90 to 95 °C. Each kWh it uses cuts boiler work and chiller load at the same time.',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)'],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'],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)'],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'],q:['Height of the return header above the tank, from the hall layout']},
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)'],q:['3 × 250 kW against 3 × 350 kW for N+1; part-load efficiency; derating at 40 °C']},
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:[]},
@@ -314,6 +341,7 @@ function setCase(k){const c=CASES[k];
['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;