技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國(guó)傳動(dòng)網(wǎng) > 技術(shù)頻道 > 技術(shù)百科 > 多線程火工品壓藥機(jī)控制程序設(shè)計(jì)初探

多線程火工品壓藥機(jī)控制程序設(shè)計(jì)初探

時(shí)間:2008-04-21 13:11:00來(lái)源:zhangting

導(dǎo)語(yǔ):?火工品在運(yùn)載火箭和導(dǎo)彈武器中的應(yīng)用極為廣泛。
引 言 在工業(yè)控制系統(tǒng)中使用的各種工控軟件往往要同時(shí)執(zhí)行多任務(wù),如數(shù)據(jù)采集、控制信息實(shí)時(shí)計(jì)算和輸出、現(xiàn)場(chǎng)各類數(shù)據(jù)和狀態(tài)的實(shí)時(shí)顯示、各種報(bào)表的實(shí)時(shí)顯示和打印、各種鍵盤命令的實(shí)時(shí)讀取和響應(yīng)以及數(shù)據(jù)通信等等。這些任務(wù)雖然在實(shí)時(shí)性上要求有些不同,但本質(zhì)上都是并行進(jìn)行的,因此要求開發(fā)的控制系統(tǒng)能實(shí)現(xiàn)實(shí)時(shí)多任務(wù)。 火工品在運(yùn)載火箭和導(dǎo)彈武器中的應(yīng)用極為廣泛,火工品壓藥機(jī)主要是用于火工品生產(chǎn)過(guò)程中壓藥工藝的專用自動(dòng)化壓藥設(shè)備,本文結(jié)合一種精密氣動(dòng)壓力機(jī)控制軟件的開發(fā),分析在工控軟件中如何利用Windows提供的多線程技術(shù)。 多線程概述 作為一個(gè)多線程的操作系統(tǒng),Windows實(shí)行的是搶先式多任務(wù)。在Windows環(huán)境中,每個(gè)正在運(yùn)行的程序都建立一個(gè)進(jìn)程,每個(gè)進(jìn)程至少由一個(gè)線程組成,每個(gè)進(jìn)程可以同時(shí)執(zhí)行多個(gè)線程。線程與進(jìn)程是兩個(gè)相關(guān)的概念,進(jìn)程是資源分配的單元,線程是系統(tǒng)調(diào)度的單元。在一個(gè)進(jìn)程中存在的多個(gè)線程間要進(jìn)行同步、通信,以實(shí)現(xiàn)復(fù)雜的邏輯功能,如共享內(nèi)存映射文件、訪問(wèn)共享數(shù)據(jù)以及使用同一消息隊(duì)列等。系統(tǒng)創(chuàng)建好進(jìn)程后,實(shí)際上就啟動(dòng)了主線程,主線程把程序的啟動(dòng)點(diǎn)提供給Windows系統(tǒng),而后按消息觸發(fā)隊(duì)列順序執(zhí)行。主線程與進(jìn)程同時(shí)存在,同時(shí)消失。在多線程執(zhí)行中系統(tǒng)會(huì)根據(jù)線程的優(yōu)先級(jí)和同步要求分配時(shí)間單元用于執(zhí)行多個(gè)線程,這樣實(shí)現(xiàn)了多任務(wù)分時(shí)占有CPU ,可在一個(gè)段時(shí)間內(nèi)并行完成多個(gè)任務(wù),達(dá)到實(shí)時(shí)性要求,大大提高了系統(tǒng)資源的利用率,有利于用戶按要求完成復(fù)雜的任務(wù)。系統(tǒng)的處理器調(diào)度算法基于以下兩點(diǎn):①基于線程優(yōu)先級(jí)的可搶占調(diào)度算法。②同優(yōu)先級(jí)線程采用按時(shí)間片輪轉(zhuǎn)的算法。CPU調(diào)度進(jìn)程方式如圖1示。 [align=center] 圖1 操作系統(tǒng)以輪轉(zhuǎn)方式安排每個(gè)線程的CPU方式[/align] 多線程操作 線程的啟動(dòng) 創(chuàng)建一個(gè)用戶界面線程,首先要從類CwinThread產(chǎn)生一個(gè)派生類,同時(shí)必須使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE來(lái)聲明和實(shí)現(xiàn)這個(gè)CwinThread派生類。 而后,根據(jù)需要重載該派生類的一些成員函數(shù)如ExitInstance()、InitInstance()、OnIdle()、PreTranslateMessage()等,最后啟動(dòng)該用戶界面線程,調(diào)用AfxBeginThread()函數(shù)的一個(gè)版本: CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); 其中第一個(gè)參數(shù)為指向定義的用戶界面線程類指針變量,第二個(gè)參數(shù)為線程的優(yōu)先級(jí),第三個(gè)參數(shù)為線程所對(duì)應(yīng)的堆棧大小,第四個(gè)參數(shù)為線程創(chuàng)建時(shí)的附加標(biāo)志,缺省為正常狀態(tài),如為CREATE_SUSPENDED則線程啟動(dòng)后為掛起狀態(tài)。 對(duì)于工作線程來(lái)說(shuō),啟動(dòng)一個(gè)線程,首先需要編寫一個(gè)希望與應(yīng)用程序的其余部分并行運(yùn)行的函數(shù)如exec(),接著定義一個(gè)指向CwinThread對(duì)象的指針變量*pThread,調(diào)用AfxBeginThread(exec,param,priority)函數(shù),返回值付給pThread變量的同時(shí)一并啟動(dòng)該線程來(lái)執(zhí)行上面的exec()函數(shù),其中exec是線程要運(yùn)行的函數(shù)的名字,也是上面所說(shuō)的控制函數(shù)的名字,param是準(zhǔn)備傳送給線程函數(shù)exec的任意32位值,priority則是定義該線程的優(yōu)先級(jí)別,它是預(yù)定義的常數(shù)。 線程的終止 終止線程有三種途徑,線程可以在自身內(nèi)部調(diào)用AfxEndThread()來(lái)終止自身的運(yùn)行;可以在線程的外部調(diào)用BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode )來(lái)強(qiáng)行終止一個(gè)線程的運(yùn)行,然后調(diào)用CloseHandle()函數(shù)釋放線程所占用的堆棧;第三種方法是改變?nèi)肿兞?,使線程的執(zhí)行函數(shù)返回,則該線程終止。 線程的同步 使用多線程開發(fā)用戶程序時(shí),經(jīng)常需要協(xié)調(diào)兩種或多種動(dòng)作,這種過(guò)程就稱作同步(Synchronization)。需要利用同步的原因是:(1)當(dāng)兩個(gè)或多個(gè)線程需要訪問(wèn)一個(gè)共享的資源,而此資源一次只能被一個(gè)線程所使用; (2)當(dāng)一個(gè)線程正在等候由另一個(gè)線程所引起的事件。 Win32操作系統(tǒng)提供了幾種同步對(duì)象允許線程來(lái)同步它們之間的行為。這些同步對(duì)象包括臨界區(qū)(criticalse ction)、互斥量(mutexe)、信號(hào)量(semaphore)和事件(event)等。 (1)臨界區(qū) 臨界區(qū)是一小段代碼,它要求在執(zhí)行以前取得對(duì)某些共享數(shù)據(jù)的獨(dú)占訪問(wèn)權(quán)。 (2)互斥量 互斥和臨界區(qū)非常相似,只不過(guò)它們可被用來(lái)同步多個(gè)進(jìn)程間的數(shù)據(jù)訪問(wèn)。 (3)信號(hào)量 信號(hào)量?jī)?nèi)核對(duì)象用于系統(tǒng)的資源計(jì)數(shù)。它們?yōu)榫€程提供了查詢可用資源數(shù)目的能力,對(duì)某個(gè)線程如果有一個(gè)或者多個(gè)資源可用,可用資源計(jì)數(shù)就減1。只有在資源計(jì)數(shù)加1之后,系統(tǒng)才會(huì)讓別的進(jìn)程訪問(wèn)此資源。 (4)事件 事件對(duì)象是同步對(duì)象的最基本形式,它與互斥量和信號(hào)量大不相同。互斥量和信號(hào)量通常用來(lái)控制對(duì)數(shù)據(jù)的訪問(wèn),但事件是用來(lái)發(fā)信號(hào)以表示某一操作己經(jīng)完成。 壓藥機(jī)控制系統(tǒng)多任務(wù)的實(shí)現(xiàn) 線程的分配 由于軟件的工作比較復(fù)雜,軟件設(shè)計(jì)時(shí)采用了4個(gè)線程完成。除了第一個(gè)主界面線程外還有執(zhí)行線程、顯示線程、A/D轉(zhuǎn)換監(jiān)視線程。 1.主線程的主要功能: (1)創(chuàng)建兩個(gè)定時(shí)器,一個(gè)為50ms Windows定時(shí)器,其功能是向顯示線程發(fā)送消息,驅(qū)動(dòng)顯示線程,另一個(gè)為20ms多媒體定時(shí)器,功能是向執(zhí)行線程發(fā)送消息,驅(qū)動(dòng)執(zhí)行線程。 (2)主線程產(chǎn)生一個(gè)用戶線程,用于監(jiān)視A/D轉(zhuǎn)換事件。 (3)接收用戶從鍵盤輸入的信息,執(zhí)行相應(yīng)過(guò)程。 主線程流程圖如圖2所示。 [align=center] 圖2 主線程流程圖[/align] 2.執(zhí)行線程負(fù)責(zé)執(zhí)行自動(dòng)壓藥,及停止自動(dòng)壓藥等功能,本程序的大部分工作由執(zhí)行線程完成。執(zhí)行線程流程圖如圖3所示。 [align=center] 圖3 執(zhí)行線程流程圖[/align] 3.參數(shù)實(shí)時(shí)顯示線程負(fù)責(zé)實(shí)時(shí)顯示壓力值、保壓時(shí)間以及錯(cuò)誤信息。 4. A/D轉(zhuǎn)換監(jiān)視線程用于監(jiān)視A/D轉(zhuǎn)換。 執(zhí)行線程的實(shí)現(xiàn) 如圖3所示,在本系統(tǒng)軟件中執(zhí)行線程完成系統(tǒng)的大部分工作,執(zhí)行線程函數(shù)的定義如下:   LRESUL   CJmqyView::OnTimerProc(WPARAM wParam, LPARAM lParam)  ?。?   if( !bfPCL812PG ) //數(shù)據(jù)采集卡不存在   return( 1 );   InputFromPCL812PG(); //數(shù)據(jù)采集卡PCL-812PG 輸入操作   if(inBit.start && !inBit0.start )//啟動(dòng)按鈕按下   OnStart();   else if( inBit.stop && !inBit0.stop ) //停止按鈕按下   OnStop();   execTask(); //執(zhí)行任務(wù)   OutputToPCL812PG(); //數(shù)據(jù)采集卡PCL-812PG 輸出操作  ?。? 某壓藥機(jī)控制系統(tǒng)有豐富的人機(jī)界面來(lái)接受用戶的鍵盤以及鼠標(biāo)操作,系統(tǒng)正是通過(guò)這些操作來(lái)完成整個(gè)控制系統(tǒng)的任務(wù)。當(dāng)控制系統(tǒng)啟動(dòng)時(shí),首先建立起主線程接受用戶的鍵盤、鼠標(biāo)操作,完成用戶的工藝參數(shù)的輸入,啟動(dòng)A/D轉(zhuǎn)化監(jiān)視線程,同時(shí)主線程也創(chuàng)建兩個(gè)定時(shí)器用以驅(qū)動(dòng)執(zhí)行線程、顯示線程。主線程相應(yīng)定時(shí)器發(fā)送的定時(shí)時(shí)間到達(dá)消息,并分別發(fā)送消息驅(qū)動(dòng)執(zhí)行線程或顯示線程。顯示線程將壓藥機(jī)的實(shí)時(shí)壓力、及保壓時(shí)間呈現(xiàn)在用戶界面上,方便用戶的下一步操作。 結(jié) 語(yǔ) 在傳統(tǒng)的DOS環(huán)境下開發(fā)的控制系統(tǒng)軟件為了實(shí)現(xiàn)并行多任務(wù),采用基于中斷的調(diào)度和循環(huán)輪流的方式,CPU的利用率較低,而在Windows環(huán)境下則可以利用Windows提供的多線程技術(shù),既可以方便的實(shí)現(xiàn)上述并行多任務(wù),又充分利用了CPU時(shí)間。實(shí)踐證明,采用多線程技術(shù)開發(fā)的某型壓藥機(jī)控制系統(tǒng)軟件,較好的保證了系統(tǒng)在多任務(wù)環(huán)境下的實(shí)時(shí)性和穩(wěn)定性。隨著工業(yè)控制系統(tǒng)的日益復(fù)雜,系統(tǒng)在同一時(shí)間所要執(zhí)行的任務(wù)不斷增加,多線程編程技術(shù)將會(huì)越來(lái)越明顯的體現(xiàn)出它的優(yōu)點(diǎn)。 參考文獻(xiàn): 1. 葛景國(guó),陳立功,倪純珍,焊縫偏差實(shí)時(shí)監(jiān)控軟件的開發(fā)[J],算機(jī)工程,2004(4) 2. 何其昌,Windows下工控軟件的研制[J].制造業(yè)自動(dòng)化,2002(24) 3. 鄭連清,劉榮,王玨,劉其坤,火工品壓藥工藝方法的改進(jìn)[J],火工品,1999(1) 4. 廖春蘭,基于多線程的實(shí)時(shí)測(cè)控系統(tǒng)研究[J].機(jī)電工程技術(shù),2006(35) 5. 邱仲潘,柯渝,謝燕華等,Visual C++6從入門到精通[M],電子工業(yè)出版社,2005

標(biāo)簽:

點(diǎn)贊

分享到:

上一篇:淺析YB47型硬盒包裝機(jī)商標(biāo)紙...

下一篇:微能WIN-V63矢量控制變頻器在...

中國(guó)傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來(lái)源:中國(guó)傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國(guó)傳動(dòng)網(wǎng)(m.u63ivq3.com)獨(dú)家所有。如需轉(zhuǎn)載請(qǐng)與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來(lái)源“中國(guó)傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明其他來(lái)源的稿件,均來(lái)自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請(qǐng)保留稿件來(lái)源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。

網(wǎng)站簡(jiǎn)介|會(huì)員服務(wù)|聯(lián)系方式|幫助信息|版權(quán)信息|網(wǎng)站地圖|友情鏈接|法律支持|意見反饋|sitemap

傳動(dòng)網(wǎng)-工業(yè)自動(dòng)化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務(wù)平臺(tái)

網(wǎng)站客服服務(wù)咨詢采購(gòu)咨詢媒體合作

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權(quán)所有
粵ICP備 14004826號(hào) | 營(yíng)業(yè)執(zhí)照證書 | 不良信息舉報(bào)中心 | 粵公網(wǎng)安備 44030402000946號(hào)