|
|
一、問(wèn)題現(xiàn)象 用戶通過(guò)以下編程:
# define XCH 0 # define YCH 1
double fUnit[]={ 3200/5.0, 3200/5.0}; //脈沖當(dāng)量,每毫米脈沖數(shù) //每轉(zhuǎn)脈沖數(shù)為3200,每轉(zhuǎn)毫米數(shù)為5.0
short axisArray[]={ XCH, YCH };//選擇XY兩軸 long distArray[]={ x * fUnit[XCH], y*fUnit[YCH] }; //x和y為毫米單位的絕對(duì)位置
d1000_start_ta_line( 2, axisArray, distArray, 10, 10, 0.0);//勻速插補(bǔ)
通過(guò)實(shí)際運(yùn)動(dòng)發(fā)現(xiàn)以下情況: No.1 當(dāng)X=100,Y=0,即水平方向,所花時(shí)間為10.002秒 No.2 當(dāng)X=0,Y=100,即垂直方向,所花時(shí)間為10.003秒 No.3 當(dāng)X=100,Y=100,即45度斜線,所花時(shí)間為10.005秒
即三種情況下的運(yùn)行時(shí)間幾乎相當(dāng)(當(dāng)中的微小時(shí)間差可能由系統(tǒng)的多任務(wù)特性引起的),而實(shí)質(zhì)上當(dāng)走45度斜線時(shí),其距離等于100*sqrt(2) = 100*1.414=141.4毫米,由此可見(jiàn)距離長(zhǎng)了許多,故其速度也快了許多。此種情況在速度慢的情況下表現(xiàn)不明顯,但是在激光切割時(shí),速度不穩(wěn)定,同樣的能量切割出來(lái)的效果就不一致,質(zhì)量也就不能過(guò)關(guān)。
二、原因分析 DMC1000的開(kāi)發(fā)較早,對(duì)于直線插補(bǔ)的算法是采用三角函數(shù)進(jìn)行合成,故以上設(shè)定的10,10,0.0的速度是對(duì)距離長(zhǎng)的運(yùn)動(dòng)軸有效(即長(zhǎng)軸),不是一個(gè)矢量的速度,由此可見(jiàn),同樣的速度設(shè)定會(huì)因?yàn)橹本的斜率不同而快慢不一致。
三、解決方法 解決此問(wèn)題也很簡(jiǎn)單,每次需要重新計(jì)算長(zhǎng)軸的速度,以用于作為插補(bǔ)速度,下面給出原代碼,以對(duì)上面的代碼進(jìn)行補(bǔ)充:
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脈個(gè)不要 return nAxises; long nStart,nSpeed; //計(jì)算出新的速度 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是計(jì)算出來(lái)的最后設(shè)定的速度。 關(guān)于speed是一個(gè)速度結(jié)構(gòu),大致如下(單位:毫米/秒)
typedef struct tag_SPEED { double start; double speed; double accel; };
四、附帶聲明 在DMC1000以后的系列控制卡,如:DMC2000,DMC3000,DMC5000,對(duì)矢量速度的設(shè)定都已進(jìn)行充分的考慮,不再需要用戶添加額外的代碼進(jìn)行計(jì)算了。
|
|
|