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