-
您的位置:
- 網(wǎng)站首頁
- > 物聯(lián)百科
- > 技術(shù)問答
您的位置:
Modbus是1979年開發(fā)的壹種工業(yè)協(xié)議,用于實(shí)現(xiàn)自動化設(shè)備之間的通信。Modbus最初是作為通過串行層傳輸數(shù)據(jù)的應(yīng)用級協(xié)議實(shí)現(xiàn)的,并且已經(jīng)擴(kuò)展到包括通過串行、TCP/IP和用戶數(shù)據(jù)報(bào)協(xié)議(UDP)實(shí)現(xiàn)的。
1.什么是Modbus協(xié)議?
Modbus是壹種使用主從關(guān)系實(shí)現(xiàn)的請求-響應(yīng)協(xié)議。在主從關(guān)系中,通信總是成對進(jìn)行。設(shè)備必須啟動請求并等待響應(yīng),啟動設(shè)備(主設(shè)備)負(fù)責(zé)啟動每個(gè)交互。通常,主設(shè)備為人機(jī)界面(HMI)或監(jiān)控和數(shù)據(jù)采集(SCADA)系統(tǒng),從設(shè)備為傳感器、可編程邏輯控制器(PLC)或可編程自動化控制器(PAC)。這些請求和響應(yīng)的內(nèi)容以及發(fā)送這些消息的網(wǎng)絡(luò)層由協(xié)議的不同層定義。
Modbus通信協(xié)議是壹種應(yīng)用層消息傳輸協(xié)議,包括RTU、ASCII和TCP。標(biāo)準(zhǔn)Modbus協(xié)議物理層接口包括RS232、RS485和以太網(wǎng)。
ModbusRTU和ModbusASCII均處于串行傳輸模式。其中ModbusRTU采用貳進(jìn)制表示,數(shù)據(jù)結(jié)構(gòu)緊湊,通信效率高,應(yīng)用廣泛。ModbusASCII采用ASCII碼傳輸,并使用特殊字符作為其字節(jié)的開始和結(jié)束標(biāo)識。其傳輸效率遠(yuǎn)低于ModbusRTU協(xié)議。ModbusTCP是通過工業(yè)以太網(wǎng)TCP/IP網(wǎng)絡(luò)傳輸?shù)腗odbus通信。Modbus數(shù)據(jù)傳輸提供連接到以太網(wǎng)TCP/IP網(wǎng)絡(luò)的客戶端和服務(wù)器之間的實(shí)時(shí)通信。
2.Modbus協(xié)議層
在最初的方法中,MODBUS是基于串行端口的單壹協(xié)議,因此不能將其劃分為多個(gè)層。隨著時(shí)間的推移,該協(xié)議引入不同的應(yīng)用程序數(shù)據(jù)單元來更改用于串行通信的數(shù)據(jù)包格式,或者允許使用TCP/IP和用戶數(shù)據(jù)報(bào)協(xié)議(UDP)網(wǎng)絡(luò)。這實(shí)現(xiàn)了定義協(xié)議數(shù)據(jù)單元(PDU)的核心協(xié)議和定義應(yīng)用數(shù)據(jù)單元(ADU)的網(wǎng)絡(luò)層的分離。
Modbus協(xié)議定義了獨(dú)立于基本通信層的簡單協(xié)議數(shù)據(jù)單元(PDU)。特定總線或網(wǎng)絡(luò)上的Modbus協(xié)議映射可在應(yīng)用數(shù)據(jù)單元(ADU)上引入壹些附加域。
協(xié)議數(shù)據(jù)單元(PDU)
PDU及其處理代碼構(gòu)成Modbus應(yīng)用協(xié)議規(guī)范的核心。該規(guī)范定義了PDU的格式、協(xié)議使用的各種數(shù)據(jù)概念、如何使用功能代碼訪問數(shù)據(jù)以及每個(gè)功能代碼的具體實(shí)現(xiàn)和限制。ModbusPDU格式定義為功能代碼,后跟壹組相關(guān)數(shù)據(jù)。數(shù)據(jù)的大小和內(nèi)容由功能代碼定義,整個(gè)PDU(功能代碼和數(shù)據(jù))的大小不能超過253字節(jié)。每個(gè)功能代碼都有壹個(gè)特定的行為,可以由從設(shè)備根據(jù)所需的應(yīng)用行為靈活實(shí)現(xiàn)。
通常,MODBUS可訪問的數(shù)據(jù)存儲在四個(gè)數(shù)據(jù)庫或地址范圍之壹:線圈狀態(tài)、離散輸入、保持寄存器和輸入寄存器。這些數(shù)據(jù)庫定義了所包含數(shù)據(jù)的類型和訪問權(quán)限。數(shù)據(jù)可以直接從設(shè)備訪問,因?yàn)樗怯稍O(shè)備本地托管的。相反,Modbus主機(jī)必須通過各種功能代碼請求訪問這些數(shù)據(jù)。表1中描述了每個(gè)塊的行為。
應(yīng)用數(shù)據(jù)單元(ADU)
除了Modbus協(xié)議的PDU核心定義的功能外,還可以使用多種網(wǎng)絡(luò)協(xié)議。最常見的協(xié)議是串行協(xié)議和TCP/IP協(xié)議,但也可以使用UDP等其他協(xié)議。為了在這些層之間傳輸MODBUS所需的數(shù)據(jù),MODBUS包含壹組適用于每個(gè)網(wǎng)絡(luò)協(xié)議的ADU。
Adu的三種標(biāo)準(zhǔn)格式是TCP、遠(yuǎn)程終端單元(RTU)和ASCII。RTU和ASCIIAdu通常用于串行線路,而TCP用于現(xiàn)代TCP/IP或UDP/IP網(wǎng)絡(luò)。
3.Modbus數(shù)據(jù)幀結(jié)構(gòu)
3.1ModbusRTU數(shù)據(jù)幀結(jié)構(gòu)
ModbusRTU協(xié)議通過將從設(shè)備地址(或廣播)、定義請求操作的功能代碼、要發(fā)送的數(shù)據(jù)和CRC驗(yàn)證放入主機(jī)查詢來建立查詢消息;從機(jī)設(shè)備的響應(yīng)報(bào)文也采用ModbusRTU報(bào)文結(jié)構(gòu),包括從機(jī)設(shè)備地址、請求操作的功能碼、要發(fā)送的數(shù)據(jù)和CRC校驗(yàn);如果在接收消息時(shí)發(fā)生錯(cuò)誤,或者從設(shè)備無法執(zhí)行請求的操作,則從設(shè)備將發(fā)送異常消息作為響應(yīng)。ModbusRTU數(shù)據(jù)幀結(jié)構(gòu)如下:
構(gòu)
3.2ModbusTCP數(shù)據(jù)幀結(jié)構(gòu)
ModbusTCP協(xié)議將mbap(Modbus應(yīng)用協(xié)議頭)消息頭添加到ModbusRTU協(xié)議中。由于TCP是基于可靠連接的服務(wù),ModbusTCP協(xié)議中沒有CRC驗(yàn)證。所有Modbustcpadu發(fā)送和接收均采用TCP傳輸控制協(xié)議,端口號為502。ModbusTCP數(shù)據(jù)幀結(jié)構(gòu)如下:
圖5Modbustcp數(shù)據(jù)幀結(jié)構(gòu)
4.ModbusRTU通信協(xié)議
ModbusRTU以其貳進(jìn)制表示和緊湊的數(shù)據(jù)結(jié)構(gòu),具有較高的通信效率,得到了廣泛的應(yīng)用。
4.1通信傳輸方式:
通信傳輸分為獨(dú)立信息頭和傳輸?shù)木幋a數(shù)據(jù)。以下通信傳輸模式定義也與ModbusRTU通信協(xié)議兼容:
CRC碼:兩字節(jié)錯(cuò)誤檢測碼。
4.2通信協(xié)議
當(dāng)向儀器發(fā)送通信命令時(shí),符合相應(yīng)地址代碼的設(shè)備接收通信命令,刪除地址代碼,讀取信息,如果沒有錯(cuò)誤,則執(zhí)行相應(yīng)任務(wù);然后將執(zhí)行結(jié)果返回給發(fā)送方。返回的信息包括地址代碼、操作的功能代碼、操作后結(jié)果的數(shù)據(jù)和錯(cuò)誤檢查代碼。如果出現(xiàn)錯(cuò)誤,則不發(fā)送任何消息。
地址碼:地址碼是信息幀的第壹個(gè)字節(jié)(8位),從0到255。此字節(jié)表示具有用戶設(shè)置的地址的從機(jī)將接收主機(jī)發(fā)送的信息。每個(gè)從機(jī)必須具有唯壹的地址代碼,并且只有符合地址代碼的從機(jī)才能響應(yīng)環(huán)回。當(dāng)從機(jī)發(fā)回信息時(shí),等效地址代碼指示信息來自何處。
功能代碼:主機(jī)發(fā)送的功能代碼告訴從機(jī)要執(zhí)行的任務(wù)。表4中列出的功能代碼具有特定的含義和操作。
復(fù)位單寄存器
將設(shè)置的貳進(jìn)制值寫入單個(gè)寄存器
數(shù)據(jù)區(qū):數(shù)據(jù)區(qū)包含從機(jī)要執(zhí)行的操作或從機(jī)收集的返回信息。此信息可以是數(shù)值、引用地址等。例如,如果功能代碼告訴從機(jī)讀取寄存器的值,則數(shù)據(jù)區(qū)必須包含要讀取的寄存器的起始地址和讀取長度。對于不同的從機(jī),地址和數(shù)據(jù)信息是不同的。
錯(cuò)誤檢查碼:主機(jī)或從機(jī)可以使用檢查碼來判斷接收到的信息是否錯(cuò)誤。有時(shí),由于電子噪聲或其他干擾,信息在傳輸過程中會略有變化。錯(cuò)誤檢查代碼確保主設(shè)備或從設(shè)備不會在傳輸過程中的錯(cuò)誤信息中發(fā)揮作用。這提高了系統(tǒng)的安全性和效率。錯(cuò)誤校驗(yàn)采用CRC-16校驗(yàn)方法。
注:信息幀的格式基本相同:地址碼、功能碼、數(shù)據(jù)區(qū)、檢錯(cuò)碼。
2)錯(cuò)誤檢查
冗余循環(huán)碼(CRC)由2個(gè)字節(jié)組成,即16位貳進(jìn)制。CRC碼由發(fā)送設(shè)備計(jì)算并置于發(fā)送信息的末尾。接收信息的設(shè)備重新計(jì)算接收信息的CRC碼,并比較計(jì)算出的CRC碼是否與接收到的CRC碼壹致。如果兩者不匹配,則表示存在錯(cuò)誤。
CRC碼的計(jì)算方法是將所有16位寄存器預(yù)設(shè)為1。然后逐步處理每8位的數(shù)據(jù)信息。在CRC碼計(jì)算期間,僅使用8個(gè)數(shù)據(jù)位、起始位和停止位。如果有奇偶校驗(yàn)位,它們還包括奇偶校驗(yàn)位,這不涉及CRC碼計(jì)算。
在計(jì)算CRC代碼時(shí),8位數(shù)據(jù)與寄存器的數(shù)據(jù)不同,或者結(jié)果被壹個(gè)字節(jié)移位到低位,最高位用0填充。然后檢查最低的順序。如果最低順序?yàn)?,則寄存器的內(nèi)容與預(yù)設(shè)數(shù)字不同。如果最低階數(shù)為0,則不執(zhí)行XOR操作。
這個(gè)過程已經(jīng)重復(fù)了八次。在第8次移位后,接下來的8位不同于或不同于當(dāng)前寄存器的內(nèi)容。此過程如上所述重復(fù)8次。當(dāng)處理所有數(shù)據(jù)信息時(shí),最后壹個(gè)寄存器的內(nèi)容是CRC碼值。當(dāng)發(fā)送和接收CRC碼中的數(shù)據(jù)時(shí),低字節(jié)排在第壹位。
計(jì)算CRC碼的步驟如下:
預(yù)設(shè)16位寄存器為十六進(jìn)制ffff(即全部為1)。稱該寄存器為CRC寄存器;
前8位數(shù)據(jù)不同于16位CRC寄存器或的低位,并且結(jié)果被置于CRC寄存器中;
將寄存器內(nèi)容向右移動壹位(向低位移動),用0填充最高位,并檢查最低位;
如果最低位為0:重復(fù)步驟3(再次移位);如果最低位為1:CRC寄存器和多項(xiàng)式A001(1010000000000001)之間的異或;
重復(fù)步驟3和4,直到右移8次,以便處理整個(gè)8位數(shù)據(jù);
重復(fù)步驟2至5以處理下壹個(gè)8位數(shù)據(jù);
最終的CRC寄存器是CRC代碼。
3)功能代碼03,讀取點(diǎn)和返回值:
如果儀器采用ModbusRTU通信協(xié)議,則可使用通信命令執(zhí)行讀取點(diǎn)(“保持寄存器”)或返回值(“輸入寄存器”)的操作。保持寄存器和輸入寄存器都是16位(2字節(jié))值,首先是高位。這樣,儀器的讀取點(diǎn)和返回值為2字節(jié)。壹次可讀取的最大寄存器數(shù)為60。由于某些可編程控制器不使用功能代碼03,因此將功能代碼03用作讀取點(diǎn)和返回值。從機(jī)響應(yīng)的命令格式為從機(jī)地址、功能代碼、數(shù)據(jù)區(qū)和CRC代碼。數(shù)據(jù)區(qū)中的寄存器數(shù)據(jù)每兩個(gè)字節(jié)壹次,高字節(jié)排在第壹位。
4)功能代碼06,單點(diǎn)保存
主機(jī)使用此命令將單點(diǎn)數(shù)據(jù)保存到儀器存儲器中。從機(jī)還使用此功能代碼向主機(jī)返回信息。
5.總結(jié)
MODBUS比其他通信協(xié)議更廣泛使用的主要原因是:
1)Modbus可以支持多種電氣接口,如RS-232\485(串口),也可以在各種介質(zhì)上傳輸,如雙絞線、光纖、無線等。
2)Modbus幀格式簡單,易于理解,易于開發(fā)。
3)可靠性好。Modbus協(xié)議需要檢查數(shù)據(jù)。除了串行協(xié)議中的奇偶校驗(yàn)外,ASCII模式中使用LRC校驗(yàn),RTU模式中使用16位CRC校驗(yàn)。此外,MODBUS采用主從模式定期發(fā)送和接收數(shù)據(jù)。在實(shí)際使用中,如果從站斷開(如故障或停機(jī)),主終端可以對其進(jìn)行診斷,故障修復(fù)后,網(wǎng)絡(luò)可以自動連接。