📝 Update spec and README

This commit is contained in:
Jonas Bengtsson
2026-10-04 14:15:26 +02:00
parent 59679b96ee
commit c30b444ef1
2 changed files with 84 additions and 10 deletions
+12 -1
View File
@@ -325,7 +325,7 @@ requirement ID for each item in parentheses.
statistics table (0x1029 words) with reset, LED-error
(0x1020/0x1021) and module-diagnosis (0x1050) fault injection
and clear; SF LED on the coupler reflects injected LED errors.
- [x] M5: configuration — coupler settings forms (watchdog time/masks/type/close-on-timeout via 0x1000–0x100B, response delay 0x1037, idle timeout 0x1030) with the device's own validation surfaced (writes refused while the watchdog runs → field error); module list editor over the 13-article catalog with SAVE CONFIG → live process-image rebuild (`rebuild_node`: datastore survives, values clear like a KBUS reset, 0x1022–0x1025 and 0x2030+ updated) + persistence to the node-config YAML via a comment-preserving custom emitter.
- [x] M5: configuration — coupler settings forms (watchdog time/masks/type/close-on-timeout via 0x1000–0x100B, response delay 0x1037, idle timeout 0x1030) with the device's own validation surfaced (writes refused while the watchdog runs → field error); module list editor over the 13-article catalog with SAVE CONFIG → live process-image rebuild (`rebuild_node`: datastore survives, values clear like a KBUS reset, 0x1022–0x1025 and 0x2030+ updated) + persistence to the node-config YAML via a comment-preserving custom emitter. Modules re-orderable by drag-and-drop or ▲/▼ arrows (FR-11.2.6); with per-type I/O codes (FR-4.3.11 v1.5) cross-kind moves don't renumber other kinds' channels.
- [x] M5a: channel names for every module channel (FR-10.2.11) —
node-config persisted (`channel_names:` mapping, I/O code →
name), survive module saves and rebuilds, shown in the overview
@@ -400,6 +400,17 @@ not yet implemented. Datasets are **optional**: signal logic
(plugins, scheduled steps, degradation) runs in parallel with CSV
streaming, or entirely without it.
- [ ] Plant environment `scenario/plantenv.py` (FR-8.2.14–16, requested
2026-10-04): gym-style `PlantEnv` — deterministic engine-owned
tick clock (never wall-clock); per tick:
`observe()` returns the WAGO input image in engineering units
(channel values, names, per-type I/O codes, ranges, sim-time);
the decision source decides; `apply()` writes the decided
outputs through the datastore's internal paths (mirrors/
statistics/watchdog stay consistent). Existing `plugins:`
become thin adapters; external (non-Python) decision sources
step the env over a socket; one decision source per output
alias per tick (ownership conflicts are errors).
- [ ] `scenario/datasets.py` — streaming CSV playback for designated
inputs (OPTIONAL driver): header-driven time column,
`interpolation: linear|hold`, `repeat` with seamless seams,