作 者 :華中科技大學 控製科學與工程係 吳力煒 葉念渝 關鍵詞: 組態軟件 設備驅動程序 RS-485串行通信 1 引言 組態軟件設備驅動程序用於提供了連接計算機硬件的軟件接口,在裝入後成為操作係統內核的―bufen,yejiushishuotachengweicaozuoxitongdexinrenbufen。yinci,renheshebeiqudongchengxudexixiaocuowudoukenengyinqicaozuoxitongdebengkui,yaobimianzheyangdeshiqingfasheng,zhiyoufanfuceshisuoxiededaima,zunxunbianxiequdongchengxudeguize。 zuijiandandefangfashigoumaixianchengdequdongchengxulaizhijiechuliwomendeshebei,danzheyangdequdongchengxucunzailianjieyuqianrucuowudefengxian。lingwai,keyitongguoxiugaigezhongshangyetongyongqudongchengxuyuxuduojiandandeshebeidajiaodao。ruguozijibianxiequdongchengxudehua,jinliangshiyongmougebiaozhundezongxianqudongchengxuhuozheleiqudongchengxu,yinweitamentongchangshixianlewomensuoxuyaodedalianggongneng。ruguoshebeizhiyouyigezhuanmendeyongtu,zeweitabianxieyigedanyiqudongchengxulaichulisuoyoushebeideqingqiukenengshizuijiandandejiejuefangan。 三維力控組態軟件提供了力控I/O驅動程序接口軟件開發工具包FIOS SDK,FIOS SDK提供了標準的開發接口,開發人員僅需要根據I/O設備的具體通信協議或驅動接口說明,填寫幾個掃描函數的實現代碼,進行必要的調試與測試,即可完成一種FIOS的開發。 2 課題背景 目前筆者接手的項目是X機場助航燈光計算機監控係統。當機場燈光實施II類運行時,其能見度在800m至400m之間,要求燈光設備可靠性高、故障少,但往往燈具在運行過程中產生故障是隨機的,其故障率達到某一個值時,將不能滿足II類運行要求[1][2]。為保證監控係統運行的穩定性和可靠性,采用雙機容錯模式與力控工業控製組態軟件相結合的方法,通過硬件冗餘、軟件組態的可靠設計、Visual C++與力控組態軟件的結合,並以RS-485總(zong)線(xian)作(zuo)為(wei)網(wang)絡(luo)連(lian)接(jie)線(xian),實(shi)現(xian)分(fen)布(bu)式(shi)的(de)數(shu)據(ju)庫(ku)配(pei)置(zhi),設(she)計(ji)了(le)基(ji)於(yu)力(li)控(kong)組(zu)態(tai)環(huan)境(jing)的(de)雙(shuang)機(ji)容(rong)錯(cuo)係(xi)統(tong)。開(kai)發(fa)此(ci)係(xi)統(tong)的(de)任(ren)務(wu)之(zhi)一(yi),就(jiu)是(shi)自(zi)主(zhu)開(kai)發(fa)驅(qu)動(dong)程(cheng)序(xu),將(jiang)自(zi)定(ding)義(yi)的(de)通(tong)信(xin)協(xie)議(yi)寫(xie)入(ru)驅(qu)動(dong)程(cheng)序(xu)之(zhi)中(zhong)。而(er)三(san)維(wei)力(li)控(kong)組(zu)態(tai)軟(ruan)件(jian)提(ti)供(gong)了(le)I/O驅動程序接口開發工具包(FIOS SDK),因此,開發驅動的主要工作就是利用組態軟件提供的接口函數和輸入輸出類庫編寫Ioapi中的代碼,以達到I/O設備的控製要求[3]。由於此項目的開發在Visual C++ 6.0環境中進行,學習Windows WDM驅動程序設計對於深入理解內核態驅動程序開發、編寫相應的接口程序也很有幫助。 3 開發工具――FIOS SDK簡介[5][6] FIOS SDK開發環境完全基於32位Windows平台。它使用動態鏈接庫(DLL)技術將開發人員開發的代碼整合到力控組態 軟件係統中。FIOS SDK提供給程序員的開發接口為API函數和C++類庫。 FIOS SDK主要由4部分組成:設備組態接口(Iodevcfg)、數據連接組態接口(Ioitemui)、I/O監控接口Ioapi和I/O服務器程序Ioserver。其中,Iodevcfg:負責管理設備組態過程;Ioitemui:負責管理數據連接組態過程;Ioapi:負責完成與I/O設備間的數據交換,實現對設備的監控過程,包括:對通信協議的解析、數據格式的轉換等;Ioserver:由FIOS SDK提供,用於完成對Ioapi 的動態裝載,調用並執行Ioapi實現的導出函數。它封裝了大部分開發人員不必關心的技術細節,如完成與I/O設備的底層通信(串口通信、網絡通信等)、設備超時處理、設備故障診斷等。Ioserver還完成與實時數據庫DB之間的通信,它把從I/O設備采集到的數據經Ioapi解析轉換後提交給DB,或者將DB下置給I/O設備的數據經Ioapi解析轉換後寫入I/O設備。 因此,開發人員僅需要開發Iodevcfg、Ioitemui、Ioapi三部分的代碼。下麵就以這三個部分的代碼、界麵開發為例,說明在力控組態軟件中進行驅動開發的步驟。 4 開發實例 以C8051單片機實現數據采集為例,針對下層RS-485總線通信開發驅動程序。 4.1 設備組態接口(Iodevcfg)開發 (1) I/O描述文件 在使用力控進行組態時,一般都要涉及I/O設備的定義過程。I/O描述文件的文件名為Iodesc.txt。文件內容規定的格式如下(其中,表示回車換行): 類別;廠商或I/O程序描述;IOID 子類型1;類型號;缺省通信方式;提供設備地址 子類型2;類型號;缺省通信方式;提供設備地址 …… 因此,在本項目中的I/O描述文件定義為: “X計算機監控係統;華中科技大學控製係;CCMSController;0;1;0”表示類型號為0,RS-485通信,不設置設備地址。 (2) 開發Iodevcfg.dll 開發人員在編寫Iodevcfg接口程序時主要完成兩部分功能,一是為用戶進行設備組態時提供一個界麵;另外就是將用戶組態的設備參數信息保存起來,以便在開發編程接口Ioapi時使用。如果力控提供的標準設備組態接口能夠完整地描述設備的有關信息,就不需要再編寫Iodevcfg接口程序。標準界麵如圖1所示,並對串口進行相關設置,如圖2所示。  圖1 標準設備組態界麵 圖2 串口設置界麵 4.2 數據連接組態接口(Ioitemui)開發 在用力控進行組態時,把實時數據庫DB中的點參數與某種設備的具體信道建立連接的過程被為數據連接過程。Ioitemui要以DLL形式提供,該DLL必須是MFC擴展DLL,其缺省文件名稱為Ioitemui.dll。 數據連接過程對於不同的I/O設備,其形式和內容可能完全不同。因此,必須針對不同的I/O設備設計相應的數據連接形式以保存各種參數信息。 開發人員在編寫Ioitemui接口程序時也是主要完成兩部分功能,一是為用戶進行數據連接組態時提供一個界麵;二是將用戶組態的設備參數信息保存在數據連接項結構(以下簡稱連接項結構)IOITEMDEF中,以便在開發I/O監控接口Ioapi時使用。這個連接項結構是一個通用結構,由開發人員自己賦值,自己解釋。界麵如圖3所示:  圖3 數據連接組態界麵 4.3 I/O監控接口Ioapi開發 Ioapi是FIOS提供的最重要的一個編程接口,開發人員的主要工作就是開發Ioapi部分的程序代碼。Ioapi提供了一組API函數(掃描函數)和一些C++類庫(IOC, Input Output Class)。這些IOC類庫全部以純虛類的形式提供,並且隻有成員函數,沒有成員變量,主要包括5個類:CItem(數據項類)、CPacket(數據包類)、CDevice(設備類)、CChannel(信道類)和CManager(管理器類)。以層級的結構來管理點、包、設備、信道,實現對設備組態、數據組態、參數信息的獲取和與實時數據庫DB之間的數據交換。 Ioapi.dll程序中主要完成如下的導出函數(對於不需要的函數,一定要刪除,這樣可以使程序的運行效率提高): OnCreate-載入Ioapi.dll後立即調用,這時信道、設備、包、點都不存在,一般用於設置程序的標題,使用戶比較清楚程序的用途; OnSortItem-所有點導入完畢後調用,這時候沒有任何包建立; OnItemToPacket-循環多次添加所有的點到各個包中,基本原則是能一次處理的點打成一個包,使打包合理化; OnBeforeScan-打包完成,正式調度之前調用一次,遍曆管理器,信道,設備,包,點; OnCreateDeviceLink-設備的初始化工作; OnCreatePacketLink-包的初始化工作; OnReadData-IOSCAN程序循環掃描調度,形成數據采集命令串; OnWriteData-發生數據下送時調用,形成數據下置命令串; OnIsResponseComplete-異步方式下判斷是否完成數據的接收,是否將數據設置到DB中; OnAfterSend-發送數據後調用一次,調試時可以查看發送的命令串是否正確; OnTimeout-發生超時的時候調用; OnUnloadPacket-包析構時調用; OnClose-CManager析構時調用一次。 開發人員可根據項目中自定義的通信協議,將通信協議寫入函數OnReadData()、OnWriteData()中,實現數據的采集和下置。下麵給出OnReadData函數的部分代碼: INT OnReadData( CPacket* pPacket, LPTSTR lpszSendString, INT& nSendStringLen ) { pPacket->SetReady(TRUE); //生成采集命令字符串 CDevice* pDevice = pPacket->GetDevice(); //得到設備指針 CChannel * pChannel = pDevice->GetChannel(); //得到通道指針 pChannel->ClearAcceptBuffer(); //清空接收緩衝區 CString csDeviceAddr = pDevice->GetAddr(); //得到實際設備的地址 IOITEMDEF * pItemStru = pPacket->GetItem(0)->GetItemStru(); //得到包的數據 BYTE ucIoType = pItemStru->n[IO_TYPE]; //得到發送命令的I/O類型 BYTE ucDeviceAddr = pItemStru->n[DEVICE_ADDR];//得到用戶輸入的設備地址 …… //需要根據實際的通信協議書寫有關的程序 CString csCommand = ""; csCommand = BYTE(FRAME_HEAD); //寫入幀信息頭 …… csCommand += BYTE(QUERY); //定義幀信息類型 csCommand += BYTE(0x01); //有效信息長度為 1 字節 csCommand += BYTE(ucDeviceAddr); //寫入設備的地址 csCommand += LRCCheck(temp_que, 2); //寫入幀尾LRC校驗碼 nSendStringLen = csCommand.GetLength(); CString csPmessage; csPmessage.Format("讀取數據:設備地址%X", ucDeviceAddr); pDevice->ShowProcessMessage(csPmessage); pDevice->ShowEventMessage(csPmessage, FALSE); //調試用,用以顯示觸發事件 for ( int i = 0; i < nSendStringLen; i++ ) lpszSendString[i] = csCommand[i]; return SEND; } 4.4 驅動程序的調試 通過Visual C++ 6.0編寫的程序,如:Iodevcfg.dll、Ioitemui.dll、Ioapi.dll,必須生成Release版本,否則調試時,I/O Server調用時將會出錯,並立即跳出程序的執行。調試顯示過程如附表所示。 附表 設備驅動程序調試過程信息  附表 設備驅動程序調試過程信息 調試結果表明該驅動程序可以實現與C8051單片機的異步通信,完成數據的采集,進而實現對助航燈光的控製。 5 結束語 組zu態tai軟ruan件jian作zuo為wei現xian場chang生sheng產chan數shu據ju采cai集ji和he過guo程cheng控kong製zhi的de專zhuan用yong軟ruan件jian,在zai許xu多duo行xing業ye領ling域yu都dou有you應ying用yong。但dan任ren何he組zu態tai軟ruan件jian的de驅qu動dong程cheng序xu不bu可ke能neng囊nang括kuo所suo有you設she備bei的de驅qu動dong程cheng序xu,特te別bie是shi對dui通tong信xin協xie議yi有you特te定ding要yao求qiu的de設she備bei,因yin此ci,就jiu需xu要yao開kai發fa人ren員yuan根gen據ju自zi己ji的de通tong信xin協xie議yi編bian寫xie相xiang應ying的de驅qu動dong程cheng序xu代dai碼ma,並bing結jie合he實shi際ji的de設she備bei進jin行xing調tiao試shi。一yi個ge好hao的de驅qu動dong程cheng序xu設she計ji應ying該gai是shi可ke配pei置zhi的de、可移植的、可搶占式的、可中斷的和多處理器安全的[4]。若想能夠很好地掌握驅動程序的開發,最根本的是閱讀驅動文檔並自己動手編寫驅動程序。
|