李 芬,常 勇,王 威
LI Fen1,CHANG Yong2,WANG Wei2
(1.煙臺工程職業(yè)技術(shù)學(xué)院 數(shù)控技術(shù)系,煙臺 264006;2.北京機(jī)械工業(yè)自動化研究所,北京 100120)
數(shù)控技術(shù)是發(fā)展尖端工業(yè)的使能技術(shù)和基礎(chǔ)裝備,數(shù)控系統(tǒng)作為數(shù)控車床的大腦,其性能直接影響甚至決定著機(jī)床的整體性能。數(shù)控機(jī)床既是高新技術(shù)專業(yè)不可缺少的基礎(chǔ)裝備,又是傳統(tǒng)產(chǎn)業(yè)更新?lián)Q代的重要手段。隨著半導(dǎo)體技術(shù)的飛速發(fā)展,數(shù)控系統(tǒng)逐漸朝嵌入式方向發(fā)展。嵌入式系統(tǒng)是近年發(fā)展最快的技術(shù)之一,它是以應(yīng)用為中心,以計算機(jī)技術(shù)為基礎(chǔ)、軟硬件可裁減,適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗等綜合性嚴(yán)格要求的專用計算機(jī)系統(tǒng)。目前市面上主流的經(jīng)濟(jì)型數(shù)控系統(tǒng)如廣州數(shù)控的GSK980TDb和北京凱恩帝K90Ti等都是使用了ARM處理器構(gòu)建的嵌入式數(shù)控系統(tǒng)。
本數(shù)控系統(tǒng)硬件平臺分為兩大組成部分:ARM 子系統(tǒng)和 FPGA 子系統(tǒng),采用主從式的兩級插補(bǔ)結(jié)構(gòu)。ARM 子系統(tǒng)采用三星S3C2410處理器,主要用于粗插補(bǔ)計算,以及鍵盤、顯示和D/A轉(zhuǎn)換等管理工作。FPGA 子系統(tǒng)采用Altera 公司的ACEX 系列芯片,主要負(fù)責(zé)系統(tǒng)的精插補(bǔ)脈沖輸出、編碼器脈沖計數(shù)以及 I/O 控制等工作。
本數(shù)控系統(tǒng)軟件部分采用Xenomai實時化方案改造標(biāo)準(zhǔn)Linux內(nèi)核[1],構(gòu)建基于Xenomai的實時嵌入式操作系統(tǒng)。Xenomai/Linux系統(tǒng)為用戶程序提供了內(nèi)核空間和用戶空間兩種模式,前者通過系統(tǒng)調(diào)用接口實現(xiàn),后者通過實時內(nèi)核實現(xiàn)。用戶空間的執(zhí)行模式保證了系統(tǒng)的可靠性和良好的軟實時性,內(nèi)核空間程序則能提供優(yōu)秀的硬實時性[2]。
數(shù)控系統(tǒng)開發(fā)的關(guān)鍵是軟件部分,為縮短系統(tǒng)開發(fā)周期,本系統(tǒng)盡量采用模塊化設(shè)計,積極利用市場現(xiàn)有的成熟技術(shù)。該數(shù)控系統(tǒng)按功能模塊構(gòu)架設(shè)計,大致劃分為如下幾個模塊:
控制模塊:控制模塊的主處理器采用市面上流行的三星S3C2410處理器,片上運(yùn)行嵌入式Linux+Xenomai操作系統(tǒng),負(fù)責(zé)信息存儲、LCD顯示、串口傳輸、USB 接口的處理,實現(xiàn)譯碼、文件系統(tǒng)、圖形顯示和 PLC 等功能??刂颇K采用市面流行的MINI2440開發(fā)板實現(xiàn)控制功能,該開發(fā)小板集成了三星S3C2440微處理器、并使用兩片外接的SDRAM芯片,兩片共64Mb并連在一起形成32位的數(shù)據(jù)總線寬度;配備2Mb的NOR FLASH和128Mb的NAND FLASH,支持兩種FLASH啟動,有利于開發(fā)階段的調(diào)試和系統(tǒng)文件的燒寫[3]。
鍵盤模塊:采用AVR單片機(jī),負(fù)責(zé)鍵盤掃描、LED燈點亮等信號處理,通過串行口與ARM進(jìn)行通信。
FPGA模塊:該模塊采用AlTERA的FPGA控制。負(fù)責(zé)輸入輸出接口控制、編碼器反饋和機(jī)床 I/O 信號處理。FPGA模塊與鍵盤模塊一起集成設(shè)計在核心板上,采用4層板設(shè)計,留出各個JTAG接口,利于集中調(diào)試和燒寫[4]。
電源及接口模塊:該模塊主要用于核心板和控制板的供電及I/O接口處理。該模塊設(shè)置在I/O接口板上,該板同樣采用4層板設(shè)計,配置各種外部連接和調(diào)試插頭。
各模塊組成的數(shù)控系統(tǒng)硬件結(jié)構(gòu)如下圖所示:
圖1 系統(tǒng)硬件結(jié)構(gòu)
數(shù)控系統(tǒng)本身是一個復(fù)雜的多任務(wù)并發(fā)的實時應(yīng)用系統(tǒng),目前市面上比較流行的實時操作系統(tǒng)有VxWorks、QNX等,這些系統(tǒng)實時性好,但開放性差并且價格昂貴;開源但不免費(fèi)的uC/OS-II是由美國人 Jean J.Labrosse 先生所編寫的實時嵌入式操作系統(tǒng)內(nèi)核,實時性好并且相當(dāng)精簡,但由于其僅是操作系統(tǒng)內(nèi)核,針對其內(nèi)核要進(jìn)行開發(fā)的內(nèi)容和項目比較多,影響開發(fā)進(jìn)度;因此本系統(tǒng)選用開放性好、移植性強(qiáng)、免費(fèi)并且開源的嵌入式Linux+Xenomai實時操作系統(tǒng)作為軟件平臺,該軟件平臺具有良好的用戶態(tài)實時性和優(yōu)秀的內(nèi)核態(tài)實時性,可分別用于實時性不高的軟實時任務(wù)和實時性要求很高的硬實時任務(wù)。
系統(tǒng)軟件部分的開發(fā)是關(guān)乎整個數(shù)控系統(tǒng)研發(fā)成敗的關(guān)鍵。數(shù)控系統(tǒng)具備的功能比較多,但其主要功能是解釋翻譯數(shù)控代碼,并按照代碼要求自動完成工件的加工。自動加工過程主要是完成刀具軌跡的控制,如加減速、插補(bǔ)、位置控制等;其次是一些邏輯控制,如冷卻液開關(guān)及限位控制等等;除具備主要功能外,數(shù)控系統(tǒng)應(yīng)該具備良好的人機(jī)界面等功能。如何合理的布置這些層次結(jié)構(gòu)及劃分模塊,對整個數(shù)控系統(tǒng)的開放性、后期可擴(kuò)展性以及系統(tǒng)的性能都具有重要意義。結(jié)合選用的嵌入式Linux+Xenomai軟件平臺,綜合考慮數(shù)控系統(tǒng)的功能需求及多任務(wù)之間數(shù)據(jù)依賴等要求,我們把系統(tǒng)分兩層進(jìn)行開發(fā):用戶層和內(nèi)核層,每層又劃分為若干模塊和子模塊,同層模塊相互配合共同完成該層任務(wù),用戶層與內(nèi)核層之間通過命名管道實現(xiàn)數(shù)據(jù)通信[5]。
用戶層:主要提供系統(tǒng)的人機(jī)接口界面,人機(jī)接口界面內(nèi)包含有位置界面、程序界面、刀補(bǔ)界面、設(shè)置界面、參數(shù)界面和診斷界面。人機(jī)接口界面為用戶提供直觀的操作界面及各種加工信息、狀態(tài)參數(shù)和診斷參數(shù)等,等待接受用戶的操作要求,并將操作要求和數(shù)據(jù)處理后傳遞給內(nèi)核層。
內(nèi)核層:主要用于內(nèi)核控制、運(yùn)算控制、輸入輸出控制,分算法模塊和FPGA模塊;算法模塊內(nèi)又分譯碼、預(yù)插補(bǔ)、插補(bǔ)、位置控制、加減速控制、PLC控制等子模塊。每個子模塊都是一個單獨(dú)的線程,子模塊之間通過消息隊列進(jìn)行通信。內(nèi)核層中的算法模塊是整個系統(tǒng)的核心,它進(jìn)行的都是實時性要求很高的插補(bǔ)、加減速、位置等控制任務(wù),實現(xiàn)毫米級甚至微秒級的間隔周期;決定著系統(tǒng)的整體性能。FPGA模塊用于直接控制硬件芯片,完成輸入輸出控制。算法模塊和FPGA模塊均設(shè)計為內(nèi)核模塊中,系統(tǒng)啟動時,直接加載到實時內(nèi)核中。
具體劃分如圖2所示:
圖2 系統(tǒng)軟件結(jié)構(gòu)和模塊劃分
用戶層與內(nèi)核層在嵌入式Linux系統(tǒng)中屬于兩個相對獨(dú)立的空間,兩個空間之間不能直接進(jìn)行通信和數(shù)據(jù)交換。嵌入式Linux系統(tǒng)進(jìn)行Xenomai實時化改造后,管道通信、消息隊列和共享內(nèi)存等全部保留。用戶層與內(nèi)核層通過管道通信進(jìn)行連接,在內(nèi)核層建立管道后,在用戶層可以通過讀取設(shè)備文件進(jìn)行管道讀寫。
內(nèi)核層創(chuàng)建及讀寫管道如下:
int rt_pipe_create (RT_PIPE *pipe, const char*name, int minor,size_t poolsize);//創(chuàng)建管道
ssize_t rt_pipe_receive (RT_PIPE *pipe, RT_PIPE_MSG **msgp, RTIME timeout);
//從管道接收一條信息;
ssize_t rt_pipe_send (RT_PIPE *pipe, RT_PIPE_MSG *msg, size_tsize, int mode);//向管道發(fā)送一條信息用戶層讀寫管道如下:int Pipe0 = open("/dev/rtp0",O_RDWR);//打開管道文件
int write(int handle, void *buf, int nbyte);//向管道文件寫入數(shù)據(jù)
int read(int handle, void *buf, int nbyte);//讀取管道文件數(shù)據(jù)
友好的人機(jī)界面是數(shù)控必須具備的功能,用戶層的主要任務(wù)就是提供人機(jī)交互界面。通過比較市面上流行的GUI開發(fā)軟件Qt/Embedded、MiniGUI、UC/GUI和Nano-X,結(jié)合Linux特性,本數(shù)控系統(tǒng)選用Qt/Embedded進(jìn)行界面程序的開發(fā)。Qt/E是一個完整的基于framebuffer[6]的GUI系統(tǒng),它用C++編寫,對用C語言程序有很好的兼容性,有著豐富的API函數(shù)庫和圖形處理功能,界面開發(fā)與圖形驅(qū)動分開,易于開發(fā)和移植,同時它也是開源軟件。
設(shè)計過程中,根據(jù)用戶層的劃分,把位置、刀補(bǔ)、程序等界面采用單獨(dú)的QWidget設(shè)計,每個界面都有自己的頭文件和cpp文件,所有界面公用一個數(shù)據(jù)結(jié)構(gòu),將各個界面通用的參數(shù)放到一起,設(shè)置一個主Mainwindow,用于系統(tǒng)初始化、界面切換、變量初始化以及加載系統(tǒng)信息等功能。主界面中對按鍵的處理也是相當(dāng)重要的,開發(fā)過程中充分利用Qt中的按鍵事件,設(shè)計過程中區(qū)分按下及釋放事件,并單獨(dú)編寫按鍵更新程序。具體如下:
void mainWindow::keyPressEvent(QKeyEvent *k)void mainWindow::keyReleaseEvent(QKeyEvent *k)void mainWindow::keyUpdate()
用戶層設(shè)計過程中著重要考慮的就是各個界面之間的通信問題,各界面之間充分利用Qt特有的信號與槽的通信機(jī)制,在界面之間進(jìn)行信號發(fā)送和槽函數(shù)調(diào)用。具體實現(xiàn)如下:
signals: void mySignal(); //信號
public slots: void mySlot(); //槽函數(shù)bool QObject::connect ( const QObject * sender,const char * signal, const QObject * receiver,
const char * member );//信號與槽函數(shù)的連接
程序中可以通過emit();函數(shù)發(fā)出signals,調(diào)用與信號連接的槽函數(shù)。
系統(tǒng)軟件設(shè)計的關(guān)鍵仍然是內(nèi)核層的設(shè)計,內(nèi)核層滿足硬實時任務(wù)的要求,將系統(tǒng)的插補(bǔ)算法、加減速算法以及位置控制算法等集成在一起;對于各個數(shù)控系統(tǒng)廠家,其插補(bǔ)算法和加減速控制算法都被列入公司核心機(jī)密,由此足以看出內(nèi)核層設(shè)計的重要性。
內(nèi)核層的軟件設(shè)計采用內(nèi)核模塊直接掛載到系統(tǒng)內(nèi)核中,F(xiàn)PGA模塊直接針對硬件用于輸入輸出數(shù)據(jù)傳輸,并且輸出內(nèi)核符號供算法模塊直接讀寫FPGA設(shè)備。算法內(nèi)核模塊中采用多線程設(shè)計,將預(yù)插補(bǔ)、插補(bǔ)、加減速、位置控制、PLC控制、手脈控制、譯碼控制以及顯示控制等采用單獨(dú)的線程進(jìn)行設(shè)計,各線程之間通過命名管道和消息隊列進(jìn)行數(shù)據(jù)交換。每個線程設(shè)立獨(dú)立的運(yùn)行周期,周期設(shè)定必須滿足系統(tǒng)功能的需要,本系統(tǒng)插補(bǔ)周期設(shè)定為2ms。顯示控制用于讀取緩沖區(qū)數(shù)據(jù),發(fā)送給用戶層進(jìn)行屏幕顯示,其設(shè)定周期滿足基本顯示需要即可,本系統(tǒng)設(shè)定為200ms。以顯示線程為例,實現(xiàn)功能的部分函數(shù)具體如下:
void LCDDisp(void *cookie)
rt_task_set_periodic(&display_task,TM_NOW,200*1000000); //設(shè)置任務(wù)運(yùn)行周期
for( ; ; )
{rt_task_wait_period(NULL); //掛起任務(wù)到下個周期再運(yùn)行;
/* 顯示線程實現(xiàn)代碼*/}
算法模塊在加載到內(nèi)核模塊時,首先要做的就是進(jìn)行模塊的初始化,初始化過程中需要把內(nèi)核層之間通信以及內(nèi)核層與用戶層通信所需要的命名管道和消息隊列等創(chuàng)建完畢,內(nèi)核層各線程之間可以通過讀寫管道和消息內(nèi)存完成數(shù)據(jù)交換。實現(xiàn)函數(shù)如下:
ssize_t rt_pipe_write (RT_PIPE *pipe, const void*buf, size_t size, int mode)
ssize_t rt_pipe_read (RT_PIPE *pipe, void *buf,size_t size, RTIME timeout)
//管道讀寫數(shù)據(jù)
int rt_queue_read (RT_QUEUE *q, void *buf,size_t size, RTIME timeout)
int rt_queue_write (RT_QUEUE *q, const void*buf, size_t size, int mode)
//消息隊列讀寫數(shù)據(jù)
經(jīng)濟(jì)型數(shù)控系統(tǒng)的軟件僅包括基本的x軸和z軸直線插補(bǔ)、圓弧插補(bǔ)等功能,屬于低端產(chǎn)品,開發(fā)過程較短,開發(fā)難度也較低,本系統(tǒng)軟件開發(fā)過程中綜合考慮了經(jīng)濟(jì)型數(shù)控系統(tǒng)的特點,迅速快捷的進(jìn)行開發(fā),同時也預(yù)留了后期軟件升級為x軸、z軸和y軸三維插補(bǔ)的接口。設(shè)計過程中為系統(tǒng)人機(jī)界面部分也僅是滿足基本的需求,后期開發(fā)過程中仍然需要進(jìn)一步的豐富和完善,尤其是在U盤文件處理和串口通信方面;但系統(tǒng)現(xiàn)有開發(fā)的功能完全可以滿足舊機(jī)床的數(shù)控化改造需求。
[1] 韓守謙,裴海龍,王清陽.基于Xenomai的實時嵌入式Linux操作系統(tǒng)的構(gòu)建[J].計算機(jī)工程與設(shè)計,2011,32(1):96-98.
[2] 陳曾漢,張鵬,晏來成.基于Xenomai的實時測控系統(tǒng)的研究與實現(xiàn)[J].計算機(jī)應(yīng)用與軟件,2009,26(5).
[3] 廣州友善之臂.mini2440用戶手冊.20110421版.
[4] 孫程建.基于Linux的嵌入式數(shù)控系統(tǒng)底層軟件設(shè)計[D],武漢科技大學(xué).
[5] 朱達(dá)宇.基于RTLinux的全軟件數(shù)控系統(tǒng)設(shè)計與開發(fā)[D],四川大學(xué).
[6] 趙霞.基于Frambuffer的嵌入式GUI系統(tǒng)實現(xiàn)[J].嵌入式軟件應(yīng)用.2007,23(12-2).