4.9 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
Array reads
PR 7 — one PCCC frame can carry up to ~120 words. Address an array tag with either the
Rockwell-native ,N suffix or the libplctag-native [N] suffix on the word number; both
forms canonicalise to [N] when the driver hands the tag to libplctag, and the parser
caps N at 120.
# Rockwell `,N` form — "10 consecutive words starting at N7:0"
otopcua-ablegacy-cli read -g ab://192.168.1.20/1,0 -a "N7:0,10" -t Int
# libplctag `[N]` form — same wire result
otopcua-ablegacy-cli read -g ab://192.168.1.20/1,0 -a "N7:0[10]" -t Int
# Float / Long arrays — same suffix syntax, narrower frame ceiling on Float (~60 elements)
# and Long (~60 elements) because each element is 4 bytes vs Int's 2.
otopcua-ablegacy-cli read -g ab://192.168.1.20/1,0 -a "F8:0,4" -t Float
otopcua-ablegacy-cli read -g ab://192.168.1.20/1,0 -a "L19:0,4" -t Long
# --array-length override — pin the element count from config rather than the address
# suffix. Wins over the parsed `,N` / `[N]` value when both are set; useful for keeping the
# address string compact while bumping the element count from a tags config file.
otopcua-ablegacy-cli read -g ab://192.168.1.20/1,0 -a "N7:0" --array-length 10 -t Int
Array tags reject sub-element references (T4:0,5.ACC) and bit suffixes (N7:0,10/3) at
parse time — both combinations are semantically meaningless against a contiguous block.
For B-files the Rockwell convention is "one BOOL per word, not per bit": B3:0,10
returns bool[10] (one per word's non-zero state), not bool[160].
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.