尚德波
(濰坊職業(yè)學(xué)院,濰坊 261041)
對數(shù)控系統(tǒng)的技術(shù)而言,插補算法對整個控制系統(tǒng)的性能指標(biāo)提升至關(guān)重要。脈沖增量插補中逐點法是插補算法中的典型算法,它相對運算較為直觀,誤差不超過一個脈沖當(dāng)量,輸出脈沖比較均勻。目前的生產(chǎn)中數(shù)控系統(tǒng)多以C、C++等軟件實現(xiàn),插補過程計算效率較低,相對影響系統(tǒng)的控制速度。本文選擇新型Java語言進行開發(fā),該語音因其穩(wěn)定和多線程等特點被一些研究機構(gòu)和廠商用于開發(fā)新型網(wǎng)絡(luò)化數(shù)控系統(tǒng)。文章旨在采用JAVA語言實現(xiàn)逐點法插補及坐標(biāo)變換算法運算過程,尋求一種既能保證精度、簡化計算,又能穩(wěn)定快捷實現(xiàn)運算的方法。
逐點比較法能逐個點計算和判別運動偏差,并逐點糾正以逼近理論線性軌跡。軌跡插補旨在線段的起點和終點坐標(biāo)值之間進行微觀數(shù)據(jù)點密化,求出一系列中間點的坐標(biāo),并向相應(yīng)坐標(biāo)輸出脈沖信號。逐點法的插補過程包含四個步驟:第一,進行偏差判別,根據(jù)偏差值判別當(dāng)前刀具加工點的具體位置;第二,坐標(biāo)進給,根據(jù)新判別的結(jié)果,控制刀具向坐標(biāo)方向進給一步;第三,進行偏差計算,根據(jù)遞推公式計算出進給一步到新的加工點的偏差,提供下步判別依據(jù);第四,終點判別,在計算偏差的同時,進行終點判別,確定是否達終點,若到則停止插補。具體如圖1所示。
圖1 逐點法插補流程
直線插補過程中各象限偏差進給方向如圖2所示。以一象限加工直線OL1為例,起點為坐標(biāo)原點O,終點坐標(biāo)為L1(xe,ye),動點坐標(biāo)(xi,yi)則方程表示為:xeyi-yexi=0
圖2 直線四象限插補方向
加工時動點坐標(biāo)(xi,yi),則會存在以下三種情況:加工點在直線上有xeyi-yexi>0;加工點在直線的上邊,有xeyi-yexi=0;加工點在直線下邊,則有xeyi-yexi<0。
假設(shè)Fi,j=xeyi-yexi為偏差判別函數(shù),則可以依次判斷出F≥0和F<0時點在直線的具體方位。
對于其他象限,通過坐標(biāo)變換法將其他三個象限直線的插補計算公式都統(tǒng)一到第一象限的計算公式中,進給脈沖的方向則仍然由實際的象限決定。坐標(biāo)變換的實質(zhì)就是將其他各個象限直線的終點坐標(biāo)與加工點的坐標(biāo)取絕對值,這樣插補計算公式和插補流程圖與實際插補第一象限直線時一樣。對跨象限坐標(biāo)變換,本文與傳統(tǒng)算法不同在于將四個象限的插補統(tǒng)一坐標(biāo)變換,形成四象限綜合算法流程圖,綜合后直線四象限插補如圖3表示,計算公式統(tǒng)一采用F=|Xe||Y|-|Ye||X|。
用逐點法插補直線時,每一步進給后,都要判斷當(dāng)前加工點是否到達終點位置,設(shè)定一個終點減法計數(shù)器,存入各個坐標(biāo)軸插補或進給的總步數(shù),在插補過程中不管向哪個方向每進給一步,從總步數(shù)中減1,直到計數(shù)器中的存數(shù)為零,表示插補到達終點;根據(jù)圖3流程圖采用JAVA程序設(shè)計語言進行算法實現(xiàn),圖4為軟件實現(xiàn)的仿真實例,比如輸入起點坐標(biāo)(0,0),終點坐標(biāo)(6,8),從而得出圖示插補軌跡,任意輸入其他數(shù)值同樣自動運算完成并形成插補軌跡圖。
圖3 直線四象限插補流程
圖4 直線逐點法插補仿真實例
主要技術(shù)如下:當(dāng)點擊“插補演示”按鈕,在文本區(qū)TextArea中顯示過程,同時在畫布區(qū)Canvas中演示執(zhí)行步驟。x0,y0表示起點坐標(biāo),xe,ye表示輸入的終點坐標(biāo),x,y表示計算的中間坐標(biāo),數(shù)組xPoints,yPoints記錄每步執(zhí)行后點的(x,y)坐標(biāo)值,F(xiàn)為判別函數(shù)。代碼如下:
//在TextArea顯示逐點法直線插補的每步情況
E = E0 = Math.abs(xe) + Math.abs(ye);
for(int i=1; i<=E0; i++) {
F = Math.abs(xe) * Math.abs(y) - Math.abs(x) *Math.abs(ye);
if(F >= 0) {
s =“第” + i +“步:F=" + F + ">0; X=X+1=" + (++x)+ "; Y=Y=" + y + "; E=E-1=" + (--E) + " ";
}
else {
s =“第” + i +“步:F=" + F + "<0; X=X=" + x + ";Y=Y+1=" + (++y) + "; E=E-1=" + (--E) + " ";
}
xPoints[i] = x;
yPoints[i] = canvas.height - y;
text.append(s);
}
//在畫布區(qū)顯示演示步驟
canvas.setXP(xPoints);
canvas.setYP(yPoints);
canvas.setNP(nPoints);
canvas.repaint();
}
該新算法的實現(xiàn)可以在終點坐標(biāo)輸入任意象限數(shù)值,實現(xiàn)一次輸入快速計算出整個插補計算過程,解決了傳統(tǒng)算法中各象限分別軟件實現(xiàn)計算的弊端,在保證準(zhǔn)確率的基礎(chǔ)上,大大提高運算效率。
圓弧插補與直線插補過程原理相同,圓弧以加工點距圓心的距離與圓弧半徑大小比較來作為判別依據(jù)。圓的方程為x2+y2=R2,設(shè)加工時動點坐標(biāo)(xi,yj),判別函數(shù)根據(jù)遞推法結(jié)合偏差進給方向可以簡單推導(dǎo)點在圓內(nèi)外時各個進給方向的判別公式:
沿+x走一步xi+1=xi+1,得Fi+1=Fi,j+2xi+1
沿-x走一步xi+1=xi-1,得Fi+1=Fi,j-2xi+1
沿+y走一步y(tǒng)j+1=yj+1,得Fj+1=Fi,j+2yj+1
沿-y走一步y(tǒng)j+1=yj-1,得Fj+1=Fi,j-2yj+1
可以發(fā)現(xiàn),新加工點的偏差值可以用前一點的偏差值遞推出來。遞推法把圓弧偏差運算式由平方運算化為加法和乘2的運算,對于二進制而言,乘2運算容易實現(xiàn)。通過坐標(biāo)變換如同直線插補一樣將其他各個象限順、逆圓弧插補計算公式都統(tǒng)一到第一象限的逆圓弧插補計算,進給脈沖的方向仍由實際象限來決定,從而解決跨象限問題。該算法同樣在終點坐標(biāo)輸入任意象限數(shù)值,實現(xiàn)了一次坐標(biāo)數(shù)據(jù)輸入快速計算出圓弧整個插補計算過程,提高了運算效率和準(zhǔn)確率。
圓弧插補軟件開發(fā)主要代碼如下:
//在TextArea顯示逐點法圓弧插補的每步情況
E = E0 = Math.abs(xe - x0) + Math.abs(ye -y0);
for(int i=1; E > 0; i++) {
if(F >= 0) {
s = "第" + i + "步:F=" + F + ">=0; ";
F = F - 2*x + 1;
s = s + “F=F-2*X+1=” + F +”; X=X-1=” + (--x)+ “; Y=Y=” + y + “; E=E-1=” + (--E) + “ ”;
}
else {
s = "第" + i + "步:F=" + F + "<0; ";
F = F + 2*y + 1;
s = s + “F=F+2*Y+1=” + F +”; X=X=” + x + “;Y=Y+1=” + (++y) + “; E=E-1=” + (--E) + “ ”;
}
xPoints[j] = canvas.width/2 + x;
yPoints[j] = canvas.height/2 - y;
text.append(s);
}
圖5 圓弧逐點法插補仿真實例
圖5為第一象限起點(5,0),終點(0,5)的逆圓插補仿真實例圖。Java語言中利用Canvas的子類來創(chuàng)建畫布對象,并在子類中重寫父類paint方法。通過重寫paint方法時,可以在子類中使用對象g調(diào)用各種方法來構(gòu)造我們需要的步驟。如實現(xiàn)演示步驟時,在Canvas的子類中需設(shè)置的方法如下:
public void setXP(int xPoints[ ]){
this.xPoints = xPoints;
}
public void setYP(int yPoints[ ]) {
this.yPoints = yPoints;
}
public void setNP(int nPoints) {
this.nPoints = nPoints;
}
public void paint(Graphics g) {
g.drawPolyline(xPoints, yPoints, nPoints);
}
}
畫圓或畫直線可通過以下語句設(shè)置:
g.drawLine(x0, y0, xe, ye);
g.drawArc(left, top, width, height,angle0, angleE);
插補運算的實時性很強,算法如果太復(fù)雜,每次插補運算的時間將加長,從而會限制進給速度指標(biāo)和精度指標(biāo)的提高。本文采用的現(xiàn)代開發(fā)軟件JAVA實現(xiàn)了數(shù)控系統(tǒng)插補算法,插補運算效率較傳統(tǒng)算法更高,該軟件網(wǎng)絡(luò)信息化開發(fā)的優(yōu)勢為這些算法對實現(xiàn)網(wǎng)絡(luò)化數(shù)控系統(tǒng)的研究具有重要作用,尤其通過坐標(biāo)變換的方法集中統(tǒng)一到第一象限進行運算,方便解決插補過程的跨象限問題,大大提高了插補效率的時效性。