什麼是 Modbus-TCP 協定
為了進行通信,我們家定義了一個非常簡單的資料結構,稱為「協定資料單元」(Protocol Data Unit,PDU)。
協定資料單元由功能碼和資料組成,如下圖所示:

功能碼長度為 1 字節,用於指示要執行的功能。例如,常見的功能碼有:01 讀取線圈;02 讀取離散輸入值;03 讀取保持暫存器的值;05 寫入單一線圈等等。
資料部分的長度範圍為 0 到 252 位元組。它表示要讀取的位址或要寫入的值。不同的功能碼對應不同的資料。例如,功能碼 01 的資料為 4 字節,其中前兩個位元組表示要讀取的線圈位址,後兩個位元組表示要讀取的線圈數量。功能碼 05 的資料也為 4 字節,前兩個位元組表示要寫入的線圈位址,後兩個位元組表示要寫入的值。
協定資料單元有三種類型:請求 PDU(請求 PDU)、回應 PDU(回應 PDU)和異常回應 PDU(異常回應 PDU)。
協定資料單元是我們家族通用的資料結構,它獨立於底層物理結構。我們三兄弟都使用相同的協定資料單元。然而,當我們通訊時,始終依賴實體網路。因此,協定資料單元需要映射到實體網絡,從而形成應用資料單元(ADU)。由於底層網路的差異,我和兩位哥哥的應用資料單元也不同。他們的ADU結構如下圖所示:

我的附屬住宅單元(ADU)結構如下:

可以看出,我的應用資料單元是基於協定資料單元,並新增了一個名為「MBAP 頭部」的結構。 「MBAP」是英文單字「ModBus Application」的縮寫,即應用資料單元。
可以看出,我的應用資料單元是基於協定資料單元,並新增了一個名為「MBAP 頭部」的結構。 「MBAP」是英文單字「ModBus Application」的縮寫,即應用資料單元。
MBAP 頭部結構由 7 個位元組組成,如下表所示。

他們之中:
傳輸識別碼:用於識別應用程式資料單元,即請求和回應之間的配對;用戶端初始化此部分,伺服器將其複製到自己的 ADU 中。
協議標識符:系統之間的協議標識符,0=Modbus;
長度:接下來要傳送的資料的長度,即單元標識符 + PDU 的總長度,以位元組為單位。
單元識別碼:用於系統間的站點尋址,例如乙太網路+串行鏈路網路中遠端站點的位址
這是我的ADU結構,即:MBAP頭部+PDU。是不是很簡單?我的資料傳輸採用了一種稱為「客戶端/伺服器」的模式。這也是上表中出現客戶端/伺服器功能描述的原因。事實上,許多網路通訊都採用了這種方法,例如著名的西門子S7通訊協定。在串行鏈路中,這種方法也稱為主從通訊。
此時,您可能會有疑問。既然在網路通訊中我們通常需要指定 IP 位址和連接埠號,為什麼我的 ADU 中沒有相關內容呢?
事實上,這是因為我是應用層協議,而 IP 位址和連接埠號碼屬於傳輸層/網路層協議。請看這張圖。

從邏輯上講,我位於 TCP 層。發送資料時,我的應用程式資料單元會先隨 TCP 協定訊息一起傳遞到傳輸層,然後隨 IP 協定訊息一起傳遞到網路層,最後會向下傳遞到資料鏈結層和實體層。接收過程則完全相反。來自對應層的訊息會逐層從物理層傳遞,直到到達應用層。因此,使用我進行資料傳輸時,必須配合 TCP/IP 協定使用。通常,如果您使用電腦編程,則需要使用 Socket 技術。如果您使用 PLC 編程,通常製造商已經將底層通訊封裝到庫指令中,您只需直接呼叫即可。例如,像西門子 S7-200 SMART/1200/1500 這樣的 PLC 都提供了現成的 Modbus-TCP 指令庫。還有一點要特別注意。我使用的連接埠號碼是502。請確保該連接埠號碼已為我保留,未被他人佔用。










