CODE-REALITY: - Line 7: "Fourth of four" → "Fourth of six"; there are 6 driver CLIs (Modbus, AbCip, AbLegacy, S7, TwinCAT, FOCAS); confirmed by src/Drivers/Cli/ project count. - read section: removed the `DB10.STRING[0] -t String --string-length 80` example that documented an unusable code path. String (and Int64, UInt64, Float64, DateTime) live in S7DataType but are blocked in S7Driver.UnimplementedDataTypes; any attempt returns BadNotSupported (src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.S7/S7Driver.cs:327-333 and :450). Added an explicit "not yet implemented" note with the source location so readers know why those types are omitted. STRUCTURAL: no rows in links-report.md for this doc. STALE-STATUS: no state words found. INLINE COMPLETENESS: no inventory-diff gaps for this doc.
2.9 KiB
otopcua-s7-cli — Siemens S7 test client
Ad-hoc probe / read / write / subscribe tool for Siemens S7-300 / S7-400 /
S7-1200 / S7-1500 (and compatible soft-PLCs) over S7comm / ISO-on-TCP port 102.
Uses the same S7Driver the OtOpcUa server does (S7.Net under the hood).
Fourth of six driver test-client CLIs.
Build + run
dotnet run --project src/Drivers/Cli/ZB.MOM.WW.OtOpcUa.Driver.S7.Cli -- --help
Common flags
| Flag | Default | Purpose |
|---|---|---|
-h / --host |
required | PLC IP or hostname |
-p / --port |
102 |
ISO-on-TCP port (rarely changes) |
-c / --cpu |
S71500 |
S7200 / S7200Smart / S7300 / S7400 / S71200 / S71500 |
--rack |
0 |
Hardware rack (S7-400 distributed setups only) |
--slot |
0 |
CPU slot (S7-300 = 2, S7-400 = 2 or 3, S7-1200/1500 = 0) |
--timeout-ms |
5000 |
Per-operation timeout |
--verbose |
off | Serilog debug output |
PUT/GET must be enabled
S7-1200 / S7-1500 ship with PUT/GET communication disabled by default.
Enable it in TIA Portal: Device config → Protection & Security → Connection
mechanisms → "Permit access with PUT/GET communication from remote partner".
Without it the CLI's first read will surface BadNotSupported.
S7 address grammar cheat sheet
| Form | Meaning |
|---|---|
DB1.DBW0 |
DB number 1, word offset 0 |
DB1.DBD4 |
DB number 1, dword offset 4 |
DB1.DBX2.3 |
DB number 1, byte 2, bit 3 |
DB10.STRING[0] |
DB 10 string starting at offset 0 |
M0.0 |
Merker bit 0.0 |
MW0 / MD4 |
Merker word / dword |
IW4 |
Input word 4 |
QD8 |
Output dword 8 |
Commands
probe
# S7-1500 — default probe MW0
otopcua-s7-cli probe -h 192.168.1.30
# S7-300 (slot 2)
otopcua-s7-cli probe -h 192.168.1.31 -c S7300 --slot 2 -a DB1.DBW0
read
Supported types: Bool, Byte, Int16, UInt16, Int32, UInt32, Float32.
Int64, UInt64, Float64, String, and DateTime are defined in S7DataType but
not yet implemented — the driver rejects them at initialisation and any read or write
returns BadNotSupported
(src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.S7/S7Driver.cs — UnimplementedDataTypes set).
# DB word
otopcua-s7-cli read -h 192.168.1.30 -a DB1.DBW0 -t Int16
# Float32 from DB dword
otopcua-s7-cli read -h 192.168.1.30 -a DB1.DBD4 -t Float32
# Merker bit
otopcua-s7-cli read -h 192.168.1.30 -a M0.0 -t Bool
write
otopcua-s7-cli write -h 192.168.1.30 -a DB1.DBW0 -t Int16 -v 42
otopcua-s7-cli write -h 192.168.1.30 -a DB1.DBD4 -t Float32 -v 3.14
otopcua-s7-cli write -h 192.168.1.30 -a M0.0 -t Bool -v true
Writes to M / Q are real — they drive the PLC program. Be careful what you flip on a running machine.
subscribe
otopcua-s7-cli subscribe -h 192.168.1.30 -a DB1.DBW0 -t Int16 -i 500
S7comm has no native push — the CLI polls through PollGroupEngine just like
Modbus / AB.