2011年5月23日 星期一

淺談MODBUS通信

Modbus是美國的Modicon公司開發的一種報文傳輸協議,1979年該公司成為施耐德公司的一部分。 Modbus協議在工業控制中得到了廣泛的應用,它已經成為一種通用的工業標準,該協議支持RS-232、RS-422、RS-485和以太網設備。不同廠商生產的控制設備通過Modbus協議可以連成通信網絡,進行集中監控。許多工控產品,例如PLC、變頻器、人機界面、DCS和自動化儀表等,都在廣泛地使用Modbus協議。
根據傳輸網絡類型的不同分為串行鏈路上的Modbus和基於TCP/IP協議的Modbus。
Modbus串行鏈路協議是一個主-從協議,採用請求-響應方式,主站發出帶有從站地址的請求報文,具有該地址的從站接收到後發出響應報文進行應答。
Modbus協議位於OSI模型的第二層。串行總線中只有一個主站,可以有1~247個從站。 Modbus通信只能由主站發起,從站在沒有收到來自主站的請求時,不會發送數據,從站之間也不會互相通信。
2. Modbus的報文傳輸模式
串行鏈路上的Modbus協議有ASCII和RTU(遠程終端單元)這兩種報文傳輸模式,同一Modbus網絡上所有的站都必須選擇相同的傳輸模式和串口參數。
(1)ASCII模式
當控制器設為在Modbus網絡上以ASCII(美國標准信息交換代碼)模式通信時,報文幀中的每個8位字節都轉換為兩個ASCII字符發送。下面是ASCII模式的報文格式:
:地址 功能碼 數據字節數 數據1……數據n LRC高字節 LRC低字節 回車 換行
報文中的每個ASCII字符都由十六進製字符組成,傳輸的每個字符包含一個起始位、7個數據位、一個奇偶校驗位和一個停止位;如果沒有校驗位,則有兩個停止位。 Modbus協議需要對數據進行校驗,串行協議中除了奇偶校驗外,ASCII模式採用縱向冗餘校驗(LRC),計算LRC時不包括開始的冒號符、LRC本身和回車換行符。
(2)RTU模式
Modbus網絡上的RTU模式的報文以字節為單位進行傳輸,一個字節由兩個十六進制數組成。在同樣的波特率下,傳輸效率比ASCII模式的高。
傳輸的每個字節包含一個起始位,8個數據位(先發送最低的有效位),奇偶校驗位、停止位與ASCII模式的相同,報文最長為256字節。
MODBUS的RTU模式報文的最後兩個字節是循環冗餘校驗碼(CRC)。其校驗方式是將整個報文的所有字節(不包括最後兩個字節)按規定的方式進行位移並進行XOR(異或)計算。接收方在收到該字符串時按同樣的方式進行計算,並將結果與收到的循環冗餘校驗碼進行比較,如果一致則認為通信正確,如果不一致,則認為通信有誤,從站將發送CRC錯誤應答。 MODBUS中RTU採用CRC-16的冗餘校驗方式。
下圖是Modbus RTU通信幀的基本結構,從站地址為0~247,它和功能碼均佔一個字節,命令幀中PLC地址區的起始地址和CRC各佔一個字,數據以字或字節為單位(與功能碼有關),以字為單位時高字節在前,低字節在後。但是CRC的低字節在前,高字節在後。
地址 功能碼 數據1……數據n CRC高字節 CRC低字節
MODBUS包括多種功能,每一功能都有相應的功能代碼。最基本的功能主要包括AI/AO、DI/DO數據的傳送。
MODBUS除了定義通信功能碼外,同時還定義了出錯碼,這有助於通信主站發現通信的錯誤內容和原因,並採取相應措施,從而保證了通信的可靠進行。
MODBUS定義的出錯信息為:指定的地址錯誤、指定的數據量出錯、從站自身的錯誤、無法應答請求或執行要求指令、從站無暇處理主站發送的通信請求指令等。錯誤信息對應錯誤代碼。主站在接收到錯誤碼後,根據錯誤的原因採取相應措施。例如改變數據地址、加大發送間隔和重發等。