多線(xiàn)程技術(shù)解決開(kāi)放式數控系統實(shí)時(shí)性能的應用設計
1 引言
本文引用地址:http://dyxdggzs.com/article/81140.htm實(shí)時(shí)性是數控系統一項重要的性能指標[1]。
在IPC(Industrial Personal Computer )+運動(dòng)控制器構成的開(kāi)放式數控系統開(kāi)發(fā)平臺上,雖然這種主從式結構,確保了運動(dòng)控制指令在運動(dòng)控制器內高速、實(shí)時(shí)的被執行,但在PC機上,仍需要完成諸如實(shí)時(shí)顯示、預處理計算、系統狀態(tài)監控等許多任務(wù)。為了保證系統的實(shí)時(shí)性能,擬采用多線(xiàn)程技術(shù),通過(guò)多任務(wù)并行處理的方式,提高系統實(shí)時(shí)性。
本開(kāi)發(fā)平臺采用IPC+運動(dòng)控制器模式的開(kāi)放式數控系統,主要的運動(dòng)控制由固高公司的GT400-SV通用運動(dòng)控制器完成。它提供C語(yǔ)言函數庫GT400sv.lib和Windows動(dòng)態(tài)連接庫GT400.dll,能夠實(shí)現復雜的控制功能[2]。數控系統的開(kāi)發(fā)是將這些控制函數與自己控制系統所需的數據處理、界面顯示、用戶(hù)接口等應用程序模塊集成在一起,建造符合特定應用要求的控制系統。
2 進(jìn)程與線(xiàn)程以及多線(xiàn)程技術(shù)
Windows操作系統既支持多進(jìn)程,又支持多線(xiàn)程。一個(gè)進(jìn)程就是應用程序的一個(gè)實(shí)例,一次執行過(guò)程也就是調入內存準備執行的程序,包括當前執行的應用程序的執行代碼和程序執行相關(guān)的一些環(huán)境信息。每個(gè)進(jìn)程擁有整臺計算機的資源,無(wú)須知道其他進(jìn)程在計算機中的信息。通常每個(gè)進(jìn)程至少有一個(gè)線(xiàn)程在執行所屬地址空間中的代碼,該線(xiàn)程稱(chēng)為主線(xiàn)程。如果該主線(xiàn)程運行結束,系統將自動(dòng)清除進(jìn)程及其他地址空間。
線(xiàn)程是進(jìn)程內部執行的路徑,是操作系統分配CPU時(shí)間的基本實(shí)體,是程序運行的最小單位。每個(gè)進(jìn)程都由主線(xiàn)程開(kāi)始進(jìn)行應用程序的執行。線(xiàn)程由一個(gè)堆棧、CPU寄存器的狀態(tài)和系統調用列表中的一個(gè)入口組成。每個(gè)進(jìn)程可以包含一個(gè)以上的線(xiàn)程,這些線(xiàn)程可以同時(shí)獨立地執行進(jìn)程地址空間中的代碼,共享進(jìn)程中的所有資源。
Windows系統分配處理器時(shí)間的最小單位是線(xiàn)程,系統不停地在各個(gè)線(xiàn)程之間切換。在PC機中,同一時(shí)間只有一個(gè)線(xiàn)程在運行。通常系統為每個(gè)線(xiàn)程劃分的時(shí)間片很小(ms級別),這樣快速系統的實(shí)時(shí)性就有了保障[3]。
要實(shí)現多線(xiàn)程編程,可建立輔助線(xiàn)程(worker Thread)和用戶(hù)界面線(xiàn)程(User Interface Thread)。輔助線(xiàn)程主要用來(lái)執行數控程序、坐標顯示、動(dòng)態(tài)仿真和數據預處理;用戶(hù)界面線(xiàn)程用來(lái)處理用戶(hù)的輸入,響應用戶(hù)產(chǎn)生的事件和消息。
3 數控系統實(shí)時(shí)性分析
3.1 線(xiàn)程的實(shí)時(shí)性
數控系統需要完成的任務(wù)有很多,這些任務(wù)中,優(yōu)先級的要求級別不一樣。據此,可以利用Windows系統的多任務(wù)、搶占式的特點(diǎn)和多線(xiàn)程技術(shù)將各個(gè)任務(wù)分給不同的線(xiàn)程,并賦予各個(gè)線(xiàn)程不同的優(yōu)先級,當高優(yōu)先級的線(xiàn)程執行時(shí),即實(shí)時(shí)性要求高的任務(wù)需要執行時(shí),可以自動(dòng)地終止其他線(xiàn)程的工作轉而執行這一線(xiàn)程[4]。通過(guò)這一方法,可以實(shí)現數控系統所要求的實(shí)時(shí)性。
3.2 輔助線(xiàn)程創(chuàng )建
本開(kāi)發(fā)系統中所創(chuàng )建的輔助線(xiàn)程可大致劃分如下:
(1)坐標顯示線(xiàn)程
在手動(dòng)脈沖面板、電動(dòng)控制面板和增量控制面板中,可實(shí)時(shí)顯示X、Y、Z三個(gè)運動(dòng)軸的坐標。這樣可使操作人員直觀(guān)看到三軸的實(shí)際坐標。實(shí)時(shí)性要求較低,所以使用最低優(yōu)先級:Lowest Normal。
(2)圖形顯示線(xiàn)程
圖像顯示線(xiàn)程用于在動(dòng)態(tài)仿真面板中執行圖形繪制的指令。通過(guò)圖形顯示,操作者可以在動(dòng)態(tài)仿真的同時(shí),對人機界面進(jìn)行操作。這一線(xiàn)程實(shí)時(shí)性要求較低,等級為:Blow Normal。
(3)IO狀態(tài)控制線(xiàn)程
此線(xiàn)程用于檢測由系統輸入的各個(gè)離散量,以及從數控程序得到的指令來(lái)輸出機床各離散量的狀態(tài)。此線(xiàn)程優(yōu)先級比前兩線(xiàn)程高,等級為:Normal。
(4)數據預處理線(xiàn)程
數據預處理線(xiàn)程主要負責完成編碼形式轉換、刀具長(cháng)度補償、刀具半徑補償和公英制轉換等運動(dòng)控制數據預處理函數的執行。等級為:Normal。
(5)運動(dòng)控制線(xiàn)程
此線(xiàn)程主要用于運動(dòng)控制器執行數控代碼函數的運行。負責向緩沖器輸入運動(dòng)控制命令,清空緩沖器和打開(kāi)關(guān)閉緩沖器等操作。等級稍高:Above Normal。
(6)緊急控制線(xiàn)程
此線(xiàn)程處理一些需要機床立即做出反應的時(shí)間,如機床的急停等。優(yōu)先級最高,等級為:Highest。
本系統中所創(chuàng )建的輔助線(xiàn)程可大致劃分如下表1所示。
表1 線(xiàn)程的創(chuàng )建及優(yōu)先級設置

4 多線(xiàn)程的實(shí)現
在Windows操作系統中,多線(xiàn)程的實(shí)現需要調用一系列的API函數,如CreateThread、ResumeThread等,比較麻煩且容易出錯。使用新一代RAD開(kāi)發(fā)工具C++ Builder中的TThread類(lèi),可以方便地實(shí)現多線(xiàn)程的編程,特別是對于系統開(kāi)發(fā)語(yǔ)言是C的Windows系列操作系統,它具有其它編程語(yǔ)言無(wú)可比擬的優(yōu)勢。
4.1 線(xiàn)程的創(chuàng )建
在C++ Builder中雖然用TThread對象說(shuō)明了線(xiàn)程的概念,但是TThread對象本身并不完整,需要在TThread下新建其子類(lèi),并重載Execute來(lái)使用線(xiàn)程對象。
在C++ Builder IDE環(huán)境下選擇菜單File|New,在New欄中選中Thread Object,按OK,在彈出的對話(huà)框中輸入TThread對象子類(lèi)的名字CoordinateDisplyThread,自動(dòng)創(chuàng )建了一個(gè)CoordinateDisply的TThread子類(lèi)。同時(shí)在編輯器中創(chuàng )建了一個(gè)名為CoordinateDisplyThread單元。
4.2 線(xiàn)程的實(shí)現
在創(chuàng )建的代碼中Execute()函數就是要在線(xiàn)程中實(shí)現的任務(wù)的代碼所在處。在原Unit1.cpp代碼中包含了CoordinateDisplayThread.h文件。使用時(shí),動(dòng)態(tài)創(chuàng )建一個(gè)TCoordinateDisplay對象,具體執行的代碼就是Execute()方法重載的代碼。
由于Execute()中添加的線(xiàn)程運行時(shí)所需要執行的函數調用了VCL組件,而VCL對象不具有線(xiàn)程安全性,它們的特性和方法只能在主線(xiàn)程中訪(fǎng)問(wèn),所以用Synchronize()函數將坐標顯示函數進(jìn)行包裝。而坐標顯示函數需如下聲明:
void_fastcall Function().
下面以坐標顯示線(xiàn)程即CoordinateDisplayThread的實(shí)現步驟為例,說(shuō)明線(xiàn)程實(shí)現的具體方法。其他線(xiàn)程的實(shí)現需根據具體情況,進(jìn)行修正。
在CoordinateDisplayThread.cpp文件中的CoordinateDisplayThread::Execute()函數里添加如下語(yǔ)句,實(shí)現X、Y、Z坐標顯示函數調用的一致性。
首先用switch語(yǔ)句判斷單軸運動(dòng)中的哪一軸的坐標位置發(fā)生改變:

做好上述準備工作之后,需要在主單元中的適當的位置添加開(kāi)始線(xiàn)程和掛起線(xiàn)程的命令。代碼如下所示:

4.3 關(guān)于線(xiàn)程同步
線(xiàn)程同步在編程技術(shù)中非常重要,當一個(gè)線(xiàn)程在訪(fǎng)問(wèn)一個(gè)進(jìn)程對象時(shí),如果另一個(gè)線(xiàn)程要改變該對象,可能產(chǎn)生錯誤的結果。在本例開(kāi)發(fā)應用中,利用API函數,可以直接使用臨界或互斥來(lái)達到同步的目的。為了提高同步的可靠性和靈活性,同時(shí)用到了標志變量和臨界機制。只需在程序中聲明一個(gè)TRTLCriticalSection類(lèi)型的變量Sect1,并在主線(xiàn)程的構造函數中進(jìn)行初始化。之后在某個(gè)線(xiàn)程中,可以把相應的代碼標記為臨界部分,當在一個(gè)線(xiàn)程中調用EnterCriticalSection()并傳遞Sect1時(shí),就設置多個(gè)數據成員,以表明臨界部分進(jìn)入活動(dòng)狀態(tài)。如果另一個(gè)線(xiàn)程要調用它自己的臨界部分時(shí),函數EnterCriticalSection()將發(fā)現有一個(gè)臨界部分正在使用,就讓第二個(gè)線(xiàn)程處于休眠狀態(tài),直到第一個(gè)線(xiàn)程退出臨界部分為止。
5 結束語(yǔ)
本文將C++ builder多線(xiàn)程技術(shù)應用于開(kāi)放式數控系統的軟件設計中,有效的解決了線(xiàn)程同步問(wèn)題,保證了數控軟件系統的實(shí)時(shí)性要求,取得了較好的運用效果。
評論