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