Zum Hauptinhalt springen

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.

PunktWert
opc_typeHART
Implementierungsklasseplantpulse.driver.protocol.hart.HARTDriver
BibliothekEigene Java-Implementierung (auf Basis der HCF-Spezifikation, keine externen Bibliotheken erforderlich)
read✅ (cmd 1, 3, 13)
write✅ (cmd 6, 17, 18, 19, 22)
Sicherheitkeine (die HART-IP-Spezifikation selbst sieht weder Authentifizierung noch Verschlüsselung vor)
Standardport5094 (TCP)

Klassenstruktur

KlasseAufgabe
HARTDriverLebenszyklus / Adressparser / read- und write-Dispatch / KeepAlive-Thread
HartIpHeader13-Byte-HART-IP-Header (version, type, id, status, sequence, byteCount BE)
HartCommandHART-Kommando-PDU-Builder — preamble + 0x82 + 5-Byte-Adresse + cmd + byteCount + data + XOR
HartChecksumlongitudinal XOR (ohne Preamble)
HartDecodefloat32-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

FeldBedeutungStandard
opc_agent_ip / opc_agent_portGateway-IP / Port(bei Port 0 gilt 5094)
options.master-typeprimary / secondaryprimary
options.inactivity-msSession Inactivity Close Time600000 (10 Minuten)
options.keepalive-msKeepAlive-Sendeintervall30000
options.connect-timeoutTCP-Connect-Timeout5000
options.read-timeoutread-SO-Timeout5000

Tag-plc_address-Format

NotationBedeutungDekodierung
1 oder 1:pvcmd 1 — Read PVfloat32 BE (ab Offset 3 nach den 2 Status-Bytes)
3:0 ~ 3:3 oder 3:pv/sv/tv/qvcmd 3 — PV/SV/TV/QV4 × float32 BE (vereinfachtes Modell)
13 oder 13:tagcmd 13 — Tag 8 Zeichenpacked-ASCII (3 Byte → 4 Zeichen)

write-Adressen (zusammen mit address.getValue()):

NotationBedeutungWertformat
6 / polling-addresscmd 6 — Write Polling AddressGanzzahl 0..63
17 / messagecmd 17 — Write Message32 Zeichen packed-ASCII
18 / tag / descriptor / datecmd 18 — Tag/Descriptor/Datetag|desc|DD/MM/YY oder je Sub-Field
19 / final-assemblycmd 19 — Final Assembly Number0..16777215
22 / long-tagcmd 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/

TestPrüfung
HartIpHeaderTestRound-Trip des 13-Byte-Headers
HartChecksumTestXOR gegen bekannten Vektor
HartCommandTest / HartCommandWriteTestPDU-Aufbau für cmd 0/1/3/13/6/17/18/19/22
HartDecodeTest / HartEncodeTestfloat32 BE, packed-ASCII (bidirektional), BCD-Datum
HARTDriverAddressTest / HARTDriverWriteTestAdressparser + write-Dispatch
HartSpecExtraTestweitere 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.