南航數(shù)控機床課程設(shè)計說明

上傳人:小** 文檔編號:46404375 上傳時間:2021-12-13 格式:DOC 頁數(shù):36 大?。?21.50KB
收藏 版權(quán)申訴 舉報 下載
南航數(shù)控機床課程設(shè)計說明_第1頁
第1頁 / 共36頁
南航數(shù)控機床課程設(shè)計說明_第2頁
第2頁 / 共36頁
南航數(shù)控機床課程設(shè)計說明_第3頁
第3頁 / 共36頁

下載文檔到電腦,查找使用更方便

30 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《南航數(shù)控機床課程設(shè)計說明》由會員分享,可在線閱讀,更多相關(guān)《南航數(shù)控機床課程設(shè)計說明(36頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、《機床數(shù)控技術(shù)及應(yīng)用》 課程設(shè)計說明書 時間:2011年12月15日 目錄 一 課程設(shè)計要求 ? 少 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. ?課程設(shè)計要求 1. 直線插補要求:用逐點比較法插補第 4象限的直線; 圓弧插補要求:用 DDA法插補1-4象限的順圓??; 界面設(shè)計要求:具有數(shù)據(jù)輸入

3、框,具有插補過程動態(tài)顯示功能,插補步長可調(diào)。 .編程語言 Visual C++ 三?插補界面說明 插補界面具有逐點比較法插補直線數(shù)據(jù)輸入?yún)^(qū), DDA法插補1-4象限順圓弧的數(shù)據(jù)輸入?yún)^(qū),兩者公用 的步長輸入?yún)^(qū),圖形顯示區(qū)域,四個按鈕實現(xiàn)插補過程的單步、連續(xù)顯示、圖形的清除, 插補界面的退出,以及必要的文字說明。 界面設(shè)計所用到的控件有:1個圖像控件,用來顯示輸出圖形; 13個編輯框,用來輸入插補直線與圓 弧所必要的數(shù)據(jù);2個單選框,用來選擇直線插補和圓弧插補; 4個按鈕,用來控制插補、清除、退出界 面;若干個靜態(tài)文本,進行相應(yīng)地文字說明。 各控件名稱及對應(yīng)的關(guān)聯(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 ,輸入直線起點橫坐標(biāo); ,輸入直線起點縱坐標(biāo); ,輸入直線終點橫坐標(biāo); ,輸入直線終點縱坐標(biāo); ,輸入圓弧起點橫坐標(biāo); ,輸入圓弧起點縱坐標(biāo); ,輸入圓弧終點橫坐標(biāo); ,輸入圓弧終點縱坐標(biāo); ,輸入圓心橫坐標(biāo); ,輸入圓心縱坐標(biāo); ,輸入圓弧半徑值; ,輸入累加器位數(shù); ,輸入插補步長; IDC_PRINTAREA實現(xiàn)圖形輸出功能; F靜態(tài)文本控件,IDC_STATIC,作為相關(guān)文字說明。 四?逐點比較法直線插補流程圖及算法 1)偏差判別公式的推導(dǎo) 設(shè)直線的起點坐標(biāo)為(x1,y1),終點坐標(biāo)為(x2,y2),直線上的任意一個動點為 (x,y)

7、,插補的 步長為b,則偏差判別函數(shù) F=(x2-x1)*y-(y2-y1)*x 對位于第四象限的直線,有: 當(dāng)F>=0時,向+x方向進給一個脈沖當(dāng)量,此時 x(i+1)=xi+b ,則有 F(i+1)=Fi-(y2-y1)*b 當(dāng)F< 0時,向-y方向進給一個脈沖當(dāng)量,此時 y(j+i)=yj-b ,則有 F(j+1)=Fj+(x2-x1)*b 終點判別器E用來判別脈沖次數(shù),每進給一次 E減1,直到其值為 0時插補過程結(jié)束,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 輸岀直線不在第四象限 結(jié)束 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ù)累加,用于橫坐標(biāo)計算; NY為-y方向進給次數(shù)累加,用于縱坐標(biāo)計算; 為x ,y兩個方向的累加次數(shù),用于和終點判別器比較; m為終點判別器,用來判斷插補是否結(jié)束; 用來存放插補過程中動點坐標(biāo); F為偏差判別函數(shù)。 在插補程序中使用的變量名與流程圖中變量的對應(yīng)關(guān)系為: m_alx對應(yīng)x1,m_aly對應(yīng)y1, 對應(yīng)x2

10、, m_bly對應(yīng)y2, m_bc對應(yīng)b, m對應(yīng)E。變量賦的初值為: m」ine = 0, m_alx = 0.0, m_aly = 0.0, m_blx = 4.0,m_bly = -4.0, m_bc = 1.0。 插補程序中的一些說明: 因為輸出的圖形坐標(biāo)數(shù)值為像素點,在圖形中顯示很小,所以在下述的程序中將輸出的數(shù)值擴大 倍,可以在圖形控件上更清晰地顯示圖形,其值本身并不具有實際的意義。 禾U用UpdateData(true)函數(shù)實現(xiàn)獲取輸入的參數(shù)值。 設(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); 在圖形控件上畫坐標(biāo)軸: 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_alxm_bly)&&(m_alx>=0)&&(m_aly<

13、=0)) //判別輸入的直線在第 4象限,如果不在,結(jié)束程序并提示輸入第 4象限的直線 { x=10*m_alx+10*NX*m_bc; // 計算動態(tài)坐標(biāo) 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í)行插補,否則結(jié)束 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 〃將坐標(biāo)移到直線起點 II計算橫坐標(biāo) 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ù),并結(jié)束判斷 〃偏差判別函數(shù)小于 0, y方向進給 NY=NY+1; N=N+1; pdc->MoveTo(x,y

15、); y=y+10*m_bc; II-y方向進給一次 〃進給次數(shù)累加器加1 〃將坐標(biāo)移到直線起點 II計算縱坐標(biāo) 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ù),并結(jié)束判斷 } I*此段函數(shù)用于連續(xù)插補 m=m-1; if(m==0) { KillTimer(1); } //終點判別器減1 〃如果終點判別器為 0,關(guān)閉定時器1

16、,連續(xù)插補結(jié)束 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ù),調(diào)用 OnButton1()函數(shù),定時器關(guān)閉如上所述 { 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ù)插補結(jié)束”); } 五.DDA法圓弧插補插補流程圖及算法 1)圓弧插補示意圖 插補1-4象限的順圓,要分成兩段圓弧來實現(xiàn),分別為第 1象限順圓弧和第 4象限順圓弧。圓弧插 補通過半加載實現(xiàn),即積分累加器 Jrx, Jry中存放寄存器最大容量的一半。假設(shè)圓弧起點坐標(biāo) (x1,y1),終點 坐標(biāo)(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;— 結(jié)束

22、 m:圓弧插補終點判別器; T:圓弧插補象限標(biāo)志位, T=1,插補第1象限圓弧,T=0插補第4象限圓 ?。籈x, Ey,x,y方向終點判別器;n第1象限圓弧終點判別器;x,y動態(tài)點坐標(biāo)值; 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、中與流程圖中的變量對應(yīng)關(guān)系為: m_aax對應(yīng)x1 , m_aay對應(yīng)y1, m_bax 對應(yīng)x2, m_bay對應(yīng)y2, m_ox對應(yīng)x0, m_oy對應(yīng)yO,m_r對應(yīng)r, m_n對應(yīng)n,m_bc對應(yīng)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軸上結(jié)束程序 程序為: 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)))) 〃判斷圓弧起點和終點到圓心的位置是否相等, 若不等,結(jié)束程序 { //判斷圓弧輸入

25、的半徑是否與求得的想的,若不等,結(jié)束程序 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象限,若不在,結(jié)束程序 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;i0插補第1象限的圓弧,若n=0,插補第4象限圓弧 //x,y軸被積函數(shù)寄存器計算 //X,y軸終點判別器計算 //計算插補過程動點坐標(biāo)(x,y) 〃插補第1象限終點判別器計算 //N用來標(biāo)志寄存器最大容量計算,一次有效 〃根據(jù)輸入的寄存器位數(shù),計算容量 ■!—1 9 ■!—1 # X=M/2; Y=M/2; //積分累加器計算,半加載方式

28、 ■!—1 # } N=N+1; pdc->MoveTo(x,y); if(Ex>0) { X=X+Xe; //畫插補線段的起點 //x向終點判別器判斷,Ex-O, x向插補結(jié)束 〃計算x積分累加器 if(X>=M) { X=X-M; //判斷積分累加器是否溢出,未溢出轉(zhuǎn)到下一步 //x積分累加器溢出取其余數(shù) xs=1; //標(biāo)志x向進給一次 Ex=Ex-1; //x終點判別器減1 Tx=Tx+1; //計算x向插補次數(shù) x=x+10*m_bc; //計算進給后x坐標(biāo)值 n=n-1; 〃第1象限圓弧終

29、點判別器 1 m=m-1; } 〃完整圓弧終點判別器減 1 if(Ey>0) { Y=Y+Ye; //y向終點判別器判斷,Ey-0, y向插補結(jié)束 //計算y積分累加器 if(Y>=M) { Y=Y-M; //判斷積分累加器是否溢出,未溢出轉(zhuǎn)到下一步 //y積分累加器溢出取其余數(shù) ys=1; //標(biāo)志y向進給一次 Ey=Ey-1; //y終點判別器減1 Ty=Ty+1; //計算y向插補次數(shù) y=y+10*m_bc; //計算進給后y坐標(biāo)值 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;jMoveTo(x,y); if(Ex>0) { X仁 X1+Xe; if(X1>=M1) { X仁 X1-M1; xs=1; Ex=Ex-1; T1x=T1x+1; x=x-10*m_bc; m=m-1; } } if(Ey>0) { 丫仁 Y1+Ye; if(Y1>=M1) { Y1= Y1-M1; ys=1; Ey=Ey-1; T1y=T1

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("請輸入位于同一圓上的坐標(biāo)點 ”); } 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ù),調(diào)用 OnButton1()函數(shù),定時器關(guān)閉如上所述 { 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;i0) { Xe=m_aay-Ty*m_bc; Ye=m_aax-m_ox+Tx*m_bc; if(Ex>0) { X=X+Xe;

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象限圓弧插補結(jié)束 } 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;j0) { Xe=0+T1y*m_bc; Ye=abs(m_r)-T1x*m_bc; if(Ex>0) { X仁 X1+Xe; if(X1>=M1) { X仁 X1-M1; xs=1; Ex=Ex-1; T1x=T1x+1; x=x-10*m_bc; m=m-1; N=N-1; } } if(Ey>0) {

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ù)插補圓弧結(jié)束");} } else AfxMessageBox("請輸入1-4象限的圓”); } else AfxMessageBox("請輸入正確的半徑值 ”); } else AfxMessageBox("請輸入位于同一圓上的坐標(biāo)點 ”); }

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("確認(rèn)退出插補程序",”請確認(rèn)退出 ”,MB_ICONQUESTION|MB_OKCANCEL)==IDOK) PostMessage(WM_QUIT); } 16 七. 心得體會 《機床數(shù)控技術(shù)及應(yīng)用課程設(shè)計》是對我們所學(xué)課程《機床數(shù)控技術(shù)及應(yīng)用》中知識的應(yīng)用,用到的 主要知識是插補原理和插補方法。本次課程設(shè)計與我們以前做過的課程設(shè)計存在明顯的不同,以往的課程 設(shè)計主要工作是計算與手工畫圖,而這次的課程設(shè)計是對原理的應(yīng)用。作為實現(xiàn)插補過程的實現(xiàn)手段,對 編程語言

42、知識的要求較高,完全通過軟件編程實現(xiàn),即“ 1%的工作是插補,99%的工作是界面的設(shè)計和程 序編寫”。 這次課程設(shè)計,我從開始準(zhǔn)備到完全做完,一共花了三天多的時間,每天從早晨八點到晚上十一點, 除了中間去上課之外,其余時間一直都在教研室里做課設(shè),不但沒有感覺枯燥,反而覺得很有趣。這次課 設(shè)主要是通過編程語言實現(xiàn)的,幸運的是我們在大一的時候?qū)W習(xí)過 Visual C++,而且這個學(xué)期以來自己也 一直在用VC對51單片機進行編程,所以對 Visual C++的知識還算熟悉,沒有因為去學(xué)習(xí)新的編程語言和 復(fù)習(xí)以往的知識而花費時間。雖然如此,但由于對建立 MFC應(yīng)用程序的過程了解不夠,沒有搞清楚文

43、檔界 面和對話框的區(qū)別,仍然走了寫誤區(qū)。我花了一天的時間去看了與文檔編程相關(guān)的資料,直到晚上才在別 人的提醒下發(fā)現(xiàn)看的資料跟自己需要的不一樣。雖然也從中學(xué)習(xí)到了一些自己所需要的知識,但是絕大多 數(shù)的時間還是浪費了。 在三天多的時間里,從 MFC知識的學(xué)習(xí),到界面的設(shè)計、控件的布置,至慷后的函數(shù)添加,自己一步 一個腳印走過來,付出了很大的努力,同時也學(xué)習(xí)到了很多的知識,對插補的原理也進一步理解。 剛開始,先練習(xí)在控件上畫出圖形,然后就練習(xí)圖形輸出的單步控制。因為在圖書館里沒有找到相關(guān) 的資料,所以就自己慢慢地琢磨,花了很長的時間,也花了很大的功夫,我知道如何編寫插補步驟的程序 對于我來說是

44、沒有問題的,關(guān)鍵的地方就是如何實現(xiàn)插補軌跡的單步輸出。后來無意中在 C++的課本上看 見靜態(tài)變量可以實現(xiàn)每次程序執(zhí)行后數(shù)值不變,我才猛然意識到利用靜態(tài)變量實現(xiàn)軌跡的單步控制。我先 嘗試著編寫了將一條直線分段輸出的程序, 果然可以實現(xiàn)。之后,就很順利的將直線的插補程序編寫出來, 與自己預(yù)想的完全一樣。而從單步控制到連續(xù)插補的實現(xiàn),只花了不到五分鐘的時間。一條一條語句的編 寫,看著自己一點點的進步,心里有種莫名的激動。第二天晚上十點半我將直線插補的兩種方式實現(xiàn)了。 第三天的時候,我開始編寫圓弧插補的程序。因為圓弧插補用 DDA法實現(xiàn),這種插補方法沒有固定的偏差 判別函數(shù),所用到的變量數(shù)目也較

45、多,所以我感覺圓弧插補的實現(xiàn)要比直線繁瑣好多,但是因為已經(jīng)有了 一定的經(jīng)驗,所以我并沒有擔(dān)心自己別寫不出來。我首先嘗試編寫第 1象限的圓弧的插補程序,在這過程 中出現(xiàn)了很多的問題, 不是輸不出圖形,就是輸出的軌跡與實際的插補軌跡不相同。 一遍一遍的修改程序, 但是大半天的時間過去了,還是沒有什么進展。實在沒有辦法,我就按照自己編寫的程序,一步步往下驗 證,將結(jié)果一步步在紙上寫下來,與實際的插補圖形進行比較,看看問題究竟出現(xiàn)在哪。這樣果然有效, 在晚上八點左右的時候,我把第 1象限的圓弧單步插補實現(xiàn)。對程序略加修改之后,不一會兒就實現(xiàn)了兩 個象限的圓弧的單步插補。然而,圓弧的連續(xù)插補并沒有

46、像直線插補那么容易實現(xiàn)。因為這其中的變量太 多,用到的判別語句很多, 眼睛很容易就看錯了, 一不小心就會把程序?qū)戝e, 輸不出正確結(jié)果就很正常了。 雖然進過一個多小時的修改,但是程序仍然不能實現(xiàn)功能。 晚上回去之后還在一直考慮著這個問題,覺也沒有睡好。第二天清晨在腦子里又把程序理了一遍,居 然發(fā)現(xiàn)了一些問題。早飯后到教研室,花了不到二十分鐘就把程序改好了。當(dāng)插補的一條條線段出現(xiàn)在我 的眼睛里的時候,心里真的是很激動,為自己這些天的努力與付出有一個滿意的結(jié)果而高興。 后來在老師的幫助和提醒下,我又花了大概半天的時間將整個程序進一步完善,例如可以逐段顯示連 續(xù)插補的軌跡、用不同的顏色顯示插補軌

47、跡、數(shù)據(jù)點賦初值,避免出錯等,這樣輸出的結(jié)果比之前好了很 多。 在這次課程設(shè)計的過程中,我不單單是將課程設(shè)計給做完了,真的學(xué)習(xí)到了很多的東西,體會到了學(xué) 習(xí)的樂趣,對數(shù)控插補原理的理解更加透徹,能夠更加熟練的使用 Visual C++,以后也可以利用 MFC故一 些其他的程序。同時,因為我將來還要深入地學(xué)習(xí)數(shù)控技術(shù), 所以這次的經(jīng)歷對自己以后也有很大的幫助, 也激發(fā)了我學(xué)習(xí)的興趣。 17 —5 七. 心得體會 # —5 七. 心得體會 # —5 附錄1:插補過程完整的程序 //數(shù)控機床技術(shù)及應(yīng)用課程設(shè)計 Dlg.cp

48、p : implementation file #include "stdafx.h" #i nclude "數(shù)控機床技術(shù)及應(yīng)用課程設(shè)計 .h" #i nclude "數(shù)控機床技術(shù)及應(yīng)用課程設(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_alxm_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; if(m>0) { if(F>=0) { NX=NX+1; N=N+1; pdc->MoveTo

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!