尚德波
(濰坊職業學院,濰坊 261041)
對數控系統的技術而言,插補算法對整個控制系統的性能指標提升至關重要。脈沖增量插補中逐點法是插補算法中的典型算法,它相對運算較為直觀,誤差不超過一個脈沖當量,輸出脈沖比較均勻。目前的生產中數控系統多以C、C++等軟件實現,插補過程計算效率較低,相對影響系統的控制速度。本文選擇新型Java語言進行開發,該語音因其穩定和多線程等特點被一些研究機構和廠商用于開發新型網絡化數控系統。文章旨在采用JAVA語言實現逐點法插補及坐標變換算法運算過程,尋求一種既能保證精度、簡化計算,又能穩定快捷實現運算的方法。
逐點比較法能逐個點計算和判別運動偏差,并逐點糾正以逼近理論線性軌跡。軌跡插補旨在線段的起點和終點坐標值之間進行微觀數據點密化,求出一系列中間點的坐標,并向相應坐標輸出脈沖信號。逐點法的插補過程包含四個步驟:第一,進行偏差判別,根據偏差值判別當前刀具加工點的具體位置;第二,坐標進給,根據新判別的結果,控制刀具向坐標方向進給一步;第三,進行偏差計算,根據遞推公式計算出進給一步到新的加工點的偏差,提供下步判別依據;第四,終點判別,在計算偏差的同時,進行終點判別,確定是否達終點,若到則停止插補。具體如圖1所示。

圖1 逐點法插補流程
直線插補過程中各象限偏差進給方向如圖2所示。以一象限加工直線OL1為例,起點為坐標原點O,終點坐標為L1(xe,ye),動點坐標(xi,yi)則方程表示為:xeyi-yexi=0

圖2 直線四象限插補方向
加工時動點坐標(xi,yi),則會存在以下三種情況:加工點在直線上有xeyi-yexi>0;加工點在直線的上邊,有xeyi-yexi=0;加工點在直線下邊,則有xeyi-yexi<0。
假設Fi,j=xeyi-yexi為偏差判別函數,則可以依次判斷出F≥0和F<0時點在直線的具體方位。
對于其他象限,通過坐標變換法將其他三個象限直線的插補計算公式都統一到第一象限的計算公式中,進給脈沖的方向則仍然由實際的象限決定。坐標變換的實質就是將其他各個象限直線的終點坐標與加工點的坐標取絕對值,這樣插補計算公式和插補流程圖與實際插補第一象限直線時一樣。對跨象限坐標變換,本文與傳統算法不同在于將四個象限的插補統一坐標變換,形成四象限綜合算法流程圖,綜合后直線四象限插補如圖3表示,計算公式統一采用F=|Xe||Y|-|Ye||X|。
用逐點法插補直線時,每一步進給后,都要判斷當前加工點是否到達終點位置,設定一個終點減法計數器,存入各個坐標軸插補或進給的總步數,在插補過程中不管向哪個方向每進給一步,從總步數中減1,直到計數器中的存數為零,表示插補到達終點;根據圖3流程圖采用JAVA程序設計語言進行算法實現,圖4為軟件實現的仿真實例,比如輸入起點坐標(0,0),終點坐標(6,8),從而得出圖示插補軌跡,任意輸入其他數值同樣自動運算完成并形成插補軌跡圖。

圖3 直線四象限插補流程

圖4 直線逐點法插補仿真實例
主要技術如下:當點擊“插補演示”按鈕,在文本區TextArea中顯示過程,同時在畫布區Canvas中演示執行步驟。x0,y0表示起點坐標,xe,ye表示輸入的終點坐標,x,y表示計算的中間坐標,數組xPoints,yPoints記錄每步執行后點的(x,y)坐標值,F為判別函數。代碼如下:
//在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);
}
//在畫布區顯示演示步驟
canvas.setXP(xPoints);
canvas.setYP(yPoints);
canvas.setNP(nPoints);
canvas.repaint();
}
該新算法的實現可以在終點坐標輸入任意象限數值,實現一次輸入快速計算出整個插補計算過程,解決了傳統算法中各象限分別軟件實現計算的弊端,在保證準確率的基礎上,大大提高運算效率。
圓弧插補與直線插補過程原理相同,圓弧以加工點距圓心的距離與圓弧半徑大小比較來作為判別依據。圓的方程為x2+y2=R2,設加工時動點坐標(xi,yj),判別函數根據遞推法結合偏差進給方向可以簡單推導點在圓內外時各個進給方向的判別公式:
沿+x走一步xi+1=xi+1,得Fi+1=Fi,j+2xi+1
沿-x走一步xi+1=xi-1,得Fi+1=Fi,j-2xi+1
沿+y走一步yj+1=yj+1,得Fj+1=Fi,j+2yj+1
沿-y走一步yj+1=yj-1,得Fj+1=Fi,j-2yj+1
可以發現,新加工點的偏差值可以用前一點的偏差值遞推出來。遞推法把圓弧偏差運算式由平方運算化為加法和乘2的運算,對于二進制而言,乘2運算容易實現。通過坐標變換如同直線插補一樣將其他各個象限順、逆圓弧插補計算公式都統一到第一象限的逆圓弧插補計算,進給脈沖的方向仍由實際象限來決定,從而解決跨象限問題。該算法同樣在終點坐標輸入任意象限數值,實現了一次坐標數據輸入快速計算出圓弧整個插補計算過程,提高了運算效率和準確率。
圓弧插補軟件開發主要代碼如下:
//在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的子類來創建畫布對象,并在子類中重寫父類paint方法。通過重寫paint方法時,可以在子類中使用對象g調用各種方法來構造我們需要的步驟。如實現演示步驟時,在Canvas的子類中需設置的方法如下:
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);
}
}
畫圓或畫直線可通過以下語句設置:
g.drawLine(x0, y0, xe, ye);
g.drawArc(left, top, width, height,angle0, angleE);
插補運算的實時性很強,算法如果太復雜,每次插補運算的時間將加長,從而會限制進給速度指標和精度指標的提高。本文采用的現代開發軟件JAVA實現了數控系統插補算法,插補運算效率較傳統算法更高,該軟件網絡信息化開發的優勢為這些算法對實現網絡化數控系統的研究具有重要作用,尤其通過坐標變換的方法集中統一到第一象限進行運算,方便解決插補過程的跨象限問題,大大提高了插補效率的時效性。