Second + third of the four driver test clients. Both follow the same shape as otopcua-modbus-cli (#249) and consume Driver.Cli.Common for DriverCommandBase + SnapshotFormatter. New projects: - src/ZB.MOM.WW.OtOpcUa.Driver.AbCip.Cli/ — otopcua-abcip-cli. AbCipCommandBase carries gateway (ab://host[:port]/cip-path) + family (ControlLogix/CompactLogix/Micro800/GuardLogix) + timeout. Commands: probe, read, write, subscribe. Value parser covers every AbCipDataType atomic type (Bool, SInt..LInt, USInt..ULInt, Real, LReal, String, Dt); Structure writes refused as out-of-scope for the CLI. - src/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Cli/ — otopcua-ablegacy-cli. AbLegacyCommandBase carries gateway + plc-type (Slc500/MicroLogix/Plc5/ LogixPccc) + timeout. Commands: probe (default address N7:0), read, write, subscribe. Value parser covers Bit, Int, Long, Float, AnalogInt, String, and the three sub-element types (TimerElement / CounterElement / ControlElement all land on int32 at the wire). Tests (35 new, 73 cumulative across the driver CLI family): - AB CIP: 17 tests — ParseValue happy-paths for every Logix atomic type, failure cases (non-numeric / bool garbage), tag-name synthesis. - AB Legacy: 18 tests — ParseValue coverage (Bit / Int / AnalogInt / Long / Float / String / sub-elements), PCCC address round-trip in tag names including bit-within-word + sub-element syntax. Docs: - docs/Driver.AbCip.Cli.md — family ↔ CIP-path cheat sheet + examples per command + typical workflows. - docs/Driver.AbLegacy.Cli.md — PCCC address primer (file letters → CLI --type) + known ab_server upstream gap cross-ref to #224 close-out. Wiring: - ZB.MOM.WW.OtOpcUa.slnx grew 4 entries (2 src + 2 tests). Full-solution build clean. `otopcua-abcip-cli --help` + `otopcua-ablegacy-cli --help` verified end-to-end. Next up (#251): S7 + TwinCAT CLIs, same pattern. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.4 KiB
otopcua-ablegacy-cli — AB Legacy (PCCC) test client
Ad-hoc probe / read / write / subscribe tool for SLC 500 / MicroLogix 1100 /
MicroLogix 1400 / PLC-5 devices, talking to the same AbLegacyDriver the
OtOpcUa server uses (libplctag PCCC back-end).
Third of four driver test-client CLIs. Shares Driver.Cli.Common with the
others.
Build + run
dotnet run --project src/ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.Cli -- --help
Common flags
| Flag | Default | Purpose |
|---|---|---|
-g / --gateway |
required | Canonical ab://host[:port]/cip-path |
-P / --plc-type |
Slc500 |
Slc500 / MicroLogix / Plc5 / LogixPccc |
--timeout-ms |
5000 |
Per-operation timeout |
--verbose |
off | Serilog debug output |
Family ↔ CIP-path cheat sheet:
- SLC 5/05 / PLC-5 —
1,0 - MicroLogix 1100 / 1400 — empty path (
ab://host/) — they use direct EIP with no backplane - LogixPccc —
1,0(Logix controller accessed via the PCCC compatibility layer; rare)
PCCC address primer
File letters imply data type; type flag still required so the CLI knows how to
parse your --value.
| File | Type | CLI --type |
|---|---|---|
N |
signed int16 | Int |
F |
float32 | Float |
B |
bit-packed (B3:0/3 addresses bit 3 of word 0) |
Bit |
L |
long int32 (SLC 5/05+ only) | Long |
A |
analog int (semantically like N) | AnalogInt |
ST |
ASCII string (82-byte + length header) | String |
T |
timer sub-element (T4:0.ACC / .PRE / .EN / .DN) |
TimerElement |
C |
counter sub-element (C5:0.ACC / .PRE / .CU / .CD / .DN) |
CounterElement |
R |
control sub-element (R6:0.LEN / .POS / .EN / .DN / .ER) |
ControlElement |
Commands
probe
# SLC 5/05 — default probe address N7:0
otopcua-ablegacy-cli probe -g ab://192.168.1.20/1,0
# MicroLogix 1100 — status file first word
otopcua-ablegacy-cli probe -g ab://192.168.1.30/ -P MicroLogix -a S:0
read
# Integer
otopcua-ablegacy-cli read -g ab://192.168.1.20/1,0 -a N7:10 -t Int
# Float
otopcua-ablegacy-cli read -g ab://192.168.1.20/1,0 -a F8:0 -t Float
# Bit-within-word
otopcua-ablegacy-cli read -g ab://192.168.1.20/1,0 -a B3:0/3 -t Bit
# Long (SLC 5/05+)
otopcua-ablegacy-cli read -g ab://192.168.1.20/1,0 -a L19:0 -t Long
# Timer ACC
otopcua-ablegacy-cli read -g ab://192.168.1.20/1,0 -a T4:0.ACC -t TimerElement
write
otopcua-ablegacy-cli write -g ab://192.168.1.20/1,0 -a N7:10 -t Int -v 42
otopcua-ablegacy-cli write -g ab://192.168.1.20/1,0 -a F8:0 -t Float -v 3.14
otopcua-ablegacy-cli write -g ab://192.168.1.20/1,0 -a B3:0/3 -t Bit -v on
Writes to timer / counter / control sub-elements land at the wire level but the PLC's runtime semantics (EN/DN edge-triggering, preset reload) are PLC-managed — use with caution.
subscribe
otopcua-ablegacy-cli subscribe -g ab://192.168.1.20/1,0 -a N7:10 -t Int -i 500
Known caveat — ab_server upstream gap
The integration-fixture ab_server Docker container accepts TCP but its PCCC
dispatcher doesn't actually respond — see
tests/...AbLegacy.IntegrationTests/Docker/README.md.
Point --gateway at real hardware or an RSEmulate 500 box for end-to-end
wire-level validation. The CLI itself is correct regardless of which endpoint
you target.