|
|
一、问题现象 用户通过以下编程:
# 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,对矢量速度的设定都已进行充分的考虑,不再需要用户添加额外的代码进行计算了。
|
|
状 态:
离线
公司简介
产品目录
|
|
公司名称:
|
深圳市雷赛智能控制股份有限公司
|
联 系 人: |
梁邦敏
|
电 话: |
755-26401178
|
传 真: |
|
地 址: |
深圳市南山区登良路天安南油工业区2栋3楼 |
邮 编: |
518000 |
主 页: |
|
|
|
|
|