尚德波
(潍坊职业学院,潍坊 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实现了数控系统插补算法,插补运算效率较传统算法更高,该软件网络信息化开发的优势为这些算法对实现网络化数控系统的研究具有重要作用,尤其通过坐标变换的方法集中统一到第一象限进行运算,方便解决插补过程的跨象限问题,大大提高了插补效率的时效性。