Zum Hauptinhalt springen

Beckhoff TwinCAT/ADS Treiber

Überblick

AMS/ADS over TCP von Beckhoff TwinCAT. Ohne JNI / externe Bibliotheken erfolgt die Socket-Kommunikation direkt innerhalb einer einzelnen JVM, allein auf Basis der von Beckhoff veröffentlichten infosys AMS/ADS Wire-Spezifikation.

PunktWert
opc_typeADS
Implementierungsklasseplantpulse.driver.protocol.ads.ADSDriver
Bibliothek(keine — Eigenimplementierung. Beckhoff infosys, offene Spezifikation)
readgut (indexGroup/Offset oder Symbol-Handle)
writegut (isWriteSupported() = true)
Standardport48898 (ADS over TCP)
Standard-AMS-Port851 (PLC Runtime 1)
Sicherheitkeine (direkte TCP-Verbindung, ADS Secure nicht unterstützt)
Zugriff auf den TwinCAT Router

Die ADS-Kommunikation erfordert eine statische Route, die im AMS Router des PC/PLC eingetragen ist. Nachdem im TwinCAT System Manager auf PLC-Seite die AmsNetId des Edge als Route registriert wurde, richtet dieser Treiber seine Anfragen an die entsprechende NetId.


Klassen / Struktur

ADSDriver (BaseProtocolDriver)
├── AmsTcpHeader 6 byte reserved + length(LE)
├── AmsHeader 32 byte target/source NetId+Port + cmd + state + dataLen + err + invokeId
├── AdsRead.buildRequest(indexGroup, indexOffset, length)
├── AdsWrite.buildRequest(indexGroup, indexOffset, data)
├── AdsResponse.parse(payload) — errorCode + data
├── AdsCommand — READ / WRITE / READ_STATE / READ_WRITE 상수, IGRP_*
└── AdsCodec — putUInt16/32LE, getUInt16/32LE, getInt32LE

Die Zuordnung von Anfrage und Antwort erfolgt über eine 32-Bit-invokeId, die von AtomicInteger invokeIdCounter vergeben wird; auf einem einzelnen Socket wird per synchronized sendCommand(...) serialisiert. Die Ergebnisse der Umsetzung Symbolname → Handle werden in symbolHandleCache (HashMap) zwischengespeichert.


Zusammenfassung des Wire-Formats

AMS/TCP Header (6) | AMS Header (32) | ADS payload (가변)
└ reserved(2) len(4)│└ tgtNetId(6) tgtPort(2) srcNetId(6) srcPort(2) cmd(2) state(2) dataLen(4) err(4) invokeId(4)
  • Alle Integer-Felder little-endian.
  • AmsNetId ist 6 Byte (z. B. 5.40.40.116.1.1).
  • cmd : READ=2, WRITE=3, READ_STATE=4, READ_WRITE=9.
  • stateFlags : STATEFLAG_REQ_RESP = 0x0004 (Antwort erforderlich).

OPC-Registrierungsoptionen (options)

SchlüsselBedeutungStandard
target-netidAmsNetId der PLC, z. B. 5.40.40.116.1.1host + .1.1
target-portAMS-Zielport (PLC Runtime)851
source-netidlokale AmsNetId127.0.0.1.1.1
source-portlokaler AMS-Port32905
connect-timeoutVerbindungs-Timeout (ms)3000
read-timeoutTimeout für Antwort (ms)3000

Unmittelbar nach connect() wird der Handshake durch Aufruf von READ_STATE verifiziert — bei Fehlschlag connected=false.


Tag-Adressformate

NotationBedeutungindexGroup
M0:4%M Offset 0, 4 ByteIGRP_PLC_RW_MB (0x4020)
I0:2%I Offset 0, 2 ByteIGRP_PLC_RW_IB (0x4000)
Q0:1%Q Offset 0IGRP_PLC_RW_QB (0x4030)
DB10:4DB10 Offset 0IGRP_PLC_RW_DB (0x4040)
0x4020:0x10:4direkt indexGroup:indexOffset:length(unverändert)
MAIN.fCounter:REALsymbolisch (ReadWrite + IGRP_GET_SYMHANDLE_BYNAME → Cache)(Handle-basiert)

Nach : kann entweder die Byte-Länge oder ein TwinCAT-Typschlüsselwort wie BOOL / INT / DINT / REAL / LREAL / STRING angegeben werden; sizeOfTypeKeyword(...) bestimmt dann die Byte-Länge.


Datenkodierung / -dekodierung

decode(byte[], data_type) / encode(value, data_type, hintLen) verarbeiten little-endian:

data_typeByteAnmerkung
Boolean / Bool1data[0] != 0
Byte1unsigned
Short / Int / Integer / Word2signed 16
UInt162unsigned
Int32 / DWord4signed 32
UInt324unsigned
Float / REAL4IEEE 754
Long / Int64 / LWord8signed
Double / LREAL8IEEE 754
StringNUTF-8, NUL-terminiert verarbeitet

Unterstützt / nicht unterstützt

  • ✅ Memory Area read/write (M / I / Q / DB)
  • ✅ Symbolname → Handle (IGRP_GET_SYMHANDLE_BYNAME = 0xF003) → IGRP_RW_SYMVAL_BYHANDLE (0xF005)
  • READ_STATE (ADS state + Device state)
  • ❌ ADS Notification (Subscription)
  • ❌ SUMUP (Bündelung mehrerer Reads in einem Aufruf)
  • ❌ ADS Secure / TLS

Testabdeckung

test/java/plantpulse/driver/protocol/ads/

KlasseAnzahl Tests
AdsAddressParseTest10
AdsCodecTest11
AdsReadTest5
AdsResponseTest5
AdsSpecComplianceTest23
AdsWriteTest5
AmsHeaderTest6
AmsNetIdTest7
AmsTcpHeaderTest7

Insgesamt 79 Tests.


Referenzen

  • Beckhoff infosys: TwinCAT ADS / AMS over TCP wire format
  • Code: src/plantpulse/driver/protocol/ads/