HART-IP Treiber
Übersicht
IP-Variante von HART (Highway Addressable Remote Transducer). 4–20-mA-Industriemessgeräte werden über ein IP-Gateway digital gelesen und geschrieben. Basiert auf der offenen HART-IP-Spezifikation der HCF.
| Punkt | Wert |
|---|---|
opc_type | HART |
| Implementierungsklasse | plantpulse.driver.protocol.hart.HARTDriver |
| Bibliothek | Eigene Java-Implementierung (auf Basis der HCF-Spezifikation, keine externen Bibliotheken erforderlich) |
| read | ✅ (cmd 1, 3, 13) |
| write | ✅ (cmd 6, 17, 18, 19, 22) |
| Sicherheit | keine (die HART-IP-Spezifikation selbst sieht weder Authentifizierung noch Verschlüsselung vor) |
| Standardport | 5094 (TCP) |
Klassenstruktur
| Klasse | Aufgabe |
|---|---|
HARTDriver | Lebenszyklus / Adressparser / read- und write-Dispatch / KeepAlive-Thread |
HartIpHeader | 13-Byte-HART-IP-Header (version, type, id, status, sequence, byteCount BE) |
HartCommand | HART-Kommando-PDU-Builder — preamble + 0x82 + 5-Byte-Adresse + cmd + byteCount + data + XOR |
HartChecksum | longitudinal XOR (ohne Preamble) |
HartDecode | float32-BE- / Packed-ASCII-6-Bit-Decoder, Auswertung der Communication-Status-Bits |
Wire-Format
HART-IP 메시지 = 13-byte 헤더 + payload
byte 0 Version 1
byte 1 Message Type 0=Request 1=Response 2=Publish 3=NAK
byte 2 Message ID 0=Session-Init 1=Session-Close 2=KeepAlive 3=PDU
byte 3 Status / Error
byte 4-5 Sequence (BE)
byte 6-7 ByteCount (BE, 헤더 13 byte 포함)
byte 8-12 Reserved (0)
PDU payload (Message ID 3) =
Preamble(0xFF×N) + Start(0x82) + Address(5) + Command(1) + ByteCount(1) + Data(N) + XOR(1)
Handshake: connect() sendet Session Init (Master-Type 1 Byte + Inactivity-Close-Time 4 Byte BE) und empfängt die Response. Anschließend sendet ein KeepAlive-Hintergrundthread periodisch Message ID 2.
OPC-Registrierungsoptionen
| Feld | Bedeutung | Standard |
|---|---|---|
opc_agent_ip / opc_agent_port | Gateway-IP / Port | (bei Port 0 gilt 5094) |
options.master-type | primary / secondary | primary |
options.inactivity-ms | Session Inactivity Close Time | 600000 (10 Minuten) |
options.keepalive-ms | KeepAlive-Sendeintervall | 30000 |
options.connect-timeout | TCP-Connect-Timeout | 5000 |
options.read-timeout | read-SO-Timeout | 5000 |
Tag-plc_address-Format
| Notation | Bedeutung | Dekodierung |
|---|---|---|
1 oder 1:pv | cmd 1 — Read PV | float32 BE (ab Offset 3 nach den 2 Status-Bytes) |
3:0 ~ 3:3 oder 3:pv/sv/tv/qv | cmd 3 — PV/SV/TV/QV | 4 × float32 BE (vereinfachtes Modell) |
13 oder 13:tag | cmd 13 — Tag 8 Zeichen | packed-ASCII (3 Byte → 4 Zeichen) |
write-Adressen (zusammen mit address.getValue()):
| Notation | Bedeutung | Wertformat |
|---|---|---|
6 / polling-address | cmd 6 — Write Polling Address | Ganzzahl 0..63 |
17 / message | cmd 17 — Write Message | 32 Zeichen packed-ASCII |
18 / tag / descriptor / date | cmd 18 — Tag/Descriptor/Date | tag|desc|DD/MM/YY oder je Sub-Field |
19 / final-assembly | cmd 19 — Final Assembly Number | 0..16777215 |
22 / long-tag | cmd 22 — Long Tag (32 Byte ISO-Latin-1) | beliebige Zeichenkette |
Nicht unterstützte Bereiche
- WirelessHART (HART 7) Burst-Modus, asynchroner Empfang von Publish (Message Type 2).
- Device-Discovery-Kommandos wie cmd 0/cmd 50/cmd 9 — nachrüstbar.
- Short-Frame-Adressierung neben Long-Frame.
- Manufacturer-/Device-Type-Abgleich der 5-Byte-Geräteadresse (derzeit Zero-Fill).
- Synchrone Verarbeitung von KeepAlive-Antworten — der Einfachheit halber werden KeepAlive-Antworten ignoriert (kann durch einen separaten Receiver-Thread mit Seq-Correlation ergänzt werden).
Testabdeckung
test/java/plantpulse/driver/protocol/hart/
| Test | Prüfung |
|---|---|
HartIpHeaderTest | Round-Trip des 13-Byte-Headers |
HartChecksumTest | XOR gegen bekannten Vektor |
HartCommandTest / HartCommandWriteTest | PDU-Aufbau für cmd 0/1/3/13/6/17/18/19/22 |
HartDecodeTest / HartEncodeTest | float32 BE, packed-ASCII (bidirektional), BCD-Datum |
HARTDriverAddressTest / HARTDriverWriteTest | Adressparser + write-Dispatch |
HartSpecExtraTest | weitere Spezifikationskonformität |
Referenzen
- HART-IP spec — FieldComm Group / HART Communication Foundation (Mitgliederdokumente).
- Code:
plantpulse-edge-driver/src/plantpulse/driver/protocol/hart/. - Im Betrieb muss am Gateway (z. B. ABB AC500-eCo, Pepperl+Fuchs HART Multiplexer) TCP 5094 freigegeben sein.