PROFINETコネクタ
PROFINETコネクタは、IEC 61158で定義されたスロット/サブスロット/インデックスアドレッシングを使用してPROFINET IOデバイスとの通信を可能にします。UDP経由でPROFINET DCE-RPCプロトコルを話し、ターゲットデバイスとのアプリケーションリレーション(AR)を確立し、レコードデータの読み書きを交換します。
コネクタタイプ:
ProfinetReader- PROFINET IOデバイスからレコードデータをポーリングProfinetWriter- PROFINET IOデバイスにレコードデータを書き込む
- ✅ スロット/サブスロット/インデックスアドレッシングによるPROFINET IOレコードデータの読み書き
- ✅ UDP経由のDCE-RPCトランスポート
- ✅ 自動再接続を伴うアプリケーションリレーション(AR)管理
- ✅ すべてのプリミティブ型のためのビッグエンディアンバイナリデコード
- ✅ 幅広いデータ型サポート:Bool、Int8/16/32、UInt8/16/32、Float32/64、OctetString
- ✅ 設定可能なポーリングレートと呼び出しごとのタイムアウト
PROFINET Reader
Section titled “PROFINET Reader”{ "type": "ProfinetReader", "config": { "endpoint": "192.168.0.50:34964", "pollingRate": 1000, "timeout": 5000 }, "variables": [ { "key": "temperature", "slot": 1, "subslot": 1, "index": 100, "dataType": "Float32", "length": 4 }, { "key": "running_state", "slot": 1, "subslot": 1, "index": 101, "dataType": "Bool", "length": 1 } ]}PROFINET Writer
Section titled “PROFINET Writer”{ "type": "ProfinetWriter", "config": { "endpoint": "192.168.0.50:34964", "timeout": 5000 }, "variables": [ { "key": "setpoint", "slot": 1, "subslot": 1, "index": 200, "dataType": "Float32", "length": 4 }, { "key": "enable_output", "slot": 1, "subslot": 1, "index": 201, "dataType": "Bool", "length": 1 } ]}設定パラメータ
Section titled “設定パラメータ”Endpoint
Section titled “Endpoint”ターゲットデバイスのIPアドレスとPROFINET DCE-RPCポート。
{ "endpoint": "192.168.0.50:34964" }形式: host:port。デフォルトのPROFINET DCE-RPCポートは34964です。一部のデバイスは代替ポートでリッスンします — デバイスのGSDファイルを参照してください。
Polling Rate
Section titled “Polling Rate”リーダーには必須。連続する読み取り間のミリ秒単位の間隔。
{ "pollingRate": 1000 }推奨値:
- 高速診断データ: 100-500ms
- プロセス変数: 500-2000ms
- 低速テレメトリ: 5000ms以上
PROFINET IOデバイスは一般的に高ポーリングレートに寛容ですが、LANとデバイスのレスポンス予算は実際の制限です。
Timeout
Section titled “Timeout”オプション。ミリ秒単位の呼び出しごとのRPCタイムアウト。デフォルトは実装定義です。
{ "timeout": 5000 }推奨値:
- ローカルLANデバイス: 1000-3000ms
- NATまたはリレーの背後のデバイス: 5000-10000ms
各変数は1つのレコードアドレスとそのワイヤ上のエンコーディングを記述します。
{ "key": "temperature", "slot": 1, "subslot": 1, "index": 100, "dataType": "Float32", "length": 4}| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
key | string | はい | Meddleペイロードキー |
slot | uint16 | はい | PROFINETスロット番号 |
subslot | uint16 | はい | PROFINETサブスロット番号 |
index | uint16 | はい | レコードインデックス |
dataType | string | はい | エンコーディング(下記参照) |
length | uint16 | はい | 読み書きするバイト数 |
スロット/サブスロット/インデックスアドレッシング
Section titled “スロット/サブスロット/インデックスアドレッシング”PROFINET IOデバイスはI/Oを階層としてモデル化します:
- Slot: デバイス内の論理「カード」。スロット0はデバイス自体(DAP)のために予約されています
- Subslot: スロット内のサブモジュール。サブスロット1は通常主要なI/Oです
- Index: そのサブモジュール上の特定のレコード。デバイスのGSDMLファイルで定義されています
アドレッシングマップについては、デバイスに同梱されているGSDML(General Station Description Markup Language)ファイルを参照してください。
コネクタはビッグエンディアンバイト順序(PROFINET規約)を使用してレコードバイトをデコードします:
{ "dataType": "Bool", "length": 1 }1バイト。0x00 → false、それ以外 → true。
{ "dataType": "Int8", "length": 1 }{ "dataType": "UInt8", "length": 1 }{ "dataType": "Int16", "length": 2 }{ "dataType": "UInt16", "length": 2 }{ "dataType": "Int32", "length": 4 }{ "dataType": "UInt32", "length": 4 }すべてのマルチバイト整数はビッグエンディアンです。
{ "dataType": "Float32", "length": 4 }{ "dataType": "Float64", "length": 8 }IEEE 754浮動小数点、ビッグエンディアン。
{ "dataType": "OctetString", "length": 32 }UTF-8文字列として解釈される生のバイト。lengthは読み取られる最大バイト数を制御します。デバイスの実際のレスポンス長が返される数を支配します。
サポートされる型:
| 型 | バイト | Go出力型 |
|---|---|---|
Bool | 1 | bool |
Int8 | 1 | int8 |
UInt8 | 1 | uint8 |
Int16 | 2 | int16 |
UInt16 | 2 | uint16 |
Int32 | 4 | int32 |
UInt32 | 4 | uint32 |
Float32 | 4 | float32 |
Float64 | 8 | float64 |
OctetString | 可変 | string |
データフロー
Section titled “データフロー”リーダーデータフロー
Section titled “リーダーデータフロー”PROFINETデバイス → ProfinetReader(RPC ReadRecord) → デコードされた値 → Meddleペイロード例:
リーダー設定:
{ "variables": [ { "key": "temperature", "slot": 1, "subslot": 1, "index": 100, "dataType": "Float32", "length": 4 }, { "key": "running", "slot": 1, "subslot": 1, "index": 101, "dataType": "Bool", "length": 1 } ]}出力ペイロード:
{ "temperature": 24.7, "running": true}ライターデータフロー
Section titled “ライターデータフロー”Meddleペイロード → ProfinetWriter(エンコード + RPC WriteRecord) → PROFINETデバイス例:
入力ペイロード:
{ "setpoint": 75.0, "enable_output": true}設定されたvariable.keyに一致する各キーはそのdataTypeに従ってエンコードされ、WriteRecord経由で書き込まれます。変数リストにないキーは無視されます。
一般的なユースケース
Section titled “一般的なユースケース”1. PROFINET IOモジュールからの診断データの読み取り
Section titled “1. PROFINET IOモジュールからの診断データの読み取り”{ "type": "ProfinetReader", "config": { "endpoint": "192.168.0.50:34964", "pollingRate": 2000, "timeout": 5000 }, "variables": [ { "key": "module_status", "slot": 1, "subslot": 1, "index": 1000, "dataType": "UInt16", "length": 2 }, { "key": "temperature_c", "slot": 1, "subslot": 1, "index": 1001, "dataType": "Float32", "length": 4 }, { "key": "uptime_seconds", "slot": 0, "subslot": 1, "index": 2000, "dataType": "UInt32", "length": 4 }, { "key": "device_name", "slot": 0, "subslot": 1, "index": 3000, "dataType": "OctetString", "length": 64 } ]}2. ドライブへの設定値の送信
Section titled “2. ドライブへの設定値の送信”{ "type": "ProfinetWriter", "config": { "endpoint": "192.168.0.60:34964", "timeout": 3000 }, "variables": [ { "key": "speed_rpm", "slot": 1, "subslot": 1, "index": 100, "dataType": "Int32", "length": 4 }, { "key": "torque_limit", "slot": 1, "subslot": 1, "index": 101, "dataType": "Float32", "length": 4 }, { "key": "enable", "slot": 1, "subslot": 1, "index": 102, "dataType": "Bool", "length": 1 } ]}3. 複数のサブモジュールからの読み取り
Section titled “3. 複数のサブモジュールからの読み取り”{ "type": "ProfinetReader", "config": { "endpoint": "192.168.0.50:34964", "pollingRate": 1000, "timeout": 5000 }, "variables": [ { "key": "input_card_1_value", "slot": 1, "subslot": 1, "index": 100, "dataType": "Int16", "length": 2 }, { "key": "input_card_2_value", "slot": 2, "subslot": 1, "index": 100, "dataType": "Int16", "length": 2 }, { "key": "input_card_3_value", "slot": 3, "subslot": 1, "index": 100, "dataType": "Int16", "length": 2 }, { "key": "device_temp", "slot": 0, "subslot": 1, "index": 200, "dataType": "Float32", "length": 4 } ]}トラブルシューティング
Section titled “トラブルシューティング”起動時のErrProfinetConnect
Section titled “起動時のErrProfinetConnect”問題: デバイスとのアプリケーションリレーション(AR)を確立できない
解決策:
- デバイスのIPとポートを確認:
ping 192.168.0.50およびnc -zv -u 192.168.0.50 34964 - デバイスのPROFINETスタックが実行中で障害状態でないことを確認
- デバイスが他のコントローラーと既にARにないことを確認(PROFINETデバイスは通常、限られた数の同時ARを許可します)
- PROFINETディセクタを使用したWiresharkのようなツールを使用して接続ハンドシェイクを検査
特定の変数でのErrProfinetReadFailed
Section titled “特定の変数でのErrProfinetReadFailed”問題: 他が成功する間に1つの変数がエラーを返す
解決策:
- デバイスのGSDMLファイルに対してスロット/サブスロット/インデックスを確認
- 設定された
lengthがデバイス上の実際のレコードサイズと一致することを確認 - 一部のインデックスは書き込み専用または保護されています — デバイスのドキュメントを参照してください
insufficient data for <type>
Section titled “insufficient data for <type>”問題: デバイスがデータ型が必要とするよりも少ないバイトを返した
解決策:
- デバイスのレスポンスサイズに合わせて変数の
lengthを増やす - OctetStringの場合、
lengthは最大値です。固定幅の型の場合は、型のバイト数と等しくする必要があります - 一部のデバイスはレスポンスをパディングします —
lengthが少なくとも必要最小限であることを確認してください(例:Float32には4)
読み取り中の接続喪失
Section titled “読み取り中の接続喪失”問題: 通常の動作期間の後にErrProfinetDisconnectedエラーが現れる
解決策:
- コネクタは次のポーリングサイクルで自動的に再接続します — 短い間隔と再開を期待
- 切断が頻繁な場合、ケーブルの問題、スイッチオーバーロード、または重複IPアドレスのためにPROFINETネットワークを確認
- 高レイテンシネットワーク用に
timeoutを増やす
マルチバイト型に対する間違った値
Section titled “マルチバイト型に対する間違った値”問題: Int32/Float値が明らかに間違っている(巨大な大きさ、NaN、間違った符号)
解決策:
- PROFINETワイヤ形式は常にビッグエンディアンです。バイト順序トグルはありません。デバイスのドキュメントがリトルエンディアンを主張する場合、それがベンダー固有のレコードかどうかを確認してください(ベンダーレコードは他のエンコーディングを使用する可能性があります — 外部で
Transformでデコードしてください) - データ型がGSDML宣言と一致することを確認
ベストプラクティス
Section titled “ベストプラクティス”1. 常にGSDMLを参照
Section titled “1. 常にGSDMLを参照”スロット、サブスロット、インデックスの割り当てはデバイス固有です。GSDMLは正準的なソースです — アドレッシングを推論しないでください。
2. デバイスレベルレコードにはスロット0 / サブスロット1を使用
Section titled “2. デバイスレベルレコードにはスロット0 / サブスロット1を使用”慣例的に:
- スロット0 = DAP(デバイスアクセスポイント) — デバイスID、診断、システムレコード
- スロットN、サブスロット1 = N番目のI/Oサブモジュールの主要I/O
3. ポーリングレートは控えめに
Section titled “3. ポーリングレートは控えめに”PROFINET IOデバイスはサイクリックI/Oチャネルではなくアプリケーションレイヤー経由でレコードデータを処理するため、あまりにも積極的にポーリングするとサイクリックパスを飢餓状態にする可能性があります。レコードポーリングには500-2000msが典型的です。
4. ダウンストリームで再接続を優雅に処理
Section titled “4. ダウンストリームで再接続を優雅に処理”リーダーの後にFilterまたはValidationコネクタを使用して、再接続ウィンドウ中にさらなる処理をゲートします。
5. 書き込みを防御的にエンコード
Section titled “5. 書き込みを防御的にエンコード”設定値をパブリッシュする時、TransformまたはReshapeで上流の値を事前にクランプして、範囲外のデータがライターに到達しないようにします。PROFINETデバイスは極端な値を一貫性なく拒否(あるいは悪いことに、受け入れる)する可能性があります。
ワークフロー例
Section titled “ワークフロー例”PROFINETドライブ監視パイプライン
Section titled “PROFINETドライブ監視パイプライン”ProfinetReader → Validation → Reshape → Predictive → InfluxDb2Writer └→ Isa182 → Alert- ProfinetReader: 1Hzでドライブから
temperature、current、vibrationを読み取る - Validation: すべての信号が存在し数値であることを保証
- Reshape:
asset_id、line、areaでタグ付け - Predictive:
temperatureとvibrationのトレンドとRULを計算 - InfluxDb2Writer: 長期保存
- Isa182: 劣化するヘルススコアでアラームをトリガー
- Alert: 保守チームに通知
クローズドループPROFINET設定値制御
Section titled “クローズドループPROFINET設定値制御”ScriptReader(制御ロジック) → ProfinetWriterProfinetReader → ScriptReader(フィードバックループ)ScriptコネクタはPROFINET入力を読み取り、制御出力を計算し、PROFINETライター経由でそれを書き戻します — 古典的なスーパーバイザリーループです。
関連コネクタ
Section titled “関連コネクタ”- Modbus - 代替産業フィールドバス
- Siemens S7 - Siemens PLC用の直接S7プロトコル
- OPC UA - PROFINET/S7データのモダンな抽象化
- Validation - 再接続中にダウンストリームをゲート
- Predictive - PROFINET信号の予測分析
追加リソース
Section titled “追加リソース”- PROFINET仕様(PI)
- IEC 61158 - PROFINETプロトコル標準
- GSDML仕様 - General Station Description Markup Language
- Wireshark PROFINETディセクタ