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