李 芬,王海濤,常 勇,孫明軍,何宏宏,宮迎輝
(1.煙臺工程職業技術學院 數控技術系,煙臺 264006;2.北京機械工業自動化研究所,北京 100120)
針對用戶而言,零件加工程序僅描述該線形所必須的相關參數,直線僅描述起點和終點坐標,圓弧則僅提供起終點坐標、圓心坐標等信息。單單給出這些信息是無法滿足數控機床控制執行部件運動要求的,必須根據其運行軌跡在已知信息點之間實時計算出滿足要求的中間點,這種在已知數據點之間插入中間點的方法就是插補,其實質就是數據點的密化。插補的實現方法有很多,不同計算方法對應不同的算法。目前應用的插補算法基本可以分為兩類,一類是基準脈沖插補,又稱為行程增量插補或脈沖增量插補,其插補方法有逐點比較法、數字脈沖乘法器法、數字積分法和最小偏差法等,其最主要的特點是插補計算的結果是以一個一個脈沖的方式輸出給伺服系統,或者說產生的是單個的行程增量[1]。另一類是數據采樣插補,或稱為時間分割法,其插補方法有直接函數法、內接弦線法和擴展DDA法、內外均差弦線法等,與基準脈沖插補法不同,采用數據采樣法插補時,在加工某一直線段或圓弧段的加工指令中必須給出加工進給速度,先通過速度計算,將進給速度分割成單位時間間隔的插補進給量(或稱為輪廓步長),又稱為一次插補進給量,按上式計算出一次插補進給量后,根據刀具運動軌跡與各坐標軸的幾何關系, 就可求出各軸在一個插補周期內的插補進給量,按時間間隔再以增量形式給各軸送出一個一個的插補增量,通過驅動使機床完成預定軌跡的加工。
擴展的DDA數據采樣插補算法是用割線代替切線來逼近圓弧,這樣可以在很大程度上提高插補精度,其插補精度在理論上高于內接弦線法而低于內外均差弦線法。但其算法要比內外均差弦線法方便很多[3]。
以圓弧圓心為原點建立坐標系來說明圓弧插補原理,插補原理如圖1所示。

圖1 圓弧插補原理
以加工第一象限圓弧AD為例,圓弧半徑為R,設現在刀具加工點Ai-1位置,線段Ai-1Ai是按原DDA圓弧插補,沿現加工點的圓弧切線方向的一個輪廓進給步長DL(=f),從圖中可以清楚看出,點Ai偏離圓弧要求的軌跡很遠,產生的徑向誤差很大。本文所采用的擴展DDA算法就是在原DDA算法的基礎上進行修正進給方向得到的,具體計算步驟如下。
1)計算原DDA算法的一個進給步長終點坐標Ai;
2)計算線段Ai-1Ai的中點坐標B;
3)計算圓心坐標O到點B長度L1;
4)以坐標O與圓心,L1為圓弧半徑,計算此圓弧在點B處的單位方向矢量;
5)計算B點的單位方向矢量在X和Z坐標軸方向上的分量;
6)加工點Ai-1在X和Z坐標軸上的進給增量值DXi、DZi就是步驟5)求出的分量值。
7)計算刀具新加工點的坐標值Xi= Xi-1+ DXi,Zi= Zi-1+ DZi;
通過推導可以證明Ai-1Ai與Ai-1Ai’相等,通過圖中的比較也可以明顯的看出,采用擴展DDA后圓弧插補精度得到很大的提高。
實時性是一個數控系統必須滿足的要求,因此在程序設計階段就需要充分考慮這方面的因素,在架構選擇上采用多線程方式,并行處理,各線程之間通過消息隊列進行通信[4,5]。插補功能的實現分四部分構成,即插補預處理、插補運算、位置控制和插補輸出。架構框圖如圖2所示。

圖2 插補程序架構圖
插補預處理線程,主要負責把一個譯碼結果處理成插補運算所需的結果。本線程主要完成圓弧圓心坐標、圓弧坐標、起始終點計算以及預讀下一段程序段,與當前程序段一起進行轉接點的計算,完成循環指令處理等,并發送插補預處理結果到插補運算消息隊列。
插補運算線程,主要針對插補預處理的結果進行加減速和進給增量的計算。
位置控制線程,主要進行完成插補輸出脈沖與余量脈沖等的計算。
插補輸出,主要是根據工作模式完成硬件FPGA的數據寫入。
插補預處理與插補運算線程是用軟件程序實現圓弧插補的兩個重要線程,位置控制和插補輸出則是將插補運算結果輸出到硬件,以控制和驅動執行元件的兩個線程。
插補預處理是讀取譯碼結果進行處理,處理后輸出插補結果。因此數據結構需要建立譯碼數據結構和插補運算的數據結構,另外預處理過程需要對上一段、當前段和下一段代碼進行分析,以前還需要段的數據結構。在此只介紹插補運算的數據結構,如下所示:

該數據結構也是用于發送消息到插補運算線程的結構。
插補預處理線程首先進行變量的初始化,之后進入for循環,在for循環中先要進行緩沖區的初始化并進行消息隊列的讀取,如果沒有消息,則循環讀取。有消息后還需要進行查詢,若隊列中消息少于一定數量,則還需要通知譯碼線程進行譯碼。讀取的消息內容放置在緩沖區中,之后再放入當前段數據區。圓弧插補預處理的過程就是根據當前段數據進行判斷,結合圓弧給定的條件計算出起始點坐標、圓心坐標和圓弧半徑等,并根據這些計算圓弧上起點與終點間弦線長度、弦線中點坐標、圓心到弦線中點距離及當前終點的方向矢量,當前段數據處理完后,還需要讀入下一段程序進行處理,計算內容與上一段基本相同,根據上一段終點的方向矢量與下一段起點的方向矢量進行C刀補計算,獲得兩軌跡轉接點坐標值。并將當前段數據及轉接點數據發送給插補運算線程。
插補運算線程,首先進行加減速的計算,之后再進行插補運算,插補運算的過程就是按照圓弧插補原理計算下個插補點的過程,也就是根據步驟求出X軸和Z軸方向進給增量值的過程;計算增量值的過程首先需要考慮的就是進給的方向,即先進行方向判斷,進給方向采用單獨的變量來表示。每次計算新加工點坐標后都需要進行終點判斷,如果到達終點則停止,反之則重復步驟繼續進行插補計算。插補運算線程與位置控制線程之間同樣采用消息隊列進行數據傳輸,數據結構如下:

位置控制線程與插補輸出線程負責將各軸插補過程中對上次的余量與本次的增量進行判斷處理,以使各軸都每一步長都輸出合適脈沖或不輸出,確保兩軸聯動的軌跡與實際軌跡相比在允許的誤差范圍內。位置控制線程通過發送消息隊列方式發送數據到插補輸出線程,插補輸出線程則根據接收的數據,進行判斷處理后寫入硬件設備,用于驅動和控制運動元件。相比于插補預處理和插補運算線程,位置控制線程與插補輸出更注重實時性和準確性,是最終的軟件輸出部分,代碼比較精簡。
本文是基于擴展DDA算法進行的圓弧插補程序設計,設計過程中充分考慮到數控系統對實時性高的特點,采用了多線程處理方式,可有效的解決插補周期問題,提高進給速度。但圓弧插補算法的程序只能是應用程序的一部分,具體的編寫內容要受到硬件平臺和所選用的實時操作系統限,但插補算法的原理是相通的,熟悉一種平臺程序編寫后可方便的修改到另一種平臺或系統下運行。擴展DDA算法的圓弧插補在程序實現上很簡單,但要實際應用還需要很多的工作要做,數控系統的程序是一個綜合的內容,不僅涉及到譯碼、插補運算還要有刀補處理、間隙補償等到內容,本文僅僅是針對擴展DDA算法的圓弧插補的算法給出簡單的程序實現。
[1]李恩林.插補原理[M].北京: 機械工業出版社,1984.
[2]李赫林,方健.機床數控技術[M].北京: 機械工業出版社,2001.
[3]顏雁鷹.時間分割法插補運算[J].應用科學,2008,55-56.
[4]孫程建.基于Linux的嵌入式數控系統底層軟件設計[D].武漢科技大學.
[5]朱達宇.基于RTLinux的全軟件數控系統設計與開發[D].四川大學.