Expromo EPS power sequencer · v2.2 · v3.1 · v3.2 · v3.3

EPS firmware: every version compared

Four firmwares, one table each: what they do, how each one handles 17 different corruptions of the network chip, how they recover when the link, the gateway or the receiver fails, how many network-standard requirements they meet, and how they behave day to day. Everything was measured on the same real EPS box with the same pre-registered tools; where a version wasn't tested, the table says so.

Status 2026-10-12 · unit 3 (real EPS box), direct cable to a PC · v2.2 field firmware, v3.1 (2026-10-10), v3.2 (2026-10-11), v3.3 (2026-10-12 overnight) · every trial reported

På dansk: Alle versioner sammenlignet · Hvorfor v3.3 (kort)

In one paragraph

v3.3 is the most robust of the four on every measurement we have, and it is the one we recommend as official. v2.2 needs a power cycle after most network faults; v3.1 recovers from many but dies on four chip faults including the one that matches the field symptom; v3.2 recovers from those but is dead on a PHY held in reset and its receiver check stops testing anything once the gateway has answered once. v3.3 recovers from all 17 faults, really tests its receiver every minute, and records the supply voltage at every chip fault. None of them is field-proven yet, and the leading field trigger (a supply sag) is still to be tested by hand.

What each version does

Pins, outputs, sequence timing, inputs, the LED, the TCP control protocol and the stored settings are the same in all four; only the network layer differs. v3.1 → v3.2 → v3.3 are small steps on the same rewritten driver.

Areav2.2 (field)v3.1v3.2v3.3
Network driverArduino Ethernet 2.0.2own W5500 driversamesame
Connections4 sockets shared by everything, one held by the keepalive; idle or half-open connections never closed8 sockets, fixed per service; idle web connections closed after 5 s, oldest control connection evictedsamesame
Web page outputone TCP segment per byte (~3,600 per view)buffered, 2–3 segmentssamesame
DHCPlibrary: blocks up to 60 s, strands on its fallbackRFC 2131, never blocks, keeps askingsamesame
Address conflict detectionnoneRFC 5227samesame
TCP give-up time18.4 s (library writes the W5100 register addresses)102 s (RFC 1122)samesame
Chip self-check every 5 snoneversion, IP, MAC, mask, gateway+ mode, retry, PHY config bits+ PHY reset bit
PHY stops with the link downnever recoverednever recoveredonly if a config bit changedPHY reset after 30 s, backing off to ~32 min
Receiver goes deaf (link up, hears nothing)never detectedgateway probe, only if the gateway answered since the last link-upsamegateway or last client; survives a link-up; counts only when nothing at all is heard
ARP requests to a gateway that is gone9 every 30 s20 in 4 s, every minutesame1 per minute (RFC 1122)
Over-long web requestno answer400400414 (RFC 9112)
Event log (survives power cuts)none96 eventssame+ supply voltage at every chip re-init
Supply and brown-out readoutnonenonenoneVCC, VCC_MIN, BOD in NET_STATUS
SyslognoneRFC 5424, optionalsamesame
Flash used (of 32,256 B) / RAM globals (of 2,048 B)29,876 / 73631,120 / 1,36431,238 / 1,36432,094 / 1,407

Why each change was made: why v3.3 · why v3.2 · mechanisms (findings) · full report

Fault matrix: one corrupted chip register at a time

Each fault is written into the real box's own W5500 by the firmware (test builds only); the PC sends only ping, a control command and a web request, and watches every service for 120 s. Three trials per fault and firmware, pre-registered criteria. F1–F14 for v2.2/v3.1/v3.2 were run on 2026-10-11; F15–F17 and all of v3.3 on the night of 2026-10-12.

recovered by itself / no effect "tail": recovered; one stray ping lost in the last 30 s (≈0.4 %/ping test artefact) keeps running with the wrong setting dead until a power cycle
Fault (one W5500 register)v2.2v3.1v3.2v3.3
F1 Chip soft reset (all settings lost)dead 3/3ok 2/3, tail 1/3 (6–10 s)ok 2/3, tail 1/3 (6–10 s)recovered (4–10 s) 3/3
F2 IP address changeddead 3/3ok 2/3, tail 1/3 (10 s)recovered (5–10 s) 3/3recovered (3–5 s) 3/3
F3 MAC changedlatent 3/3ok 2/3, tail 1/3 (5–10 s)recovered (6–10 s) 3/3recovered (4–6 s) 3/3
F4 Gateway changedtail 2/3, latent 1/3recovered (6 s) 3/3recovered (3–7 s) 3/3recovered (6–7 s) 3/3
F5 Mask changeddead 3/3recovered (4–7 s) 3/3ok 1/3, tail 2/3 (5 s)recovered (3–7 s) 3/3
F6 Ping block (mode register)dead 3/3dead 3/3ok 2/3, tail 1/3 (4–7 s)recovered (3–7 s) 3/3
F7 PHY power-down (field match)dead 3/3dead 3/3ok 2/3, tail 1/3 (11–12 s)recovered (4–6 s) 3/3
F8 PHY forced 10 Mbps halflatent 3/3latent 3/3recovered (4–10 s) 3/3recovered (6–10 s) 3/3
F9 Retry count 0dead 3/3dead 3/3recovered (3–5 s) 3/3ok 2/3, tail 1/3 (10 s)
F10 Control listeners closedno effect 3/3no effect 3/3ok 1/3, tail 2/3no effect 3/3
F11 Control listen port changeddead 3/3no effect 3/3no effect 3/3no effect 3/3
F12 Web listeners closedok 2/3, tail 1/3no effect 3/3ok 2/3, tail 1/3ok 2/3, tail 1/3
F13 Web listen port changeddead 3/3ok 2/3, tail 1/3no effect 3/3ok 2/3, tail 1/3
F14 Control RX buffer 0no effect 3/3no effect 3/3no effect 3/3no effect 3/3
F15 PHY held in reset (new)dead 3/3dead 3/3dead 3/3recovered (3–6 s) 3/3
F17 PHY power-down written once (new)tail 1/3, latent 2/3tail 2/3, latent 1/3ok 2/3, tail 1/3 (5–26 s)ok 2/3, tail 1/3 (6–7 s)
F16 F15 with only the link-down recovery (v3.3 build without the bit-7 check)———recovered (40 s) 3/3

Recovery times are from fault injection to all three services answering again. "tail" is the end-of-trial ping check catching a single stray miss after service was already back; it also hits faults that cannot affect ping. Background ping loss in recovered trials: v3.1 1.97 % (0.43 % without one MAC trial that flapped ~60 s), v3.2 1.09 %, v3.3 0.52 %.

Recovery scenarios

Scenariov2.2v3.1v3.2v3.3
Network chip loses all its settings (chip reset by command)dead until power cycle (4/4)recovered 2–7 s, outputs kept (30/30)recovered (fault matrix F1, 3/3)recovered 2–8 s (38/40); twice the chip came back deaf for 38 s / ~3.5 min, cleared by itself
DHCP server away during a renewalstranded until power cyclekeeps asking, recovers by itselfas v3.1DHCP sequence A–E passed
PHY held in reset (link down, new fault F15)dead 3/3dead 3/3dead 3/3recovered 3–6 s (3/3)
PHY stuck with the link down, registers look right (F16)no recovery (code)no recovery (code)no recovery (code)PHY reset after 30 s: back at 40 s (3/3)
Gateway disappears (router reboot), 12 min watchedkeepalive uses the cached address: no ARP after it vanished (no recovery logic to trigger)same as v3.2: 1 ARP while present, none after; the check keeps "succeeding"no ARP after it vanished: the check keeps "succeeding" on a cached address1 ARP request per check; no false PHY reset
Receiver goes deaf with the link upnever detectednot detectable once the gateway answered (cached address), nor without a gatewaysame as v3.13 silent checks → PHY reset (emulated: once, at 6 min); two real episodes after re-inits cleared by themselves first (38 s, ~3.5 min)
Link down 180 s (cable or switch side)back when the link returns (switch port flaps, 10-09)back when the link returns (16/16 link drops, 10-11)not runback 8.3–8.6 s after the link returns (2/2); 2 harmless PHY resets per outage
Main-loop hangwatchdog restart (outputs off)watchdog restart ~25 s (3/3)as v3.1watchdog restart 25 s (3/3 outside the outage)
Start-up after a USB reset (resets the network chip too)200/200200/200not run50/50, median 9.2 s

Details: DHCP strand · code analysis and v3.3 · full report §5.20–5.26

Network standards (56 pre-registered requirements, 10 standards)

Pass criteria written down before any firmware was run; same tool, same box. A standard passes only if all its requirements pass. v3.2 was not run through the suite: its only change from v3.1 is the health check, which nothing in the suite measures, so its column repeats v3.1's.

Standardv2.2v3.1v3.2v3.3
IEEE 802.3 Ethernetpasspasspass (as v3.1)pass
IEEE 802 MAC addressingpasspasspass (as v3.1)pass
RFC 826 ARPpasspasspass (as v3.1)pass
IEEE 802.1D/Q end stationpasspasspass (as v3.1)pass
RFC 5227 address conflict detectionfail: 6 itemspasspass (as v3.1)pass (2 not verifiable without forged traffic)
RFC 5424/5426 syslognot availablepasspass (as v3.1)pass
RFC 2131/2132 DHCP clientfail: 7 itemsfail: 1 itemfail: 1 item (as v3.1)fail: 1 item (kept: asks from its fallback address)
HTTP (RFC 9110/9112)fail: 7 itemsfail: 3 itemsfail: 3 items (as v3.1)fail: 2 items (kept: GET switching, no Host check)
TCP (RFC 9293/1122)fail: 2 itemsfail: 1 itemfail: 1 item (as v3.1)fail: 1 item (kept: 2-s send timeout)
RFC 1122 host requirementsfail: 3 itemsfail: 3 itemsfail: 3 items (as v3.1)fail: 2 items, both chip limits (ARP rate fixed)
Requirements passed, of 5626464648

Per requirement: findings · executive summary

Everyday behaviour (regression)

Testv2.2v3.1v3.2v3.3
Power and output sequence (21 checks)reference behaviour21/21as v3.121/21
Load test, short (idle connections, then Companion + eXcontrol + browser)control port dead with 2 idle web connections (1 of 30 answered)541/541as v3.1541/541
Idle connections held open, up to 5 per portcontrol port dead from 2800/800 answeredas v3.1all answered
Persistent controller connectionsnot supported6/6as v3.16/6
Junk and malformed input—16/16as v3.116/16
HTTP methods and malformed requestsevery method served as GET21/21as v3.121/21, plus 414
DHCP sequence (no server, lease, server gone, address in use)strands after an outage, restarts at renewalspassas v3.1pass
10 Mbps half duplex—pass (load 543/544)as v3.1pass (load 543/543)
millis() rollover at 49.7 days (simulated)—passas v3.1pass
Lowest free stack seen~0.45 KB (computed)243 Bas v3.1190 B

v3.2 shares v3.1's network layer apart from the health check, so its everyday behaviour was not re-measured separately; "as v3.1" marks that.

What these tables don't show

Measured

  • All four firmwares on the same real box (10 V supply, six SSRs, no loads), same harness, three trials per fault.
  • v3.3 overnight 2026-10-12: 51 fault-matrix trials, 50 USB-reset start-ups, the full regression suite, link-down, gateway-gone and deaf-receiver tests.
  • The box's brown-out level (2.7 V) and supply (≈ 5.1 V on USB), read by v3.3 itself.
  • Twice in 40 chip-reset trials on v3.3 the network chip came back deaf after its re-init (38 s and ~3.5 min), then recovered by itself; one episode captured (transmitting, answering nothing). v3.1: 0 in 30.

Not tested yet

  • Supply sags and slow power-up. The leading hypothesis for the field dropouts (the box reports a 2.7 V brown-out level). Needs the USB cable out to really cut power, so it needs hands-on time.
  • Real loads switched by the SSRs, multi-day operation and other switch brands.
  • v3.3 acting on a real deaf receiver. The two real episodes on this box cleared by themselves before the check acted; the check itself is tested by emulation.
  • A W5500 that stops answering on SPI. No firmware on this board can reset it (no reset pin wired); it needs a hardware change.
  • Field rates: one box, three trials per fault. These are behaviours, not failure rates.

The rest of the investigation