Files
lmxopcua/docs/Driver.AbLegacy.Cli.md
2026-04-25 23:36:01 -04:00

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-51,0
  • MicroLogix 1100 / 1400 — empty path (ab://host/) — they use direct EIP with no backplane
  • LogixPccc1,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.