在之前的文章中,我們介紹了Modbus RTU協議的內容和實現方法。最近在進行網絡通訊的時候又用到了Modbus TCP協議,因此這裏把自己對Modbus TCP的瞭解總結一下。
文章目錄
一、Modbus TCP協議解析
Modbus TCP和Modbus RTU的區別
這兩個都是Modbus協議,但是兩者之間有有何區別呢?在我看來,Modbus TCP協議是一個運行在TCP/IP網絡連接中的一種協議,而Modbus RTU則是運行在工業控制領域的一種協議,就傳遞數據的功能來說,兩者都能實現。就傳遞數據的路徑來說,Modbus TCP可能更多的是在網絡環境下的數據傳輸。就傳遞的數據的格式來說,二者存在着一定的區別,但是又有相同的地方。下面我們通過具體的例子,來說明。
Modbus TCP協議的構成
Modbus TCP的協議構成可以分爲 報文頭 功能碼 數據碼 (校驗碼)這幾個部分,這裏校驗碼在一般的Modbus TCP中是沒有的。對比Modbus RTU,我們可以看到這兩個協議的組成基本上是一樣的。
Modbus TCP的報文頭
Modbus TCP的報文頭一般來說又分爲以下幾個碼:
名稱 | 長度 | 示例 | 備註 |
---|---|---|---|
事務處理標識符 | 2個字節 | 97 79 | 客戶機發起,服務器複製,用於事務處理配對,可以自行設定 |
協議標識符 | 2個字節 | 00 00 | 客戶機發起,服務器複製,表示該協議是TCP協議,是固定值,不可以更改 |
長度標識符 | 2個字節 | 00 06 | 表示該數據幀中,從本子節到最後一個字節的字節個數,根據當前數據幀的情況設定 |
單元標識符 | 1個字節 | 03 | 客戶機發起,服務器複製,這是一個站點號,在多設備通訊時,用來表示該數據的來源於哪個設備或者該數據要去往哪個設備 |
Modbus TCP的功能碼
除了Modbus的構成基本相似,其中的功能碼、數據碼兩部分也是採用通用的格式,例如3爲讀寄存器功能碼,16爲寫寄存器功能碼等等。這裏對功能碼和數據碼不做深入的展開。
名稱 | 長度 | 示例 | 備註 |
---|---|---|---|
功能碼 | 1個字節 | 05 | 功能碼根據Modbus通用功能碼的定義進行設定,這裏05表示對線圈進行寫操作 |
Modbus TCP的數據碼
這裏數據碼也是同Modbus RTU協議一樣,不同的功能碼後面的數據碼是不同的。這裏具體什麼樣的功能碼對應什麼樣的數據碼,請自行查閱資料。這裏只是簡單的舉幾個例子。
名稱 | 長度 | 示例 | 備註 |
---|---|---|---|
線圈地址 | 2個字節 | 00 10 | 表示對地址爲17的線圈進行操作 |
操作命令 | 2個字節 | FF 00 | FF 00 表示將該線圈置1,00 00 表示將該線圈置0 |
二、持續更新:Modbus TCP實現各種功能碼的示例
1.功能碼 05 (0x05)
功能碼0x05表示寫指令線圈,也就是控制某線圈通斷。代碼的構成如下:
結構 | 名稱 | 長度 | 示例 | 備註 |
報文頭 | ||||
事務處理標識符 | 2個字節 | 97 79 | 客戶機發起,服務器複製,用於事務處理配對,可以自行設定 | |
協議標識符 | 2個字節 | 00 00 | 客戶機發起,服務器複製,表示該協議是TCP協議,是固定值,不可以更改 | |
長度標識符 | 2個字節 | 00 06 | 表示該數據幀中,從本子節到最後一個字節的字節個數,根據當前數據幀的情況設定 | |
單元標識符 | 1個字節 | 03 | 客戶機發起,服務器複製,這是一個站點號,在多設備通訊時,用來表示該數據的來源於哪個設備或者該數據要去往哪個設備 | |
功能碼 | 功能碼 | 1個字節 | 05 | 05表示對線圈進行寫操作 |
數據碼 | ||||
線圈地址 | 2個字節 | 00 10 | 表示對地址爲17的線圈進行操作 | |
操作命令 | 2個字節 | FF 00 | FF 00 表示將該線圈置1,00 00 表示將該線圈置0 |
發送:97 79 00 00 00 06 03 05 00 10 FF 00
收到:97 79 00 00 00 06 03 05 00 10 FF 00
因爲這裏不需要主機返回數據,因此主機將收到的指令複製一下直接發送回來表示接受正常。