段從武,李亭亭,趙世平
(四川大學 制造科學與工程學院,四川 成都 610065)
數(shù)據(jù)采集系統(tǒng)(dataacquisitionsystem,DAS)是允許被測對象經(jīng)過傳感器采集和調理,轉變?yōu)橹T如電壓、電流、脈沖或其他易被采集的信號之后,再通過特定的方式送入計算機或者微處理器供處理或存儲的測量系統(tǒng)。數(shù)據(jù)采集是工業(yè)自動化技術的前提,在工業(yè)控制和科學研究中具有舉足輕重的作用,而數(shù)據(jù)采集系統(tǒng)的軟件模塊是保證試驗臺自動、可靠、高效運行的關鍵。
根據(jù)四川某軍工單位的某型飛機特殊零件的測試需求,研制了一套機電液一體化的測控系統(tǒng)。該測控系統(tǒng)中,根據(jù)試驗要求,存在多種需要采集的信號,包括模擬信號、數(shù)字信號、脈沖信號等,根據(jù)其采集信號的不同采用不同采集標準的采集卡獲取數(shù)據(jù)是設計該系統(tǒng)的關鍵所在。本文根據(jù)相應的技術協(xié)議書的要求,對數(shù)據(jù)采集系統(tǒng)的軟件模塊進行了分析,然后采用適配器模式、裝飾者模式和單例模式對其進行具體實現(xiàn),通過這3種設計模式的實際應用效果表明數(shù)據(jù)采集系統(tǒng)軟件模塊除擁有較高的可拓展性外,其可靠性、靈活性與復用性也得到了極大的提高。
設計模式是軟件設計經(jīng)驗的總結,它允許直接復用他人已經(jīng)成功使用過的設計和體系結構,并能快速做出有利于系統(tǒng)復用、擴展的選擇[1]。
適配器模式屬于結構型模式,它將一個類的接口轉換成用戶需要的接口[2],并讓原本接口不兼容的類協(xié)同工作[3]。適配器模式可以分為對象適配器和類適配器,由于類適配器需要適配器繼承目標類與適配者類,而對象適配器對適配者類應用動態(tài)組合的方式使代碼具備了更大的靈活性,因此在Java、C#等不能支持多重繼承的靜態(tài)語言中主要使用對象適配器。
適配器模式由Target(目標抽象類)、Adapter(適配器類)和Adaptee(適配者類)三部分組成,其中,Target類中定義了客戶所需的接口[4];Adaptee定義了一個已經(jīng)存在的接口,它包含了客戶希望使用的業(yè)務方法,此接口需要適配;而Adapter是此模式的核心,它將對Adaptee和Target進行適配。
裝飾者模式屬于結構型模式,它可以動態(tài)地給一個對象增加一些額外的職責[5]。裝飾者模式是繼承方式的替代手段之一,它使得需要裝飾的類和用于裝飾的類均可獨立變化,增加新的構建類和具體裝飾者類都非常方便,較好地遵循面向對象設計的開閉原則[4]。
裝飾者模式包含Component(抽象構建)、ConcreteComponent(具體構建)、Decorator(抽象裝飾類)和ConcreteDecorator(具體裝飾類)。Component是ConcreteComponent和Decorator的共同基類,借助它可以使客戶端以一致的方式處理裝飾前后的對象;ConcreteComponent是Component的子類;Decorator是Component的子類,用于給具體構建類增加職責,同時它維護一個指向Component的引用,通過該引用可以調用裝飾之前構件對象的方法,并通過子類擴展該方法,以達到裝飾的目的;ConcreteDecorator是Decorator的子類,負責向構建添加新的職責。
單例模式屬于創(chuàng)建型模式,它確保一個類只有一個實例,并提供一個全局訪問點來訪問這個唯一實例[6]。借助此模式,不但可以方便對實例個數(shù)進行控制,而且可避免系統(tǒng)同一時刻存在多個狀態(tài)。單例模式按其實現(xiàn)形式可以分為“餓漢式”單例模式和“懶漢式”單例模式兩類,其中,“餓漢式”單例模式在類加載時就實例化單例類,而“懶漢式”單例模式則在第一次調用時才實例化單例類[7]。因此,對系統(tǒng)初始化時就需要的資源而言一般采用“餓漢式”單例模式[6]。
單例模式僅由一個類組成。它能夠自行創(chuàng)建程序中唯一的實例,并讓客戶端通過一個共有的靜態(tài)方法使用這個唯一的實例[8]。
在某試驗臺的DAS系統(tǒng)中需要采集多種不同類型的信號,且同一類型的信號還有不同的采集速率的要求,因此采用了多個生產(chǎn)廠家的采集卡構建了此系統(tǒng)。不同的采集卡廠商提供了各式各樣的API讓用戶通過編程操作設備,但是,如果讓測控軟件直接調用API函數(shù),則程序會依賴于底層的采集模塊,如果出現(xiàn)采集信號頻率發(fā)生變化等原因導致需求改變進而更換相應的采集卡時,則程序有大量代碼需要重新編寫,不利于保證程序的可維護性和擴展性,也不符合面向對象的依賴倒置原則。因此,設計中采用了適配器模式對廠家提供的API函數(shù)進行封裝,以便軟件的其他模塊進行調用,并讓程序其他模塊依賴于抽象接口。
基于適配器模式的采集模塊類圖如圖1所示,在此僅以HSLAI16AO2為例進行說明。HSL類是凌華公司提供的操控采集設備的API,屬于Adaptee;AbstractDevice類為Target,高層模塊通過操作該抽象類提供的接口來操作底層的采集設備。在AbstractDevice類中定義了Open、IsReady、Read等5種虛方法作為高層模塊操作底層采集設備的接口,其中,Open方法中封裝了采集卡的初始化、參數(shù)配置等方法,通過調用此方法可以完成采集設備的啟動工作;IsReady方法用于判斷采集卡是否可以開始工作;Read方法用于獲取采集卡的數(shù)據(jù),其中,data用于存放讀到的數(shù)據(jù),length用來表示需要獲取數(shù)據(jù)的長度;Write方法用于向采集卡輸出數(shù)據(jù)進而控制外接設備;Close方法
圖1 基于適配器模式的采集模塊類圖
中封裝了停止采集和關閉采集設備等方法,用于程序退出之前關閉采集卡。DeviceHSLAI16AO2類為Adapter,它繼承自AbstractDevice并持有一個對HSL類的引用,通過調用HSL中的相應方法來重寫AbstractDevice中的5種方法,進而實現(xiàn)操作采集卡的最終目的。若DAS中需要加入新的采集卡,則只需添加一個新類,讓其繼承AbstractDevice并引用廠家提供的庫函數(shù)來重寫以上5種虛方法即可,無需對上層軟件代碼進行修改。
通過采用適配器模式對采集模塊進行封裝設計之后,首先,避免了該測控系統(tǒng)的高層模塊直接依賴于采集卡廠商提供的庫函數(shù),當需要更換采集卡或增加新的采集卡時,不需要對代碼進行大范圍的修改,從而增強了此試驗臺測控系統(tǒng)軟件的靈活性和維護性;其次,可以同時對上層軟件和底層適配器進行編寫,極大提高了軟件的開發(fā)效率。
試驗臺的采集卡采集到數(shù)據(jù)之后需要對其按照一定的換算關系式進行運算處理;與此同時,在工廠環(huán)境中模擬信號采集卡采集到的數(shù)據(jù)含有噪聲信號,為減少噪聲信號對試驗臺控制的影響,不僅需要從硬件上對其進行隔離,而且軟件上也需要使用相應的濾波算法進行處理;此外,隨著新的需求出現(xiàn),今后可能需要對采集卡采集到的數(shù)據(jù)進行校準等操作。因此,DAS的軟件模塊應該具備在不影響整個程序結構的前提下應對今后新需求的能力。
采用裝飾者模式的類圖如圖2所示,其中DeviceHSLAI16AO2與DeviceDataProcess均繼承自AbstractDevice類,DeviceDataProcess類中的dataProcessObject持有一個AbstractDevice的引用,F(xiàn)ilter類則繼承自DeviceDataProcess并重寫基類中的ReadData方法,程序運行時當需要對數(shù)據(jù)進行濾波處理時則用Filter類包裝DeviceHSLAI16AO2類的數(shù)據(jù),然后調用ReadData方法即可。若以后需要添加新的數(shù)據(jù)處理功能時只需要添加一個新類,并讓其繼承DeviceDataProcess并重寫ReadData方法即可。
通過采用裝飾者模式對采集模塊進行設計之后,可以較靈活地對采集到的數(shù)據(jù)進行必要的處理;同時,在不改變原有代碼結構體系的情況下,允許今后對數(shù)據(jù)進行進一步的運算處理和改變數(shù)據(jù)處理方法的調用順序,符合了面向對象的“開閉原則”。
圖2 基于裝飾者模式的數(shù)據(jù)處理方法類圖
試驗臺的測控系統(tǒng)中每一塊采集卡的實例應該只有一個,否則,如果測控系統(tǒng)中存在多個獨立的對象,則會造成采集設備的誤操作和數(shù)據(jù)采集、設備管理的混亂,進而影響試驗臺的正常運行。因此,為了避免此類問題,采用單例模式是最佳的選擇。
在DAS模塊中,設計了一個DeviceManager類對所有采集設備進行管理,由于設備管理一直貫穿整個測控軟件的整個生命周期,所以采用餓漢單例模式進行設計,使其在DeviceManager類加載時就實例化唯一的一個對象。按單例模式設計的類圖如圖3所示。當高層模塊需要對采集卡進行讀寫操作時,可以通過調用GetInstance方法直接使用DeviceMangaer的實例對采集設備進行間接操作,該類包含了一個私有容器類(deviceIndex)用于存儲實例化的設備,將其類型聲明為ImmutableDictionary
通過采用單例模式對數(shù)據(jù)采集系統(tǒng)軟件模塊進行設計之后,可以保證采集卡的對象只有開始時實例化一次并容易對它們進行統(tǒng)一管理,同時又方便高層組件獲取設備對象進行相應操作[9]。
最終數(shù)據(jù)采集系統(tǒng)軟件模塊的類圖如圖4所示,此DAS軟件模塊充當?shù)蛯咏M件,高層軟件模塊持有一個對DeviceManager的引用,通過此引用可以調用相應采集卡對象進行對應的數(shù)據(jù)讀取操作,其關鍵偽代碼如下:
doubledata=0;
AbstractDeviceai16AO2=newDeviceHSLAI16AO2(); //實例化采集卡
ai16AO2.Open(null); //null表示使用默認參數(shù)啟動采集卡
AbstractDevicefilter=newFilter(ai16AO2); //用濾波算法來裝飾采集卡采集的數(shù)據(jù)
filter.Type=EnumDevice.AI16AO2;
DeviceManager.GetInstance().Add(filter); //添加采集設備
DeviceManager.GetInstance().DeviceAtIndex(EnumDevice.AI16AO2).ReadData(refdata,1); //設備調用,獲得經(jīng)過濾波處理的數(shù)據(jù)
圖3 基于單例模式的設備管理類圖
圖4 DAS軟件模塊最終類圖
設計模式是解決軟件開發(fā)過程中常見問題的有效手段,開發(fā)人員可以直接借鑒已有的成熟解決方案來解決實際編程問題。通過軟件的開發(fā)和實際使用效果表明對DAQ系統(tǒng)軟件模塊采用適配器模式、裝飾者模式和單例模式進行綜合設計。首先,成功解決了系統(tǒng)上層軟件模塊對采集設備對應的庫函數(shù)耦合度高、使用復雜、管理混亂的問題,為構建高可靠、易維護、可擴展的測控系統(tǒng)軟件夯實了基礎;其次,為今后數(shù)據(jù)處理留下了較大的擴展空間,方便添加新的數(shù)據(jù)處理功能;最后,若今后的測控系統(tǒng)開發(fā)中采用相同的采集設備,則可直接使用此模塊,實現(xiàn)了代碼的有效復用。