PROFINET ドライバ
概要
PROFINET IO — 産業用イーサネットベースの fieldbus。2026-07 ネイティブ再実装 — 旧 Apache PLC4j profinet への委譲は削除されました(PLC4X profinet は raw Ethernet(EtherType 0x8892、libpcap 前提)+ canRead()=false のため、Edge では connect 自体が例外で落ちていました)。現在は plantpulse-plc-protocol の独自 acyclic Read-Implicit(DCE/RPC over UDP 34964) 実装(ProfinetPLC)を使用します — AR(Connect)なしで ARUUID=0 として record を読み出すサービス(I&M データなどエンジニアリングツール経路)であり、ポーリング型収集器に適合します。
| 項目 | 値 |
|---|---|
opc_type | PROFINET |
| 実装クラス | plantpulse.driver.protocol.profinet.ProfinetDriver |
| ライブラリ | 独自ネイティブ (plantpulse-plc-protocol の profinet — DCE/RPC Read-Implicit) |
| 継承 | BaseProtocolDriver (PLC4j ではない) |
| デフォルトポート | 34964 (PROFINET CM DCE/RPC, UDP) |
| 状態 | 安定 (acyclic record ポーリング) |
| read | OK (Read-Implicit, acyclic record) |
| write | ❌ (読み取り専用 — Write record 未実装) |
| セキュリティ | なし |
本ドライバは acyclic record ポーリング専用です。サイクリック IO 交換(RT/IRT、L2 raw Ethernet)は非対応 — RT が必要な場合は raw-ethernet(pcap, CAP_NET_RAW)トラックが別途必要です。GSDML ファイルも使用しません(record 座標を直接指定)。
クラス構造
BaseProtocolDriver
└── ProfinetDriver — connect() 에서 ProfinetPLC(host, port) 생성 (UDP connectionless)
UDP は connectionless のためハンドシェイクがありません — ライブネスは read 失敗時に無効化します(AB-ETH/BACnet パターン)。要求→応答の往復は ProfinetPLC 内で直列化(one outstanding request)され、応答は activityUuid + sequenceNumber のエコー検証で stale を拒否します。
OPC 登録オプション
| フィールド | 意味 | デフォルト |
|---|---|---|
opc_agent_ip | PROFINET デバイス IP | 192.168.1.30 |
opc_agent_port | UDP ポート | 34964 (0 なら自動) |
options.read-timeout | 応答タイムアウト (ms) | 3000 |
options.api | PROFINET API 番号 | 0 |
旧フォームの gsd-directory / dap-id / ip-address オプションはネイティブでは受け付けません(削除済み)。record 座標はタグアドレスで直接指定します。
タグ plc_address 形式 (新契約)
<slot>:<subslot>:<index>[:<TYPE>]
index: 10進または0x16進 (例: I&M0 =0xAFF0)TYPE(デフォルトWORD):WORD(u16) /INT(i16) /DINT(i32) /DWORD(u32) /REAL(float32) /BOOL/STRING[n](デフォルト n=32)。record data は big-endian。
| 表記 | 意味 |
|---|---|
0:1:0x0001:REAL | slot0 / subslot1 の record 0x0001 を float32 として |
0:1:2 | record 2 を WORD(u16) として — TYPE 省略 |
0:1:0xAFF0:STRING[32] | I&M0 領域の文字列 |
support / 非対応
- read: DCE/RPC Read-Implicit (acyclic record) — OK。
- write: 非対応 —
isWriteSupported() = false、write()は常にfalse。(Write record は今後対応。) - サイクリック IO (RT/IRT): 非対応 — record ポーリング専用。
- DCP discovery / 自動 IP 設定: 非対応 — IP を直接指定。
- PROFIsafe / PROFIenergy profile: 非対応。
curl 登録例
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"}
]
}'
参考
- Profinet IO — IEC 61158-6-10 / IEC 61784。Read-Implicit = CM opnum 5。
- コード:
plantpulse-edge-driver/src/plantpulse/driver/protocol/profinet/ProfinetDriver.java+plantpulse-plc-protocolのprofinetパッケージ。 - 運用: S7 PLC のメモリ値収集が目的であれば S7 (ISO-on-TCP) ドライバ の方が一般的です — 本ドライバは PROFINET デバイスの record(I&M など)ポーリング用です。