Zum Hauptinhalt springen

PROFINET Treiber

Überblick

PROFINET IO — Feldbus auf Basis von Industrial Ethernet. Native Neuimplementierung 2026-07 — die alte Delegation an Apache PLC4j profinet wurde entfernt (PLC4X profinet setzt auf raw Ethernet (EtherType 0x8892, libpcap vorausgesetzt) + canRead()=false, weshalb bereits der connect auf der Edge mit einer Exception abbrach). Jetzt wird die eigene azyklische Read-Implicit-Implementierung (DCE/RPC over UDP 34964) von plantpulse-plc-protocol verwendet (ProfinetPLC) — ein Dienst, der Records ohne AR (Connect) mit ARUUID=0 liest (Engineering-Tool-Pfad, u. a. I&M-Daten) und damit gut zu einem Polling-Kollektor passt.

PunktWert
opc_typePROFINET
Implementierungsklasseplantpulse.driver.protocol.profinet.ProfinetDriver
Bibliothekeigene native Implementierung (plantpulse-plc-protocol von profinet — DCE/RPC Read-Implicit)
VererbungBaseProtocolDriver (nicht PLC4j)
Standardport34964 (PROFINET CM DCE/RPC, UDP)
Statusstabil (azyklisches Record-Polling)
readOK (Read-Implicit, azyklischer Record)
write❌ (nur lesend — Write Record nicht implementiert)
Sicherheitkeine
Nur azyklische Records — kein zyklisches RT

Dieser Treiber ist ausschließlich für azyklisches Record-Polling ausgelegt. Zyklischer IO-Austausch (RT/IRT, L2 raw Ethernet) wird nicht unterstützt — wird RT benötigt, ist ein separater raw-ethernet-Pfad (pcap, CAP_NET_RAW) erforderlich. GSDML-Dateien werden ebenfalls nicht verwendet (Record-Koordinaten werden direkt angegeben).


Klassenstruktur

BaseProtocolDriver
└── ProfinetDriver — connect() 에서 ProfinetPLC(host, port) 생성 (UDP connectionless)

Da UDP verbindungslos ist, gibt es keinen Handshake — die Liveness wird bei einem fehlgeschlagenen read invalidiert (Muster wie AB-ETH/BACnet). Der Umlauf Anfrage→Antwort wird innerhalb von ProfinetPLC serialisiert (one outstanding request); Antworten werden über den Echo-Abgleich von activityUuid + sequenceNumber geprüft, um veraltete Pakete zu verwerfen.


OPC-Registrierungsoptionen

FeldBedeutungStandard
opc_agent_ipIP des PROFINET-Geräts192.168.1.30
opc_agent_portUDP-Port34964 (0 = automatisch)
options.read-timeoutAntwort-Timeout (ms)3000
options.apiPROFINET-API-Nummer0
Alte PLC4X-Optionen entfernt

Die Optionen gsd-directory / dap-id / ip-address des alten Formulars werden von der nativen Implementierung nicht akzeptiert (entfernt). Record-Koordinaten werden direkt über die Tag-Adresse angegeben.


Tag-plc_address-Format (neuer Vertrag)

<slot>:<subslot>:<index>[:<TYPE>]
  • index: dezimal oder hexadezimal als 0x (Beispiel: I&M0 = 0xAFF0)
  • TYPE (Standard WORD): WORD (u16) / INT (i16) / DINT (i32) / DWORD (u32) / REAL (float32) / BOOL / STRING[n] (Standard n=32). Record-Daten sind big-endian.
NotationBedeutung
0:1:0x0001:REALRecord 0x0001 von slot0 / subslot1 als float32
0:1:2Record 2 als WORD (u16) — TYPE weggelassen
0:1:0xAFF0:STRING[32]Zeichenkette aus dem I&M0-Bereich

Unterstützt / nicht unterstützt

  • read: DCE/RPC Read-Implicit (azyklischer Record) — OK.
  • write: nicht unterstütztisWriteSupported() = false und write() liefern immer false. (Write Record folgt später.)
  • Zyklisches IO (RT/IRT): nicht unterstützt — nur Record-Polling.
  • DCP-Discovery / automatische IP-Vergabe: nicht unterstützt — IP direkt angeben.
  • PROFIsafe / PROFIenergy-Profile: nicht unterstützt.

curl-Registrierungsbeispiel

curl -X POST http://<edge-host>/api/v1/opc \
-H "Content-Type: application/json" \
-d '{
"opc_id": "OPC_PROFINET_IO1",
"opc_type": "PROFINET",
"opc_name": "PN Device 1",
"opc_agent_ip": "192.168.1.30",
"opc_agent_port": "34964",
"site_id": "SITE_00001",
"auto_collect": true,
"timecycle": 1000,
"options": { "read-timeout": "3000" },
"tag_list": [
{"tag_id":"OPC_PROFINET_IO1_T01","tag_name":"Rec1","plc_address":"0:1:0x0001:REAL","data_type":"Float"},
{"tag_id":"OPC_PROFINET_IO1_T02","tag_name":"Rec2","plc_address":"0:1:2:WORD","data_type":"Integer"}
]
}'

Hinweise

  • Profinet IO — IEC 61158-6-10 / IEC 61784. Read-Implicit = CM opnum 5.
  • Code: plantpulse-edge-driver/src/plantpulse/driver/protocol/profinet/ProfinetDriver.java + Paket profinet von plantpulse-plc-protocol.
  • Betrieb: Geht es um die Erfassung von Speicherwerten einer S7-PLC, ist der S7-Treiber (ISO-on-TCP) gebräuchlicher — dieser Treiber dient dem Polling von Records (I&M usw.) an PROFINET-Geräten.