|  |  | 
| 
|  | 发表人:zhong2010 | 发表时间:2010/5/9 21:08:00 |   |  发表新论题
 |  
| 本栏论题: | 如何正确计算及设置DMC1000插补的矢量速度  [10382] |  
| 如何正确计算及设置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,对矢量速度的设定都已进行充分的考虑,不再需要用户添加额外的代码进行计算了。
 
 
 |  |  
| 
|  相关博客新闻: |  |  
| 
|  相关技术论坛: |  |  
| 
|  相关技术论文: |  |  |