mirror of
https://github.com/openglow-org/forgefirm.git
synced 2026-09-28 01:01:12 -07:00
Record the bench proof on image 20260829190323 and the warm-loop flow check
CAMPAIGN-LOG: the three flowload t1 runs on the new image (judged rise 11.3, 11.1 and 11.8 C with the tube lit through most of each window, the laser's share on the line), and Test 3, the flow check from a warm loop (23.6 to 24.9 C baselines, 0 of 6 wrong, the 14.4 C limit 2.25 C above the flow band and 3.67 C below the no-flow band). flow_warm_validate.py takes the warm target and the warm-up budget as arguments (defaults 28 C, 20 min), and the bench page passes them; the warm-up still judges on the upstream sensor beside the heater, which is why this run's baselines stopped near 25 C (BRINGUP item 1). BRINGUP: item 1's open half is the loop above 25 C; item 22 holds what remains of the flow check under load. No catalog consequence: a bench tool's arguments and documentation; no runtime behavior of the release image changes.
This commit is contained in:
+12
-12
@@ -1045,11 +1045,11 @@ Open items only. Anything closed is in `CAMPAIGN-LOG.md`.
|
||||
|
||||
1. **Laser commissioning leftovers.** Verify the hardware button latch persists
|
||||
across kernel-run gaps mid-job (if OK_2_FIRE drops between motion bursts, the
|
||||
fix is a stream keepalive across armed gaps); characterize warm-baseline
|
||||
flow-check behavior under real laser heating (all flow characterization used
|
||||
19–23 °C baselines; physics argues the dependence is weak — ΔT = P/(ṁ·c)
|
||||
carries no absolute-temperature term — but that is reasoning, not
|
||||
measurement).
|
||||
fix is a stream keepalive across armed gaps); the flow check's bands from
|
||||
a loop warmer than 25 C (the bands hold from 19 to 25 C with the margin
|
||||
widening warm; the warm-up in `flow_warm_validate.py` must be judged on
|
||||
the mixed bulk, not the upstream sensor beside the heater, to reach 28 C
|
||||
and above).
|
||||
2. **Low-temperature gates and warm-up (planned).** Two keys in the Cooling
|
||||
card: `cool_temp_min` (hard floor, default ~5 °C, a fire gate) and
|
||||
`cool_temp_start` (warm-up gate, default ~16 °C) — a job starting below the
|
||||
@@ -1479,13 +1479,13 @@ Open items only. Anything closed is in `CAMPAIGN-LOG.md`.
|
||||
carries a common-mode offset of about 1 C that steps in when the
|
||||
airflow goes to the run profile, steps out when it returns to idle,
|
||||
and toggles between two levels in between. Together they put an
|
||||
ordinary job's check within a few tenths of the limit. Owed, in order:
|
||||
the engine's reading (means for the baseline and the end, the tube's
|
||||
share taken off from the `hv_current` integral, one coefficient per
|
||||
power model) on an image; three `flowload t1` runs to show the
|
||||
engine's rise back in the dark band; a `cooling.*` catalog case with
|
||||
an armed CW load; and if that is not enough, the void-on-emission
|
||||
design with the tube as its own flow tracer.
|
||||
ordinary job's check within a few tenths of the limit. The engine now
|
||||
reads means and takes the tube's share off (`cool_laser_heat_cw`,
|
||||
`cool_laser_heat_density`). Owed: a `cooling.*` catalog case with an
|
||||
armed CW load; a re-measure of the two coefficients once a second
|
||||
machine is on the bench (one tube, one supply so far); and if a lit
|
||||
check still trips, the void-on-emission design with the tube as its
|
||||
own flow tracer.
|
||||
Open question, the offset's source: the timing points at the airflow
|
||||
drive (the step lands one sample after the fans go to run duty, before
|
||||
any HV, and lifts when they go idle, long after the tube is dark), but
|
||||
|
||||
@@ -4308,6 +4308,55 @@ absurd coefficient is bounded at 3 C and no flow is still SUSPECT (17.2);
|
||||
under the density model the density coefficient applies (1.1 off). The
|
||||
`flowload` drill's verdict parser accepts the new suffix.
|
||||
|
||||
## 2026-08-29: image 20260829190323, the flow check under load on the bench
|
||||
|
||||
Pins forgefirm d577629 (grblHAL-glowforge a7dcdca, forgectrl 2f18b16),
|
||||
both images built rc=0 from the committed trees, the dev image flashed by
|
||||
the operator at 19:11. Three `flowload t1` runs from the installed drill,
|
||||
each a prompt press with the tube lit for 58 to 63 percent of the check
|
||||
window, the check opening 4 to 7 s after the fire (about 15 s after the
|
||||
session open, from the fresh history):
|
||||
|
||||
| run | engine line | lit |
|
||||
|---|---|---|
|
||||
| 191517 | `verified (heater rise 11.3 C, dT 9.6 C; laser 0.8 off 12.0)` | 58 % |
|
||||
| 192051 | `verified (heater rise 11.1 C, dT 9.4 C; laser 0.7 off 11.9)` | 63 % |
|
||||
| 192439 | `verified (heater rise 11.8 C, dT 9.8 C; laser 0.7 off 12.5)` | 58 % |
|
||||
|
||||
The judged rise sits in the loop's dark band, 2.6 to 3.3 C under the
|
||||
14.4 C limit, where the same conditions read 14.1 in the morning. The arm
|
||||
sequence on the new driver was clean in every run (prompt, armed on the
|
||||
press, `Pgm End` and the disarm at program end, the window closed with
|
||||
the M2, all 55 lines queued at once). The power-good warning at the session
|
||||
open persists (BRINGUP item 23). Board left idle, heater off, conf
|
||||
restored, nothing under `/data`; records in `bench-data/`.
|
||||
|
||||
## 2026-08-29: the flow check from a warm loop (Test 3)
|
||||
|
||||
The plan's third test: the check's bands from a heater-warmed loop, the
|
||||
tube dark, run from the bench page as the `flow-warm` takeover
|
||||
(`flow_warm_validate.py 3`, forgectrl and the controller stopped for the
|
||||
run and restarted on its exit), three checks with the pump on and three
|
||||
with it commanded off, alternating, each from a fresh warm-up. The tool's
|
||||
warm target reads the upstream sensor, which sits near the heater and
|
||||
reaches 28 C within two minutes while the mixed bulk settles near 24.5, so
|
||||
the baselines landed at 23.6 to 24.9 C rather than the 28 to 30 the plan
|
||||
asked for; the tree's copy now takes the target and the warm-up budget as
|
||||
arguments (defaults 28 C, 20 min, registered on the bench page), and a
|
||||
warm-up judged on the mixed bulk is the follow-up.
|
||||
|
||||
| case | rises (C) | band |
|
||||
|---|---|---|
|
||||
| pump on | 11.54, 12.15, 11.78 | max 12.15 (cold data: 12.75) |
|
||||
| pump off | 18.97, 18.70, 18.07 | min 18.07 (cold data: 16.04) |
|
||||
|
||||
Every verdict correct; the 14.4 C limit sits 2.25 C above the warm flow
|
||||
band and 3.67 C below the warm no-flow band, a 5.9 C gap where the cold
|
||||
data has 3.3. A warmer loop sheds the heater's heat no worse with the pump
|
||||
on and holds it better with the pump off, so `cool_flow_rise` needs no
|
||||
warm-end value through 25 C; above that is not measured. Records:
|
||||
`bench-data/flow_warm_log_20260829.txt`, `flow_warm_results_20260829.json`.
|
||||
|
||||
## Superseded status notes
|
||||
|
||||
### Shared machine services — remaining polish, as listed 2026-08-13
|
||||
|
||||
@@ -123,7 +123,9 @@ TOOLS = [
|
||||
"desc": "Long run of the real re-check cadence via M8: verdicts, false faults, loop heat accumulation."},
|
||||
{"id": "flow-warm", "title": "Coolant warm-baseline validation", "script": "flow_warm_validate.py",
|
||||
"safety": "takeover", "where": "board", "ported": True,
|
||||
"args": [_arg("cycles", "int", 3, "cycles per case (flow / no-flow)")],
|
||||
"args": [_arg("cycles", "int", 3, "cycles per case (flow / no-flow)"),
|
||||
_arg("target_c", "float", 28.0, "warm the upstream sensor to this before each check"),
|
||||
_arg("warm_min", "float", 20.0, "warm-up budget per check, minutes")],
|
||||
"desc": "Runs the real check (40 percent / 50 s, cut-profile fans) from a heater-warmed baseline, alternating "
|
||||
"flow and no-flow; results to the bench data directory. Slow: about 15 minutes per cycle."},
|
||||
{"id": "critical-tier", "title": "Coolant critical-tier warm-loop drill", "script": "critical_tier_drill.py",
|
||||
|
||||
@@ -15,7 +15,10 @@ controller stopped (the bench page's takeover does that; from a host,
|
||||
stop them first). Runs on the board or from a host (gfbench: GF_HOST).
|
||||
Results and the log go to the bench data directory (gfbench.data_path).
|
||||
|
||||
Usage: flow_warm_validate.py [cycles_per_case] (default 3)
|
||||
Usage: flow_warm_validate.py [cycles_per_case] [target_c] [warm_budget_min]
|
||||
(defaults 3, 28.0, 20: the loop's own heater at 50 percent plateaus
|
||||
near 28 to 29 C in a 20 C room, the most a warm baseline can be
|
||||
without the tube)
|
||||
"""
|
||||
import json
|
||||
import statistics
|
||||
@@ -29,8 +32,8 @@ RESULTS = data_path('flow_warm_results.json')
|
||||
DUTY = 40
|
||||
CHECK_S = 50
|
||||
THRESHOLD = float(setting('cool_flow_rise', 14.4)) # forgectrl's configured threshold
|
||||
WARM_TARGET_C = 25.5 # what a ~19-20 C room permits at 50% duty
|
||||
WARM_MAX_S = 780
|
||||
WARM_TARGET_C = float(sys.argv[2]) if len(sys.argv) > 2 else 28.0
|
||||
WARM_MAX_S = 60.0 * (float(sys.argv[3]) if len(sys.argv) > 3 else 20.0)
|
||||
ABORT_C = 48.0
|
||||
|
||||
FANS_RUN = ('echo 65535 > /sys/glowforge/thermal/exhaust_pwm; '
|
||||
|
||||
Reference in New Issue
Block a user