強實時測控系統(tǒng)的軟件設計技術
工業(yè)控制和SCADA的發(fā)展對測控及仿真軟件的實時性提出了更高的要求,軟件的實時性已作為評估測控、仿真系統(tǒng)性能優(yōu)劣的一項重要考核指標。實現(xiàn)軟件的實時性當然離不開高速I/O傳輸及高速數(shù)據(jù)采集的支持,許多公司現(xiàn)已成功研制出具有高可靠性和穩(wěn)定性的高速數(shù)據(jù)采集板卡,板卡的研制僅僅為高速數(shù)據(jù)采集提供了很好的硬件平臺,還需要應用微機接口技術、軟件工程技術、總線技術使其發(fā)揮應有的作用。本文主要從A/D觸發(fā)時鐘和觸發(fā)模式等硬件配置的軟件設置方法,數(shù)據(jù)傳輸方式和端口I/O操作方法的選擇,以及多線程應用技術等方面,探討有關如何進行程序設計來提高軟件實時性的技巧及關鍵技術。
技巧及關鍵技術
A/D觸發(fā)時鐘的設置
高效率、高可靠性、高頻率、高準確度的定時器脈沖觸發(fā)源是實現(xiàn)穩(wěn)定可靠高速數(shù)據(jù)采集的重要前提。在高速采集板卡上一般設計有兩塊Intel8254定時芯片,且相互橋聯(lián),即第一塊Intel8254的時鐘輸入腳接入高精度、高頻率的石英振蕩器,其輸出作為第二塊Intel8254時鐘的輸入,第二塊Intel8254的輸出才是觸發(fā)A/D的真正脈沖源。在程序設計時尤其要注意二者的協(xié)聯(lián)及相互間的匹配關系,這種設計的定時器1和2的計數(shù)值CT1和CT2必須滿足如下關系式: CT1×CT2=時鐘基頻/系統(tǒng)的采樣頻率,同時CT2最好是CT1的整數(shù)倍。通過Matlab with Simulink平臺的仿真結果以及實踐證明:比較可靠的方法是將CT1強行設置為2k或4k,再利用上式關系計算出CT2。同時兩時鐘的工作方式最好設置成方式2。
A/D觸發(fā)模式的設置
A/D觸發(fā)模式將直接影響A/D采樣速率和孔徑時間,A/D觸發(fā)的模式一般有三種:軟件觸發(fā)、定時器同步觸發(fā)以及外部觸發(fā)。一般而言,軟件觸發(fā)一般適合采樣速度較慢且現(xiàn)場信號變化比較緩慢的場合;外部觸發(fā)適合于多路信號需要同步采樣的場合,其采樣速率由外部觸發(fā)信號的頻率而定;定時器同步觸發(fā)一般適合采樣速率較快的場合。在編寫底層驅(qū)動程序時,要根據(jù)外部信號的特征和控制系統(tǒng)實時性的要求選取合適的A/D觸發(fā)模式。
A/D轉換數(shù)據(jù)的傳輸方式設置
數(shù)據(jù)的傳輸方式也同樣影響A/D的采樣速率和孔徑時間,數(shù)據(jù)的傳輸方式一般有軟件查詢(軟件控制)、中斷傳輸、DMA方式以及FIFO方式等四種方式,以常見的A/D轉換基頻10M為例,上述4種方式的數(shù)據(jù)傳輸速率分別為10-20kS/s、10-30kS/s、200kS/s、330kS/s。通過比較可知,需高速數(shù)據(jù)采集的場合應選取FIFO數(shù)據(jù)傳輸方式為宜。
I/O操作方式的設置
在對高速數(shù)據(jù)采集板卡的端口進行I/O操作時,針對ISA和PCI總線設備,應特別注意有所區(qū)別:
一個ISA設備驅(qū)動程序的資源是固定不變的,而一個PCI設備驅(qū)動程序的資源是操作系統(tǒng)自動分配的,需通過設備ID號和廠商ID號獲得設備的物理位置、總線號、器件號和功能號,并利用它們尋址PCI配置空間,才能從配置空間獲得中斷號、端口地址等硬件資源。
ISA設備與PCI設備驅(qū)動程序?qū)χ袛嗵幚聿煌阂粋€ISA設備驅(qū)動程序的中斷模式可以是LevelSensitive,也可以是Latched,而且中斷向量是否與其它設備共享無關緊要。但一個PCI設備驅(qū)動程序的中斷模式必須是LevelSensitive,而且中斷向量必須是共享的。
通過Matlab with Simulink平臺的仿真結果來看:在高速數(shù)據(jù)采集過程中,為了縮短A/D的孔徑時間,提高A/D的轉換效率,應盡量減少對其端口I/O操作的次數(shù)。最好的解決辦法是將A/D整個過程分解為:包括時鐘基頻、采樣頻率、掃描通道、通道增益等參數(shù)設置等在內(nèi)的A/D初始化過程;A/D標志位判別及數(shù)據(jù)采集過程;數(shù)據(jù)轉移及處理過程等,并將這三個過程采用Visual C++將其編譯成DLL(動態(tài)鏈接庫),然后在應用程序中調(diào)用,比在Visual C++中直接采用_inp()、_outp()等編成的子函數(shù)要更省時。編寫DLL時,若在VC++環(huán)境中嵌入?yún)R編語言,效果更佳。但要記?。壕幾g后的DLL在Win9X(包括WinME)系統(tǒng)中必須存放在System子目錄下,而在Win2k或XP系統(tǒng)中必須存放在System32子目錄下。
軟件多線程的應用
多線程的應用策略
一個復雜的測控、仿真軟件,往往要求數(shù)據(jù)采集、圖形界面生成、控制算法實現(xiàn)、遠程通信、數(shù)據(jù)管理等過程并行完成,而Windows又并非是一個實時性很強的操作系統(tǒng),但其多線程能力為實現(xiàn)這種并行處理能力提供了很好的解決方案。
實踐表明,在設計和編寫測控多線程程序時,必須考慮以下幾點:
線程數(shù)量不宜過多,否則線程間的頻繁切換反而會影響程序的執(zhí)行效率,從而導致軟件實時性的下降,在高速數(shù)據(jù)采集過程中,采用2~3線程足以滿足軟件的實時性要求。如設定A/D初始化線程、數(shù)據(jù)采集線程、數(shù)據(jù)傳輸與處理線程等。
因為同一時間有多個線程在執(zhí)行,公共數(shù)據(jù)區(qū)段內(nèi)的變量、數(shù)據(jù)或參數(shù)可能會被其它的線程在線修改,必須合理控制并發(fā)線程。在測控程序設計中,較好的辦法是通過Semaphore(信號量)對象來控制線程間的同步,同時在所有并發(fā)線程中,設置數(shù)據(jù)采集線程具有最高優(yōu)先級。
不同的外部設備,如PCI總線、ISA總線、串行設備,其I/O操作的速度不同,因此必須合理協(xié)調(diào)不同I/O設備間的I/O操作。
一般而言,一個調(diào)入內(nèi)存并準備執(zhí)行的程序稱為一個進程,每個進程擁有一個局部虛擬地址空間和一個控制點,每個進程可創(chuàng)建多個并發(fā)線程,并由一個主線程開始,所有線程共享該進程里的地址空間、數(shù)據(jù)和系統(tǒng)資源。Win32、WinNT是一種搶先式多線程調(diào)度方式,可以保證優(yōu)先級高的線程首先獲得CPU運行時間。在高速數(shù)據(jù)采集系統(tǒng)中,可為每個線程設定一個優(yōu)先級,操作系統(tǒng)根據(jù)線程的優(yōu)先級讓CPU搶先執(zhí)行當前最適當?shù)木€程。在實現(xiàn)安全有效的多線程機制的軟件時,除了要合理設置線程優(yōu)先級外,還要合理控制并發(fā)線程,否則不僅會造成線程死鎖,還會導致系統(tǒng)崩潰,最易導致線程死鎖的因素是多線程中公共數(shù)據(jù)的訪問過程。為了避免此現(xiàn)象發(fā)生,可通過線程之間的同步來實現(xiàn)對公共數(shù)據(jù)塊進行保護。
多線程的應用實現(xiàn)
各個線程可以訪問進程中的公共變量,需要注意的問題是如何防止兩個或兩個以上的線程同時訪問同一個數(shù)據(jù),以免破壞數(shù)據(jù)的完整性。在高速數(shù)據(jù)采集過程中,應避免數(shù)據(jù)采集線程往FIFO緩沖區(qū)寫數(shù)據(jù)的同時,數(shù)據(jù)轉移線程來訪問FIFO緩存。
Visual C++中使用同步類來解決操作系統(tǒng)的并行性引起的數(shù)據(jù)不安全問題。MFC支持的七個多線程的同步類可以分成兩大類:同步對象(CsyncObject、Csemaphore、Cmutex、CcriticalSection和Cevent)和同步訪問對象(CmultiLock和CsingleLock)。臨界區(qū)(Critical section)是保證在某一個時間只有一個線程可以訪問數(shù)據(jù)的方法。使用它的過程中,需要給各個線程提供一個共享的臨界區(qū)對象,無論哪個線程占有臨界區(qū)對象,都可以訪問受到保護的數(shù)據(jù),此時其它線程需要等待,直到該線程釋放臨界區(qū)對象為止。臨界區(qū)被釋放后,另外的線程可以強占這個臨界區(qū),以便訪問共享的數(shù)據(jù)。臨界區(qū)對應著一個CriticalSection對象,當線程需要訪問保護數(shù)據(jù)時,調(diào)用臨界區(qū)對象的Lock()成員函數(shù);當對保護數(shù)據(jù)的操作完成之后,調(diào)用臨界區(qū)對象的Unlock()成員函數(shù)釋放對臨界區(qū)對象的擁有權,以使另一個線程可以奪取臨界區(qū)對象并訪問受保護的數(shù)據(jù)。信號量(Semaphore)和互斥(Mutexe)的用法很相似,不同的是,它可以同一時刻允許多個線程訪問同一個資源,這正是高速數(shù)據(jù)采集所需的對并發(fā)線程控制的方法。創(chuàng)建一個信號量需要用Csemaphore類聲明一個對象,一旦創(chuàng)建了一個信號量對象,就可以用它來對資源訪問??梢韵葎?chuàng)建一個CsingleLock或CmltiLock對象,然后用該對象的Lock()函數(shù)減少這個信號量的計數(shù)值,Unlock()反之。
在多線程程序運行過程中,必須要有一個主線程。其實,線程有用戶界面線程和工作線程(又稱為后臺線程)之分。前者通常用來處理用戶的輸入并響應各種事件和消息,應用程序的主執(zhí)行線程CWinAPP對象就是一個用戶界面線程,當應用程序啟動時,它自動創(chuàng)建和啟動。同樣,它的終止也意味著該程序的結束,進程終止。工作線程用來執(zhí)行程序的后臺處理任務,在高速數(shù)據(jù)采集過程中,A/D初始化線程、數(shù)據(jù)采集線程、數(shù)據(jù)轉移與處理線程就是后臺線程,和用戶界面線程的區(qū)別是,它不用從CwinThread類派生來創(chuàng)建。一個進程中的所有線程共享它們父進程的變量,但同時每個線程可以擁有自己的變量。
在本設計中,將控制策略管理線程作為主線程,其屬性設置成CWinAPP,數(shù)據(jù)采集線程在所有并發(fā)線程中具有最高的優(yōu)先級,數(shù)據(jù)采集線程不間斷地將采集的數(shù)據(jù)存放到公共的FIFO數(shù)據(jù)緩沖區(qū),以便數(shù)據(jù)處理線程調(diào)用,控制策略管理線程具有最高優(yōu)先級的主線程,可以隨時喚醒或掛起后臺線程。同時,所有后臺線程只能有數(shù)據(jù)采集線程喚醒,控制策略管理線程則無權干涉,程序通過CEvent對象來溝通各線程間發(fā)生的事件,通過獲得Csemaphore的使用權來存取公共數(shù)據(jù)FIFO緩沖區(qū)的數(shù)據(jù)。
結語
影響測控及仿真軟件實時性既有硬件的因素,也有軟件的因素,二者相互依存,相互制約。一個良好的軟件設計不僅可以提高硬件的性能,還可彌補其性能設計上的不足。軟件設計時,要考慮其綜合因素,如A/D觸發(fā)方式、數(shù)據(jù)轉換方式的選擇、多線程的應用及其相互間的協(xié)同工作關系,大容量數(shù)據(jù)存儲與高速數(shù)據(jù)存取間矛盾、高速數(shù)據(jù)采集與高速數(shù)據(jù)存取間的矛盾等等。■
參考文獻:
1. 吳重光等,系統(tǒng)仿真導論,科學出版社,2001
2. 施陽、嚴衛(wèi)生等,MATLAB及動態(tài)仿真工具SIMULINK,清華大學出版社 2001.6
3. 于海生:計算機控制技術,清華大學出版社.北京,1999.7
4. 吳小博等;Visual C++編程技巧,清華大學出版社.北京,2000.7
作者簡介:
吳道虎,博士,主要研究生產(chǎn)過程自動化、現(xiàn)場總線應用等
評論