コンテンツにスキップ

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
  • ✅ 設定可能なポーリングレートと呼び出しごとのタイムアウト
{
"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
}
]
}
{
"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
}
]
}

ターゲットデバイスのIPアドレスとPROFINET DCE-RPCポート。

{ "endpoint": "192.168.0.50:34964" }

形式: host:port。デフォルトのPROFINET DCE-RPCポートは34964です。一部のデバイスは代替ポートでリッスンします — デバイスのGSDファイルを参照してください。

リーダーには必須。連続する読み取り間のミリ秒単位の間隔。

{ "pollingRate": 1000 }

推奨値:

  • 高速診断データ: 100-500ms
  • プロセス変数: 500-2000ms
  • 低速テレメトリ: 5000ms以上

PROFINET IOデバイスは一般的に高ポーリングレートに寛容ですが、LANとデバイスのレスポンス予算は実際の制限です。

オプション。ミリ秒単位の呼び出しごとのRPCタイムアウト。デフォルトは実装定義です。

{ "timeout": 5000 }

推奨値:

  • ローカルLANデバイス: 1000-3000ms
  • NATまたはリレーの背後のデバイス: 5000-10000ms

各変数は1つのレコードアドレスとそのワイヤ上のエンコーディングを記述します。

{
"key": "temperature",
"slot": 1,
"subslot": 1,
"index": 100,
"dataType": "Float32",
"length": 4
}
フィールド必須説明
keystringはいMeddleペイロードキー
slotuint16はいPROFINETスロット番号
subslotuint16はいPROFINETサブスロット番号
indexuint16はいレコードインデックス
dataTypestringはいエンコーディング(下記参照)
lengthuint16はい読み書きするバイト数

スロット/サブスロット/インデックスアドレッシング

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バイト。0x00false、それ以外 → true

サポートされる型:

バイトGo出力型
Bool1bool
Int81int8
UInt81uint8
Int162int16
UInt162uint16
Int324int32
UInt324uint32
Float324float32
Float648float64
OctetString可変string
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
}
Meddleペイロード → ProfinetWriter(エンコード + RPC WriteRecord) → PROFINETデバイス

例:

入力ペイロード:

{
"setpoint": 75.0,
"enable_output": true
}

設定されたvariable.keyに一致する各キーはそのdataTypeに従ってエンコードされ、WriteRecord経由で書き込まれます。変数リストにないキーは無視されます。

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 }
]
}
{
"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 }
]
}

問題: デバイスとのアプリケーションリレーション(AR)を確立できない

解決策:

  1. デバイスのIPとポートを確認:ping 192.168.0.50およびnc -zv -u 192.168.0.50 34964
  2. デバイスのPROFINETスタックが実行中で障害状態でないことを確認
  3. デバイスが他のコントローラーと既にARにないことを確認(PROFINETデバイスは通常、限られた数の同時ARを許可します)
  4. PROFINETディセクタを使用したWiresharkのようなツールを使用して接続ハンドシェイクを検査

特定の変数でのErrProfinetReadFailed

Section titled “特定の変数でのErrProfinetReadFailed”

問題: 他が成功する間に1つの変数がエラーを返す

解決策:

  1. デバイスのGSDMLファイルに対してスロット/サブスロット/インデックスを確認
  2. 設定されたlengthがデバイス上の実際のレコードサイズと一致することを確認
  3. 一部のインデックスは書き込み専用または保護されています — デバイスのドキュメントを参照してください

問題: デバイスがデータ型が必要とするよりも少ないバイトを返した

解決策:

  1. デバイスのレスポンスサイズに合わせて変数のlengthを増やす
  2. OctetStringの場合、lengthは最大値です。固定幅の型の場合は、型のバイト数と等しくする必要があります
  3. 一部のデバイスはレスポンスをパディングします — lengthが少なくとも必要最小限であることを確認してください(例:Float32には4)

問題: 通常の動作期間の後にErrProfinetDisconnectedエラーが現れる

解決策:

  1. コネクタは次のポーリングサイクルで自動的に再接続します — 短い間隔と再開を期待
  2. 切断が頻繁な場合、ケーブルの問題、スイッチオーバーロード、または重複IPアドレスのためにPROFINETネットワークを確認
  3. 高レイテンシネットワーク用にtimeoutを増やす

マルチバイト型に対する間違った値

Section titled “マルチバイト型に対する間違った値”

問題: Int32/Float値が明らかに間違っている(巨大な大きさ、NaN、間違った符号)

解決策:

  1. PROFINETワイヤ形式は常にビッグエンディアンです。バイト順序トグルはありません。デバイスのドキュメントがリトルエンディアンを主張する場合、それがベンダー固有のレコードかどうかを確認してください(ベンダーレコードは他のエンコーディングを使用する可能性があります — 外部でTransformでデコードしてください)
  2. データ型が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デバイスは極端な値を一貫性なく拒否(あるいは悪いことに、受け入れる)する可能性があります。

PROFINETドライブ監視パイプライン

Section titled “PROFINETドライブ監視パイプライン”
ProfinetReader → Validation → Reshape → Predictive → InfluxDb2Writer
└→ Isa182 → Alert
  1. ProfinetReader: 1Hzでドライブからtemperaturecurrentvibrationを読み取る
  2. Validation: すべての信号が存在し数値であることを保証
  3. Reshape: asset_idlineareaでタグ付け
  4. Predictive: temperaturevibrationのトレンドとRULを計算
  5. InfluxDb2Writer: 長期保存
  6. Isa182: 劣化するヘルススコアでアラームをトリガー
  7. Alert: 保守チームに通知

クローズドループPROFINET設定値制御

Section titled “クローズドループPROFINET設定値制御”
ScriptReader(制御ロジック) → ProfinetWriter
ProfinetReader → ScriptReader(フィードバックループ)

ScriptコネクタはPROFINET入力を読み取り、制御出力を計算し、PROFINETライター経由でそれを書き戻します — 古典的なスーパーバイザリーループです。

  • Modbus - 代替産業フィールドバス
  • Siemens S7 - Siemens PLC用の直接S7プロトコル
  • OPC UA - PROFINET/S7データのモダンな抽象化
  • Validation - 再接続中にダウンストリームをゲート
  • Predictive - PROFINET信号の予測分析