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