李 芬,常 勇,王 威
LI Fen1,CHANG Yong2,WANG Wei2
(1.煙臺工程職業技術學院 數控技術系,煙臺 264006;2.北京機械工業自動化研究所,北京 100120)
數控技術是發展尖端工業的使能技術和基礎裝備,數控系統作為數控車床的大腦,其性能直接影響甚至決定著機床的整體性能。數控機床既是高新技術專業不可缺少的基礎裝備,又是傳統產業更新換代的重要手段。隨著半導體技術的飛速發展,數控系統逐漸朝嵌入式方向發展。嵌入式系統是近年發展最快的技術之一,它是以應用為中心,以計算機技術為基礎、軟硬件可裁減,適應應用系統對功能、可靠性、成本、體積、功耗等綜合性嚴格要求的專用計算機系統。目前市面上主流的經濟型數控系統如廣州數控的GSK980TDb和北京凱恩帝K90Ti等都是使用了ARM處理器構建的嵌入式數控系統。
本數控系統硬件平臺分為兩大組成部分:ARM 子系統和 FPGA 子系統,采用主從式的兩級插補結構。ARM 子系統采用三星S3C2410處理器,主要用于粗插補計算,以及鍵盤、顯示和D/A轉換等管理工作。FPGA 子系統采用Altera 公司的ACEX 系列芯片,主要負責系統的精插補脈沖輸出、編碼器脈沖計數以及 I/O 控制等工作。
本數控系統軟件部分采用Xenomai實時化方案改造標準Linux內核[1],構建基于Xenomai的實時嵌入式操作系統。Xenomai/Linux系統為用戶程序提供了內核空間和用戶空間兩種模式,前者通過系統調用接口實現,后者通過實時內核實現。用戶空間的執行模式保證了系統的可靠性和良好的軟實時性,內核空間程序則能提供優秀的硬實時性[2]。
數控系統開發的關鍵是軟件部分,為縮短系統開發周期,本系統盡量采用模塊化設計,積極利用市場現有的成熟技術。該數控系統按功能模塊構架設計,大致劃分為如下幾個模塊:
控制模塊:控制模塊的主處理器采用市面上流行的三星S3C2410處理器,片上運行嵌入式Linux+Xenomai操作系統,負責信息存儲、LCD顯示、串口傳輸、USB 接口的處理,實現譯碼、文件系統、圖形顯示和 PLC 等功能。控制模塊采用市面流行的MINI2440開發板實現控制功能,該開發小板集成了三星S3C2440微處理器、并使用兩片外接的SDRAM芯片,兩片共64Mb并連在一起形成32位的數據總線寬度;配備2Mb的NOR FLASH和128Mb的NAND FLASH,支持兩種FLASH啟動,有利于開發階段的調試和系統文件的燒寫[3]。
鍵盤模塊:采用AVR單片機,負責鍵盤掃描、LED燈點亮等信號處理,通過串行口與ARM進行通信。
FPGA模塊:該模塊采用AlTERA的FPGA控制。負責輸入輸出接口控制、編碼器反饋和機床 I/O 信號處理。FPGA模塊與鍵盤模塊一起集成設計在核心板上,采用4層板設計,留出各個JTAG接口,利于集中調試和燒寫[4]。
電源及接口模塊:該模塊主要用于核心板和控制板的供電及I/O接口處理。該模塊設置在I/O接口板上,該板同樣采用4層板設計,配置各種外部連接和調試插頭。
各模塊組成的數控系統硬件結構如下圖所示:

圖1 系統硬件結構
數控系統本身是一個復雜的多任務并發的實時應用系統,目前市面上比較流行的實時操作系統有VxWorks、QNX等,這些系統實時性好,但開放性差并且價格昂貴;開源但不免費的uC/OS-II是由美國人 Jean J.Labrosse 先生所編寫的實時嵌入式操作系統內核,實時性好并且相當精簡,但由于其僅是操作系統內核,針對其內核要進行開發的內容和項目比較多,影響開發進度;因此本系統選用開放性好、移植性強、免費并且開源的嵌入式Linux+Xenomai實時操作系統作為軟件平臺,該軟件平臺具有良好的用戶態實時性和優秀的內核態實時性,可分別用于實時性不高的軟實時任務和實時性要求很高的硬實時任務。
系統軟件部分的開發是關乎整個數控系統研發成敗的關鍵。數控系統具備的功能比較多,但其主要功能是解釋翻譯數控代碼,并按照代碼要求自動完成工件的加工。自動加工過程主要是完成刀具軌跡的控制,如加減速、插補、位置控制等;其次是一些邏輯控制,如冷卻液開關及限位控制等等;除具備主要功能外,數控系統應該具備良好的人機界面等功能。如何合理的布置這些層次結構及劃分模塊,對整個數控系統的開放性、后期可擴展性以及系統的性能都具有重要意義。結合選用的嵌入式Linux+Xenomai軟件平臺,綜合考慮數控系統的功能需求及多任務之間數據依賴等要求,我們把系統分兩層進行開發:用戶層和內核層,每層又劃分為若干模塊和子模塊,同層模塊相互配合共同完成該層任務,用戶層與內核層之間通過命名管道實現數據通信[5]。
用戶層:主要提供系統的人機接口界面,人機接口界面內包含有位置界面、程序界面、刀補界面、設置界面、參數界面和診斷界面。人機接口界面為用戶提供直觀的操作界面及各種加工信息、狀態參數和診斷參數等,等待接受用戶的操作要求,并將操作要求和數據處理后傳遞給內核層。
內核層:主要用于內核控制、運算控制、輸入輸出控制,分算法模塊和FPGA模塊;算法模塊內又分譯碼、預插補、插補、位置控制、加減速控制、PLC控制等子模塊。每個子模塊都是一個單獨的線程,子模塊之間通過消息隊列進行通信。內核層中的算法模塊是整個系統的核心,它進行的都是實時性要求很高的插補、加減速、位置等控制任務,實現毫米級甚至微秒級的間隔周期;決定著系統的整體性能。FPGA模塊用于直接控制硬件芯片,完成輸入輸出控制。算法模塊和FPGA模塊均設計為內核模塊中,系統啟動時,直接加載到實時內核中。
具體劃分如圖2所示:

圖2 系統軟件結構和模塊劃分
用戶層與內核層在嵌入式Linux系統中屬于兩個相對獨立的空間,兩個空間之間不能直接進行通信和數據交換。嵌入式Linux系統進行Xenomai實時化改造后,管道通信、消息隊列和共享內存等全部保留。用戶層與內核層通過管道通信進行連接,在內核層建立管道后,在用戶層可以通過讀取設備文件進行管道讀寫。
內核層創建及讀寫管道如下:
int rt_pipe_create (RT_PIPE *pipe, const char*name, int minor,size_t poolsize);//創建管道
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);//向管道發送一條信息用戶層讀寫管道如下:int Pipe0 = open("/dev/rtp0",O_RDWR);//打開管道文件
int write(int handle, void *buf, int nbyte);//向管道文件寫入數據
int read(int handle, void *buf, int nbyte);//讀取管道文件數據
友好的人機界面是數控必須具備的功能,用戶層的主要任務就是提供人機交互界面。通過比較市面上流行的GUI開發軟件Qt/Embedded、MiniGUI、UC/GUI和Nano-X,結合Linux特性,本數控系統選用Qt/Embedded進行界面程序的開發。Qt/E是一個完整的基于framebuffer[6]的GUI系統,它用C++編寫,對用C語言程序有很好的兼容性,有著豐富的API函數庫和圖形處理功能,界面開發與圖形驅動分開,易于開發和移植,同時它也是開源軟件。
設計過程中,根據用戶層的劃分,把位置、刀補、程序等界面采用單獨的QWidget設計,每個界面都有自己的頭文件和cpp文件,所有界面公用一個數據結構,將各個界面通用的參數放到一起,設置一個主Mainwindow,用于系統初始化、界面切換、變量初始化以及加載系統信息等功能。主界面中對按鍵的處理也是相當重要的,開發過程中充分利用Qt中的按鍵事件,設計過程中區分按下及釋放事件,并單獨編寫按鍵更新程序。具體如下:
void mainWindow::keyPressEvent(QKeyEvent *k)void mainWindow::keyReleaseEvent(QKeyEvent *k)void mainWindow::keyUpdate()
用戶層設計過程中著重要考慮的就是各個界面之間的通信問題,各界面之間充分利用Qt特有的信號與槽的通信機制,在界面之間進行信號發送和槽函數調用。具體實現如下:
signals: void mySignal(); //信號
public slots: void mySlot(); //槽函數bool QObject::connect ( const QObject * sender,const char * signal, const QObject * receiver,
const char * member );//信號與槽函數的連接
程序中可以通過emit();函數發出signals,調用與信號連接的槽函數。
系統軟件設計的關鍵仍然是內核層的設計,內核層滿足硬實時任務的要求,將系統的插補算法、加減速算法以及位置控制算法等集成在一起;對于各個數控系統廠家,其插補算法和加減速控制算法都被列入公司核心機密,由此足以看出內核層設計的重要性。
內核層的軟件設計采用內核模塊直接掛載到系統內核中,FPGA模塊直接針對硬件用于輸入輸出數據傳輸,并且輸出內核符號供算法模塊直接讀寫FPGA設備。算法內核模塊中采用多線程設計,將預插補、插補、加減速、位置控制、PLC控制、手脈控制、譯碼控制以及顯示控制等采用單獨的線程進行設計,各線程之間通過命名管道和消息隊列進行數據交換。每個線程設立獨立的運行周期,周期設定必須滿足系統功能的需要,本系統插補周期設定為2ms。顯示控制用于讀取緩沖區數據,發送給用戶層進行屏幕顯示,其設定周期滿足基本顯示需要即可,本系統設定為200ms。以顯示線程為例,實現功能的部分函數具體如下:
void LCDDisp(void *cookie)
rt_task_set_periodic(&display_task,TM_NOW,200*1000000); //設置任務運行周期
for( ; ; )
{rt_task_wait_period(NULL); //掛起任務到下個周期再運行;
/* 顯示線程實現代碼*/}
算法模塊在加載到內核模塊時,首先要做的就是進行模塊的初始化,初始化過程中需要把內核層之間通信以及內核層與用戶層通信所需要的命名管道和消息隊列等創建完畢,內核層各線程之間可以通過讀寫管道和消息內存完成數據交換。實現函數如下:
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)
//管道讀寫數據
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)
//消息隊列讀寫數據
經濟型數控系統的軟件僅包括基本的x軸和z軸直線插補、圓弧插補等功能,屬于低端產品,開發過程較短,開發難度也較低,本系統軟件開發過程中綜合考慮了經濟型數控系統的特點,迅速快捷的進行開發,同時也預留了后期軟件升級為x軸、z軸和y軸三維插補的接口。設計過程中為系統人機界面部分也僅是滿足基本的需求,后期開發過程中仍然需要進一步的豐富和完善,尤其是在U盤文件處理和串口通信方面;但系統現有開發的功能完全可以滿足舊機床的數控化改造需求。
[1] 韓守謙,裴海龍,王清陽.基于Xenomai的實時嵌入式Linux操作系統的構建[J].計算機工程與設計,2011,32(1):96-98.
[2] 陳曾漢,張鵬,晏來成.基于Xenomai的實時測控系統的研究與實現[J].計算機應用與軟件,2009,26(5).
[3] 廣州友善之臂.mini2440用戶手冊.20110421版.
[4] 孫程建.基于Linux的嵌入式數控系統底層軟件設計[D],武漢科技大學.
[5] 朱達宇.基于RTLinux的全軟件數控系統設計與開發[D],四川大學.
[6] 趙霞.基于Frambuffer的嵌入式GUI系統實現[J].嵌入式軟件應用.2007,23(12-2).