南航數(shù)控機床課程設計說明
《南航數(shù)控機床課程設計說明》由會員分享,可在線閱讀,更多相關《南航數(shù)控機床課程設計說明(36頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、《機床數(shù)控技術及應用》 課程設計說明書 時間:2011年12月15日 目錄 一 課程設計要求 ? 少 1、1—L-* < 1 J、 5555555555555555555555555555 2 二 . 編程言 "11U 1—L-* *\_1 I——I 555555555555555555555555555555 2 插補界面說明 4 H 1 1 丿丨 1 1 1 1 Mx LJ y -4 ,,,,,,,,,,,,,,,,,,,,,,,,,,,, 2 四? 逐點比較法直線插補流程圖及算法 2 五. DDA法圓弧插補插補流程
2、圖及算法 7 六. 其他程序說明 ,,,,,,,,,,,,,,,,,,,,,,,,,,,, 15 七. 心得體會 1~* 1 J 1 1 )))))))))))))))))))))))))))))) 16 附錄 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 17 3 2. 3. ?課程設計要求 1. 直線插補要求:用逐點比較法插補第 4象限的直線; 圓弧插補要求:用 DDA法插補1-4象限的順圓?。?界面設計要求:具有數(shù)據(jù)輸入
3、框,具有插補過程動態(tài)顯示功能,插補步長可調。 .編程語言 Visual C++ 三?插補界面說明 插補界面具有逐點比較法插補直線數(shù)據(jù)輸入?yún)^(qū), DDA法插補1-4象限順圓弧的數(shù)據(jù)輸入?yún)^(qū),兩者公用 的步長輸入?yún)^(qū),圖形顯示區(qū)域,四個按鈕實現(xiàn)插補過程的單步、連續(xù)顯示、圖形的清除, 插補界面的退出,以及必要的文字說明。 界面設計所用到的控件有:1個圖像控件,用來顯示輸出圖形; 13個編輯框,用來輸入插補直線與圓 弧所必要的數(shù)據(jù);2個單選框,用來選擇直線插補和圓弧插補; 4個按鈕,用來控制插補、清除、退出界 面;若干個靜態(tài)文本,進行相應地文字說明。 各控件名稱及對應的關聯(lián)變量名稱: 按鈕控
4、件 按鈕控件 按鈕控件 按鈕控件 單選框控件 單選框控件 編輯框控件 編輯框控件 編輯框控件 編輯框控件 編輯框控件 編輯框控件 編輯框控件 編輯框控件 編輯框控件 編輯框控件 編輯框控件 編輯框控件 編輯框控件 圖形控件: 若 1, IDC_BUTT0N1, m_danbu,實現(xiàn)單步插補功能按鈕; 2, IDC_BUTT0N2, m_qin gchu ,實現(xiàn)清除功能按鈕; 3, IDC_BUTT0N3, m_lia nxu ,實現(xiàn)連續(xù)插補功能按鈕; 4, IDC_BUTT0N4, m_tuichu ,實現(xiàn)退出界面功能按鈕; 1,IDC_RADIO1, m_line,其屬性選擇 G
5、ROUP選擇直線插補; 2,IDC_RADIO2,選擇圓弧插補; 1, IDC_EDIT1, m_alx 2, IDC_EDIT2, m_aly 3, IDC_EDIT3, m_blx 4, IDC_EDIT4, m_bly 5, IDC_EDIT5, m_aax 6, IDC_EDIT6, m_aay 7, IDC_EDIT7, m_bax 8, IDC_EDIT8, m_bay 9, IDC_EDIT9, m_ox 10, IDC_EDIT10, m_oy 11, IDC_EDIT11, m_r 12, IDC_EDIT12, m_n 13, IDC_EDIT1
6、3, m_bc ,輸入直線起點橫坐標; ,輸入直線起點縱坐標; ,輸入直線終點橫坐標; ,輸入直線終點縱坐標; ,輸入圓弧起點橫坐標; ,輸入圓弧起點縱坐標; ,輸入圓弧終點橫坐標; ,輸入圓弧終點縱坐標; ,輸入圓心橫坐標; ,輸入圓心縱坐標; ,輸入圓弧半徑值; ,輸入累加器位數(shù); ,輸入插補步長; IDC_PRINTAREA實現(xiàn)圖形輸出功能; F靜態(tài)文本控件,IDC_STATIC,作為相關文字說明。 四?逐點比較法直線插補流程圖及算法 1)偏差判別公式的推導 設直線的起點坐標為(x1,y1),終點坐標為(x2,y2),直線上的任意一個動點為 (x,y)
7、,插補的 步長為b,則偏差判別函數(shù) F=(x2-x1)*y-(y2-y1)*x 對位于第四象限的直線,有: 當F>=0時,向+x方向進給一個脈沖當量,此時 x(i+1)=xi+b ,則有 F(i+1)=Fi-(y2-y1)*b 當F< 0時,向-y方向進給一個脈沖當量,此時 y(j+i)=yj-b ,則有 F(j+1)=Fj+(x2-x1)*b 終點判別器E用來判別脈沖次數(shù),每進給一次 E減1,直到其值為 0時插補過程結束,E值由下面 公式所得: E=((x2-x1)+(y1-y2))/ b 2)直線插補流程圖: 開始 x1 >=0,y1>=0,x2>
8、0,y2<0 初始化:E=(x2-x1)+(y1-y2),F=0,x=x1,y=y1 E=0 -Y方向走一步 F=F+b*(x2-x1),y=y-b F>=0 +X方向走一步 F=F-b*(y2-y1),x=x+b E=E-1 輸岀直線不在第四象限 結束 3)單步插補直線實現(xiàn)程序及變量說明 定義靜態(tài)變量static,變量類
9、型為double型,在每次單擊按鈕控件執(zhí)行程序后,該變量的值始終存在 可以實現(xiàn)對插補次數(shù)的計算和判別。 static double NX=0, NY=0 , N=0 , m , x , y , F=0 ; N x, y i_blx 10 NX為+x方向的進給次數(shù)累加,用于橫坐標計算; NY為-y方向進給次數(shù)累加,用于縱坐標計算; 為x ,y兩個方向的累加次數(shù),用于和終點判別器比較; m為終點判別器,用來判斷插補是否結束; 用來存放插補過程中動點坐標; F為偏差判別函數(shù)。 在插補程序中使用的變量名與流程圖中變量的對應關系為: m_alx對應x1,m_aly對應y1, 對應x2
10、, m_bly對應y2, m_bc對應b, m對應E。變量賦的初值為: m」ine = 0, m_alx = 0.0, m_aly = 0.0, m_blx = 4.0,m_bly = -4.0, m_bc = 1.0。 插補程序中的一些說明: 因為輸出的圖形坐標數(shù)值為像素點,在圖形中顯示很小,所以在下述的程序中將輸出的數(shù)值擴大 倍,可以在圖形控件上更清晰地顯示圖形,其值本身并不具有實際的意義。 禾U用UpdateData(true)函數(shù)實現(xiàn)獲取輸入的參數(shù)值。 設置圖形顯示區(qū)域: CStatic*pWnd=(CStatic*)GetDlgltem(IDC_PRINTAREA);
11、CDC*pdc=pWnd->GetDC(); CRect rc; pWnd->GetClie ntRect(&rc); CRgn rgn; rgn. CreateRectRg n(rc.l eft+1,rc.top+7,rc.right-2,rc.bottom-2); pdc->SelectClipRg n(&rgn); pdc->SetViewportOrg((rc.left+rc.right)/2,rc.bottom-150); 在圖形控件上畫坐標軸: pdc->MoveTo(-150,0); pdc->Li neTo(150,0); pdc->MoveTo(0,-15
12、0);
pdc->Li neTo(0,150);
在圖形控件上輸出原點、x軸、y軸符號:
pdc->TextOut(-10,-20,"o");
pdc->TextOut(150,0,"x"); pdc->TextOut(-5,-150,"y");
單步直線插補程序:
if (m_li ne==0) 〃選擇直線插補
{ pdc->MoveTo(10*m_alx,-10*m_aly); 〃畫出需要插補的直線
pdc->Li neTo(10*m_blx,-10*m_bly);
if((m_alx
13、=0)) //判別輸入的直線在第 4象限,如果不在,結束程序并提示輸入第 4象限的直線 { x=10*m_alx+10*NX*m_bc; // 計算動態(tài)坐標 y=-10*m_aly+10*NY*m_bc; 4 # # m=((abs(m_blx)_abs(m_alx))+(abs(m_bly)_abs(m_aly)))/(m_bc)_N; II終點判別器計算 II終點判別器不為0,執(zhí)行插補,否則結束 if(m>0) { if(F>=0) { 〃偏差判別函數(shù)大于 0, x方向進給 } else NX=N
14、X+1; N=N+1; pdc->MoveTo(x,y); x=x+10*m_bc; 〃+x方向進給一次 〃進給次數(shù)累加器加 1 〃將坐標移到直線起點 II計算橫坐標 pdc->SelectObject (new CPe n(PS_SOLID,0,RGB(255,0,0))); II改變插補線段的顏色,此處選擇紅色 pdc->Li neTo(x,y); 〃畫直線 F=F-m_bc*(abs(m_bly)-abs(m_aly)); II重新計算偏差判別函數(shù),并結束判斷 〃偏差判別函數(shù)小于 0, y方向進給 NY=NY+1; N=N+1; pdc->MoveTo(x,y
15、); y=y+10*m_bc; II-y方向進給一次 〃進給次數(shù)累加器加1 〃將坐標移到直線起點 II計算縱坐標 pdc->SelectObject (new CPe n(PS_SOLID,0,RGB(255,0,0))); II改變插補線段的顏色,此處選擇紅色 pdc->Li neTo(x,y); 〃畫直線 F=F+m_bc*(abs(m_blx)-abs(m_alx)); 〃重新計算偏差判別函數(shù),并結束判斷 } I*此段函數(shù)用于連續(xù)插補 m=m-1; if(m==0) { KillTimer(1); } //終點判別器減1 〃如果終點判別器為 0,關閉定時器1
16、,連續(xù)插補結束 I*此段函數(shù)用于連續(xù)插補 } } else 〃提示輸入的直線不在給定的象限 AfxMessageBox("請輸入位于第四象限的點 ”); } 4)連續(xù)插補直線的實現(xiàn) 方案1:通過定時器實現(xiàn)逐段顯示插補軌跡 void CMyDlg::O nButto n3() { SetTimer(1,500,NULL); II選擇定時器1,定時時間500ms; ■ - 7 5
17、
}
void CMyDlg::OnTimer(UINT nIDEvent)// 定時器1函數(shù),調用 OnButton1()函數(shù),定時器關閉如上所述
{
On Butto n1();
}
方案2:通過循環(huán)體,一次實現(xiàn)插補軌跡的顯示
程序各行的含義同單步插補程序
if (m_li ne==0)
{
pdc->MoveTo(10*m_alx,-10*m_aly);
pdc->Li neTo(10*m_blx,-10*m_bly);
if((m_alx 18、&(m_aly>m_bly)&&(m_alx>=0)&&(m_aly<=0))
{
x=10*m_alx+10*NX*m_bc;
y=-10*m_aly+10*NY*m_bc;
m=((abs(m_blx)_abs(m_alx))+(abs(m_bly)_abs(m_aly)))/(m_bc)_N;
pdc->MoveTo(x,y);
while(m>0) 〃通過while循環(huán)一次實現(xiàn)插補軌跡顯示
{
if(F>=0)
{
F=F-m_bc*(abs(m_bly)-abs(m_aly));
x=x+10*m_bc;
}
else
{
F=F+m_bc*(abs(m 19、_blx)-abs(m_alx));
y=y+10*m_bc;
}
pdc->L in eTo(x,y);
m=m-1;
}
AfxMessageBox("連續(xù)插補結束”);
}
五.DDA法圓弧插補插補流程圖及算法
1)圓弧插補示意圖
插補1-4象限的順圓,要分成兩段圓弧來實現(xiàn),分別為第 1象限順圓弧和第 4象限順圓弧。圓弧插
補通過半加載實現(xiàn),即積分累加器 Jrx, Jry中存放寄存器最大容量的一半。假設圓弧起點坐標 (x1,y1),終點
坐標(x2,y2),根據(jù)DDA法插補圓弧的要求,x軸被積函數(shù)寄存器 Jvx存放y1, y軸被積函數(shù)寄存器 Jvy存 放x1 20、。
DDA法插補第1象限順圓插補器示意圖:
DDA法插補第4象限順圓插補器示意圖:
N
Y
N
m=((xO+r) x1+y1+(x0+r)x2+|y2|)/b
N
N
Y
Y
1-xO+Tx*b
Y
1
N
N
Y
Y
N
Y
N
X=X+Xe
Y=Y-M;Ey=Ey-1;Ty=Ty+1;y=y-b; n=n-1;m=
r1=(x1-x0)A2+(y1-y0)A2 r2=(x2-xO)#+(y2-yO)A2,T=1
Xe=y1-Ty*b; N
Ex=(r+xO-x1)/b;Ey=y1/b;
N
m=m-Tx-Ty- 21、T1x-T1y
N
x1;x=x+b;n=n-1;m
N
Y仁 Y1-M1;Ey=Ey-1;T1y=T1y+1;y=y-b
T-T-1
流程圖中變量說明: 靜態(tài)變量:
Y
X1=X1+Xe
X1=X1-M1;E
Ex-( i+規(guī)-x2)/b;Ey=|y2|/b;N=Ex+Ey,x=(i+x0)y=0;Mi n J1—_
Xe= T1y*b;Ye=r+T1x*b;—
結束
22、
m:圓弧插補終點判別器; T:圓弧插補象限標志位, T=1,插補第1象限圓弧,T=0插補第4象限圓 ??;Ex, Ey,x,y方向終點判別器;n第1象限圓弧終點判別器;x,y動態(tài)點坐標值; Xe, Ye,分別為 x、y軸被積函數(shù)寄存器; X,Y為第1象限x、y軸積分累加器,X1,Y1分別為第4象限x、y軸積分累 加器;Tx,Ty為第1象限x、y軸插補計數(shù)器,T1x,T1y為第4象限x、y軸插補計數(shù)器。
全局變量:
M,M1存放寄存器最大存儲容量。
3)單步插補圓弧實現(xiàn)程序及變量說明
部分變量說明如上, 插補程序 23、中與流程圖中的變量對應關系為: m_aax對應x1 , m_aay對應y1, m_bax
對應x2, m_bay對應y2, m_ox對應x0, m_oy對應yO,m_r對應r, m_n對應n,m_bc對應b。變量賦 予的初值為: m_aax = 0.0, m_aay = 5.0, m_bax = 0.0, m_bay = -5.0, m_ox = 0.0,m_oy = 0.0,m_r = 5.0,
m_n = 3.0, m_bc = 1.0, n=1, X=0, X仁0,Y=0,丫仁0,Tx=0,T1x=0, Ty=0, T1y=0, T=1, M=1,
M1=1。未列出的變量不賦初值。 24、
//判斷圓心位置,如果不在 x軸上結束程序
程序為:
if(m_oy==0)
{ if(((fabs(m_bax)_fabs(m_ox))*(fabs(m_bax)_fabs(m_ox))+(fabs(m_bay)_fabs(m_oy))*(fabs(m_bay)_fabs( m_oy)))==((fabs(m_aax)-fabs(m_ox))*(fabs(m_aax)-fabs(m_ox))+(fabs(m_aay)-fabs(m_oy))*(fabs(m_aay)-fabs( m_oy)))) 〃判斷圓弧起點和終點到圓心的位置是否相等, 若不等,結束程序
{
//判斷圓弧輸入 25、的半徑是否與求得的想的,若不等,結束程序
if((sqrt((fabs(m_aax)-fabs(m_ox))*(fabs(m_aax)-fabs(m_ox))+(fabs(m_aay)-fabs(m_oy))*(fabs(m_aay)-fabs(m_ oy))))==m_r)
if(m_aax>=0&&m _aay>=0&&m _bax>=0&&m _bay<=0)
{ 〃判斷圓弧是否在1-4象限,若不在,結束程序
pdc->Arc(10*(m_ox-m_r),10*(-m_oy-m_r),10*(m_ox+m_r),10*(m_r-m_oy),10*(m_bax),10*(-m_ba 26、y), 10*(m_aax),10*(-m_aay)); 〃畫給定的圓弧
m=((abs(m_ox+m_r)-abs(m_aax)+abs(m_aay))+(abs(m_ox+m_r)-abs(m_bax)+abs(m_bay)))/m_bc-Tx- Ty-T1x-T1y;
if(n >0)
{
Xe=m_aay-Ty*m_bc;
Ye=m_aax-m_ox+Tx*m_bc;
Ex=(abs(m_r+m_ox)-abs(m_aax))/m_bc-Tx;
Ey=abs(m_aay)/m_bc-Ty;
x=10*m_aax+10*Tx*m_bc;
y=-10*m_aay+10*T 27、y*m_bc;
n=Ex+Ey;
if(N= =0)
{
for(i nt i=0;i 28、
■!—1
#
}
N=N+1;
pdc->MoveTo(x,y); if(Ex>0)
{
X=X+Xe;
//畫插補線段的起點
//x向終點判別器判斷,Ex-O,
x向插補結束
〃計算x積分累加器
if(X>=M)
{
X=X-M;
//判斷積分累加器是否溢出,未溢出轉到下一步
//x積分累加器溢出取其余數(shù)
xs=1;
//標志x向進給一次
Ex=Ex-1;
//x終點判別器減1
Tx=Tx+1;
//計算x向插補次數(shù)
x=x+10*m_bc;
//計算進給后x坐標值
n=n-1;
〃第1象限圓弧終 29、點判別器 1
m=m-1;
}
〃完整圓弧終點判別器減 1
if(Ey>0)
{
Y=Y+Ye;
//y向終點判別器判斷,Ey-0,
y向插補結束
//計算y積分累加器
if(Y>=M)
{
Y=Y-M;
//判斷積分累加器是否溢出,未溢出轉到下一步
//y積分累加器溢出取其余數(shù)
ys=1;
//標志y向進給一次
Ey=Ey-1;
//y終點判別器減1
Ty=Ty+1;
//計算y向插補次數(shù)
y=y+10*m_bc;
//計算進給后y坐標值
n=n-1; m=m-1;
//第1象限圓弧終點判別器 1
}
} 30、
〃完整圓弧終點判別器減 1
pdc->SelectObject (new CPe n(PS_SOLID,0,RGB(255,0,0))); //選擇插補直線的顏色,此處選紅色
pdc->Li neTo(x,y); // 畫直線
}
/*插補第4象限的圓弧,程序語句含義同上 /*
else
{
Xe=0+T1y*m_bc;
Ye=abs(m_r)-T1x*m_bc;
Ex=(abs(m_r+m_ox)-abs(m_bax))/m_bc-T1x;
Ey=abs(m_bay)/m_bc-T1y;
x=10*(m_r+m_ox)-10*T1x*m_bc;
y=10* 31、T1y*m_bc;
if(N1= =0)
for(i nt j=O;j 32、y+1;
y=y+10*m_bc;
m=m-1;
}
}
pdc->SelectObject (new CPe n(PS_SOLID,0,RGB(255,0,0))); pdc->L in eTo(x,y);
}
if(m==0) 〃此段函數(shù)用于連續(xù)插補圓弧時終點判斷
{ KillTimer(l);}
}
else
AfxMessageBox("請輸入1-4象限的圓"); }
else
AfxMessageBox("請輸入正確的半徑值");
} else
AfxMessageBox("請輸入位于同一圓上的坐標點 ”);
}
else
AfxMessage 33、Box("請輸入符合要求的圓心位置 ”);
}
4)連續(xù)插補圓弧的實現(xiàn)程序
方案1:通過定時器實現(xiàn)逐段顯示插補軌跡。
void CMyDlg::O nButto n3()
{
SetTimer(1,500,NULL); // 選擇定時器 1,定時時間 500ms;
}
void CMyDlg::OnTimer(UINT nIDEvent)// 定時器1函數(shù),調用 OnButton1()函數(shù),定時器關閉如上所述
{
On Butto n1();
}
方案2:通過循環(huán)體,一次實現(xiàn)插補軌跡的顯示。
程序語句含義同單步插補程序。
if(m」ine= =1)
{
if(m 34、_oy==0)
{
if(((fabs(m_bax)_fabs(m_ox))*(fabs(m_bax)_fabs(m_ox))+(fabs(m_bay)_fabs(m_oy))*(fabs(m _bay)-fabs(m_oy)))==((fabs(m_aax)-fabs(m_ox))*(fabs(m_aax)-fabs(m_ox))+(fabs(m_aay)-fabs(m_oy))*(f abs(m_aay)_fabs(m_oy))))
{ if((sqrt((fabs(m_aax)-fabs(m_ox))*(fabs(m_aax)-fabs(m_ox))+(fabs(m_aay)-fa 35、bs(m_oy))* (fabs(m_aay)-fabs(m_oy))))==m_r)
{
if(m_aax>=0&&m _aay>=0&&m _bax>=0&&m _bay<=0)
{ pdc->Arc(10*(m_ox-m_r),10*(-m_oy-m_r),10*(m_ox+m_r),10*(m_r-m_oy),10*(m_bax), 10*(-m_bay),10*(m_aax),10*(-m_aay));
m=((abs(m_ox+m_r)-abs(m_aax)+abs(m_aay))+(abs(m_ox+m_r)-abs(m_bax)+abs(m_bay)))/m_bc; w 36、hile(m>0)
{
if(T= =1) //T=1插補第1象限的圓弧,T=0插補第四象限的圓弧
{
Ex=(abs(m_r+m_ox)-abs(m_aax))/m_bc;
Ey=abs(m_aay)/m_bc;
n=Ex+Ey;
x=10*m_aax;
y=_10*m_aay; pdc_>MoveTo(x,y); for(i nt i=0;i 37、if(X>=M)
{
X=X-M;
xs=1;
Ex=Ex-1;
Tx=Tx+1;
x=x+10*m_bc;
n=n-1;
m=m-1;
}
}
if(Ey>0)
{
Y=Y+Ye;
if(Y>=M)
{
Y=Y-M;
ys=1;
Ey=Ey-1;
Ty=Ty+1;
y=y+10*m_bc;
n=n-1;
m=m-1;
}
}
pdc->L in eTo(x,y);
}
T=T-1; //第1象限圓弧插補結束
}
else
{
Ex=(abs(m_r+m_ox)-abs(m_bax))/m_bc;
Ey=abs(m_bay)/ 38、m_bc;
N=Ex+Ey;
x=10*(m_r+m_ox);
y=0;
pdc_>MoveTo(x,y);
for(i nt j=O;j 39、
丫仁 Y1+Ye;
if(Y1>=M1)
{
丫仁Y1-M1;
ys=1;
Ey=Ey-1;
T1y=T1y+1;
y=y+10*m_bc;
m=m-1;
N=N-1;
}
}
pdc->L in eTo(x,y);
}
}
if(m==O)
{AfxMessageBox("連續(xù)插補圓弧結束");}
}
else
AfxMessageBox("請輸入1-4象限的圓”);
}
else
AfxMessageBox("請輸入正確的半徑值 ”);
}
else
AfxMessageBox("請輸入位于同一圓上的坐標點 ”);
}
40、else
AfxMessageBox("請輸入符合要求的圓心位置 ”);
}
六. 其他程序說明
1) 清除按鈕功能程序
每次按下該按鈕時,將定義的所有變量賦予初值。
void CMyDlg::O nButto n2()
{
N=0;N1=0;NX=0;NY=0;x=0;y=0;E=0; F=0;m=0; n=1; X=0;X 仁 0;Y=0;Y 仁 0;Xe=0;Ye=0;Ex=0;Ey=0; xs=0;ys=0;Tx=0;T1x=0;Ty=0;T1y=0;M=1;M1=1;T=1;
In validate();
}
2) 退出按鈕功能程序
每次按下該按鈕時,程序提示 41、退出界面。
void CMyDlg::O nButto n4()
{
if(MessageBox("確認退出插補程序",”請確認退出 ”,MB_ICONQUESTION|MB_OKCANCEL)==IDOK) PostMessage(WM_QUIT);
}
16
七. 心得體會
《機床數(shù)控技術及應用課程設計》是對我們所學課程《機床數(shù)控技術及應用》中知識的應用,用到的 主要知識是插補原理和插補方法。本次課程設計與我們以前做過的課程設計存在明顯的不同,以往的課程 設計主要工作是計算與手工畫圖,而這次的課程設計是對原理的應用。作為實現(xiàn)插補過程的實現(xiàn)手段,對 編程語言 42、知識的要求較高,完全通過軟件編程實現(xiàn),即“ 1%的工作是插補,99%的工作是界面的設計和程
序編寫”。
這次課程設計,我從開始準備到完全做完,一共花了三天多的時間,每天從早晨八點到晚上十一點, 除了中間去上課之外,其余時間一直都在教研室里做課設,不但沒有感覺枯燥,反而覺得很有趣。這次課 設主要是通過編程語言實現(xiàn)的,幸運的是我們在大一的時候學習過 Visual C++,而且這個學期以來自己也
一直在用VC對51單片機進行編程,所以對 Visual C++的知識還算熟悉,沒有因為去學習新的編程語言和 復習以往的知識而花費時間。雖然如此,但由于對建立 MFC應用程序的過程了解不夠,沒有搞清楚文 43、檔界
面和對話框的區(qū)別,仍然走了寫誤區(qū)。我花了一天的時間去看了與文檔編程相關的資料,直到晚上才在別 人的提醒下發(fā)現(xiàn)看的資料跟自己需要的不一樣。雖然也從中學習到了一些自己所需要的知識,但是絕大多 數(shù)的時間還是浪費了。
在三天多的時間里,從 MFC知識的學習,到界面的設計、控件的布置,至慷后的函數(shù)添加,自己一步 一個腳印走過來,付出了很大的努力,同時也學習到了很多的知識,對插補的原理也進一步理解。
剛開始,先練習在控件上畫出圖形,然后就練習圖形輸出的單步控制。因為在圖書館里沒有找到相關 的資料,所以就自己慢慢地琢磨,花了很長的時間,也花了很大的功夫,我知道如何編寫插補步驟的程序 對于我來說是 44、沒有問題的,關鍵的地方就是如何實現(xiàn)插補軌跡的單步輸出。后來無意中在 C++的課本上看
見靜態(tài)變量可以實現(xiàn)每次程序執(zhí)行后數(shù)值不變,我才猛然意識到利用靜態(tài)變量實現(xiàn)軌跡的單步控制。我先 嘗試著編寫了將一條直線分段輸出的程序, 果然可以實現(xiàn)。之后,就很順利的將直線的插補程序編寫出來,
與自己預想的完全一樣。而從單步控制到連續(xù)插補的實現(xiàn),只花了不到五分鐘的時間。一條一條語句的編 寫,看著自己一點點的進步,心里有種莫名的激動。第二天晚上十點半我將直線插補的兩種方式實現(xiàn)了。 第三天的時候,我開始編寫圓弧插補的程序。因為圓弧插補用 DDA法實現(xiàn),這種插補方法沒有固定的偏差
判別函數(shù),所用到的變量數(shù)目也較 45、多,所以我感覺圓弧插補的實現(xiàn)要比直線繁瑣好多,但是因為已經(jīng)有了 一定的經(jīng)驗,所以我并沒有擔心自己別寫不出來。我首先嘗試編寫第 1象限的圓弧的插補程序,在這過程
中出現(xiàn)了很多的問題, 不是輸不出圖形,就是輸出的軌跡與實際的插補軌跡不相同。 一遍一遍的修改程序,
但是大半天的時間過去了,還是沒有什么進展。實在沒有辦法,我就按照自己編寫的程序,一步步往下驗 證,將結果一步步在紙上寫下來,與實際的插補圖形進行比較,看看問題究竟出現(xiàn)在哪。這樣果然有效, 在晚上八點左右的時候,我把第 1象限的圓弧單步插補實現(xiàn)。對程序略加修改之后,不一會兒就實現(xiàn)了兩
個象限的圓弧的單步插補。然而,圓弧的連續(xù)插補并沒有 46、像直線插補那么容易實現(xiàn)。因為這其中的變量太 多,用到的判別語句很多, 眼睛很容易就看錯了, 一不小心就會把程序寫錯, 輸不出正確結果就很正常了。
雖然進過一個多小時的修改,但是程序仍然不能實現(xiàn)功能。
晚上回去之后還在一直考慮著這個問題,覺也沒有睡好。第二天清晨在腦子里又把程序理了一遍,居 然發(fā)現(xiàn)了一些問題。早飯后到教研室,花了不到二十分鐘就把程序改好了。當插補的一條條線段出現(xiàn)在我 的眼睛里的時候,心里真的是很激動,為自己這些天的努力與付出有一個滿意的結果而高興。
后來在老師的幫助和提醒下,我又花了大概半天的時間將整個程序進一步完善,例如可以逐段顯示連 續(xù)插補的軌跡、用不同的顏色顯示插補軌 47、跡、數(shù)據(jù)點賦初值,避免出錯等,這樣輸出的結果比之前好了很 多。
在這次課程設計的過程中,我不單單是將課程設計給做完了,真的學習到了很多的東西,體會到了學 習的樂趣,對數(shù)控插補原理的理解更加透徹,能夠更加熟練的使用 Visual C++,以后也可以利用 MFC故一
些其他的程序。同時,因為我將來還要深入地學習數(shù)控技術, 所以這次的經(jīng)歷對自己以后也有很大的幫助,
也激發(fā)了我學習的興趣。
17
—5
七. 心得體會
#
—5
七. 心得體會
#
—5
附錄1:插補過程完整的程序
//數(shù)控機床技術及應用課程設計 Dlg.cp 48、p : implementation file
#include "stdafx.h"
#i nclude "數(shù)控機床技術及應用課程設計 .h"
#i nclude "數(shù)控機床技術及應用課程設計 Dlg.h"
#in clude "math.h"
#ifdef _DEBUG
#defi ne new DEBUG_NEW
#un def THIS_FILE
static char THIS_FILE[] = __FILE__;
#en dif
/////////////////////////////////////////////////////////////////// 49、//////////
// CAboutDlg dialog used for App About
static double NX=0,NY=0,N=0,N 仁0,m,x,y,X=0,X 仁0,Y=0,Y 仁0,Xe,Ye,F=0;
static double Ex,Ey,xs=0,ys=0,Tx=0,T1x=0,Ty=0,T1y=0,E, n=1,T=1;
int M=1,M 1=1;
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
〃{{AFX_DATA(CAboutDlg) 50、
enum { IDD = IDD_ABOUTBOX };
〃}}AFX_DATA
// ClassWizard gen erated virtual fun ctio n overrides
〃{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExcha nge(CDataExcha nge* pDX); // DDX/DDV support //}}AFX_VIRTUAL
// Impleme ntati on
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DEC 51、LARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExcha nge(CDataExcha nge* pDX)
{
CDialog::DoDataExcha nge(pDX);
〃{{AFX_DATA_MAP(CAboutDlg)
〃}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDi 52、alog)
〃{{AFX_MSG_MAP(CAboutDlg)
// No message han dlers
〃}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog
CMyDlg::CMyDlg(CWnd* pPare nt /*=NULL*/)
:CDialog(CMyDlg::IDD, pPare nt)
{
//{{AFX_DATA_INIT(CMyDlg)
m」in 53、e = 0;
m_alx = 0.0;
m_aly = 0.0;
m_blx = 4.0;
m_bly = -4.0;
m_aax = 0.0;
m_aay = 5.0;
m_bax = 0.0;
m_bay = -5.0;
m_ox = 0.0;
m_oy = 0.0;
m_r = 5.0;
m_n = 3.0;
m_bc = 1.0;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIco n = AfxGetApp()- 54、>Loadlco n(IDR_MAINFRAME);
}
void CMyDlg::DoDataExcha nge(CDataExcha nge* pDX)
{
CDialog::DoDataExcha nge(pDX);
〃{{AFX_DATA_MAP(CMyDlg)
DDX_Co ntrol(pDX, IDC_BUTTON4, m_tuichu);
DDX_Co ntrol(pDX, IDC_BUTTON3, m_lia nxu);
DDX_C on trol(pDX, IDC_BUTTON2, m_qi ngchu);
DDX_Co ntrol(pDX, IDC_BUT 55、TON1, m_da nbu);
DDX_Radio(pDX, IDC_RADIO1, m_li ne);
DDX_Text(pDX, IDC_EDIT1, m_alx);
DDX_Text(pDX, IDC_EDIT2, m_aly);
DDX_Text(pDX, IDC_EDIT3, m_blx);
DDX_Text(pDX, IDC_EDIT4, m_bly);
DDX_Text(pDX, IDC_EDIT5, m_aax);
DDX_Text(pDX, IDC_EDIT6, m_aay);
DDX_Text(pDX, IDC_EDIT7, m_bax);
DDX_ 56、Text(pDX, IDC_EDIT8, m_bay);
DDX_Text(pDX, IDC_EDIT9, m_ox);
DDX_Text(pDX, IDC_EDIT10, m_oy);
DDX_Text(pDX, IDC_EDIT11, m_r);
DDX_Text(pDX, IDC_EDIT12, m_n);
DDX_Text(pDX, IDC_EDIT13, m_bc);
〃}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
〃{{AFX_MSG_MAP(CMyDlg)
ON_WM_SYSCOMMAND()
ON_ 57、WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, On Butt on1)
ON_BN_CLICKED(IDC_BUTTON2, On Butt on2)
ON_BN_CLICKED(IDC_BUTTON4, On Butt on4)
ON_BN_CLICKED(IDC_BUTTON3, On Butt on3)
ON_WM_TIMER()
〃}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////// 58、//////////////////////////
// CMyDlg message han dlers
BOOL CMyDlg::O nl ni tDialog()
{
CDialog::O nlni tDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system comma nd ran ge.
ASSERT((IDM_ABOUTBOX & OxFFFO) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < OxFOOO) 59、;
CMe nu* pSysMe nu = GetSystemMe nu(FALSE);
if (pSysMe nu != NULL)
{
CStri ng strAboutMe nu;
strAboutMe nu.LoadStri ng(IDS_ABOUTBOX);
if (!strAboutMe nu.IsEmpty())
pSysMe nu->Appe ndMe nu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING , IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the ic 60、on for this dialog. The framework does this automatically
// when the applications main window is not a dialog
SetIco n(m_hlco n, TRUE); // Set big icon
SetIco n(m_hlc on, FALSE); // Set small icon
// TODO: Add extra in itializatio n here
return TRUE; // return TRUE uni ess you set the focus to 61、 a con trol
}
void CMyDlg::O nSysComma nd(UINT nID, LPARAM lParam)
{
if ((n ID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::O nSysComma nd( nID, lParam);
}
}
// If you add a mini mize butt on to your dialog, you will n eed the code below
// to 62、 draw the icon. For MFC applicati ons using the docume nt/view model,
// this is automatically done for you by the framework.
void CMyDlg::O nPai nt()
{
if (IsIco ni c())
{
CPaintDC dc(this); // device con text for painting
Sen dMessage(WM」CONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Cen 63、ter icon in clie nt recta ngle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClie ntRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIc on (x, y, m_hIc on);
}
else
64、
21
CDialog:: OnPain t();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the mi ni mized win dow.
HCURSOR CMyDlg::O nQueryDraglco n()
{
return (HCURSOR) m_hIco n;
}
void CMyDlg::O nButto n1()
{
// TODO: Add your con trol no tificati on han dl 65、er code here CStatic*pWnd=(CStatic*)GetDlgltem(IDC_PRINTAREA); CDC*pdc=pWnd->GetDC();
CRect rc;
pWnd->GetClie ntRect(&rc);
CRgn rgn;
rgn. CreateRectRg n(rc.l eft+1,rc.top+7,rc.right-2,rc.bottom-2); pdc->SelectClipRg n(&rgn);
pdc->SetViewportOrg((rc.left+rc.right)/2,rc.bottom-150); pdc->MoveTo(- 66、150,0);
pdc->Li neTo(150,0);
pdc->MoveTo(0,-150);
pdc->Li neTo(0,150);
pdc->TextOut(-10,-20,"o");
pdc->TextOut(15O,O,"x");
pdc->TextOut(-5,-15O,"y");
UpdateData(true);
if (m_li ne==0)
{ pdc->MoveTo(10*m_alx,-10*m_aly);
pdc->Li neTo(10*m_blx,-10*m_bly);
if((m_alx
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。