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