iT邦幫忙

1

[技術分享] Implicit Messaging 的架構:使用 Python 實作原始 CIP I/O 通訊

  • 分享至 

  • xImage
  •  

理解 CIP (Common Industrial Protocol) 協定的底層 Socket 實作,對於從事工業網路資安、客製化 SCADA 整合,或在資源有限的嵌入式系統中工作的開發者來說,是至關重要的技能。

EtherNet/IP (EIP) 的核心挑戰在於同時管理兩種類型的通訊:

Explicit Messaging (TCP 44818): 顯式訊息,用於配置與診斷。

Implicit Messaging (UDP 2222): 隱式訊息,用於高頻率、週期性的 I/O 數據交換 (Class 1 連線)。

我們的架構專注於實作後者,即 Implicit Messaging。

🏗️ 核心架構:四步連線週期 (4-Step Connection Sequence)
一個穩健的 I/O 連線必須在每個週期內完成 TCP 連線的建立與拆除。我們的實作遵循這四個關鍵步驟:

註冊會話 (Register Session - TCP): Client 透過 TCP 44818 發送 0x65 指令,以建立通訊會話 (Session) 並取得 Session Handle。

前向開啟 (Forward Open - TCP): Client 發送關鍵的 Forward Open 指令。此指令定義了 I/O 連線的所有參數,包括 RPI (請求封包間隔)、O2T/T2O Connection ID,以及 Assembly Instance IDs。

週期性 I/O 交換 (UDP): 一旦 Step 2 成功,通訊即切換到高頻率的 UDP 2222。Client 會使用特定的 Connection ID 週期性地發送 (O2T) 和接收 (T2O) I/O 數據。

前向關閉 (Forward Close - TCP): Client 必須發送 Forward Close 指令來優雅地釋放資源。這是為了防止目標設備因超時而進入故障狀態,確保工業網路的穩定性。

💻 雙應用程式架構:實現確定性測試
為了可靠地驗證這套複雜的序列,我們設計了一個雙應用程式架構:

原始 Socket 客戶端 (Raw Socket Client): 實作了完成 I/O 週期所需的全套 TCP/UDP 狀態機。

模擬 PLC 伺服器 (Mock PLC Server): 一個獨立的 Python 應用程式,在 Localhost 上監聽 TCP 44818 和 UDP 2222。模擬伺服器對於確定性測試至關重要,它保證握手過程能即時且正確地響應,讓開發者能將邏輯錯誤與實體網路噪訊隔離開來。

理解 CIP 協定的底層 Socket 實作,對於工業資安、客製化 SCADA 整合,或資源有限的嵌入式系統開發者至關重要。

覺得不錯或想了解更多的話
歡迎支持一下Link


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言