基于Linux-RTAI的數(shù)控軟件結(jié)構(gòu)設(shè)計(jì)與實(shí)現(xiàn)
點(diǎn)擊:1848
A+ A-
所屬頻道:新聞中心
Linux是一個(gè)遵循可移植操作系統(tǒng)接口(POSIX, Portable Operating System Interface)標(biāo)準(zhǔn)的多用戶、多任務(wù)且具有先進(jìn)的網(wǎng)絡(luò)特性開源操作系統(tǒng)?;谀K化設(shè)計(jì)思想在開放的軟硬件平臺(tái)上開發(fā)適合一定需求的專用數(shù)控系統(tǒng),已成為數(shù)控領(lǐng)域的一個(gè)研究熱點(diǎn)。雖然2.6以后的內(nèi)核版本是可搶占的,但實(shí)時(shí)性仍比較弱,而數(shù)控系統(tǒng)本身要求有明顯的實(shí)時(shí)控制、實(shí)時(shí)交互和實(shí)時(shí)監(jiān)測等特性。本文首先將RTAI移植到Linux OS,使系統(tǒng)達(dá)到了強(qiáng)實(shí)時(shí)的要求,而后在此平臺(tái)上完成了數(shù)控軟件的體系結(jié)構(gòu)設(shè)計(jì)。
1 實(shí)時(shí)Linux的實(shí)現(xiàn)
提高Linux實(shí)時(shí)性,目前有兩種方法:1)直接修改Lint內(nèi)核,如:Montavista; 2 )在Linux內(nèi)核之上增加實(shí)時(shí)模塊,采用雙內(nèi)核結(jié)構(gòu),如:RTAI。
前一種方案對開發(fā)人員的技術(shù)要求較高,需要修改大量的代碼,開發(fā)效率低。RTAI是一個(gè)遵循GNU的開源項(xiàng)目。RTAI采用雙內(nèi)核方法,不直接使用Lint的任何功能,而是把實(shí)時(shí)任務(wù)寫成一個(gè)驅(qū)動(dòng)程序的形式,然后直接用PC時(shí)序芯片所產(chǎn)生的中斷調(diào)用這個(gè)驅(qū)動(dòng)程序。RTAI在Lint上定義了一個(gè)實(shí)時(shí)硬件抽象層(RTHAL, Real Tirne Hardware Abstraction Layer),并針對RTAI開發(fā)了LXPT,讓RTAI可以調(diào)用Lint本身的系統(tǒng)調(diào)用功能。RTHAL的作’用是使RTAI能夠在實(shí)時(shí)任務(wù)需要運(yùn)行的任何時(shí)刻中斷。引入RTAI后,Linux僅作為優(yōu)先級最低的任務(wù)運(yùn)行,并且只有在沒有實(shí)時(shí)任務(wù)時(shí)它才能執(zhí)行。這樣做的好處在于將直接修改Linux核心的代碼減到最小,這使得將RTAI移植到Linux內(nèi)核的工作量減至最低。
本文以PIV 2.0GHz, S12MB RAM的通用PC機(jī)作為硬件開發(fā)平臺(tái),以Red Hat 9為操作系統(tǒng)平臺(tái),將3.5版本的RTAI移植到版本為2.6.15.2的Linux內(nèi)核中測試操作系統(tǒng)實(shí)時(shí)性能,測試結(jié)果顯示,無論是內(nèi)核層還是用戶層都能夠滿足數(shù)控系統(tǒng)實(shí)時(shí)性的要求。需要特別指出的是,許多不可測因素會(huì)導(dǎo)致調(diào)度器的運(yùn)行時(shí)間變的不確定,繼而使接下來的任務(wù)的開始時(shí)間發(fā)生相應(yīng)的變化,即產(chǎn)生了調(diào)度抖動(dòng)。調(diào)度抖動(dòng)對于基于通用處理器的實(shí)時(shí)系統(tǒng)來說是不可避免的。經(jīng)試驗(yàn)測定,上述開發(fā)平臺(tái)的調(diào)度抖動(dòng)時(shí)間在50 ms左右,能夠滿足數(shù)控系統(tǒng)的需要。
2 系統(tǒng)的軟件結(jié)構(gòu)設(shè)計(jì)
以集成RTAI實(shí)時(shí)內(nèi)核的Linux操作系統(tǒng)為開發(fā)平臺(tái),基于模塊化思想將數(shù)控軟件按照實(shí)時(shí)性的要求分為用戶層模塊和內(nèi)核層實(shí)時(shí)模塊兩部分。所有與實(shí)時(shí)相關(guān)的任務(wù)都運(yùn)行在內(nèi)核層下,且用一個(gè)獨(dú)立的內(nèi)核進(jìn)程來執(zhí)行;所有非實(shí)時(shí)進(jìn)程運(yùn)行于用戶層下,它們不能打斷實(shí)時(shí)進(jìn)程的運(yùn)行。同時(shí)兩大模塊又劃分為不同的子模塊。采用這種模塊化結(jié)構(gòu),實(shí)質(zhì)是將功能分配給組件,這有利于軟件測試、系統(tǒng)維護(hù)以及增加新功能。該軟件體系結(jié)構(gòu)如圖1所示。
圖1數(shù)控軟件體系結(jié)構(gòu)
2.1 系統(tǒng)實(shí)時(shí)模塊的實(shí)現(xiàn)
數(shù)控軟件的主程序由插補(bǔ)預(yù)處理任務(wù)、插補(bǔ)任務(wù)、位置控制任務(wù)、I/O控制任務(wù)和狀態(tài)監(jiān)測任務(wù)(圖1中未全部給出)等組成。本文將以上任務(wù)分別作為一個(gè)內(nèi)核進(jìn)程,每個(gè)進(jìn)程編譯成后綴為.0的模塊。數(shù)控加工過程中,G代碼是順序執(zhí)行的,每一個(gè)模塊讀取前一模塊的數(shù)據(jù),而將處理得到的數(shù)據(jù)輸出給后一模塊使用。首先,插補(bǔ)預(yù)處理任Pre-inter-polate ( )從I/O緩沖區(qū)中讀人G代碼,將代碼解釋為插補(bǔ)模塊可識(shí)別的數(shù)據(jù)結(jié)構(gòu),送入到預(yù)處理數(shù)據(jù)緩沖區(qū)prepare-fifo。而后,插補(bǔ)任務(wù)interpolate ( )從預(yù)處理數(shù)據(jù)緩沖區(qū)prepare-fifo中取出數(shù)據(jù),然后進(jìn)行插補(bǔ)運(yùn)算,將結(jié)果送interpolate-fifo()。最后,位置控制任務(wù)motor( )周期性地從插補(bǔ)緩沖區(qū)interpolated-fifo計(jì)算出下一周期的實(shí)際坐標(biāo)增量,輸出到位控?cái)?shù)據(jù)緩沖區(qū)供伺服驅(qū)動(dòng)單元(位控輸出模塊)使用。
位控輸出模塊的優(yōu)先級別最高,運(yùn)行過程中不允許其它模塊中斷。同時(shí),它的運(yùn)行周期必須匹配于伺服驅(qū)單元的運(yùn)行周期。因此,將其設(shè)計(jì)成周期性RTAI進(jìn)程,運(yùn)行周期為20 ms,l級優(yōu)先權(quán)(級別越小,優(yōu)先級越高)。預(yù)處理模塊、插補(bǔ)模塊和位置控制模塊的運(yùn)行較之于位控輸出模塊都要快得多,因此將他們的周期設(shè)置為5 ms,優(yōu)先級別依次為4級、3級和2級。
采用基于優(yōu)先級搶占的進(jìn)程調(diào)度策略,實(shí)現(xiàn)對數(shù)控模塊的實(shí)時(shí)調(diào)度。當(dāng)位控?cái)?shù)據(jù)緩沖區(qū)的數(shù)據(jù)量小于緩沖區(qū)大小一半時(shí),位控輸出模塊掛起自身,喚醒次高級的模塊(位控模塊);以此類推,當(dāng)插補(bǔ)數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)量小于緩沖區(qū)大小一半時(shí),位控模塊就掛起自身,喚醒次高優(yōu)先級模塊(插補(bǔ)模塊)。
此外,在數(shù)控加工過程中,功能控制任務(wù)control()利用FIFO從用戶層向內(nèi)核層傳遞控制命令,如點(diǎn)動(dòng)、暫停和自動(dòng)等,并實(shí)現(xiàn)對I/O口的控制。狀態(tài)檢測任務(wù)monitor()將傳輸?shù)絀/O口的各個(gè)閥門,壓力表狀態(tài)保存在status-fifo中,同時(shí)負(fù)責(zé)對運(yùn)行時(shí)水壓和電流等值狀態(tài)進(jìn)行判斷,實(shí)時(shí)監(jiān)控機(jī)床運(yùn)行狀態(tài),對機(jī)床故障進(jìn)行實(shí)時(shí)響應(yīng)。這些任務(wù)采用實(shí)時(shí)中斷策略,由中斷信號觸發(fā)相應(yīng)的模塊。
實(shí)時(shí)模塊在數(shù)控軟件啟動(dòng)時(shí)就加載到Linux內(nèi)核中,實(shí)時(shí)進(jìn)程和函數(shù)就可以訪問系統(tǒng)的底層資源。實(shí)時(shí)任務(wù)模塊由init-module()和cleanup -module()兩個(gè)RTAI函數(shù)聲明實(shí)現(xiàn),并且可以通過這兩個(gè)函數(shù)進(jìn)行資源分配和回收。
2.2 模塊間的通信
數(shù)控軟件各模塊之間需要大量的數(shù)據(jù)通信。歸納起來,主要有三類:
(1)非實(shí)時(shí)進(jìn)程間通信
這類通信主要存在于人機(jī)交互界面中,用于編輯加工代碼、設(shè)置機(jī)床和系統(tǒng)的初始值等,采用管道、消息隊(duì)列、共享內(nèi)存、信號等實(shí)現(xiàn)。
(2)實(shí)時(shí)與非實(shí)時(shí)進(jìn)程間通信
這類通信主要完成插補(bǔ)主程序與系統(tǒng)界面的人機(jī)交互,動(dòng)態(tài)模擬刀具軌跡,顯示加工狀態(tài),采用實(shí)時(shí)管道FIFO和共享內(nèi)存。
(3)實(shí)時(shí)進(jìn)程間通信
這類進(jìn)程主要完成數(shù)控主程序模塊之間的通信,采用FIFO和共享內(nèi)存的方式進(jìn)行通信。
數(shù)控模塊通過調(diào)用RTAI接口函數(shù)ttf-create ( )來創(chuàng)建實(shí)時(shí)管道FIFO,實(shí)現(xiàn)數(shù)據(jù)傳輸,實(shí)時(shí)管道創(chuàng)建后在目錄/dev下生成字符設(shè)備文件/devlrkf" oLinux進(jìn)程通過對這些文件的操作實(shí)現(xiàn)對實(shí)時(shí)管道的操作,調(diào)用。pen ( ) , read ( )和write ( )實(shí)現(xiàn)管道打開、讀和寫操作,調(diào)用select()和poll()實(shí)現(xiàn)異步I/OoFIFO的通信是單向的,因此模塊間的信息交互必須至少創(chuàng)建兩條管道才能實(shí)現(xiàn)。
3 應(yīng)用實(shí)例
目前,經(jīng)濟(jì)型數(shù)控系統(tǒng)僅具有直線和圓弧插補(bǔ)功能。針對這一現(xiàn)狀,課題組研究了二次曲線(直線、圓、橢圓、拋物線和雙曲線)的插補(bǔ)方法,編寫了直接插補(bǔ)直線、圓、橢圓、拋物線和雙曲線的模塊,將軟件應(yīng)用于三坐標(biāo)數(shù)控銑床的控制,進(jìn)行了輪廓曲線的加工試驗(yàn),如圖2所示。
對于一條二次曲線(直線、圓、橢圓、拋物線或雙曲線),數(shù)控軟件僅需調(diào)用相應(yīng)的加工模塊一次,即可完成加工。而漸開線、擺線等復(fù)雜曲線的加工,可以應(yīng)用直線、圓、橢圓、拋物線或雙曲線進(jìn)行擬合,編寫數(shù)控加工程序代碼進(jìn)行加工。數(shù)控軟件首先讀取加工程序代碼,并根據(jù)插補(bǔ)預(yù)處理模塊的輸出信息,自動(dòng)調(diào)用相應(yīng)的插補(bǔ)模塊完成加工。
實(shí)驗(yàn)結(jié)果表明,數(shù)控軟件采用優(yōu)先級搶占的調(diào)度策略實(shí)現(xiàn)了對數(shù)控加工任務(wù)的實(shí)時(shí)調(diào)度,能夠流暢地運(yùn)行在Linux-RTAI強(qiáng)實(shí)時(shí)性平臺(tái)上,完成對三坐標(biāo)銑床的控制。
4 結(jié)束語
本文在實(shí)現(xiàn)Linux硬實(shí)時(shí)性的基礎(chǔ)上,完成數(shù)控軟件模塊化設(shè)計(jì),并通過實(shí)驗(yàn)驗(yàn)證其正確性。在未來研究中,應(yīng)重點(diǎn)開發(fā)其它曲線的插補(bǔ)模塊,同時(shí)應(yīng)進(jìn)一步優(yōu)化任務(wù)周期、優(yōu)先級以及緩沖區(qū)的選擇,減少系統(tǒng)對由于參數(shù)選擇不當(dāng)引起的異常任務(wù)的響應(yīng)。
(審核編輯: 智匯胡妮)
分享