基于嵌入式linux的數(shù)控系統(tǒng)軟件設計
引言
數(shù)控技術是發(fā)展尖端工業(yè)的使能技術和基礎裝備,數(shù)控系統(tǒng)作為數(shù)控車床的大腦,其性能直接影響甚至決定著機床的整體性能。數(shù)控機床既是高新技術專業(yè)不可缺少的基礎裝備,又是傳統(tǒng)產(chǎn)業(yè)更新?lián)Q代的重要手段。隨著半導體技術的飛速發(fā)展,數(shù)控系統(tǒng)逐漸朝嵌入式方向發(fā)展。嵌人式系統(tǒng)是近年發(fā)展最快的技術之一,它是以應用為中心,以計算機技術為基礎、軟硬件可裁減,適應應用系統(tǒng)對功能、可靠性、成本、體積、功耗等綜合性嚴格要求的專用計算機系統(tǒng)。目前市面上主流的經(jīng)濟型數(shù)控系統(tǒng)如廣州數(shù)控的GSK980TDb和北京凱恩帝K90Ti等都是使用了ARM處理器構(gòu)建的嵌入式數(shù)控系統(tǒng)。
本數(shù)控系統(tǒng)硬件平臺分為兩大組成部分:ARM子系統(tǒng)和FPGA子系統(tǒng),采用主從式的兩級插補結(jié)構(gòu)。ARM子系統(tǒng)采用三星S3C24I0處理器,主要用于粗插補計算,以及鍵盤、顯示和D/A轉(zhuǎn)換等管理工作。FPGA子系統(tǒng)采用Altera公司的ACEX系列芯片,主要負責系統(tǒng)的精插補脈沖輸出、編碼器脈沖計數(shù)以及I/O控制等工作。
本數(shù)控系統(tǒng)軟件部分采用Xenomai實時化方案改造標準Linux內(nèi)核,構(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)秀的硬實時性。
1 系統(tǒng)硬件模塊設計
數(shù)控系統(tǒng)開發(fā)的關鍵是軟件部分,為縮短系統(tǒng)開發(fā)周期,本系統(tǒng)盡量采用模塊化設計,積極利用市場現(xiàn)有的成熟技術。該數(shù)控系統(tǒng)按功能模塊構(gòu)架設計,大致劃分為如下幾個模塊:
控制模塊:控制模塊的主處理器采用市面上流行的三星S3C2410處理器,片上運行嵌人式Linux+Xenomai操作系統(tǒng),負責信息存儲、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)文件的燒寫。
鍵盤模塊:采用AVR單片機,負責鍵盤掃描、LED燈點亮等信號處理,通過串行口與ARM進行通信。
FPGA模塊:該模塊采用AITERA的FPGA控制。負責輸入輸出接口控制、編碼器反饋和機床I/O信號處理。FPGA模塊與鍵盤模塊一起集成設計在核心板上,采用4層板設計,留出各個JTAG接口,利于集中調(diào)試和燒寫。
電源及接口模塊:該模塊主要用于核心板和控制板的供電及I/O接口處理。該模塊設置在I/O接口板上,該板同樣采用4層板設計,配置各種外部連接和調(diào)試插頭。
各模塊組成的數(shù)控系統(tǒng)硬件結(jié)構(gòu)如下圖所示:
點擊圖片查看大圖
圖1 系統(tǒng)硬件結(jié)構(gòu)
2 系統(tǒng)軟件模塊設計
2.1數(shù)控系統(tǒng)軟件平臺的選擇
數(shù)控系統(tǒng)本身是一個復雜的多任務并發(fā)的實時應用系統(tǒng),目前市面上比較流行的實時操作系統(tǒng)有VxWorks, QNX等,這些系統(tǒng)實時性好,但開放性差并且價格昂貴;開源但不免費的uC/OS-II是由美國人Jean J.Labrosse先生所編寫的實時嵌入式操作系統(tǒng)內(nèi)核,實時性好并且相當精簡,但由于其僅是操作系統(tǒng)內(nèi)核,針對其內(nèi)核要進行開發(fā)的內(nèi)容和項目比較多,影響開發(fā)進度;因此本系統(tǒng)選用開放性好、移植性強、免費并且開源的嵌人式Linux+Xenomai實時操作系統(tǒng)作為軟件平臺,該軟件平臺具有良好的用戶態(tài)實時性和優(yōu)秀的內(nèi)核態(tài)實時性,可分別用于實時性不高的軟實時任務和實時性要求很高的硬實時任務。
2.2 系統(tǒng)的軟件結(jié)構(gòu)
系統(tǒng)軟件部分的開發(fā)是關乎整個數(shù)控系統(tǒng)研發(fā)成敗的關鍵。數(shù)控系統(tǒng)具備的功能比較多,但其主要功能是解釋翻譯數(shù)控代碼,并按照代碼要求自動完成工件的加工。自動加工過程主要是完成刀具軌跡的控制,如加減速、插補、位置控制等;其次是一些邏輯控制,如冷卻液開關及限位控制等等;除具備主要功能外,數(shù)控系統(tǒng)應該具備良好的人機界面等功能。如何合理的布置這些層次結(jié)構(gòu)及劃分模塊,對整個數(shù)控系統(tǒng)的開放性、后期可擴展性以及系統(tǒng)的性能都具有重要意義。結(jié)合選用的嵌入式Linux+Xenomai軟件平臺,綜合考慮數(shù)控系統(tǒng)的功能需求及多任務之間數(shù)據(jù)依賴等要求,我們把系統(tǒng)分兩層進行開發(fā):用戶層和內(nèi)核層,每層又劃分為若干模塊和子模塊,同層模塊相互配合共同完成該層任務,用戶層與內(nèi)核層之間通過命名管道實現(xiàn)數(shù)據(jù)通信。
用戶層:主要提供系統(tǒng)的人機接口界面,人機接口界面內(nèi)包含有位置界面、程序界面、刀補界面、設置界面、參數(shù)界面和診斷界面。人機接口界面為用戶提供直觀的操作界面及各種加工信息、狀態(tài)參數(shù)和診斷參數(shù)等,等待接受用戶的操作要求,并將操作要求和數(shù)據(jù)處理后傳遞給內(nèi)核層。
內(nèi)核層:主要用于內(nèi)核控制、運算控制、輸人輸出控制,分算法模塊和FPGA模塊;算法模塊內(nèi)又分譯碼、預插補、插補、位置控制、加減速控制、PLC控制等子模塊。每個子模塊都是一個單獨的線程,子模塊之間通過消息隊列進行通信。內(nèi)核層中的算法模塊是整個系統(tǒng)的核心,它進行的都是實時性要求很高的插補、加減速、位置等控制任務,實現(xiàn)毫米級甚至微秒級的間隔周期;決定著系統(tǒng)的整體性能。FPGA模塊用于直接控制硬件芯片,完成輸人輸出控制。算法模塊和FPGA模塊均設計為內(nèi)核模塊中,系統(tǒng)啟動時,直接加載到實時內(nèi)核中。
具體劃分如圖2所示:
點擊圖片查看大圖
圖2 系統(tǒng)軟件結(jié)構(gòu)和模塊劃分
3 系統(tǒng)軟件詳細設計
3.1 用戶層與內(nèi)核層的通信設計
用戶層與內(nèi)核層在嵌人式Linux系統(tǒng)中屬于兩個相對獨立的空間,兩個空間之間不能直接進行通信和數(shù)據(jù)交換。嵌入式Linux系統(tǒng)進行Xenomai實時化改造后,管道通信、消息隊列和共享內(nèi)存等全部保留。用戶層與內(nèi)核層通過管道通信進行連接,在內(nèi)核層建立管道后,在用戶層可以通過讀取設備文件進行管道讀寫。
內(nèi)核層創(chuàng)建及讀寫管道如下:
int rt_pipe_create (RT_ PIPE *pipe, const char*name, int minor,siu 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 PipeO=open("/dev/ntp0",O_RDWR);
//打開管道文件
int write(int handle, void *buf, int nbyte);
//向管道文件寫入數(shù)據(jù)
int read(int handle, void *buf, int nbyte);
//讀取管道文件數(shù)據(jù)
3.2 用戶層的設計
友好的人機界面是數(shù)控必須具備的功能,用戶層的主要任務就是提供人機交互界面。通過比較市面上流行的GUI開發(fā)軟件Qt/Embedded,MiniGUI, UC/GUI和Nano-X,結(jié)合Linux特性,本數(shù)控系統(tǒng)選用Qt/Embedded進行界面程序的開發(fā)。Qt/E是一個完整的基于framebuffer的GUI系統(tǒng),它用C++編寫,對用C語言程序有很好的兼容性,有著豐富的API函數(shù)庫和圖形處理功能,界面開發(fā)與圖形驅(qū)動分開,易于開發(fā)和移植,同時它也是開源軟件。
設計過程中,根據(jù)用戶層的劃分,把位置、刀補、程序等界面采用單獨的QWidget設計,每個界面都有自己的頭文件和cpp文件,所有界面公用一個數(shù)據(jù)結(jié)構(gòu),將各個界面通用的參數(shù)放到一起,設置一個主Mainwindow,用于系統(tǒng)初始化、界面切換、變量初始化以及加載系統(tǒng)信息等功能。主界面中對按鍵的處理也是相當重要的,開發(fā)過程中充分利用Qt中的按鍵事件,設計過程中區(qū)分按下及釋放事件,并單獨編寫按鍵更新程序。具體如下:
void mainWindow::keyPressEvent(QKeyEvent *k}
void mainWindow::keyReleaseEvent(QKeyEvent *k)
void mainWindow::keyUpdateQ
用戶層設計過程中著重要考慮的就是各個界面之間的通信問題,各界面之間充分利用Qt特有的信號與槽的通信機制,在界面之間進行信號發(fā)送和槽函數(shù)調(diào)用。具體實現(xiàn)如下:
signals: void mySignal(); //信號
public slots: void mySlotQ; //槽函數(shù)
bool QObject::connect(const QObject*sender,
const char*signal, const QObject*receiver,
const char * member);//信號與槽函數(shù)的連接
程序中可以通過emit();函數(shù)發(fā)出signals,調(diào)用與信號連接的槽函數(shù)。
3.3 內(nèi)核層的設計
系統(tǒng)軟件設計的關鍵仍然是內(nèi)核層的設計,內(nèi)核層滿足硬實時任務的