diff --git a/docs/plans/2026-07-24-driver-expansion-tracking.md b/docs/plans/2026-07-24-driver-expansion-tracking.md index 9b88fb66..81db1a96 100644 --- a/docs/plans/2026-07-24-driver-expansion-tracking.md +++ b/docs/plans/2026-07-24-driver-expansion-tracking.md @@ -30,7 +30,7 @@ it reaches πŸ“. | Wave | Deliverable | Design | Impl. plan | Status | Effort | Fixture / hardware | |---|---|---|---|---|---|---| | **0** | Universal Discover-backed browser | [design](2026-07-15-universal-discovery-browser-design.md) | [plan](2026-07-15-universal-discovery-browser-implementation.md) Β· [tasks](2026-07-15-universal-discovery-browser-implementation.md.tasks.json) | 🟑 **Live gate open** | S–M | none (retrofits shipped drivers) | -| **1** | Modbus RTU (extend Modbus) | [design](2026-07-15-modbus-rtu-driver-design.md) | [plan](2026-07-24-modbus-rtu-driver.md) Β· [tasks](2026-07-24-modbus-rtu-driver.md.tasks.json) | πŸ“ **Plan ready** (11 tasks) | **S (lowest)** | `pymodbus` `rtu_over_tcp` β€” CI-simulatable, no new infra | +| **1** | Modbus RTU (extend Modbus) | [design](2026-07-15-modbus-rtu-driver-design.md) | [plan](2026-07-24-modbus-rtu-driver.md) Β· [tasks](2026-07-24-modbus-rtu-driver.md.tasks.json) | 🟒 **Built β€” live gate PASSED** (11 tasks, branch `feat/modbus-rtu-driver`, pending merge) | **S (lowest)** | `pymodbus` `rtu_over_tcp` β€” CI-simulatable, no new infra | | **1** | SQL poll | [design](2026-07-15-sql-poll-driver-design.md) | [plan](2026-07-24-sql-poll-driver.md) Β· [tasks](2026-07-24-sql-poll-driver.md.tasks.json) | πŸ“ **Plan ready** (22 tasks) | S–M | **existing central SQL Server** `10.100.0.35,14330` + SQLite unit | | **2** | MTConnect Agent | [design](2026-07-15-mtconnect-driver-design.md) | [plan](2026-07-24-mtconnect-driver.md) Β· [tasks](2026-07-24-mtconnect-driver.md.tasks.json) | πŸ“ **Plan ready** (23 tasks) | S–M | Dockerized `mtconnect/cppagent` β€” CI-simulatable | | **2** | MQTT / Sparkplug B | [design](2026-07-15-mqtt-sparkplug-driver-design.md) | [plan](2026-07-24-mqtt-sparkplug-driver.md) Β· [tasks](2026-07-24-mqtt-sparkplug-driver.md.tasks.json) | πŸ“ **Plan ready** (27 tasks, P1+P2) | M–L | Mosquitto/EMQX + C# Sparkplug sim β€” CI-simulatable | @@ -92,16 +92,30 @@ marginal cost. Both are **fully CI-simulatable with zero new hardware**; Modbus RTU needs no new infra at all, and SQL poll reuses the always-on central SQL Server. This is the recommended next build. -### Modbus RTU β€” πŸ“ Plan ready +### Modbus RTU β€” 🟒 Built, live gate PASSED (branch `feat/modbus-rtu-driver`, pending merge) - **Design:** [`2026-07-15-modbus-rtu-driver-design.md`](2026-07-15-modbus-rtu-driver-design.md) -- **Implementation plan:** [`2026-07-24-modbus-rtu-driver.md`](2026-07-24-modbus-rtu-driver.md) Β· [`.tasks.json`](2026-07-24-modbus-rtu-driver.md.tasks.json) β€” **11 tasks** (1 trivial / 5 small / 2 standard / 3 high-risk). +- **Implementation plan:** [`2026-07-24-modbus-rtu-driver.md`](2026-07-24-modbus-rtu-driver.md) Β· [`.tasks.json`](2026-07-24-modbus-rtu-driver.md.tasks.json) β€” **11 tasks** (1 trivial / 5 small / 2 standard / 3 high-risk), all complete via subagent-driven-development. - **Scope:** extend the existing Modbus driver with a `Transport` selector (RTU CRC-16 + FC-aware length, no TxId) + a `rtu_over_tcp` `pymodbus` docker profile + the AdminUI selector. **Direct-serial transport is descoped** (user, 2026-07-15) β€” RTU-over-TCP via a serialβ†’Ethernet gateway is the only shipped mode, so there is no serial hardware gate. -- **Fixture:** add an `rtu_over_tcp` profile to the existing Modbus integration fixture. First P1 - step is confirming the pymodbus simulator exposes the RTU framer on a TCP server. -- **Effort:** **S β€” the lowest on the roadmap.** Recommended first. +- **Fixture:** added the `rtu_over_tcp` profile (`framer=rtu`, host `:5021`, co-runs with `standard`) + to the Modbus integration fixture. **Unknown confirmed:** pymodbus 3.13's simulator DOES honour + `framer=rtu` on a TCP server (wire-probed a pure RTU FC03 response, no MBAP) β€” so the simple profile + path was taken; **no stdlib fallback server was needed.** +- **Verification (all green):** unit suite **344/344**; full solution build 0 errors; the 2 RTU + integration tests pass **live** against the real `framer=rtu` fixture (read HR5β†’5, write+readback + HR200←4242). Per-task review chain (spec + code reviewers) + a final whole-branch review, all + approved-to-merge. +- **Live `/run` gate β€” PASSED (2026-07-24, docker-dev rebuilt from this branch):** + - AdminUI `/raw` Modbus **driver** config modal renders the new **Transport** selector (with the + operator hint) β€” set to `RtuOverTcp`, saved. + - **Device Test Connect β†’ `OK Β· 23 MS`** β€” the probe built a `ModbusRtuOverTcpTransport` via the + factory and spoke **FC03 over real RTU framing** to `10.100.0.35:5021`. + - Authored raw tags HR5 (r/o) + HR200 (r/w) β†’ **deployment `06ec1632` Sealed** (all 6 nodes acked). + - Client.CLI on `opc.tcp://localhost:4840` (`multi-role`/`password`): **read** `ns=2;s=rtu-gate/Device1/HR5` + β†’ **5, Good**; **write** `ns=2;s=rtu-gate/Device1/HR200` = 4242 β†’ readback **4242, Good**. +- **Effort:** **S β€” the lowest on the roadmap.** Delivered first, as recommended. ### SQL poll β€” πŸ“ Plan ready - **Design:** [`2026-07-15-sql-poll-driver-design.md`](2026-07-15-sql-poll-driver-design.md)