計(jì)算機(jī)應(yīng)用基于Windows多線程開放數(shù)控主控系統(tǒng)的實(shí)現(xiàn)張政,馬書根,曹秉剛(西安交通大學(xué)機(jī)戒工程學(xué)院機(jī)電系,陜西西安710049)如何用多線程機(jī)制實(shí)現(xiàn)數(shù)控系統(tǒng)的多任務(wù),以及多任務(wù)之間的協(xié)調(diào)和同步問(wèn)題。同時(shí),還討論了實(shí)現(xiàn)數(shù)控機(jī)床上位機(jī)(Windows)和下位機(jī)(DOS)之間的串口通信問(wèn)題。該主控系統(tǒng)已經(jīng)用于一臺(tái)數(shù)控機(jī)床的改造實(shí)驗(yàn),并且取得了良好的效果。
1引百在現(xiàn)有數(shù)控系統(tǒng)中,大多數(shù)系統(tǒng)是基于DOS環(huán)境的,其綜合性能相對(duì)于Windows環(huán)境就弱一些,尤其是界面、人機(jī)交互能力、多任務(wù)以及開放性方面比較差。因此說(shuō),開發(fā)基于本文的主控系統(tǒng)是基于一種開放式數(shù)控機(jī)床體系結(jié)構(gòu)數(shù)控軟件化體系結(jié)構(gòu)進(jìn)行研究的。該體系結(jié)構(gòu)(所示)就是為了解決封閉系統(tǒng)的不足而提出來(lái)的。在這一結(jié)構(gòu)下,工藝軟件在一臺(tái)Host―PC上運(yùn)行,所生成的設(shè)備動(dòng)作信息由串行口傳送給完備數(shù)字機(jī)床。
用VC++編制了主控系統(tǒng)的控制軟件,并且通過(guò)實(shí)驗(yàn)驗(yàn)證,取得了滿意的效果。該主控系統(tǒng)可以支持齒輪加工和復(fù)雜曲面的加工,大大簡(jiǎn)化了工藝軟件的編制。
0、張政(972-)男,陜西三原人,博士研究生,主要研究方向數(shù)控技術(shù)、機(jī)器人遠(yuǎn)程控制?!筁.件的測(cè)量數(shù)據(jù)進(jìn)行比較,現(xiàn)加工過(guò)程中中的系統(tǒng)誤cMliShM記記錄線程就被喚el對(duì)ei新數(shù)tf進(jìn)行處理把*新數(shù)bookmark4利用VC++開發(fā)的基于Windows的開放數(shù)控主控系統(tǒng)界面如該系統(tǒng)的主要功能:裝配自動(dòng)加工文件;手工編輯自動(dòng)加工文件;機(jī)床位置調(diào)整;機(jī)床坐標(biāo)原點(diǎn)設(shè)定;離線仿真走刀軌跡;在線實(shí)時(shí)仿真走刀軌跡;數(shù)字機(jī)床狀態(tài)顯示。
2多線程技術(shù)在主控系統(tǒng)中的應(yīng)用每一個(gè)Windows應(yīng)用程序都是一個(gè)進(jìn)程,并由線程來(lái)負(fù)責(zé)執(zhí)行包含在進(jìn)程地址空間中的代碼。實(shí)際上,單個(gè)進(jìn)程可以擁有多個(gè)線程,它們?cè)谶M(jìn)程的地址空間中“同時(shí)地”執(zhí)行代碼。操作系統(tǒng)以一種輪轉(zhuǎn)的方式為每個(gè)獨(dú)立的線程分配CPU時(shí)間片,客觀上使所有的線程近乎同時(shí)進(jìn)行。
系統(tǒng)同時(shí)又是根據(jù)所有活動(dòng)線程的優(yōu)先級(jí)來(lái)決定何時(shí)調(diào)用哪個(gè)線程以及調(diào)度多長(zhǎng)時(shí)間。系統(tǒng)為每一個(gè)線程分配了優(yōu)先級(jí),從*低的0到*高的31.不管低級(jí)別的線程正在干什么,高級(jí)別的線程總會(huì)搶先低級(jí)別的線程。
2.1線程優(yōu)先級(jí)的設(shè)定在Windows中一個(gè)線程的優(yōu)先級(jí)是由它所在的進(jìn)程和它相對(duì)于該進(jìn)程的優(yōu)先級(jí)確定的。當(dāng)線程被創(chuàng)建時(shí),它的優(yōu)先級(jí)是所在進(jìn)程的優(yōu)先級(jí)類。例如,一個(gè)REALTIME-PRIORITY-CIASS的進(jìn)程主線程的初始優(yōu)先級(jí)為24.不過(guò),可以通過(guò)設(shè)定線程相對(duì)于進(jìn)程的優(yōu)先級(jí),來(lái)改變線程優(yōu)先級(jí)。
這樣,在一個(gè)應(yīng)用程序中的幾個(gè)線程就可以被設(shè)定為不同的優(yōu)先級(jí)。例如:在上下位機(jī)通信線程中使用:在時(shí)間顯示線程中,使用);/可以把該線程的優(yōu)先級(jí)設(shè)定為16表1給出了系統(tǒng)如何根據(jù)進(jìn)程的優(yōu)先級(jí)類和線程的相對(duì)優(yōu)先級(jí)相結(jié)合,決定線程的基本優(yōu)先級(jí)。
表1系統(tǒng)如何確定線程的基本優(yōu)先級(jí)線程相對(duì)優(yōu)先級(jí)進(jìn)程優(yōu)先級(jí)類空閑普通高實(shí)時(shí)2.2主控系統(tǒng)中的線程主控系統(tǒng)中的線程主要有:顯示年月日和北京時(shí)間。如:002年1月21日星期一北京自動(dòng)記錄線程。在自動(dòng)加工時(shí),把從下位機(jī)接收到的數(shù)據(jù)存儲(chǔ)到文本文件。這樣就可以保存完整的加工數(shù)據(jù),把加工過(guò)程記錄下來(lái)。加工完成后,可以根據(jù)該文件和實(shí)際零而米取措施進(jìn)一步提高加工精度。
跡按照三視圖繪制在界面上,有利于操作者掌握加工進(jìn)度和實(shí)際的加工情況。
*后驗(yàn)證自動(dòng)加工程序的正確性。從而可以發(fā)現(xiàn)錯(cuò)誤,避免造成損失。
串口通信線程。該線程負(fù)責(zé)把自動(dòng)加工數(shù)據(jù)或者機(jī)床調(diào)整數(shù)據(jù)通過(guò)串口發(fā)送給下位機(jī),同時(shí)還要從串口讀取下位機(jī)傳來(lái)的機(jī)床狀態(tài)數(shù)據(jù),顯示于界面上。
以上介紹的各個(gè)線程的優(yōu)先級(jí)列于表2表2主控系統(tǒng)中幾個(gè)線程的優(yōu)先級(jí)。
線程顯示時(shí)間線程自動(dòng)記錄線程在線仿真線程離線仿真線程串口通信線程優(yōu)先級(jí)23各線程之間的協(xié)調(diào)和同步在有幾個(gè)線程并行運(yùn)行的環(huán)境中,同步不同線程的活動(dòng)是很重要的。Windows中主要提供了5種用于同步線程的對(duì)在本主控系統(tǒng)中主要用到了臨界區(qū)和事件進(jìn)行線程同步。
臨界區(qū)是一小段代碼,它要求在執(zhí)行以前取得對(duì)某些共享數(shù)據(jù)的獨(dú)占的訪問(wèn)。臨界區(qū)一次只允許一個(gè)線程取得對(duì)某個(gè)數(shù)據(jù)區(qū)的訪問(wèn)權(quán)。通過(guò)使用臨界區(qū)就能確保對(duì)數(shù)據(jù)結(jié)構(gòu)的存取能在線程之間得到協(xié)調(diào)。如果某個(gè)線程已經(jīng)取得了臨界區(qū)的所有權(quán),其它想要獲得訪問(wèn)權(quán)的線程都會(huì)被置于睡眠狀態(tài)。當(dāng)擁有所有權(quán)的線程放棄了所有權(quán)時(shí),系統(tǒng)只喚醒正等待中的一個(gè)線程,給它所有權(quán),而讓其它的線程繼續(xù)睡眠。例如,在線仿真線程中使用程序段:在主線程中使用程序段:可以同步在線仿真線程和主線程對(duì)全局變量strSimuOnlineX的訪問(wèn)。
事件*常用于一個(gè)進(jìn)程進(jìn)行初始化工作后,發(fā)信號(hào)給另一個(gè)線程,讓其完成剩余的工作。初始化線程將事件設(shè)置為無(wú)信號(hào)狀態(tài)后開始進(jìn)行初始化。當(dāng)初始化完成后,線程把事件設(shè)置為有信號(hào)態(tài),工作線程就醒來(lái)執(zhí)行余下的必要工作。
在主控系統(tǒng)中主要定義了如下事件:其中rote-eventStart用于表示主線程初始化已經(jīng)完成,自動(dòng)加工開始,可以啟動(dòng)自動(dòng)記錄線程。當(dāng)該事件為有信號(hào)態(tài)據(jù)寫入文件。在自動(dòng)記錄線程中使用等待該時(shí)間有信號(hào)。當(dāng)主線程開始自動(dòng)加工,并且向下位機(jī)發(fā)送了**組數(shù)據(jù)后,使用語(yǔ)句就可以啟動(dòng)自動(dòng)記錄線程開始記錄。由于篇幅所限,其它事件的具體應(yīng)用就不再討論。
3Windows和DOS間的串口通信3.1串口通信的硬件基礎(chǔ)RS―232-C是在數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通信設(shè)備(DCE)之間進(jìn)行二進(jìn)制交換的接口標(biāo)準(zhǔn),可用于實(shí)現(xiàn)兩臺(tái)微機(jī)間的近距離直接通信。實(shí)現(xiàn)雙機(jī)連接,只要將兩臺(tái)微機(jī)的串行口或并行口以適當(dāng)電纜按一定方式連接起來(lái)即可。
9針在本主控系統(tǒng)中,采用的就是9針三線連接方式。
RS―232―C只是計(jì)算機(jī)之間串行通信的接口標(biāo)準(zhǔn),其電器特性則是由計(jì)算機(jī)中稱作通用異步收/發(fā)器(UART)的器件來(lái)完成的。
DOS串口通信DOS和BIOS都提供了支持串行異步通信的功能調(diào)用,可以利用這些功能調(diào)用來(lái)設(shè)計(jì)簡(jiǎn)單的串行異步通信程序。中斷控制方式是串行通信采用*多的收/發(fā)控制方式。在下位PC機(jī)運(yùn)行的DOS環(huán)境下,就采用了基于中斷的方式。
Windows串口通信在Windows下,串行口作為系統(tǒng)資源,由設(shè)備驅(qū)動(dòng)程序統(tǒng)一管理,用戶不能像在DOS下一樣直接對(duì)串行口硬件端口進(jìn)行編程。Windows將串行口和其它通信設(shè)備如Modem、傳真機(jī)等統(tǒng)一視作文件,對(duì)串行口的打開、關(guān)閉、讀寫等操作與操作還由于需要結(jié)合Windows的線程編程、事件驅(qū)動(dòng)等新技術(shù),因而使得Windows下的串行通信編程比較復(fù)雜。
串行通信會(huì)話以調(diào)用CreateFileC)函數(shù)打開串行口開始,接著設(shè)置串行口波特率、數(shù)據(jù)位、校驗(yàn)位、停止位等參數(shù)以及超時(shí)參數(shù),*后選擇一種工作方式讀、寫串行口。在Windows中,串行通信有詢方式和事件驅(qū)動(dòng)兩種工作方式。
查詢是*為直接、易于理解的技術(shù)。但是查詢會(huì)占用大量的CPU時(shí)間,效率較低。事件驅(qū)動(dòng)I/O方式是指線程通過(guò)監(jiān)視通信資源中的一組事件來(lái)進(jìn)行I/O操作,這種方式類似于DOS下的中斷工作方式,效率高。主控系統(tǒng)中使用的就是事件驅(qū)動(dòng)的通信方式。在主控系統(tǒng)中,建立了一個(gè)CSerialPort類,用于實(shí)現(xiàn)串口的初始化和讀寫操作。
3.4Windows和DOS的串口通信兩種操作系統(tǒng)之間的串口通信并不難,只要在兩者之間建立了正確的硬件連接,然后分別編寫各自的通信程序,并且按照同樣的通信協(xié)議設(shè)置,就可以通信了。這也就是本主控系統(tǒng)上位機(jī)和下位機(jī)的通信實(shí)現(xiàn)方式,并且通信速率達(dá)到了4結(jié)語(yǔ)該主控系統(tǒng)的實(shí)用性已經(jīng)通過(guò)實(shí)驗(yàn)驗(yàn)證,取得了良好的效果。