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>
60 lines
2.6 KiB
JSON
60 lines
2.6 KiB
JSON
{
|
|
"$comment": "Copy this file to e2e-config.json and replace the NodeIds with the ones your Config DB publishes. Fields named `opcUaUrl` override the -OpcUaUrl parameter on test-all.ps1 per-driver. Omit a top-level key to skip that driver.",
|
|
|
|
"modbus": {
|
|
"$comment": "Port 5020 matches tests/.../Modbus.IntegrationTests/Docker/docker-compose.yml — `docker compose --profile standard up -d`.",
|
|
"endpoint": "127.0.0.1:5020",
|
|
"bridgeNodeId": "ns=2;s=Modbus/HR200",
|
|
"opcUaUrl": "opc.tcp://localhost:4840"
|
|
},
|
|
|
|
"abcip": {
|
|
"$comment": "ab_server listens on port 44818 (default CIP/EIP). `docker compose --profile controllogix up -d`.",
|
|
"gateway": "ab://127.0.0.1:44818/1,0",
|
|
"family": "ControlLogix",
|
|
"tagPath": "TestDINT",
|
|
"bridgeNodeId": "ns=2;s=AbCip/TestDINT"
|
|
},
|
|
|
|
"ablegacy": {
|
|
"$comment": "Gated behind AB_LEGACY_TRUST_WIRE=1 — ab_server PCCC path upstream-broken, needs real SLC / MicroLogix / PLC-5 or RSEmulate 500.",
|
|
"gateway": "ab://192.168.1.10/1,0",
|
|
"plcType": "Slc500",
|
|
"address": "N7:5",
|
|
"bridgeNodeId": "ns=2;s=AbLegacy/N7_5"
|
|
},
|
|
|
|
"s7": {
|
|
"$comment": "Port 1102 matches tests/.../S7.IntegrationTests/Docker/docker-compose.yml (python-snap7 needs non-priv port). `docker compose --profile s7_1500 up -d`. Real S7 PLCs listen on 102.",
|
|
"endpoint": "127.0.0.1:1102",
|
|
"cpu": "S71500",
|
|
"slot": 0,
|
|
"address": "DB1.DBW0",
|
|
"bridgeNodeId": "ns=2;s=S7/DB1_DBW0"
|
|
},
|
|
|
|
"focas": {
|
|
"$comment": "Gated behind FOCAS_TRUST_WIRE=1 — no public simulator. Point at a real CNC + ensure Fwlib32.dll is on PATH.",
|
|
"host": "192.168.1.20",
|
|
"port": 8193,
|
|
"address": "R100",
|
|
"bridgeNodeId": "ns=2;s=Focas/R100"
|
|
},
|
|
|
|
"twincat": {
|
|
"$comment": "Gated behind TWINCAT_TRUST_WIRE=1 — needs XAR or standalone TwinCAT Router NuGet reachable at -AmsNetId.",
|
|
"amsNetId": "127.0.0.1.1.1",
|
|
"amsPort": 851,
|
|
"symbolPath": "MAIN.iCounter",
|
|
"bridgeNodeId": "ns=2;s=TwinCAT/MAIN_iCounter"
|
|
},
|
|
|
|
"phase7": {
|
|
"$comment": "Virtual tags + scripted alarms. The VirtualNodeId must resolve to a server-side virtual tag whose script reads the modbus InputNodeId and writes VT = input * 2. The AlarmNodeId is the ConditionId of a scripted alarm that fires when VT > 100.",
|
|
"modbusEndpoint": "127.0.0.1:5502",
|
|
"inputNodeId": "ns=2;s=Modbus/HR100",
|
|
"virtualNodeId": "ns=2;s=Virtual/VT_DoubledHR100",
|
|
"alarmNodeId": "ns=2;s=Alarm/HR100_High"
|
|
}
|
|
}
|