diff --git a/README.md b/README.md index 1b94790..2bfddeb 100644 --- a/README.md +++ b/README.md @@ -282,6 +282,10 @@ docs/ ├── cnx_vinyl_parametric_payap-iso.png Isometric view of the Payap model ├── cnx_vinyl_parametric_payap-office.png Office building floor plans ├── cnx_vinyl_parametric_payap-block.png Finishing and print block plans +├── cnx_vinyl_parametric_payap_parts.FCStd Payap model in Part/Draft: roof, PV, parking canopies +├── cnx_vinyl_parametric_payap_parts.png Isometric view of the parts model +├── cnx_vinyl_parametric_payap_parts-top.png Top view of the parts model +├── CNX_apply_Params.FCMacro Pushes Params edits to the model (FreeCAD 26.3 RC1) ├── crane-workshop-tours.md Overhead crane, workshop, visitor corridor ├── digital-factory.md Data platform, NixOS/Clan fleet, acquisition, app ├── facility-security.md Security, HVAC, fire and life safety, compliance diff --git a/docs/CNX_apply_Params.FCMacro b/docs/CNX_apply_Params.FCMacro new file mode 100644 index 0000000..7f87261 --- /dev/null +++ b/docs/CNX_apply_Params.FCMacro @@ -0,0 +1,19 @@ +# CNX: apply Params +# FreeCAD 26.3 RC1 does not pass spreadsheet edits on to the objects that read them +# (a normal recompute only recomputes the sheet). Run this macro after editing Params: +# it touches every object whose expressions read the sheet, then recomputes; anything +# further down the chain (arrays, dimensions) follows normally. +import FreeCAD as App + +doc = App.ActiveDocument +sheet = doc.getObject("Params") if doc else None +if sheet is None: + App.Console.PrintError("CNX apply Params: the active document has no Params sheet\n") +else: + sheet.recompute() + deps = [o for o in sheet.InList if o is not sheet] + for o in deps: + o.touch() + n = doc.recompute() + bad = [o.Label for o in doc.Objects if "Invalid" in o.State or "Error" in o.State] + App.Console.PrintMessage(f"CNX apply Params: {len(deps)} objects read Params, {n} recomputed, errors: {bad[:10]}\n") diff --git a/docs/cnx_vinyl_parametric_payap_parts-top.png b/docs/cnx_vinyl_parametric_payap_parts-top.png new file mode 100644 index 0000000..fc1d764 Binary files /dev/null and b/docs/cnx_vinyl_parametric_payap_parts-top.png differ diff --git a/docs/cnx_vinyl_parametric_payap_parts.FCStd b/docs/cnx_vinyl_parametric_payap_parts.FCStd new file mode 100644 index 0000000..f1c71a4 Binary files /dev/null and b/docs/cnx_vinyl_parametric_payap_parts.FCStd differ diff --git a/docs/cnx_vinyl_parametric_payap_parts.png b/docs/cnx_vinyl_parametric_payap_parts.png new file mode 100644 index 0000000..329dfac Binary files /dev/null and b/docs/cnx_vinyl_parametric_payap_parts.png differ diff --git a/docs/scale.md b/docs/scale.md index 3cfff5c..712ac74 100644 --- a/docs/scale.md +++ b/docs/scale.md @@ -113,6 +113,9 @@ Staff parking is roofed, in the front yard clear of the loading route: canopies — dimensions per the modelled layout in the [construction RFQ](finance/phase1-construction-rfq.md). At 4.1 m and 3.5 m they sit below the main building's 7.0 m low eave, so they cannot shade it. +Fully covered with the 580 W placeholder module the two canopies take 94 +modules (~54 kWp); see the Payap parts model in +[site candidates](site-candidates.md#roof-pv-and-parking-canopies-part-and-draft-model-october-2026). ### Expansion headroom: a second building diff --git a/docs/site-candidates.md b/docs/site-candidates.md index eab2796..0b8f9f9 100644 --- a/docs/site-candidates.md +++ b/docs/site-candidates.md @@ -281,4 +281,53 @@ and every equipment envelope is an estimate. All of it is an estimate to settle against the real plot. +### Roof, PV and parking canopies (Part and Draft model, October 2026) + +A second model of the same scenario, +[cnx_vinyl_parametric_payap_parts.FCStd](cnx_vinyl_parametric_payap_parts.FCStd) +([isometric](cnx_vinyl_parametric_payap_parts.png), +[top view](cnx_vinyl_parametric_payap_parts-top.png)), is built from plain +Part solids and Draft (arrays, labels, dimensions) instead of BIM objects, +on the same `Params` sheet, and adds the roof, the PV and the parking +canopies. Module counts are expressions on the sheet (`pv_roof_n`, +`pv_cp_n`, `pv_kwp`), so the drawing and the kWp change together when a +parameter does. + +- **Roof**: monopitch at 10° with the low eave (7.0 m) on the south side + and the high side 11.4 m above the floor on the north, the geometry of + the [phase 1 RFQ](finance/phase1-construction-rfq.md) and the + [sustainability](sustainability.md) roof study. On this plot (road + assumed south) the whole field faces south; once Payap names a plot, + its bearing sets the azimuth and the yield derate. The fire wall rises + with the roof, 0.5 m above it. +- **Rooftop PV**: 901 modules of the generic 580 W placeholder, ~523 kWp, + in 17 rows (blocks of four with a walkway, 1 m edge strip, as in the + sustainability study): 45 columns west of the fire wall and 8 east of + it, with 2.5 m of roof kept clear over the wall (estimate; check the + Thai code and the insurer). +- **Parking canopies**, both in the car park clear of the footpath: + - car canopy, 10 bays, 27.7 × 7.0 m at 4.1 m: 72 modules; + - scooter canopy, 30 spaces, 13.7 × 5.5 m at 3.5 m: 22 modules. + + Together ~54 kWp. Covering the canopies fully gives more than the + ~40 kWp the RFQ states. The RFQ heights are read as the high side; at + the 10° tilt used for self-cleaning (estimate for the canopies) the low + side clears 2.9 m (cars) and 2.5 m (scooters). +- **Total ~577 kWp**: at 1,400 to 1,500 kWh/kWp/yr that is about 810 to + 870 MWh a year before any azimuth derate, roughly 55 to 85 % of the + 1,000 to 1,500 MWh mature two-shift use ([scale](scale.md)). Three + things follow before this size is fixed: + - at midday the array can exceed the plant's load (weekends, single + shift), so PEA's export terms decide whether the surplus is sold or + curtailed; + - the 271 kWh battery is sized for ride-through, not to absorb it; + - the BOI solar measure caps eligible spend per MW ([BOI](boi.md)). + +FreeCAD 26.3.0 RC1 does not pass a cell edit on to the parts that read +the cell (a normal recompute updates only the sheet). After editing +`Params`, run the macro [CNX_apply_Params.FCMacro](CNX_apply_Params.FCMacro) +(copy it to the FreeCAD macro folder): it touches every object that reads +the sheet and recomputes. Tested with factory length, roof pitch, car bays +and walkway width; the drawn module count matches the sheet each time. + The Mueang Chi model and everything sited on it stay as they are. diff --git a/docs/sustainability.md b/docs/sustainability.md index 76a2955..695223a 100644 --- a/docs/sustainability.md +++ b/docs/sustainability.md @@ -106,6 +106,11 @@ large-format modules reach roughly 225 W/m². Roughly 70 m of plot depth remains undeveloped behind the building for ground-mount, which matters if the electric-boiler route is chosen. +On the Payap scenario plot the 128 m factory roof takes ~901 modules +(~523 kWp) and the car and scooter canopies another ~54 kWp, ~577 kWp in +all; what that size means for export, the battery and BOI is in +[site candidates](site-candidates.md#roof-pv-and-parking-canopies-part-and-draft-model-october-2026). + ### Energy efficiency architecture: recover before generating The deepest efficiency in this plant comes from its own thermodynamics: the