Modbus報文詳解

Modbus報文詳解

Modbus是一種通訊協議,廣泛應用於工業自動化控制系統中。它允許不同廠家製造的設備之間進行數據交換,並且有著開放式的標準結構,因此受到許多工程師的青睞。在本文中,我們將深入探討Modbus報文的結構及運作方式。

首先,我們需要了解的是Modbus報文是由三個主要部分組成的:功能碼(Function Code)、資料域(Data Field)以及校驗位元(Checksum)。這些部分的具體內容取決於所使用的Modbus版本(RTU或TCP)以及傳輸模式(ASCII或Binary)。以下是各部分的大致描述:

1. 功能碼(Function Code):

  • Modbus支持多種不同的功能碼,每種功能碼對應一種特定的操作。例如,讀寫寄存器(Read/Write Holding Registers, FC 3 and FC 6)就是最常用的兩個功能。
  • 在Modbus RTU模式下,功能碼佔用一個字節,而在Modbus TCP模式下,它被編碼為整數格式。

2. 資料域(Data Field):

  • 這是根據功能碼要求而變化的區域,可能包含要寫入的資料或是從裝置中讀取的資料。其長度也因功能的不同而有差異。
  • 如果功能碼涉及資料回送(如FC 4 Read Input Registers),那麼資料域會包含從受控裝置返回的資料。

3. 校驗位元(Checksum):

  • 在Modbus ASCII模式下,這個部分通常是一個稱為CRC-16的效驗值,用來確保傳輸過程中沒有發生錯誤。
  • 在Modbus Binary模式下,則使用LRC(Length Checking Register)作為效驗機制。

以下是一個簡化了的Modbus RTU報文範例(假設使用功能碼0x03 – “讀寫保持寄存器”):

-----------------------------------------
| Start Delimiter (e.g. '@')            |
| Slave Address (2 bytes)               |
| Function Code (1 byte)                |
| Data Field (variable length)          |
| Checksum (2 bytes for CRC-16)         |
| Stop Delimiter (e.g. '@')             |
-----------------------------------------

例如,如果我們想讀取地址從100到103的四個連續寄存器的資料,且Slave Address是17號裝置,那麼Modbus RTU報文可能是這樣的:

@17 03 00D8 FF

其中:

  • @ 是開始分隔符號。
  • 17是從站地址(十進位為23)。
  • 03是功能碼,表示「讀寫保持寄存器」。
  • 00D8是資料域,代表從地址100開始的4個連續寄存器的請求(每個寄存器以2個位元組表示,所以總共是4 * 2 = 8位元組)。
  • FF是效驗碼,計算方法是將所有有效資料加起來後取反轉位的結果。

當裝置收到此報文時,它會執行指定的操作並返回相應的資料。例如,假設這四個寄存器的值分別是55、66、77、88,那麼回應報文可能如下所示:

@17 04 0055 0066 0077 0088 F9

這裡的04表示回應報文中包含了4個資料位元的資料。接下來是實際的寄存器資料,最後一位F9則是效驗碼。

總結來說,Modbus報文結構複雜但邏輯清晰,對於專業程序員而言,理解並正確配置Modbus通信是非常重要的技能之一。隨著技術的不斷發展,Modbus也在不斷演進,以適應更多樣化和更先進的自動化需求。

为您推荐