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

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

圖2 插補(bǔ)程序架構(gòu)圖
插補(bǔ)預(yù)處理線程,主要負(fù)責(zé)把一個(gè)譯碼結(jié)果處理成插補(bǔ)運(yùn)算所需的結(jié)果。本線程主要完成圓弧圓心坐標(biāo)、圓弧坐標(biāo)、起始終點(diǎn)計(jì)算以及預(yù)讀下一段程序段,與當(dāng)前程序段一起進(jìn)行轉(zhuǎn)接點(diǎn)的計(jì)算,完成循環(huán)指令處理等,并發(fā)送插補(bǔ)預(yù)處理結(jié)果到插補(bǔ)運(yùn)算消息隊(duì)列。
插補(bǔ)運(yùn)算線程,主要針對(duì)插補(bǔ)預(yù)處理的結(jié)果進(jìn)行加減速和進(jìn)給增量的計(jì)算。
位置控制線程,主要進(jìn)行完成插補(bǔ)輸出脈沖與余量脈沖等的計(jì)算。
插補(bǔ)輸出,主要是根據(jù)工作模式完成硬件FPGA的數(shù)據(jù)寫入。
插補(bǔ)預(yù)處理與插補(bǔ)運(yùn)算線程是用軟件程序?qū)崿F(xiàn)圓弧插補(bǔ)的兩個(gè)重要線程,位置控制和插補(bǔ)輸出則是將插補(bǔ)運(yùn)算結(jié)果輸出到硬件,以控制和驅(qū)動(dòng)執(zhí)行元件的兩個(gè)線程。
插補(bǔ)預(yù)處理是讀取譯碼結(jié)果進(jìn)行處理,處理后輸出插補(bǔ)結(jié)果。因此數(shù)據(jù)結(jié)構(gòu)需要建立譯碼數(shù)據(jù)結(jié)構(gòu)和插補(bǔ)運(yùn)算的數(shù)據(jù)結(jié)構(gòu),另外預(yù)處理過(guò)程需要對(duì)上一段、當(dāng)前段和下一段代碼進(jìn)行分析,以前還需要段的數(shù)據(jù)結(jié)構(gòu)。在此只介紹插補(bǔ)運(yùn)算的數(shù)據(jù)結(jié)構(gòu),如下所示:

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

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