如何正确计算及设置DMC1000插补的矢量速度
一、问题现象
用户通过以下编程:
# define XCH 0
# define YCH 1
double fUnit[]={ 3200/5.0, 3200/5.0}; //脉冲当量,每毫米脉冲数
//每转脉冲数为3200,每转毫米数为5.0
short axisArray[]={ XCH, YCH };//选择XY两轴
long distArray[]={ x * fUnit[XCH], y*fUnit[YCH] }; //x和y为毫米单位的绝对位置
d1000_start_ta_line( 2, axisArray, distArray, 10, 10, 0.0);//匀速插补
通过实际运动发现以下情况:
No.1 当X=100,Y=0,即水平方向,所花时间为10.002秒
No.2 当X=0,Y=100,即垂直方向,所花时间为10.003秒
No.3 当X=100,Y=100,即45度斜线,所花时间为10.005秒
即三种情况下的运行时间几乎相当(当中的微小时间差可能由系统的多任务特性引起的),而实质上当走45度斜线时,其距离等于100*sqrt(2) = 100*1.414=141.4毫米,由此可见距离长了许多,故其速度也快了许多。此种情况在速度慢的情况下表现不明显,但是在激光切割时,速度不稳定,同样的能量切割出来的效果就不一致,质量也就不能过关。
二、原因分析
DMC1000的开发较早,对于直线插补的算法是采用三角函数进行合成,故以上设定的10,10,0.0的速度是对距离长的运动轴有效(即长轴),不是一个矢量的速度,由此可见,同样的速度设定会因为直线的斜率不同而快慢不一致。
三、解决方法
解决此问题也很简单,每次需要重新计算长轴的速度,以用于作为插补速度,下面给出原代码,以对上面的代码进行补充:
double fP1 = distArray[XCH] - (double)d1000_get_command_pos(XCH);
double fP2 = distArray[YCH] - (double)d1000_get_command_pos(YCH);
double fLen= sqrt( fP1*fP1 + fP2*fP2 );
if( fLen < 1 )//0脉个不要
return nAxises;
long nStart,nSpeed; //计算出新的速度
if( fabs(fP1)>fabs(fP2) )
{
double kx = fP1 / fLen;
double AP = kx * fP1;
kx = AP / fP1;
nStart = long(fUnit[XCH] * speed.start * kx );
nSpeed = long(fUnit[XCH] * speed.speed * kx );
}
else{
double ky = fP2 / fLen;
double AP = ky * fP2;
ky = AP/ fP2;
nStart = long(fUnit[YCH]*ky);
nSpeed = long(fUnit[YCH]*ky);
}
nStart和nSpeed是计算出来的最后设定的速度。
关于speed是一个速度结构,大致如下(单位:毫米/秒)
typedef struct tag_SPEED
{
double start;
double speed;
double accel;
};
四、附带声明
在DMC1000以后的系列控制卡,如:DMC2000,DMC3000,DMC5000,对矢量速度的设定都已进行充分的考虑,不再需要用户添加额外的代码进行计算了。
|