Task #253 follow-up — driver-side e2e debug: port fixes + HR[200] scratch register #214
Reference in New Issue
Block a user
Delete Branch "task-253c-e2e-debug-driver-side"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Ran the driver CLIs against the live
docker composefixtures to actually debug what the PR #207/#208 e2e scripts do. Two real bugs surfaced, plus a wider blocker that I've filed tracking issues for.Driver-side bugs fixed
Wrong simulator ports in
e2e-config.sample.json:test-modbus.ps1default-ModbusHostalso had 5502; fixed to 5020.Modbus HR[100] is auto-increment. pymodbus
standard.jsonapplies anincrementaction to HR[100], so every poll ticks the value.test-modbus.ps1used HR[100] as its write target, causingwrote=4242 read=4244(off by exactly +2, confirmed across 100/1000/10000/65535). Switched to HR[200] (scratch range per the profile).AbCip probe
-t @raw_cpu_typerejected. Driver's TagPath parser returnsmalformed TagPath '@raw_cpu_type'. Probe now uses the user-supplied-TagPathfor every family — works against both ab_server and real controllers.Verified against live containers
Stages 3-5 blocker (tracked, not fixed here)
src/ZB.MOM.WW.OtOpcUa.Server/Program.cs:98-104only registers Galaxy + FOCAS driver factories.DriverInstanceBootstrappersilently skips anyDriverTypewithout a registered factory — so Modbus/AbCip/S7/AbLegacy rows in the Config DB are no-op'd even with a perfect seed.Tracking issues opened:
README flags this + links the issues so anyone running the scripts today knows stages 3-5 will fail on
read faileduntil the wiring lands.Test plan
otopcua-pymodbus-standardon 5020 — ✓otopcua-ab-server-controllogixon 44818 — ✓otopcua-python-snap7-s7_1500on 1102 — ✓Ran the driver CLIs against the live docker-compose fixtures to debug what actually works. Two real bugs surfaced: 1. `e2e-config.sample.json` pointed at the wrong simulator ports: - Modbus: 5502 → **5020** (pymodbus compose binding) - S7: 102 → **1102** (python-snap7, non-priv port) - AbCip: no port → now explicit **:44818** `test-modbus.ps1` default `-ModbusHost` also shipped with 5502; fixed to 5020. 2. Modbus loopback was off-by-2 because pymodbus `standard.json` makes HR[100] an auto-increment register (value ticks on every poll). Switched `test-modbus.ps1` to **HR[200]** (scratch range in the profile) + updated sample config `bridgeNodeId` to match. Also fixed the AbCip probe: `-t @raw_cpu_type` was rejected by the driver's TagPath parser ("malformed TagPath"). Probe now uses the user-supplied `-TagPath` for every family. Works against both ab_server and real controllers. Verified driver-side against live containers: - Modbus 5020: probe ✓, HR[200] write+read round-trip ✓ - AB CIP 44818: probe ✓, TestDINT write+read round-trip ✓ - S7 1102: probe ✓, DB1.DBW0 write+read round-trip ✓ ## Known blocker (stages 3-5) README now flags — and the 4 child issues under umbrella #209 track — that `src/ZB.MOM.WW.OtOpcUa.Server/Program.cs:98-104` only registers Galaxy + FOCAS driver factories. `DriverInstanceBootstrapper` silently skips any `DriverType` without a registered factory, so stages 3-5 (anything crossing the OPC UA server) can't work today even with a perfect Config DB seed. Issues #210-213 scope the factory + seed SQL work per driver. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>