<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
關(guān) 閉

新聞中心

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

強實(shí)時(shí)測控系統的軟件設計技術(shù)

作者:華中理工大學(xué)水電與數字化工程學(xué)院 吳道虎 中國船舶重工集團公司第710研究所 李玉華 王緒軍 時(shí)間:2002-12-05 來(lái)源:電子設計應用 收藏
設計需求
工業(yè)控制和SCADA的發(fā)展對測控及仿真軟件的實(shí)時(shí)性提出了更高的要求,軟件的實(shí)時(shí)性已作為評估測控、仿真系統性能優(yōu)劣的一項重要考核指標。實(shí)現軟件的實(shí)時(shí)性當然離不開(kāi)高速I(mǎi)/O傳輸及高速數據采集的支持,許多公司現已成功研制出具有高可靠性和穩定性的高速數據采集板卡,板卡的研制僅僅為高速數據采集提供了很好的硬件平臺,還需要應用微機接口技術(shù)、軟件工程技術(shù)、總線(xiàn)技術(shù)使其發(fā)揮應有的作用。本文主要從A/D觸發(fā)時(shí)鐘和觸發(fā)模式等硬件配置的軟件設置方法,數據傳輸方式和端口I/O操作方法的選擇,以及多線(xiàn)程應用技術(shù)等方面,探討有關(guān)如何進(jìn)行程序設計來(lái)提高軟件實(shí)時(shí)性的技巧及關(guān)鍵技術(shù)。

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

結語(yǔ)
影響測控及仿真軟件實(shí)時(shí)性既有硬件的因素,也有軟件的因素,二者相互依存,相互制約。一個(gè)良好的軟件設計不僅可以提高硬件的性能,還可彌補其性能設計上的不足。軟件設計時(shí),要考慮其綜合因素,如A/D觸發(fā)方式、數據轉換方式的選擇、多線(xiàn)程的應用及其相互間的協(xié)同工作關(guān)系,大容量數據存儲與高速數據存取間矛盾、高速數據采集與高速數據存取間的矛盾等等?!?/P>

參考文獻:
1. 吳重光等,系統仿真導論,科學(xué)出版社,2001
2. 施陽(yáng)、嚴衛生等,MATLAB及動(dòng)態(tài)仿真工具SIMULINK,清華大學(xué)出版社 2001.6
3. 于海生:計算機控制技術(shù),清華大學(xué)出版社.北京,1999.7
4. 吳小博等;Visual C++編程技巧,清華大學(xué)出版社.北京,2000.7

作者簡(jiǎn)介:
吳道虎,博士,主要研究生產(chǎn)過(guò)程自動(dòng)化、現場(chǎng)總線(xiàn)應用等



關(guān)鍵詞: 測控系統

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>