在設計火焰切割機數控系統的過程中,我們采用微機與ADT-853運動控制卡的結構。微機作為上位機,負責系統的管理功能,如數控加工文件管理,數控代碼譯碼,與下位機通信,顯示加工過程中的信息,接受用戶輸入的信息等任務。運動控制卡作為下位機則負責驅動電動機,開關量的控制,以及插補運算等實時性較強的任務。在加工過程中,計算機主要執行加工過程控制任務,即調用動態鏈接庫函數控制機床運動。同時在屏幕上動態地顯示當前刀具軌跡和加工程序段,及時地響應暫停、急停等用戶信息。
作為上位機的微機需要同時執行控制及顯示等任務,如采用單線程會造成軟件無法及時響應。為此我們采用多線程技術,把各個任務放在不同的線程中執行,使數控系統軟件能較好地執行各種不同的任務,互不干擾。
1 數控系統軟件結構
本系統使用目前流行的WINDOWS操作系統,采用VC++6.0編譯器開發。系統要實現的主要功能有:數控代碼譯碼,刀具半徑補償,離線仿真,加工過程控制,加工軌跡動態顯示,機床故障及狀態檢查等。
雖然WINDOWS操作系統是一個多任務的操作系統,能夠同時處理多個任務,但如果某一個任務執行的時間很長,就會造成其它的任務得不到及時響應。例如,在開始設計時,我們把加工過程控制和加工軌跡顯示功能都放在主線程中實現,結果,由于加工過程控制任務需要不斷查詢控制卡的狀態,占用了大部分的CPU資源,使得加工軌跡顯示任務得不到及時響應,軌跡顯示嚴重滯后,甚至嚴重偏離實際的加工位置,并且不能及時響應用戶的輸入,如暫停停止等操作。由此可見,由于數控系統軟件的多任務同時并發執行,數控系統軟件中各個任務爭奪CPU資源,導致某些任務不能及時執行,影響了數控系統性能。為了解決這個問題,我們把多線程技術引入到軟件設計中。
2 多線程技術
每一個應用程序的執行實例稱為進程,每個進程至少有一個線程,稱為主線程。線程是進程內部可獨立執行的一個單元,系統分配給每個線程一定的執行時間。由于每個線程的執行時間片只有20μs,可以認為它們幾乎是同時執行的。Windows操作系統的多線程機制,為我們解決數控系統的多任務同時執行問題提供了方案。
數控軟件運行時,產生了數控軟件的一個實例,即進程。同時開始執行該進程的主線程。此線程終止時,進程也終止。除主線程外,windows操作系統允許用戶根據需要在應用程序中創建其他線程,使您可以同時運行多個并行執行的線程。我們可以創建其他線程執行加工過程控制任務、顯示運動軌跡等。因此,多線程技術可以滿足數控系統多任務并行執行的要求。
Windows提供了兩種線程類型:用戶界面線程(user—interface thread)和輔助線程(worker thread),它們都是從CWinThread類派生出來的。用戶界面線程通常有窗口,有自己的消息循環。一般用于處理用戶的輸入和對用戶生成的事件及消息的響應。輔助線程沒有窗口,不需要處理消息。一般用于完成不需要用戶輸入的后臺任務。如計算、調度等工作。2 J。
3 線程在數控軟件中的應用
在本系統中由主線程負責維護人機界面,數控代碼譯碼,刀具半徑補償,離線仿真等功能。這些功能的實時性要求不強,可以在非加工過程中完成。加工過程中,主線程創建加工過程控制子線程、加工軌跡顯示子線程。下面以加工過程控制為例,介紹如何使用多線程。
加工過程控制子線程負責控制運動控制卡。在自動加工過程中它先讀取一行刀位文件數據,判斷是執行什么樣的動作,然后調用相應的動態鏈接庫函數。讀下一行數據并執行相應的函數之前,ADT一853運動控制卡要求查詢上一次的函數執行過程是否有錯誤發生,當進行連續插補運算時還要查詢是否可以發送下一個數據。當用戶發現加工過程有錯誤,按下“暫停”、“停止”等按鈕時,主線程通知加工過程控制線程,子線程執行相應的函數實現暫停或停止功能。
3.1 線程的創建
由于加工過程控制線程不需要窗口,可以使用輔助線程作為加工過程控制線程。輔助線程的創建非常簡單,不需要顯式的從CWinThread類派生一個輔助線程類。直接在主線程的自動加工消息響應函數中創建運動過程控制線程。它的創建函數的用法如下。
參數pfnThreadProc是指向線程的控制函數的指針,這個控制函數必須按下面的形式申明。
pParam是傳遞給線程控制函數的參數。nPfiofity是線程的優先級。操作系統根據線程的優先級決定它們的執行時間。由于加工過程控制需要較高的實時性,所以它的優先級要比主線程的優先級(THREAD—PRIORITY—NORMAL)高。設輔助線程的優先級比主線程的優先級高一級,為THREAD—PRIORITY—A.BOVE—NORMAL。
3.2 線程的通信
由于;暫停停止等消息是由主線程響應的,所以子線程要響應這些消息必須和主線程通信,由主線程通知子線程。由于采用的是輔助線程,因此不能使用windows消息通信。為此,我們可以使用全局變量,讓主線程通知輔助線程。
為響應暫停停止消息,分別申明一個布爾類型的全局變量:
BOOL g_zanting,g_tingzhi;
初始化時將全局變量賦值為假。在主線程的暫停”和“停止”等消息響應函數中給全局變量賦值為真。加工過程控制線程調用動態鏈接庫函數之前,需要循環查詢是否可以發送下一個數據,同時可以在這個循環中查詢哪個全局變量為真,執行相應的函數,從而實現主線程和輔助線程的通信。
3.3 線程的阻塞
當按下“暫停”按鈕時,主線程的暫停”消息響應函數將全局變量zanting賦值為真。加工過程控制線程查詢到zanting為真,阻塞線程,并向運動控制卡發出停止命令,記錄當前的運動狀態。當用戶按下繼續加工按鈕時,線程從當前狀態下繼續執行。為了實現線程的阻塞,需要調用WaitForSingleObject函數,它的用法如下。
參數hHandle是指向一個事件對象的句柄。事件是Windows的一種內核對象,在進程內部。事件是用唯一的32位句柄來標識的。它的句柄可以進行復制,以便在進程之間進行共享。事件可以為有信號(或真)狀態或無信號(或假)狀態。事件有兩種類型:手工復位和自動復位事件。這里使用了自動復位事件。MFC為事件對象提供了一個方便的CEvent類,它是從CSyncObject類中派生的。在默認狀態下,構造函數在無信號狀態生成自動重置事件對象。
要實現暫停后繼續加工功能,需要申明一個全局的事件對象CEvent g_evenOixu。當按鈕按下時,在主線程的消息響應函數中調用CEvent::SetEvent設定事件為有信號狀態。在加工過程控制線程中調用Wait—ForSingleObject(g-evenOixu,INFINITE)函數,當事件為有信號狀態,此函數返回值為WAIT_OBJECT_0。
3.4 線程的終止
為了實現線程正常情況下,一次加工過程執行完成后,加工過程控制線程返回,線程正常終止。如果加工過程出現錯誤,或是用戶停止加工,加工過程控制線程需要提前終止。提前終止線程需要從線程內調用AfxEndThread函數,將所需的退出代碼作為唯一參數傳遞。這將停止執行線程,解除對線程堆棧的分配,分離附加到線程的所有DLL并從內存中刪除線程對象。
4 結語
本系統在開發過程中將多線程技術應用在數控系統軟件的開發中,把各個任務放在不同的線程中執行,解決了數控系統中多任務并發執行時產生的系統響應滯后的問題。通過改進,數控系統軟件能較好地執行各種不同的任務,及時響應用戶操作。
(審核編輯: 智匯胡妮)
分享