工控網(wǎng)首頁
>

應(yīng)用設(shè)計

>

以串口S2W-M02為例說明Modbus

以串口S2W-M02為例說明Modbus

2018/9/25 9:09:47

Modbus TCP 與 Modbus RTU的區(qū)別

Modbus通信協(xié)議由Modicon公司(現(xiàn)已經(jīng)為施耐德公司并購,成為其旗下的子品牌)于1979年發(fā)明的,是全球最早用于工業(yè)現(xiàn)場的總線規(guī)約。由于其免費公開發(fā)行,使用該協(xié)議的廠家無需繳納任何費用,Modbus通信協(xié)議采用的是主從通信模式(即Master/Slave通信模式),其在分散控制方面應(yīng)用極其廣泛,從而使得Modbus協(xié)議在全球得到了廣泛的應(yīng)用。

Modbus通信協(xié)議具有多個變種,其具有支持串口(主要是RS-485總線),以太網(wǎng)多個版本,其中最著名的是Modbus RTU,Modbus ASCII和Modbus TCP三種。其中Modbus RTU與Modbus ASCII均為支持RS-485總線的通信協(xié)議,其中Modbus RTU由于其采用二進(jìn)制表現(xiàn)形式以及緊湊數(shù)據(jù)結(jié)構(gòu),通信效率較高,應(yīng)用比較廣泛。而Modbus ASCII由于采用ASCII碼傳輸,并且利用特殊字符作為其字節(jié)的開始與結(jié)束標(biāo)識,其傳輸效率要遠(yuǎn)遠(yuǎn)低于Modbus RTU協(xié)議,一般只有在通信數(shù)據(jù)量較小的情況下才考慮使用ModbusASCII通信協(xié)議,在工業(yè)現(xiàn)場一般都是采用Modbus RTU協(xié)議,一般而言,大家說的基于串口通信的Modbus通信協(xié)議都是指Modbus RTU通信協(xié)議。

在此我們著重討論Modbus RTU協(xié)議,而Modbus TCP協(xié)議則是在RTU協(xié)議上加一個MBAP報文頭,由于TCP是基于可靠連接的服務(wù),RTU協(xié)議中的CRC校驗碼就不再需要,所以在Modbus TCP協(xié)議中是沒有CRC校驗碼,用一句比較通俗的話說就是:Modbus TCP協(xié)議就是Modbus RTU協(xié)議在前面加上五個0以及一個6,然后去掉兩個CRC校驗碼字節(jié)就OK.雖然這句話說得不是特別準(zhǔn)確,但是也基本上把RTU與TCP之間的區(qū)別說得比較清楚了。

RTU協(xié)議中的指令由地址碼(一個字節(jié)),功能碼(一個字節(jié)),起始地址(兩個字節(jié)),數(shù)據(jù)(N個字節(jié)),校驗碼(兩個字節(jié))五個部分組成,其中數(shù)據(jù)又由數(shù)據(jù)長度(兩個字節(jié),表示的是寄存器個數(shù),假定內(nèi)容為M)和數(shù)據(jù)正文(M乘以2個字節(jié))組成,而RTU協(xié)議是采用3.5個字節(jié)的空閑時間作為指令的起始和結(jié)束,一般而言,只有當(dāng)從機(jī)返回數(shù)據(jù)或者主機(jī)寫操作的時候,才會有數(shù)據(jù)正文,而其他時候比如主機(jī)讀操作指令的時候,沒有數(shù)據(jù)正文,只需要數(shù)據(jù)長度即可。(本章的討論只涉及寄存器的讀寫,其他比如線圈的讀寫指令我們暫時不涉及)。在此我們通過兩個指令(0x03H:讀多個寄存器指令以及0x10H:寫多個寄存器指令)來解釋Modbus RTU協(xié)議。我們使用的RTU設(shè)備是北京博安瑞通科技的SimpleWiFi串口轉(zhuǎn)WiFi模塊。

S2W-M02采用UAER進(jìn)行通訊,支持串口轉(zhuǎn)WiFi,我們只講述通過WiFi網(wǎng)絡(luò)讀取開關(guān)量輸出的狀態(tài)以及通過WiFi寫指令控制開關(guān)量的輸出。其中儲存開關(guān)量輸出狀態(tài)的四個寄存器分別:0x18E,0x18F,0x190,0x191。在此我們假設(shè)模塊的地址為默認(rèn)的0x01,當(dāng)我們要去讀取開關(guān)量輸出對應(yīng)的四個寄存器的狀態(tài)的時候,我們下發(fā)的十六進(jìn)制的指令為:“01 03 01 8E 00 04 25 DE”,其中“01”為模塊的地址碼,“03”為功能碼,即表示讀寄存器,“01 8E”為寄存器地址,即從該寄存器地址開始讀取數(shù)據(jù),“00 04”則表示讀取4個寄存器,而“25 DE”則為前面“0103 01 8E 00 04”的CRC校驗碼,該數(shù)值通過CRC16校驗算法計算出來的,我們會在其他文章中闡述。該指令的完整解讀就是,在地址碼為“01”的模塊中,從“01 8E”寄存器開始,讀取4個寄存器的數(shù)據(jù)返回至主機(jī)。在此,我們可以看到,讀取指令中并沒有什么數(shù)據(jù)正文,因為它只是讀取相應(yīng)數(shù)量的寄存器,并不需要數(shù)據(jù)正文,而寫操作指令則相反,我們會在后面講到。

模塊返回的指令是:“01 03 08 00 01 00 01 0001 00 01 28 D7”,返回的指令內(nèi)容解讀就是:“01”表示模塊的地址碼,“03”表示該指令是讀操作返回的指令,“08”表示數(shù)據(jù)長度,在此表示的是8個字節(jié)數(shù)據(jù)正文(即4個寄存器,每個寄存器兩個字節(jié)表示),“00 01 00 01 00 01 00 01”是數(shù)據(jù)正文,表示四個寄存器的狀態(tài),“28D7”就是CRC16校驗碼。

同樣的當(dāng)我們執(zhí)行寫操作的是,我們舉例寫第一個開關(guān)量輸出,即寄存器“0x18E”,主機(jī)下發(fā)的指令為:“01 10 01 8e 00 01 02 00 00 A8 7E”,該指令的解讀就是:“01”表示模塊的地址,“10”表示該指令為寫寄存器,“01 8E”表示從該寄存器地址開始執(zhí)行寫操作指令“00 01”表示寫多少個寄存器,在此為寫1個寄存器,“02”表示數(shù)據(jù)長度,表示數(shù)據(jù)長度為兩個字節(jié),“00 00”表示寫入寄存器的數(shù)據(jù),在此表示連通,“A8 7E”為CRC校驗碼。模塊返回的指令和讀取寄存器的返回的指令類似。

前文所述,Modbus TCP協(xié)議是在RTU協(xié)議前面添加MBAP報文頭,共七個字節(jié)長度,其分別的意義是:1.傳輸標(biāo)志,兩個字節(jié)長度,標(biāo)志Modbus詢問/應(yīng)答的傳輸,一般默認(rèn)是00 00。2.協(xié)議標(biāo)志,兩個字節(jié)長度,0表示是Modbus,1表示UNI-TE協(xié)議,一般默認(rèn)也是00 00。3.后續(xù)字節(jié)計數(shù),兩個字節(jié)長度,其實際意義就是后面的字節(jié)長度,具體情況詳見下文。4.單元標(biāo)志,一個字節(jié)長度,一般默認(rèn)為00,單元標(biāo)志對應(yīng)于Modbus RTU協(xié)議中的地址碼,當(dāng)RTU與TCP之間進(jìn)行協(xié)議轉(zhuǎn)換的時候,特別是Modbus網(wǎng)關(guān)轉(zhuǎn)換協(xié)議的時候,在TCP協(xié)議中,該數(shù)據(jù)就是對應(yīng)RTU協(xié)議中的地址碼,具體情況詳見下文。

通過上面的描述我們差不多能夠理解Modbus RTU協(xié)議,我們再說說Modbus TCP通信協(xié)議,前面就已經(jīng)說過TCP協(xié)議就是在RTU協(xié)議的基礎(chǔ)上去掉校驗碼以及加上五個0和一個6,當(dāng)是讀取相關(guān)寄存器的時候,該說法是沒有錯的,比如上文的“01 03 01 8E 0004 25 DE”讀取指令,用TCP協(xié)議來表述的話,指令是“0000 00 00 00 06 00 03 01 8E 00 04”,由于TCP是基于TCP連接的,不存在所謂的地址碼,所以06后面一般都是“00”(當(dāng)其作為Modbus網(wǎng)關(guān)服務(wù)器掛接多個RTU設(shè)備的時候,數(shù)值從01-FF).即“00 03 01 8E 00 04”對應(yīng)的是RTU中去掉校驗碼的指令,前面則是五個0以及一個6。其中6表示的是數(shù)據(jù)長度,即“00 03 01 8E 00 04”有6個字節(jié)長度。而當(dāng)其為寫操作指令的時候,其指令是“00 00 00 00 00 09 01 10 01 8e 00 01 02 00 00”,其中“00 09”表示后面有9個字節(jié)。

Modbus RTU與Modbus TCP讀指令對比:

指令的涵義:從地址碼為01(TCP協(xié)議單元標(biāo)志為00)的模塊0x18E(01 8E)寄存器地址開始讀(03)四個(00 04)寄存器。

Modbus RTU與Modbus TCP寫指令對比   

指令的涵義:從地址碼為01(TCP協(xié)議單元標(biāo)志為00)的模塊0x18E(01 8E)寄存器地址開始寫(10)一個(00 01)寄存器,具體數(shù)據(jù)長度為2個字節(jié)(02),數(shù)據(jù)正文內(nèi)容為00 00(00 00)。

通過串口抓包我們知道了,Modbus TCP與Modbu RTU的區(qū)別。我們可以看出在SimpleWiFi系列的串口轉(zhuǎn)WiFi模塊S2W-M02以及S2W-M03內(nèi)部的Modbus支持,就是按照上述協(xié)議進(jìn)行轉(zhuǎn)換。主要完成了WiFi接收到網(wǎng)絡(luò)層的modbus協(xié)議后,將modbus TCP頭部的幾個自己去掉。然后在數(shù)據(jù)包的結(jié)尾增加CRC的校驗即可。

審核編輯(
王靜
)
投訴建議

提交

查看更多評論
其他資訊

查看更多

3串口多串口雙2串口轉(zhuǎn)WiFi多跳實現(xiàn)四

有線以太網(wǎng)RJ45網(wǎng)口轉(zhuǎn)無線WiFi方案

3串口雙串口2串口WiFi多跳通訊實現(xiàn)二

3串口多雙串口2串口轉(zhuǎn)WiFi多跳通訊

工業(yè)串口設(shè)備RS232或485設(shè)備通過WiFi聯(lián)網(wǎng)傳輸方案