關(guān) 閉

新聞中心

EEPW首頁 > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > 強(qiáng)實(shí)時(shí)測(cè)控系統(tǒng)的軟件設(shè)計(jì)技術(shù)

強(qiáng)實(shí)時(shí)測(cè)控系統(tǒng)的軟件設(shè)計(jì)技術(shù)

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

結(jié)語
影響測(cè)控及仿真軟件實(shí)時(shí)性既有硬件的因素,也有軟件的因素,二者相互依存,相互制約。一個(gè)良好的軟件設(shè)計(jì)不僅可以提高硬件的性能,還可彌補(bǔ)其性能設(shè)計(jì)上的不足。軟件設(shè)計(jì)時(shí),要考慮其綜合因素,如A/D觸發(fā)方式、數(shù)據(jù)轉(zhuǎ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á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)過程自動(dòng)化、現(xiàn)場(chǎng)總線應(yīng)用等



關(guān)鍵詞: 測(cè)控系統(tǒng)

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉