唐崇華
[摘要]MODBUS協(xié)議是應用于電子控制器上的一種通用協(xié)議。通過此協(xié)議,控制器相互之間、控制器經由網絡(例如以太網)和其它設備之間可以通信。它已經成為一種通用工業(yè)標準。不同廠商生產的控制設備可以連成工業(yè)網絡進行集中監(jiān)控。此協(xié)議定義一個控制器能認識使用的消息結構,而不管它們是經過何種網絡進行通信的。它描述控制器請求訪問其它設備的過程,如何回應來自其它設備的請求,以及怎樣偵測錯誤并記錄。它制定消息域格局和內容的公共格式。
MODBUS是OSI模型第7層上的應用層報文傳輸協(xié)議,它在連接至不同類型總線或網絡的設備之間提供客戶機/服務器通信。自從1979年出現(xiàn)工業(yè)串行鏈路的事實標準以來,MODBUS使成千上萬的自動化設備能夠通信。目前,繼續(xù)增加對簡單而雅觀的MODBUS結構支持。
[關鍵詞]ModbusTCP/IP工業(yè)控制
中圖分類號:TP3文獻標識碼:A文章編號:1671-7597(2009)0710066-02
一、MODBUS協(xié)議描述
MODBUS是一個請求/應答協(xié)議,并且提供功能碼規(guī)定的服務。目前,以以太網上的TCP/IP使用MODBUS比較常見。
圖1ModBus協(xié)議格式
MODBUS協(xié)議定義了一個與基礎通信層無關的簡單協(xié)議數(shù)據(jù)單元(PDU)。特定總線或網絡上的MODBUS協(xié)議映射能夠在應用數(shù)據(jù)單元(ADU)上引入一些附加域。Modbus協(xié)議格式如圖1所示。TCP/IP上的MODBUS的請求/響應協(xié)議格式如圖2所示。
啟動MODBUS事務處理的客戶機創(chuàng)建MODBUS應用數(shù)據(jù)單元。功能碼向服務器指示將執(zhí)行哪種操作。
MODBUS報文傳輸服務提供設備之間的客戶機/服務器通信,這些設備聯(lián)接在一個Ethernet(以太網)TCP/IP網絡上。
這種客戶機/服務器模式是基于4種類型報文:
MODBUS請求:客戶機在網絡上發(fā)送用來啟動事務處理的報文。
MODBUS證實:在客戶端接收的響應信息。
MODBUS指示:服務端接收的請求報文。
MODBUS響應:服務器發(fā)送的響應信息。
圖2TCP/IP上的MODBUS的請求/響應協(xié)議格式
在TCP/IP上使用一種專用報文頭識別MODBUS應用數(shù)據(jù)單元。將這種報文頭稱為MBAP報文頭(MODBUS協(xié)議報文頭)。
MBAP報文頭包括下列域:
報文頭為7個字節(jié)長:
事務處理標識符:用于事務處理配對。在響應中,MODBUS服務器復制請求的事務處理標識符。
協(xié)議標識符:用于系統(tǒng)內的多路復用。通過值0識別MODBUS協(xié)議。
長度:長度域是下一個域的字節(jié)數(shù),包括單元標識符和數(shù)據(jù)域。
單元標識符:為了系統(tǒng)內路由使用這個域。專門用于通過以太網TCP-IP網絡和MODBUS串行鏈路之間的網關對MODBUS或MODBUS+串行鏈路從站的通信。MODBUS客戶機在請求中設置這個域,在響應中服務器必須利用相同的值返回這個域。
二、MODBUS功能碼舉例
以讀保持寄存器(功能碼3)為例。
在一個遠程設備中,使用該功能碼讀取保持寄存器連續(xù)塊的內容。請求PDU說明了起始寄存器地址和寄存器數(shù)量。從零開始尋址寄存器。將響應報文中的寄存器數(shù)據(jù)分成每個寄存器有兩字節(jié),在每個字節(jié)中直接地調整二進制內容。對于每個寄存器,第一個字節(jié)包括高位比特,并且第二個字節(jié)包括低位比特。
請求
響應(*N=寄存器的數(shù)量)
錯誤
這是一個請求讀寄存器108-110的實例:
將寄存器108的內容表示為兩個十六進制字節(jié)值02 2B,或十進制555。將寄存器109-110的內容分別表示為十六進制00 00和00 64,或十進制0和100。
三、用動態(tài)鏈接庫封裝MODBUS應答服務
采用動態(tài)鏈接庫(Dynamic-Linbk Library)實現(xiàn)對MODBUS應答服務的封裝。應客戶要求此動態(tài)鏈接庫主要的功能為響應客戶MODBUS請求并按請求將從設備采集到的數(shù)據(jù)以MODBUS協(xié)議格式發(fā)送給客戶。數(shù)據(jù)為32位浮點數(shù),采用IEEE754格式編碼。為便于用VB等開發(fā)工具開發(fā)的客戶端調用,采用標準的動態(tài)鏈接庫格式,即函數(shù)用__stdcall定義。
1.Modbus協(xié)議解析函數(shù)
函數(shù)processMsg(unsigned char mdreq):負責解析modbus請求。主要代碼:
switch(mRrequest[7])//按照modbus協(xié)議該位置為功能號
{ case 3://請求保持寄存器
{unsigned regNo = getWord(mRrequest, 8);//起始寄存器地址
Unsigned regCount = getWord(mRrequest, 10);// 寄存器數(shù)量
if (len != 12) { //標準Modbus請求為12個字節(jié),否則非法請求,填寫錯誤響應
mRrequest [7] |= 0x83;//錯誤碼
mRrequest [8] = 3;// 異常碼
mRrequest [5] = 3; // length
break;
}
if (regCount < 1 || regCount > 125 || regNo >= num4xRegs || (regCount + regNo) > num4xRegs) {// 請求寄存器范圍不合法,填寫錯誤響應
mRrequest [7] |= 0x83;// //錯誤碼
mRrequest [8] = 2; // 異常碼
mRrequest [5] = 3; // length
break;
}
// 正確的請求,填寫響應
mRrequest [8] = 2 * regCount;//數(shù)據(jù)字節(jié)數(shù)
mRrequest [5] = mRrequest [8] + 3;//響應信息長度
for (i=0;i {//訪問設備,得到數(shù)據(jù)項并賦值。 … … } } break; … … } return6+ mRrequest [5]; 2.通信模型的選擇 由于采用動態(tài)鏈接庫的方式實現(xiàn)對Modbus通信幀的監(jiān)聽和解析,為了避免窗體的使用,所以采用SELECT模型負責網絡通信工作。SELECT模式是Winsock中最常見的I/O模型。之所以稱其為“select模式”,是由于它的中心思想是利用SELECT函數(shù),實現(xiàn)對I/O的管理。利用SELECT函數(shù),可以判斷套接字上是否存在數(shù)據(jù),或者能否向一個套接字寫入數(shù)據(jù),從而實現(xiàn)數(shù)據(jù)的收發(fā)工作。采用SELECT主要用到函數(shù)ioctlsocket、select和FD_ZERO、FD_SET、FD_ISSET和FD_CLR宏。 在應用開發(fā)時,通過以下步驟,完成對套接字的可讀可寫判斷。 (1)使用FD_ZERO宏,初始化感興趣的套接字集合fd_set,可以為可讀套接字集合和可寫套接字集合。例如FD_ZERO(ReadFD)。 (2)使用FD_SET宏將套接字分配給參與操作的fd_set集合。例如FD_SET(s,ReadFD)。 (3)以fd_set為參數(shù)調用select函數(shù)。等待在指定的fd_set集合中I/O活動設置好套接字。select函數(shù)完成后會返回在所有fd_set集合中設置的套接字句柄總數(shù),并對每個集合進行相應的更新。 (4)select函數(shù)成功返回后,使用FD_ISSET宏,對每個fd_set集合進行檢查。例如,FD_ISSET(s,ReadFD)。如果該宏的值為TRUE,則說明該套接字可讀。 (5)調用相應的Windows Sockets API進行數(shù)據(jù)的接受和發(fā)送。 四、MODBUS異常響應 異常響應報文有兩個與正常響應不同的域: 功能碼域:在正常響應中,服務器利用響應功能碼域來應答最初請求的功能碼。所有功能碼的最高有效位(MSB)都為0(它們的值都低于十六進制80)。在異常響應中,服務器設置功能碼的MSB為1。這使得異常響應中的功能碼值比正常響應中的功能碼值高十六進制80。通過設置功能碼的MSB,客戶機的應用程序能夠識別異常響應,并且能夠檢測異常碼的數(shù)據(jù)域。 數(shù)據(jù)域:在正常響應中,服務器可以返回數(shù)據(jù)域中數(shù)據(jù)或統(tǒng)計表(請求中要求的任何報文)。在異常響應中,服務器返回數(shù)據(jù)域中的異常碼。 客戶機請求和服務器異常響應的實例: 在這個實例中,客戶機對服務器設備尋址請求。功能碼(01)用于讀輸出狀態(tài)操作。它將請求地址1245(十六進制04A1)的輸出狀態(tài)。 如果在服務器設備中不存在輸出地址,那么服務器將返回異常碼(02)的異常響應。這就說明從站的非法數(shù)據(jù)地址。 參考文獻: [1]《MODBUS Protocol Reference Guide》,http://www.Modbus-IDA.org. [2]《MODBUS MESSAGEING ON TCP/IP IMPLEMENTATION GUIDE V1.0a》, Http://www.Modbus-IDA.org. [3]《MODBUS Application Protocol Specification》,http://www.Modbus-IDA.org. [4]孫海民,《Windows Sockets 網絡開發(fā)-基于Visual C++實現(xiàn)》,人民郵電出版社.