Windows環(huán)境下數(shù)控軟件實(shí)時(shí)控制的實(shí)現(xiàn)
點(diǎn)擊:1200
A+ A-
所屬頻道:新聞中心
引言
自1952 年第一臺數(shù)控機(jī)床誕生以來,數(shù)控系統(tǒng)已經(jīng)歷了兩個(gè)階段和六代的發(fā)展。進(jìn)入90 年代后,基于個(gè)人計(jì)算機(jī)(PC)的數(shù)控系統(tǒng)(簡稱PCNC)成為第六代數(shù)控系統(tǒng)的代表。作為CNC 發(fā)展的主要方向,PCNC 有成本低、開放性強(qiáng)、軟件開發(fā)環(huán)境完備、軟件資源豐富和良好的通訊功能等特點(diǎn)。從組成類型來看,目前“軟件NC”和“NC 嵌入PC”是PCNC的主流形式。所謂“軟件NC”,就是“CNC 的功能處理全產(chǎn)由PC 進(jìn)行,并通過裝在PC 擴(kuò)展插槽中的接口卡對伺服驅(qū)動(dòng)進(jìn)行控制。其優(yōu)點(diǎn)是編程處理相當(dāng)靈活,數(shù)控軟件的通用性強(qiáng)。缺點(diǎn)是實(shí)時(shí)處理比較困難,可靠性待進(jìn)一步研究。目前,實(shí)時(shí)處理能力是制約PCNC 展的重要因素。在PC 的操作系統(tǒng)中,MS - DOS 是一個(gè)非實(shí)時(shí)單任務(wù)內(nèi)核,Windows95 并不實(shí)時(shí)能系統(tǒng)的數(shù)控實(shí)時(shí)性能只能依賴系統(tǒng)設(shè)計(jì)和程序設(shè)計(jì)來保證。
1 數(shù)控軟件的實(shí)時(shí)性
PCNC 軟件系統(tǒng)一般都包括:讀取處理后的NC文件→譯碼→軌跡插補(bǔ)計(jì)算→伺服控制這樣一個(gè)基本的加工循環(huán),在未運(yùn)行完最后一條NC 語句前,該循環(huán)將一直進(jìn)行。顯然,丙次循環(huán)之間總存在一定的時(shí)間間隔,而時(shí)間間隔的長短需要根據(jù)實(shí)際加工對實(shí)時(shí)性的要求來確定。
對于控制精度要求不高的情況可以直接用Windows的計(jì)時(shí)器計(jì)時(shí),在達(dá)到設(shè)定的時(shí)間后,計(jì)時(shí)器發(fā)出WM-TIMER 消息到應(yīng)用程序的消息對列中,如果將上述循環(huán)程序放在WM-TIMER 消息的處理函數(shù)中,就可以方便地實(shí)現(xiàn)定時(shí)。但這種方法存在兩個(gè)問題:一是WM-TIMER 消息的優(yōu)先級比較低,只有當(dāng)系統(tǒng)處理完消息隊(duì)列中優(yōu)先級較高的消息后,才會處理WM-TIMER 消息;二是計(jì)時(shí)器是以PC 硬件的時(shí)間中斷次數(shù)來確定計(jì)時(shí)的長短,而時(shí)間中斷的周期是以系統(tǒng)電子釧的時(shí)間為基準(zhǔn),固定54.95ms。由此可見,計(jì)時(shí)器的實(shí)際地精度大于55ms,只能用于實(shí)時(shí)性求不高的場合。
大多數(shù)情況下,計(jì)時(shí)器都不能滿足要求。為了增強(qiáng)控制程序的實(shí)時(shí)性,可以采用軟件延時(shí)的方法,即在上述循環(huán)中放一段延時(shí)語句。對于毫秒級的延時(shí)精度,可通過調(diào)用Windows 的API 函數(shù)timeGetTime來實(shí)現(xiàn),該函數(shù)采用了基于BIOS 的時(shí)間基準(zhǔn)。以下是VC + + 中實(shí)現(xiàn)毫秒級延時(shí)的例子。
void deIaytime(int timdeIay) {DWORD m-timerI; m-timerI = timeGetTime() whiIe((timeGetTime() - m-timerI) < timdeIay ?。?/span>
timeGetTime 函數(shù)能實(shí)現(xiàn)毫秒級的延時(shí),與計(jì)時(shí)器相比,時(shí)間精度得到了一定的提高。但毫秒級的時(shí)間精度并不能完全滿足數(shù)控加工的要求。為了進(jìn)一步提高時(shí)間精度,可以通過執(zhí)行循環(huán)程序來實(shí)現(xiàn)(如用for 語句)。但這種情況下,循環(huán)次數(shù)不僅與延時(shí)的時(shí)間長短有關(guān),還與計(jì)算機(jī)的硬件配置(如主頻等)有直接聯(lián)系。所以這種方法的最大弊端就是程序的移植性很差。
如前所述,從時(shí)間精度的角度來看,計(jì)時(shí)器只能用于控制精度不高的場合,多數(shù)情況下需要用timeGetTime 函數(shù)或執(zhí)行循環(huán)程序的方法。從獲得精確時(shí)間的方式來看,計(jì)時(shí)器以硬件中斷為基礎(chǔ),不“獨(dú)占CPU”,而timeGetTime 函數(shù)和執(zhí)行循環(huán)程序采用了延時(shí)的方法,程序在執(zhí)行的過程中將“獨(dú)占CPU”。如果應(yīng)用程序僅有一個(gè)線程,即用戶界面線程,一旦CPU 被“獨(dú)占”,程序?qū)o法接收、處理用戶輸入的消息和事件,這顯然不能滿足設(shè)計(jì)要求,所以必須考慮引入多線程。(注:由于Windows 是基于消息的多任務(wù)操作系統(tǒng),這里的“獨(dú)占CPU”并不表示一直完全占有CPU,而是表示在執(zhí)行該線程的時(shí)間片內(nèi)獨(dú)占CPU,而其它時(shí)間片CPU 并非由該線程占有。)
2 多線程
VisuaiC + + 中的線程分為用戶界面線程(UserImterface Thread)和工作者線程Worker Thread)。用戶界面線程的特點(diǎn)是擁有單獨(dú)的消息隊(duì)列,具有自已的窗口界面,能夠?qū)τ脩糨斎氲氖录拖⒆龀鲰憫?yīng)。工作者線程一般用于處理后臺任務(wù),僅由一個(gè)函數(shù)體實(shí)現(xiàn),不處理窗口。
在擁有多個(gè)線程的應(yīng)用程序中,當(dāng)兩個(gè)或更我的線程同時(shí)訪問同一數(shù)據(jù)時(shí),就會導(dǎo)致不可預(yù)知的結(jié)果,因此必須保持線程間的同點(diǎn)。Visuaic + + 中有四種同步方法:臨界段、信號燈、互斥量和事件。事件同步是通過將事件本身設(shè)置為有信號或無信號來通知其他線程某一操作已完成或尚未完成。下面以實(shí)現(xiàn)M01功能為例,介紹在數(shù)控軟件中使用多線程和事件同步的方法。
3 實(shí)現(xiàn)M01功能
M01—計(jì)劃程序停止。該指令的作用是:在操作面板上預(yù)先按下“任選停止”按鈕,當(dāng)執(zhí)行完M01指令之后,程序停止,主軸停轉(zhuǎn),進(jìn)給停止,冷卻工作者線程流程圖液關(guān)閉,加工停止。
如果不按“任選停止“按鈕,則M01指令無效。在加工停止后,如果重新按下“循環(huán)啟動(dòng)”按鈕,則繼續(xù)加工。如果僅用用戶界面線程,當(dāng)控制精度很高,采用了延時(shí)程序時(shí), 循環(huán)指令將會“獨(dú)占CPU”,從而導(dǎo)致用戶界面線程不能處理用戶輸入的事件和消息,無法實(shí)現(xiàn)人機(jī)交互。解決的方法是將含有軌跡插補(bǔ)的循環(huán)指令放入一個(gè)工作者線程中,將各種實(shí)現(xiàn)人機(jī)交互的按鈕(如“任選停止”按鈕)放在用戶界面線程中。這樣,盡管工作者線程一直“忙” 個(gè)不停,但用戶界面線程卻“閑”著,能夠及時(shí)響應(yīng)用戶輸入的事件和消息。當(dāng)用戶界面線程接收到用戶輸入的事件和消息后,通過線程同步,就能使工作者線程實(shí)現(xiàn)預(yù)定的操作實(shí)現(xiàn)M01功能的具體方法如下:
首先在“任選停止”按鈕和“循環(huán)啟動(dòng)”按鈕的ciick(單擊)事件的響應(yīng)函數(shù)中分別設(shè)置某一事件有信號,然后在工作者線程的扦環(huán)體內(nèi)檢測相應(yīng)事件是否有信號,并根據(jù)檢測的結(jié)果做出相應(yīng)的處理。需要做的工作是:定義兩個(gè)事件,創(chuàng)建一個(gè)工作者線程,并建立工作者線程的控制函數(shù)體。程序流程如圖所示,主要代碼如下:
其中,AfxBeginThread 為啟動(dòng)工作者線程的全局函數(shù),該函數(shù)創(chuàng)建并初始化CwindThread 對象、啟動(dòng)并返回線程的地址。
控制函數(shù)用于定義線程。進(jìn)入控制函數(shù)時(shí),線程啟動(dòng);退出時(shí),線程終止。以上控制函數(shù)中Deaiedatathread為控制函數(shù)名,參數(shù)param 是一個(gè)32 位值。該參數(shù)在創(chuàng)建線程對象時(shí)傳遞過來。工作者線程的控制函數(shù)體如下:
最后在“任選停止”按鈕和“循環(huán)啟動(dòng)”按鈕的click(單擊) 事件的響應(yīng)函數(shù)中分別設(shè)置gpauseevent 和g starteevent 有信號即可,可通過以下兩條語句實(shí)現(xiàn)。
g pauseevent. SetEvent(); / / 設(shè)置停止事件為有信號 g pauseevent. SetEvent(); / / 設(shè)置啟動(dòng)事件為有信號
4 結(jié)束語
多線程和事件同步能有效地解決數(shù)控軟件實(shí)時(shí)控制中存在的“獨(dú)占CPU”的問題,實(shí)現(xiàn)人機(jī)交互。本文介紹了一種易于實(shí)現(xiàn)的簡便方法。
(審核編輯: 智匯胡妮)
分享