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.
| Punkt | Wert |
|---|---|
opc_type | PROFINET |
| Implementierungsklasse | plantpulse.driver.protocol.profinet.ProfinetDriver |
| Bibliothek | eigene native Implementierung (plantpulse-plc-protocol von profinet — DCE/RPC Read-Implicit) |
| Vererbung | BaseProtocolDriver (nicht PLC4j) |
| Standardport | 34964 (PROFINET CM DCE/RPC, UDP) |
| Status | stabil (azyklisches Record-Polling) |
| read | OK (Read-Implicit, azyklischer Record) |
| write | ❌ (nur lesend — Write Record nicht implementiert) |
| Sicherheit | keine |
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
| Feld | Bedeutung | Standard |
|---|---|---|
opc_agent_ip | IP des PROFINET-Geräts | 192.168.1.30 |
opc_agent_port | UDP-Port | 34964 (0 = automatisch) |
options.read-timeout | Antwort-Timeout (ms) | 3000 |
options.api | PROFINET-API-Nummer | 0 |
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 als0x(Beispiel: I&M0 =0xAFF0)TYPE(StandardWORD):WORD(u16) /INT(i16) /DINT(i32) /DWORD(u32) /REAL(float32) /BOOL/STRING[n](Standard n=32). Record-Daten sind big-endian.
| Notation | Bedeutung |
|---|---|
0:1:0x0001:REAL | Record 0x0001 von slot0 / subslot1 als float32 |
0:1:2 | Record 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ützt —
isWriteSupported() = falseundwrite()liefern immerfalse. (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+ Paketprofinetvonplantpulse-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.