1 引言
隨著計算機技術、通信技術、自動控制技術的發展,傳統的PLC已經發展到集3C 技術為一體的新型工業控制裝置PCC ,它更能勝任大型的集散控制和復雜的過程控制。奧地利貝加萊工業自動化公司的B&R2005 就是這一裝置。B&R2005 具有強大的網絡通信能力,可以實現遠程I/O ,CANBUS ,PROFIBUS ,以太網等網絡通信。并且提供了與第三方設備之間進行通信的幀驅動器。我們的項目中需要PCC 與阿爾斯通儀表進行通信,讀取阿爾斯通儀表中數據,而阿爾斯通儀表采用MODBUS 通信協議,所以我們利用幀驅動器實現工業控制中普遍采用的MODBUS 協議通信程序。
2 MODBUS 通信協議
MODBUS 是一種工業通信和分布式控制系統協議,由美國著名的可編程控制器制造公司莫迪康公司(MODICON INC) 提出,已廣泛地應用于工業控制中。MODBUS 是一種主從協議,允許一臺主機與多臺從機通信。MODBUS 通信協議主要包括寄存器讀寫,開關量I/ O 等命令。采用命令/ 間答方式,每一種命令幀都對應著一種應答幀,命令幀由主機發出,當從機收到后,應發出相應的應答幀。每個從機有一個唯一的地址,只有被訪問的從機才會響應包含它的地址的查詢。也可以采用廣播方式,在廣播方式中使用地址0 ,所有的從機把它當作一條指令執行,但不發回應答幀。在MODBUS 中有兩種有效的數據傳送方式,即ASCII 碼和RTU 方式。我們采用RTU 方式,這種方式的主要優點是:在同樣的波特率下,可比ASCII 碼方式傳送更多的數據。其格式如下:
從機地址即主機要訪問的設備的地址。功能代碼即從機要執行的功能。數據即附屬于功能代碼的數據。CRC 校驗數據即對前三種數據進行CRC 校驗算法,所得到的CRC 校驗值,用來校驗傳輸數據的正確性。
例如我們要讀取(03功能) 地址為11(16進制)的從機寄存器的值,我們要發送如下數據幀:
這條指令的意義是讀取起始地址為006BH開3個字的內容。
從機收到命令后即可響應,發回如下數據幀:
這樣即可取得所需數據。每種MODBUS 功能都有固定的命令幀和應答幀格式,共十六種。
3 幀驅動器
幀驅動器是貝加萊公司為實現與第三方設備之間進行通信而設計的軟件工具箱。通常數據通信,對數據進行讀寫操作,用戶必須對端口的細節了解很清楚,才能通過編程實現對接口各管腳進行操作。而幀驅動器將這些操作集中起來,用戶不必知道接口的細節,就可以通過幀驅動器命令直接傳輸讀寫數據。其提供的函數如下:
FRM_XOPEN:初始化端口,為幀驅動器分配緩存,安裝中斷處理程序
FRM_READ:把數據讀入讀緩存區
FRM_RBUF:釋放讀緩存區
FRM_GBUF:申請寫緩存區
FRM_WRITE:將數據寫入寫緩存區
FRM_ROBUT:釋放寫緩存區
在初始化接口后,用戶就可以發送和接收數據了。發送數據基本過程是這樣的,向幀驅動器申請一個緩存區,然后將要發送的數據寫入申請得到的緩存區中,命令幀驅動器傳輸數據。
FRM_GBUF(1 ,IDENT,GSTATUS ,OUTBUFADR ,OUTBUFLNG);申請緩存區
IF(GSTATUS = -) THEN
MEMCPY (OUTBUFADR ,ADR(SENDFRAME) ,LEN);將數據寫入寫緩存區
FRM_WRITE(1 ,IDENT,OUTBUFADR ,LEN ,WDSTATUS);要求幀驅動器傳輸數據
IF(WDSTATUS < >0) THEN
FRM_ROBUF(1 ,IDENT,OUTBUFADR ,LEN ,ROSTATUS)ENDIF
ENDIF
接收數據的過程與發送的過程基本相反,其過程是這樣的:命令幀驅動器從接口讀一幀數據并把它存入一個緩存區中,將數據從緩存區中拷貝到工作區中,釋放緩存區
FRM_READ(1 , IDENT,RSTATUS , INBUFADR , INBUFLNG);接收數據
IF (RSTATUS =0) THEN
MEMCPY (ADR(BUFFER[0]) , INBUFADR , INBUFLNG);接收數據存入工作區
FRM_RBUF(1 ,IDENT,INBUFADR ,INBUFLNG,RBSTATUS);釋放讀緩存區
ENDIF
4 程序設計實現
為了使操作命令組織結構清晰,合理。我們采用數據表格方式。我們把MODBUS 命令組織成命令表,表格中的每一行對應于一條MODBUS 命令,其格式如下:
此例就是讀取從機地址為11 ,起始地址為006B ,長度為3個字的內容,并把其放入地址為REBUFADR 開始的單元中。
整個程序由三部分組成: (1) 主程序。(2) CRC 校驗功能塊。(3) 數據表格。程序的設計思路是這樣的,主程序為一個TC#4任務,它每10ms 執行一次,確保實時快速地與從機通信。程序循環讀取表格中每一行的數據,然后調用CRC 校驗函數,計算出CRC 校驗碼,然后將其組織成MODBUS 命令幀發送出去。從機得到命令幀后,發回響應數據,主程序讀取返回數據,計算CRC 校驗碼,判斷返回數據是否有效,把其存放在記錄中。當有事件發生時,主程序立即讀取地址3600h開始的9個字,把其放在相應的事件記錄中,直至事件觸發標志無。為了使程序適應現場要求,對每種MODBUS 命令設有三種操作模式:模式0(不執行此條MODBUS命令) 、模式1(對此條MODBUS 命令只執行一次) 、模式2(常執行此條MODBUS 命令) 。
該程序裝入貝加萊B&R2005PCC 中,經運行,該程序能實時、準確,可靠地讀取阿爾斯通儀表的數據,很好地與阿爾斯通儀表進行通信,實現了MODBUS 的各種命令,完成了對阿爾斯通儀表的操作與控制。