1 引言
組態(tài)軟件設(shè)備驅(qū)動程序用于提供了連接計算機硬件的軟件接口,在裝入后成為操作系統(tǒng)內(nèi)核的—部分,也就是說它成為操作系統(tǒng)的信任部分。因此,任何設(shè)備驅(qū)動程序的細小錯誤都可能引起操作系統(tǒng)的崩潰,要避免這樣的事情發(fā)生,只有反復(fù)測試所寫的代碼,遵循編寫驅(qū)動程序的規(guī)則。
最簡單的方法是購買現(xiàn)成的驅(qū)動程序來直接處理我們的設(shè)備,但這樣的驅(qū)動程序存在連接與嵌入錯誤的風(fēng)險。另外,可以通過修改各種商業(yè)通用驅(qū)動程序與許多簡單的設(shè)備打交道。如果自己編寫驅(qū)動程序的話,盡量使用某個標(biāo)準(zhǔn)的總線驅(qū)動程序或者類驅(qū)動程序,因為它們通常實現(xiàn)了我們所需要的大量功能。如果設(shè)備只有一個專門的用途,則為它編寫一個單一驅(qū)動程序來處理所有設(shè)備的請求可能是最簡單的解決方案。
三維力控組態(tài)軟件提供了力控I/O驅(qū)動程序接口軟件開發(fā)工具包FIOS SDK,F(xiàn)IOS SDK提供了標(biāo)準(zhǔn)的開發(fā)接口,開發(fā)人員僅需要根據(jù)I/O設(shè)備的具體通信協(xié)議或驅(qū)動接口說明,填寫幾個掃描函數(shù)的實現(xiàn)代碼,進行必要的調(diào)試與測試,即可完成一種FIOS的開發(fā)。
2 課題背景
目前筆者接手的項目是X機場助航燈光計算機監(jiān)控系統(tǒng)。當(dāng)機場燈光實施II類運行時,其能見度在800m至400m之間,要求燈光設(shè)備可靠性高、故障少,但往往燈具在運行過程中產(chǎn)生故障是隨機的,其故障率達到某一個值時,將不能滿足II類運行要求[1][2]。為保證監(jiān)控系統(tǒng)運行的穩(wěn)定性和可靠性,采用雙機容錯模式與力控工業(yè)控制組態(tài)軟件相結(jié)合的方法,通過硬件冗余、軟件組態(tài)的可靠設(shè)計、Visual C++與力控組態(tài)軟件的結(jié)合,并以RS-485總線作為網(wǎng)絡(luò)連接線,實現(xiàn)分布式的數(shù)據(jù)庫配置,設(shè)計了基于力控組態(tài)環(huán)境的雙機容錯系統(tǒng)。開發(fā)此系統(tǒng)的任務(wù)之一,就是自主開發(fā)驅(qū)動程序,將自定義的通信協(xié)議寫入驅(qū)動程序之中。而三維力控組態(tài)軟件提供了I/O驅(qū)動程序接口開發(fā)工具包(FIOS SDK),因此,開發(fā)驅(qū)動的主要工作就是利用組態(tài)軟件提供的接口函數(shù)和輸入輸出類庫編寫Ioapi中的代碼,以達到I/O設(shè)備的控制要求[3]。由于此項目的開發(fā)在Visual C++ 6.0環(huán)境中進行,學(xué)習(xí)Windows WDM驅(qū)動程序設(shè)計對于深入理解內(nèi)核態(tài)驅(qū)動程序開發(fā)、編寫相應(yīng)的接口程序也很有幫助。
3 開發(fā)工具——FIOS SDK簡介[5][6]
FIOS SDK開發(fā)環(huán)境完全基于32位Windows平臺。它使用動態(tài)鏈接庫(DLL)技術(shù)將開發(fā)人員開發(fā)的代碼整合到力控組態(tài)
軟件系統(tǒng)中。FIOS SDK提供給程序員的開發(fā)接口為API函數(shù)和C++類庫。
FIOS SDK主要由4部分組成:設(shè)備組態(tài)接口(Iodevcfg)、數(shù)據(jù)連接組態(tài)接口(Ioitemui)、I/O監(jiān)控接口Ioapi和I/O服務(wù)器程序Ioserver。其中,Iodevcfg:負責(zé)管理設(shè)備組態(tài)過程;Ioitemui:負責(zé)管理數(shù)據(jù)連接組態(tài)過程;Ioapi:負責(zé)完成與I/O設(shè)備間的數(shù)據(jù)交換,實現(xiàn)對設(shè)備的監(jiān)控過程,包括:對通信協(xié)議的解析、數(shù)據(jù)格式的轉(zhuǎn)換等;Ioserver:由FIOS SDK提供,用于完成對Ioapi 的動態(tài)裝載,調(diào)用并執(zhí)行Ioapi實現(xiàn)的導(dǎo)出函數(shù)。它封裝了大部分開發(fā)人員不必關(guān)心的技術(shù)細節(jié),如完成與I/O設(shè)備的底層通信(串口通信、網(wǎng)絡(luò)通信等)、設(shè)備超時處理、設(shè)備故障診斷等。Ioserver還完成與實時數(shù)據(jù)庫DB之間的通信,它把從I/O設(shè)備采集到的數(shù)據(jù)經(jīng)Ioapi解析轉(zhuǎn)換后提交給DB,或者將DB下置給I/O設(shè)備的數(shù)據(jù)經(jīng)Ioapi解析轉(zhuǎn)換后寫入I/O設(shè)備。
因此,開發(fā)人員僅需要開發(fā)Iodevcfg、Ioitemui、Ioapi三部分的代碼。下面就以這三個部分的代碼、界面開發(fā)為例,說明在力控組態(tài)軟件中進行驅(qū)動開發(fā)的步驟。
4 開發(fā)實例
以C8051單片機實現(xiàn)數(shù)據(jù)采集為例,針對下層RS-485總線通信開發(fā)驅(qū)動程序。
4.1 設(shè)備組態(tài)接口(Iodevcfg)開發(fā)
(1) I/O描述文件
在使用力控進行組態(tài)時,一般都要涉及I/O設(shè)備的定義過程。I/O描述文件的文件名為Iodesc.txt。文件內(nèi)容規(guī)定的格式如下(其中,表示回車換行):
類別;廠商或I/O程序描述;IOID
子類型1;類型號;缺省通信方式;提供設(shè)備地址
子類型2;類型號;缺省通信方式;提供設(shè)備地址
……
因此,在本項目中的I/O描述文件定義為:
“X計算機監(jiān)控系統(tǒng);華中科技大學(xué)控制系;CCMSController;0;1;0”表示類型號為0,RS-485通信,不設(shè)置設(shè)備地址。
(2) 開發(fā)Iodevcfg.dll
開發(fā)人員在編寫Iodevcfg接口程序時主要完成兩部分功能,一是為用戶進行設(shè)備組態(tài)時提供一個界面;另外就是將用戶組態(tài)的設(shè)備參數(shù)信息保存起來,以便在開發(fā)編程接口Ioapi時使用。如果力控提供的標(biāo)準(zhǔn)設(shè)備組態(tài)接口能夠完整地描述設(shè)備的有關(guān)信息,就不需要再編寫Iodevcfg接口程序。標(biāo)準(zhǔn)界面如圖1所示,并對串口進行相關(guān)設(shè)置,如圖2所示。