以SimpleWiFi串列埠轉WiFi模組S2WM02為例說明ModbusTCP與ModbusRTU區別
Modbus TCP 與 Modbus RTU的區別
Modbus通訊協議由Modicon公司(現已經為施耐德公司併購,成為其旗下的子品牌)於1979年發明的,是全球最早用於工業現場的匯流排規約。由於其免費公開發行,使用該協議的廠家無需繳納任何費用,Modbus通訊協議採用的是主從通訊模式(即Master/Slave通訊模式),其在分散控制方面應用極其廣泛,從而使得Modbus協議在全球得到了廣泛的應用。
Modbus通訊協議具有多個變種,其具有支援串列埠(主要是RS-485匯流排),乙太網多個版本,其中最著名的是Modbus RTU,Modbus ASCII和Modbus TCP三種。其中Modbus RTU與Modbus ASCII均為支援RS-485匯流排的通訊協議,其中Modbus RTU由於其採用二進位制表現形式以及緊湊資料結構,通訊效率較高,應用比較廣泛。而Modbus ASCII由於採用ASCII碼傳輸,並且利用特殊字元作為其位元組的開始與結束標識,其傳輸效率要遠遠低於Modbus RTU協議,一般只有在通訊資料量較小的情況下才考慮使用Modbus ASCII通訊協議,在工業現場一般都是採用Modbus RTU協議,一般而言,大家說的基於串列埠通訊的Modbus通訊協議都是指Modbus RTU通訊協議。
在此我們著重討論Modbus RTU協議,而Modbus TCP協議則是在RTU協議上加一個MBAP報文頭,由於TCP是基於可靠連線的服務,RTU協議中的CRC校驗碼就不再需要,所以在Modbus TCP協議中是沒有CRC校驗碼,用一句比較通俗的話說就是:Modbus TCP協議就是Modbus RTU協議在前面加上五個0以及一個6,然後去掉兩個CRC校驗碼位元組就OK.雖然這句話說得不是特別準確,但是也基本上把RTU與TCP之間的區別說得比較清楚了。
RTU協議中的指令由地址碼(一個位元組),功能碼(一個位元組),起始地址(兩個位元組),資料(N個位元組),校驗碼(兩個位元組)五個部分組成,其中資料又由資料長度(兩個位元組,表示的是暫存器個數,假定內容為M)和資料正文(M乘以2個位元組)組成,而RTU協議是採用3.5個位元組的空閒時間作為指令的起始和結束,一般而言,只有當從機返回資料或者主機寫操作的時候,才會有資料正文,而其他時候比如主機讀操作指令的時候,沒有資料正文,只需要資料長度即可。(本章的討論只涉及暫存器的讀寫,其他比如線圈的讀寫指令我們暫時不涉及)。在此我們通過兩個指令(0x03H:讀多個暫存器指令以及0x10H:寫多個暫存器指令)來解釋Modbus RTU協議。我們使用的RTU裝置是北京博安瑞通科技的SimpleWiFi串列埠轉WiFi模組。
S2W-M02採用UAER進行通訊,支援串列埠轉WiFi,我們只講述通過WiFi網路讀取開關量輸出的狀態以及通過WiFi寫指令控制開關量的輸出。其中儲存開關量輸出狀態的四個暫存器分別:0x18E,0x18F,0x190,0x191。在此我們假設模組的地址為預設的0x01,當我們要去讀取開關量輸出對應的四個暫存器的狀態的時候,我們下發的十六進位制的指令為:“01 03 01 8E 00 04 25 DE”,其中“01”為模組的地址碼,“03”為功能碼,即表示讀暫存器,“01 8E”為暫存器地址,即從該暫存器地址開始讀取資料,“00 04”則表示讀取4個暫存器,而“25 DE”則為前面“01 03 01 8E 00 04”的CRC校驗碼,該數值通過CRC16校驗演算法計算出來的,我們會在其他文章中闡述。該指令的完整解讀就是,在地址碼為“01”的模組中,從“01 8E”暫存器開始,讀取4個暫存器的資料返回至主機。在此,我們可以看到,讀取指令中並沒有什麼資料正文,因為它只是讀取相應數量的暫存器,並不需要資料正文,而寫操作指令則相反,我們會在後面講到。
模組返回的指令是:“01 03 08 00 01 00 01 00 01 00 01 28 D7”,返回的指令內容解讀就是:“01”表示模組的地址碼,“03”表示該指令是讀操作返回的指令,“08”表示資料長度,在此表示的是8個位元組資料正文(即4個暫存器,每個暫存器兩個位元組表示),“00 01 00 01 00 01 00 01”是資料正文,表示四個暫存器的狀態,“28 D7”就是CRC16校驗碼。
同樣的當我們執行寫操作的是,我們舉例寫第一個開關量輸出,即暫存器“0x18E”,主機下發的指令為:“01 10 01 8e 00 01 02 00 00 A8 7E”,該指令的解讀就是:“01”表示模組的地址,“10”表示該指令為寫暫存器,“01 8E”表示從該暫存器地址開始執行寫操作指令“00 01”表示寫多少個暫存器,在此為寫1個暫存器,“02”表示資料長度,表示資料長度為兩個位元組,“00 00”表示寫入暫存器的資料,在此表示連通,“A8 7E”為CRC校驗碼。模組返回的指令和讀取暫存器的返回的指令類似。
前文所述,Modbus TCP協議是在RTU協議前面新增MBAP報文頭,共七個位元組長度,其分別的意義是:1.傳輸標誌,兩個位元組長度,標誌Modbus詢問/應答的傳輸,一般預設是00 00。2.協議標誌,兩個位元組長度,0表示是Modbus,1表示UNI-TE協議,一般預設也是00 00。3.後續位元組計數,兩個位元組長度,其實際意義就是後面的位元組長度,具體情況詳見下文。4.單元標誌,一個位元組長度,一般預設為00,單元標誌對應於Modbus RTU協議中的地址碼,當RTU與TCP之間進行協議轉換的時候,特別是Modbus閘道器轉換協議的時候,在TCP協議中,該資料就是對應RTU協議中的地址碼,具體情況詳見下文。
通過上面的描述我們差不多能夠理解Modbus RTU協議,我們再說說Modbus TCP通訊協議,前面就已經說過TCP協議就是在RTU協議的基礎上去掉校驗碼以及加上五個0和一個6,當是讀取相關暫存器的時候,該說法是沒有錯的,比如上文的“01 03 01 8E 00 04 25 DE”讀取指令,用TCP協議來表述的話,指令是“00 00 00 00 00 06 00 03 01 8E 00 04”,由於TCP是基於TCP連線的,不存在所謂的地址碼,所以06後面一般都是“00”(當其作為Modbus閘道器伺服器掛接多個RTU裝置的時候,數值從01-FF).即“00 03 01 8E 00 04”對應的是RTU中去掉校驗碼的指令,前面則是五個0以及一個6。其中6表示的是資料長度,即“00 03 01 8E 00 04”有6個位元組長度。而當其為寫操作指令的時候,其指令是“00 00 00 00 00 09 01 10 01 8e 00 01 02 00 00”,其中“00 09”表示後面有9個位元組。
Modbus RTU與Modbus TCP讀指令對比:
指令的涵義:從地址碼為01(TCP協議單元標誌為00)的模組0x18E(01 8E)暫存器地址開始讀(03)四個(00 04)暫存器。
Modbus RTU與Modbus TCP寫指令對比:
指令的涵義:從地址碼為01(TCP協議單元標誌為00)的模組0x18E(01 8E)暫存器地址開始寫(10)一個(00 01)暫存器,具體資料長度為2個位元組(02),資料正文內容為00 00(00 00)。
通過串列埠抓包我們知道了,Modbus TCP與Modbu RTU的區別。我們可以看出在SimpleWiFi系列的串列埠轉WiFi模組S2W-M02以及S2W-M03內部的Modbus支援,就是按照上述協議進行轉換。主要完成了WiFi接收到網路層的modbus協議後,將modbus TCP頭部的幾個自己去掉。然後在資料包的結尾增加CRC的校驗即可。
相關文章
- 串列埠轉無線模組 ESP8266 ESP-01除錯使用說明串列埠除錯
- 以例項說明 OAuth2OAuth
- 4g路由器解決方案無線CPE串列埠轉WiFi模組的功能與應用路由器串列埠WiFi
- 物聯網工業級UART串列埠轉WiFi轉有線網口轉乙太網閘道器WiFi模組選型串列埠WiFi
- 摘要與加密的區別(以MD5演算法為例)加密演算法
- 埠號說明
- zookeeper埠說明
- 常用埠說明
- 教你E103-W10串列埠轉WiFi模組的無線透傳應用教程串列埠WiFi
- 核心FAQ 舉例說明 (轉)
- Wlan與wifi的區別WiFi
- nodeMCU wifi透傳到串列埠 支援hexWiFi串列埠
- Linux下PCI轉串列埠卡及USB轉串列埠Linux串列埠
- 串列埠收發字元轉換為整數串列埠字元
- HC-07 藍芽串列埠模組藍芽串列埠
- java串列埠通訊例項 -Java串列埠
- 串列埠通訊 (轉)串列埠
- 串列埠SRAM和並口SRAM的引腳區別串列埠
- 串列埠通訊型別串列埠型別
- IBM串列埠線序以及串列埠線的做法(轉)IBM串列埠
- Hyperion模組分類說明
- Http與Https的區別(精簡版包含協議說明)HTTP協議
- CXP 協議中upconnection 與downconnection的說明及其區別協議
- Oracle RESETLOGS 和 NORESETLOGS 區別說明Oracle
- 分享個WIFI 一鍵配置原理-以ESP8266為例WiFi
- 全網通4G工業路由器模組和串列埠轉網口/4G/有線/WiFi/LTE模組的實現原理路由器串列埠WiFi
- 微火共享wifi與青提wifi哪個好?區別在哪裡?WiFi
- 選擇介面還是抽象類?---應用例項說明介面與抽象類的應用場合(區別)抽象
- VC++ 串列埠通訊(轉)C++串列埠
- adb 埠自定義及原理說明
- mysql_real_connect 埠號說明MySql
- 為什麼基本型別可以呼叫方法——以字串為例型別字串
- 淺顯直白的Python深複製與淺複製區別說明Python
- Dump型別說明型別
- 以資料庫為中心的架構與以領域為中心的架構的區別 - DevSDhami資料庫架構dev
- 以生活例子說明單執行緒與多執行緒執行緒
- 為什麼我說OKR與KPI沒有本質區別?OKRKPI
- Nginx的HTTP模組與Stream模組:區別與應用場景NginxHTTP