




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、機(jī)床數(shù)控技術(shù)及應(yīng)用課程設(shè)計(jì)說明書時(shí)間:2011年12月15日目錄一 課程設(shè)計(jì)要求 2二 編程語言 2三 插補(bǔ)界面說明 2四 逐點(diǎn)比較法直線插補(bǔ)流程圖及算法 2五 DDA法圓弧插補(bǔ)插補(bǔ)流程圖及算法 7六 其他程序說明 15七 心得體會(huì) 16 附錄 17一 課程設(shè)計(jì)要求1 直線插補(bǔ)要求:用逐點(diǎn)比較法插補(bǔ)第4象限的直線;2 圓弧插補(bǔ)要求:用DDA法插補(bǔ)1-4象限的順圓弧;3 界面設(shè)計(jì)要求:具有數(shù)據(jù)輸入框,具有插補(bǔ)過程動(dòng)態(tài)顯示功能,插補(bǔ)步長(zhǎng)可調(diào)。二 編程語言Visual C+三 插補(bǔ)界面說明插補(bǔ)界面具有逐點(diǎn)比較法插補(bǔ)直線數(shù)據(jù)輸入?yún)^(qū),DDA法插補(bǔ)1-4象限順圓弧的數(shù)據(jù)輸入?yún)^(qū),兩者公用的步長(zhǎng)輸入?yún)^(qū),圖形顯
2、示區(qū)域,四個(gè)按鈕實(shí)現(xiàn)插補(bǔ)過程的單步、連續(xù)顯示、圖形的清除,插補(bǔ)界面的退出,以及必要的文字說明。界面設(shè)計(jì)所用到的控件有:1個(gè)圖像控件,用來顯示輸出圖形;13個(gè)編輯框,用來輸入插補(bǔ)直線與圓弧所必要的數(shù)據(jù);2個(gè)單選框,用來選擇直線插補(bǔ)和圓弧插補(bǔ);4個(gè)按鈕,用來控制插補(bǔ)、清除、退出界面;若干個(gè)靜態(tài)文本,進(jìn)行相應(yīng)地文字說明。各控件名稱及對(duì)應(yīng)的關(guān)聯(lián)變量名稱:按鈕控件1, IDC_BUTTON1, m_danbu ,實(shí)現(xiàn)單步插補(bǔ)功能按鈕; 按鈕控件2, IDC_BUTTON2, m_qingchu ,實(shí)現(xiàn)清除功能按鈕; 按鈕控件3, IDC_BUTTON3, m_lianxu ,實(shí)現(xiàn)連續(xù)插補(bǔ)功能按鈕;按鈕控
3、件4, IDC_BUTTON4, m_tuichu ,實(shí)現(xiàn)退出界面功能按鈕;單選框控件1,IDC_RADIO1, m_line,其屬性選擇GROUP ,選擇直線插補(bǔ);單選框控件2,IDC_RADIO2 ,選擇圓弧插補(bǔ);編輯框控件1, IDC_EDIT1, m_alx ,輸入直線起點(diǎn)橫坐標(biāo);編輯框控件2, IDC_EDIT2, m_aly ,輸入直線起點(diǎn)縱坐標(biāo);編輯框控件3, IDC_EDIT3, m_blx ,輸入直線終點(diǎn)橫坐標(biāo);編輯框控件4, IDC_EDIT4, m_bly ,輸入直線終點(diǎn)縱坐標(biāo);編輯框控件5, IDC_EDIT5, m_aax ,輸入圓弧起點(diǎn)橫坐標(biāo);編輯框控件6, IDC
4、_EDIT6, m_aay ,輸入圓弧起點(diǎn)縱坐標(biāo);編輯框控件7, IDC_EDIT7, m_bax ,輸入圓弧終點(diǎn)橫坐標(biāo);編輯框控件8, IDC_EDIT8, m_bay ,輸入圓弧終點(diǎn)縱坐標(biāo);編輯框控件9, IDC_EDIT9, m_ox ,輸入圓心橫坐標(biāo);編輯框控件10, IDC_EDIT10, m_oy ,輸入圓心縱坐標(biāo);編輯框控件11, IDC_EDIT11, m_r ,輸入圓弧半徑值;編輯框控件12, IDC_EDIT12, m_n ,輸入累加器位數(shù);編輯框控件13, IDC_EDIT13, m_bc ,輸入插補(bǔ)步長(zhǎng);圖形控件:IDC_PRINTAREA,實(shí)現(xiàn)圖形輸出功能;若干靜態(tài)文
5、本控件,IDC_STATIC,作為相關(guān)文字說明。四 逐點(diǎn)比較法直線插補(bǔ)流程圖及算法1) 偏差判別公式的推導(dǎo)設(shè)直線的起點(diǎn)坐標(biāo)為(x1,y1),終點(diǎn)坐標(biāo)為(x2,y2),直線上的任意一個(gè)動(dòng)點(diǎn)為(x,y),插補(bǔ)的步長(zhǎng)為b,則偏差判別函數(shù)F=(x2-x1)*y-(y2-y1)*x對(duì)位于第四象限的直線,有:當(dāng)F>=0時(shí),向+x方向進(jìn)給一個(gè)脈沖當(dāng)量,此時(shí)x(i+1)=xi+b,則有 F(i+1)=Fi-(y2-y1)*b當(dāng)F< 0時(shí),向-y方向進(jìn)給一個(gè)脈沖當(dāng)量,此時(shí)y(j+1)=yj-b,則有 F(j+1)=Fj+(x2-x1)*b終點(diǎn)判別器E用來判別脈沖次數(shù),每進(jìn)給一次E 減1,直到其值為0
6、時(shí)插補(bǔ)過程結(jié)束,E 值由下面公式所得: E=(x2-x1)+(y1-y2)/ bYYE=0輸入x1,y1,x2,y2,b 開始F>=0初始化:E=(x2-x1)+(y1-y2),F=0,x=x1,y=y1+X方向走一步F=F-b*(y2-y1),x=x+b-Y方向走一步x1>=0,y1>=0,x2>0,y2<0NYNF=F+b*(x2-x1),y=y-bE=E-1N輸出直線不在第四象限 結(jié)束2) 直線插補(bǔ)流程圖:3) 單步插補(bǔ)直線實(shí)現(xiàn)程序及變量說明定義靜態(tài)變量static,變量類型為double型,在每次單擊按鈕控件執(zhí)行程序后,該變量的值始終存在可以實(shí)現(xiàn)對(duì)插補(bǔ)次數(shù)
7、的計(jì)算和判別。static double NX=0, NY=0 , N=0 , m , x , y , F=0 ; NX為+x方向的進(jìn)給次數(shù)累加,用于橫坐標(biāo)計(jì)算;NY為-y方向進(jìn)給次數(shù)累加,用于縱坐標(biāo)計(jì)算;N為x , y兩個(gè)方向的累加次數(shù),用于和終點(diǎn)判別器比較;m為終點(diǎn)判別器,用來判斷插補(bǔ)是否結(jié)束;x,y用來存放插補(bǔ)過程中動(dòng)點(diǎn)坐標(biāo);F為偏差判別函數(shù)。在插補(bǔ)程序中使用的變量名與流程圖中變量的對(duì)應(yīng)關(guān)系為: m_alx對(duì)應(yīng)x1,m_aly對(duì)應(yīng)y1,m_blx對(duì)應(yīng)x2,m_bly對(duì)應(yīng)y2,m_bc對(duì)應(yīng)b,m對(duì)應(yīng)E。變量賦的初值為:m_line = 0,m_alx = 0.0,m_aly = 0.0,m
8、_blx = 4.0,m_bly = -4.0,m_bc = 1.0。插補(bǔ)程序中的一些說明:因?yàn)檩敵龅膱D形坐標(biāo)數(shù)值為像素點(diǎn),在圖形中顯示很小,所以在下述的程序中將輸出的數(shù)值擴(kuò)大10倍,可以在圖形控件上更清晰地顯示圖形,其值本身并不具有實(shí)際的意義。利用UpdateData(true)函數(shù)實(shí)現(xiàn)獲取輸入的參數(shù)值。設(shè)置圖形顯示區(qū)域:CStatic*pWnd=(CStatic*)GetDlgItem(IDC_PRINTAREA);CDC*pdc=pWnd->GetDC();CRect rc;pWnd->GetClientRect(&rc);CRgn rgn;rgn.CreateRec
9、tRgn(rc.left+1,rc.top+7,rc.right-2,rc.bottom-2);pdc->SelectClipRgn(&rgn);pdc->SetViewportOrg(rc.left+rc.right)/2,rc.bottom-150);在圖形控件上畫坐標(biāo)軸:pdc->MoveTo(-150,0);pdc->LineTo(150,0);pdc->MoveTo(0,-150);pdc->LineTo(0,150);在圖形控件上輸出原點(diǎn)、x軸、y軸符號(hào):pdc->TextOut(-10,-20,"o");pdc
10、->TextOut(150,0,"x");pdc->TextOut(-5,-150,"y");單步直線插補(bǔ)程序:if (m_line=0) /選擇直線插補(bǔ) pdc->MoveTo(10*m_alx,-10*m_aly); /畫出需要插補(bǔ)的直線 pdc->LineTo(10*m_blx,-10*m_bly); if(m_alx<m_blx)&&(m_aly>m_bly)&&(m_alx>=0)&&(m_aly<=0) /判別輸入的直線在第4象限,如果不在,結(jié)束程
11、序并提示輸入第4象限的直線 x=10*m_alx+10*NX*m_bc; /計(jì)算動(dòng)態(tài)坐標(biāo) y=-10*m_aly+10*NY*m_bc; m=(abs(m_blx)-abs(m_alx)+(abs(m_bly)-abs(m_aly)/(m_bc)-N;/終點(diǎn)判別器計(jì)算 if(m>0) /終點(diǎn)判別器不為0,執(zhí)行插補(bǔ),否則結(jié)束 if(F>=0) /偏差判別函數(shù)大于0,x方向進(jìn)給 NX=NX+1; /+x方向進(jìn)給一次 N=N+1; /進(jìn)給次數(shù)累加器加1 pdc->MoveTo(x,y); /將坐標(biāo)移到直線起點(diǎn) x=x+10*m_bc; /計(jì)算橫坐標(biāo) pdc->SelectOb
12、ject (new CPen(PS_SOLID,0,RGB(255,0,0); /改變插補(bǔ)線段的顏色,此處選擇紅色 pdc->LineTo(x,y); /畫直線 F=F-m_bc*(abs(m_bly)-abs(m_aly); /重新計(jì)算偏差判別函數(shù),并結(jié)束判斷 else /偏差判別函數(shù)小于0,y方向進(jìn)給 NY=NY+1; /-y方向進(jìn)給一次 N=N+1; /進(jìn)給次數(shù)累加器加1 pdc->MoveTo(x,y); /將坐標(biāo)移到直線起點(diǎn) y=y+10*m_bc; /計(jì)算縱坐標(biāo) pdc->SelectObject (new CPen(PS_SOLID,0,RGB(255,0,0)
13、; /改變插補(bǔ)線段的顏色,此處選擇紅色 pdc->LineTo(x,y); /畫直線 F=F+m_bc*(abs(m_blx)-abs(m_alx); /重新計(jì)算偏差判別函數(shù),并結(jié)束判斷 /*此段函數(shù)用于連續(xù)插補(bǔ) m=m-1; /終點(diǎn)判別器減1 if(m=0) /如果終點(diǎn)判別器為0,關(guān)閉定時(shí)器1,連續(xù)插補(bǔ)結(jié)束 KillTimer(1); /*此段函數(shù)用于連續(xù)插補(bǔ) else /提示輸入的直線不在給定的象限AfxMessageBox("請(qǐng)輸入位于第四象限的點(diǎn)");4) 連續(xù)插補(bǔ)直線的實(shí)現(xiàn)方案1:通過定時(shí)器實(shí)現(xiàn)逐段顯示插補(bǔ)軌跡void CMyDlg:OnButton3()
14、SetTimer(1,500,NULL); /選擇定時(shí)器1,定時(shí)時(shí)間500ms;void CMyDlg:OnTimer(UINT nIDEvent) /定時(shí)器1函數(shù),調(diào)用OnButton1()函數(shù),定時(shí)器關(guān)閉如上所述OnButton1();方案2:通過循環(huán)體,一次實(shí)現(xiàn)插補(bǔ)軌跡的顯示程序各行的含義同單步插補(bǔ)程序if (m_line=0) pdc->MoveTo(10*m_alx,-10*m_aly); pdc->LineTo(10*m_blx,-10*m_bly); if(m_alx<m_blx)&&(m_aly>m_bly)&&(m_al
15、x>=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)一次實(shí)現(xiàn)插補(bǔ)軌跡顯示 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_blx)-abs(m_alx); y=y+10*m_bc
16、; pdc->LineTo(x,y); m=m-1; AfxMessageBox("連續(xù)插補(bǔ)結(jié)束");五DDA法圓弧插補(bǔ)插補(bǔ)流程圖及算法1)圓弧插補(bǔ)示意圖 插補(bǔ)1-4象限的順圓,要分成兩段圓弧來實(shí)現(xiàn),分別為第1象限順圓弧和第4象限順圓弧。圓弧插補(bǔ)通過半加載實(shí)現(xiàn),即積分累加器Jrx,Jry中存放寄存器最大容量的一半。假設(shè)圓弧起點(diǎn)坐標(biāo)(x1,y1),終點(diǎn)坐標(biāo)(x2,y2),根據(jù)DDA法插補(bǔ)圓弧的要求,x軸被積函數(shù)寄存器Jvx存放y1,y軸被積函數(shù)寄存器Jvy存放x1。DDA法插補(bǔ)第1象限順圓插補(bǔ)器示意圖:控制脈沖x軸被積函數(shù)寄存器Jvx(y1)x軸積分累加器Jrx+y軸被
17、積函數(shù)寄存器Jvy(x1)y軸積分累加器Jry+-x軸正向進(jìn)給y軸負(fù)向進(jìn)給DDA法插補(bǔ)第4象限順圓插補(bǔ)器示意圖:控制脈沖x軸被積函數(shù)寄存器Jvx(y1)x軸積分累加器Jrx+y軸被積函數(shù)寄存器Jvy(x1)y軸積分累加器Jry+-+x軸負(fù)向進(jìn)給y軸負(fù)向進(jìn)給2) 圓弧插補(bǔ)流程圖開始各變量初始化N輸入(x1,y1),(x2,y2),(x0,y0),b,r,nYy0=0Nr1=(x1-x0)2+(y1-y0)2 r2=(x2-x0)2+(y2-y0)2,T=1r2=r1NY r1=r2NYx1>=0,y1>=0,x2>=0,y2<=0Ym=(x0+r)- x1+y1+(x0+
18、r)-x2+|y2|)/bNm>0YYm=m-Tx-Ty-T1x-T1yNT>0Ex=(r+x0-x1)/b;Ey=y1/b; n=Ex+Ey;x=x1,y=y1;M=2bX=M/2,Y=M/2Ex=( r+x0-x2)/b;Ey=|y2|/b;N=Ex+Ey;x=(r+x0),y=0;M1=2b,Y1=M1/2,X1=M1.2Nn>0NYN>0YXe=y1-Ty*b;Ye= x1-x0+Tx*b;NXe= T1y*b;Ye=r+T1x*b;Ex>0NYEx>0YX=X+XeX>=MNX1=X1+XeX1>=M1NYYX=X-M;Ex=Ex-1;
19、Tx=Tx+1;x=x+b;n=n-1;m=m-1;NX1=X1-M1;Ex=Ex-1;T1x=T1x+1;x=x-b;N=n-1;m=m-1;Ey>0NYYEy>0Y=Y+YeY>=MNY1=Y1+YeNYY1>=M1YY=Y-M;Ey=Ey-1;Ty=Ty+1;y=y-b;n=n-1;m=m-1Y1=Y1-M1;Ey=Ey-1;T1y=T1y+1;y=y-b;N=M-1;m=m-1T=T-1結(jié)束流程圖中變量說明:靜態(tài)變量 :m:圓弧插補(bǔ)終點(diǎn)判別器;T:圓弧插補(bǔ)象限標(biāo)志位,T=1,插補(bǔ)第1象限圓弧,T=0插補(bǔ)第4象限圓弧;Ex,Ey,x,y方向終點(diǎn)判別器;n第1象限圓
20、弧終點(diǎn)判別器;x,y動(dòng)態(tài)點(diǎn)坐標(biāo)值; Xe,Ye,分別為x、y軸被積函數(shù)寄存器;X,Y為第1象限x、y軸積分累加器,X1,Y1 分別為第4象限x、y軸積分累加器;Tx,Ty 為第1象限x、y軸插補(bǔ)計(jì)數(shù)器,T1x,T1y為第4象限x、y軸插補(bǔ)計(jì)數(shù)器。全局變量:M,M1存放寄存器最大存儲(chǔ)容量。3) 單步插補(bǔ)圓弧實(shí)現(xiàn)程序及變量說明部分變量說明如上,插補(bǔ)程序中與流程圖中的變量對(duì)應(yīng)關(guān)系為:m_aax對(duì)應(yīng)x1,m_aay對(duì)應(yīng)y1,m_bax對(duì)應(yīng)x2,m_bay對(duì)應(yīng)y2,m_ox對(duì)應(yīng)x0,m_oy對(duì)應(yīng)y0,m_r對(duì)應(yīng)r,m_n對(duì)應(yīng)n,m_bc對(duì)應(yīng)b。變量賦予的初值為:m_aax = 0.0,m_aay = 5
21、.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,X1=0,Y=0,Y1=0,Tx=0,T1x=0,Ty=0,T1y=0,T=1,M=1,M1=1。未列出的變量不賦初值。 程序?yàn)椋?if(m_oy=0) /判斷圓心位置,如果不在x軸上結(jié)束程序 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)-fa
22、bs(m_ox)*(fabs(m_aax)-fabs(m_ox)+(fabs(m_aay)-fabs(m_oy)*(fabs(m_aay)-fabs(m_oy) /判斷圓弧起點(diǎn)和終點(diǎn)到圓心的位置是否相等,若不等,結(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) /判斷圓弧輸入的半徑是否與求得的想的,若不等,結(jié)束程序 if(m_aax>=0&&m_aay>=0&&m_bax>
23、=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_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-Tx-Ty-T1x-T1y; / 計(jì)算插補(bǔ)圓弧的終點(diǎn)判別器值if(n>0) /n>0插
24、補(bǔ)第1象限的圓弧,若n=0,插補(bǔ)第4象限圓弧 Xe=m_aay-Ty*m_bc; /x,y軸被積函數(shù)寄存器計(jì)算Ye=m_aax-m_ox+Tx*m_bc; Ex=(abs(m_r+m_ox)-abs(m_aax)/m_bc-Tx; /x,y軸終點(diǎn)判別器計(jì)算Ey=abs(m_aay)/m_bc-Ty; x=10*m_aax+10*Tx*m_bc; /計(jì)算插補(bǔ)過程動(dòng)點(diǎn)坐標(biāo)(x,y) y=-10*m_aay+10*Ty*m_bc; n=Ex+Ey; /插補(bǔ)第1象限終點(diǎn)判別器計(jì)算if(N= =0) /N用來標(biāo)志寄存器最大容量計(jì)算,一次有效 for(int i=0;i<m_n;i+) /根據(jù)輸入的
25、寄存器位數(shù),計(jì)算容量M=M*2;X=M/2; /積分累加器計(jì)算,半加載方式Y(jié)=M/2;N=N+1; pdc->MoveTo(x,y); /畫插補(bǔ)線段的起點(diǎn)if(Ex>0) /x向終點(diǎn)判別器判斷,Ex=0,x向插補(bǔ)結(jié)束 X=X+Xe; /計(jì)算x積分累加器 if(X>=M) /判斷積分累加器是否溢出,未溢出轉(zhuǎn)到下一步 X=X-M; /x積分累加器溢出取其余數(shù)xs=1; /標(biāo)志x向進(jìn)給一次Ex=Ex-1; /x終點(diǎn)判別器減1Tx=Tx+1; /計(jì)算x向插補(bǔ)次數(shù)x=x+10*m_bc; /計(jì)算進(jìn)給后x坐標(biāo)值n=n-1; /第1象限圓弧終點(diǎn)判別器1m=m-1; /完整圓弧終點(diǎn)判別器減1
26、 if(Ey>0) /y向終點(diǎn)判別器判斷,Ey=0,y向插補(bǔ)結(jié)束 Y=Y+Ye; /計(jì)算y積分累加器 if(Y>=M) /判斷積分累加器是否溢出,未溢出轉(zhuǎn)到下一步 Y=Y-M; /y積分累加器溢出取其余數(shù)ys=1; /標(biāo)志y向進(jìn)給一次Ey=Ey-1; /y終點(diǎn)判別器減1Ty=Ty+1; /計(jì)算y向插補(bǔ)次數(shù)y=y+10*m_bc; /計(jì)算進(jìn)給后y坐標(biāo)值n=n-1; /第1象限圓弧終點(diǎn)判別器1m=m-1; /完整圓弧終點(diǎn)判別器減1pdc->SelectObject (new CPen(PS_SOLID,0,RGB(255,0,0); /選擇插補(bǔ)直線的顏色,此處選紅色 pdc-&g
27、t;LineTo(x,y); /畫直線/*插補(bǔ)第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*T1y*m_bc;if(N1= =0) for(int j=0;j<m_n;j+)M1=M1*2;X1=M1/2;Y1=M1/2;N1=N1+1; pdc->MoveTo(x,y);if(Ex>0) X1=X1+Xe; if
28、(X1>=M1) X1=X1-M1;xs=1;Ex=Ex-1;T1x=T1x+1;x=x-10*m_bc;m=m-1; if(Ey>0) Y1=Y1+Ye; if(Y1>=M1) Y1=Y1-M1;ys=1;Ey=Ey-1;T1y=T1y+1;y=y+10*m_bc;m=m-1; pdc->SelectObject (new CPen(PS_SOLID,0,RGB(255,0,0);pdc->LineTo(x,y); if(m=0) /此段函數(shù)用于連續(xù)插補(bǔ)圓弧時(shí)終點(diǎn)判斷 KillTimer(1); else AfxMessageBox("請(qǐng)輸入1-4象限
29、的圓"); else AfxMessageBox("請(qǐng)輸入正確的半徑值");else AfxMessageBox("請(qǐng)輸入位于同一圓上的坐標(biāo)點(diǎn)"); else AfxMessageBox("請(qǐng)輸入符合要求的圓心位置");4) 連續(xù)插補(bǔ)圓弧的實(shí)現(xiàn)程序方案1:通過定時(shí)器實(shí)現(xiàn)逐段顯示插補(bǔ)軌跡。void CMyDlg:OnButton3() SetTimer(1,500,NULL); /選擇定時(shí)器1,定時(shí)時(shí)間500ms;void CMyDlg:OnTimer(UINT nIDEvent) /定時(shí)器1函數(shù),調(diào)用OnButton1()函
30、數(shù),定時(shí)器關(guān)閉如上所述OnButton1();方案2:通過循環(huán)體,一次實(shí)現(xiàn)插補(bǔ)軌跡的顯示。程序語句含義同單步插補(bǔ)程序。if(m_line= =1) 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)if(sqrt(fabs(m_aax)-fab
31、s(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) 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
32、(m_aax)+abs(m_aay)+(abs(m_ox+m_r)-abs(m_bax)+abs(m_bay)/m_bc;while(m>0)if(T= =1) /T=1插補(bǔ)第1象限的圓弧,T=0插補(bǔ)第四象限的圓弧 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(int i=0;i<m_n;i+)M=M*2; X=M/2; Y=M/2; while(n>0) Xe=m_aay-Ty*m_bc; Ye
33、=m_aax-m_ox+Tx*m_bc; if(Ex>0) X=X+Xe; 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->LineTo(x,y); T=T-1; /第1象限圓弧插補(bǔ)結(jié)束 else Ex=(abs(m_r+m_ox)-abs(m_bax)/m_bc; Ey=abs(m_bay)/m_bc;
34、 N=Ex+Ey; x=10*(m_r+m_ox); y=0; pdc->MoveTo(x,y); for(int j=0;j<m_n;j+) M1=M1*2; X1=M1/2; Y1=M1/2; while(N>0) Xe=0+T1y*m_bc; Ye=abs(m_r)-T1x*m_bc; if(Ex>0) X1=X1+Xe; if(X1>=M1) X1=X1-M1; xs=1; Ex=Ex-1; T1x=T1x+1; x=x-10*m_bc; m=m-1; N=N-1; if(Ey>0) Y1=Y1+Ye; if(Y1>=M1) Y1=Y1-M1;
35、 ys=1; Ey=Ey-1; T1y=T1y+1; y=y+10*m_bc; m=m-1; N=N-1; pdc->LineTo(x,y); if(m=0) AfxMessageBox("連續(xù)插補(bǔ)圓弧結(jié)束"); else AfxMessageBox("請(qǐng)輸入1-4象限的圓"); else AfxMessageBox("請(qǐng)輸入正確的半徑值"); else AfxMessageBox("請(qǐng)輸入位于同一圓上的坐標(biāo)點(diǎn)"); else AfxMessageBox("請(qǐng)輸入符合要求的圓心位置");
36、六 其他程序說明1) 清除按鈕功能程序每次按下該按鈕時(shí),將定義的所有變量賦予初值。void CMyDlg:OnButton2() N=0;N1=0;NX=0;NY=0;x=0;y=0;E=0; F=0;m=0;n=1; X=0;X1=0;Y=0;Y1=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; Invalidate();2) 退出按鈕功能程序每次按下該按鈕時(shí),程序提示退出界面。void CMyDlg:OnButton4() if(MessageBox("確認(rèn)退出插補(bǔ)程序","
37、;請(qǐng)確認(rèn)退出",MB_ICONQUESTION|MB_OKCANCEL)=IDOK)PostMessage(WM_QUIT);七 心得體會(huì)機(jī)床數(shù)控技術(shù)及應(yīng)用課程設(shè)計(jì)是對(duì)我們所學(xué)課程機(jī)床數(shù)控技術(shù)及應(yīng)用中知識(shí)的應(yīng)用,用到的主要知識(shí)是插補(bǔ)原理和插補(bǔ)方法。本次課程設(shè)計(jì)與我們以前做過的課程設(shè)計(jì)存在明顯的不同,以往的課程設(shè)計(jì)主要工作是計(jì)算與手工畫圖,而這次的課程設(shè)計(jì)是對(duì)原理的應(yīng)用。作為實(shí)現(xiàn)插補(bǔ)過程的實(shí)現(xiàn)手段,對(duì)編程語言知識(shí)的要求較高,完全通過軟件編程實(shí)現(xiàn),即“1%的工作是插補(bǔ),99%的工作是界面的設(shè)計(jì)和程序編寫”。這次課程設(shè)計(jì),我從開始準(zhǔn)備到完全做完,一共花了三天多的時(shí)間,每天從早晨八點(diǎn)到晚上十
38、一點(diǎn),除了中間去上課之外,其余時(shí)間一直都在教研室里做課設(shè),不但沒有感覺枯燥,反而覺得很有趣。這次課設(shè)主要是通過編程語言實(shí)現(xiàn)的,幸運(yùn)的是我們?cè)诖笠坏臅r(shí)候?qū)W習(xí)過Visual C+,而且這個(gè)學(xué)期以來自己也一直在用VC對(duì)51單片機(jī)進(jìn)行編程,所以對(duì)Visual C+的知識(shí)還算熟悉,沒有因?yàn)槿W(xué)習(xí)新的編程語言和復(fù)習(xí)以往的知識(shí)而花費(fèi)時(shí)間。雖然如此,但由于對(duì)建立MFC應(yīng)用程序的過程了解不夠,沒有搞清楚文檔界面和對(duì)話框的區(qū)別,仍然走了寫誤區(qū)。我花了一天的時(shí)間去看了與文檔編程相關(guān)的資料,直到晚上才在別人的提醒下發(fā)現(xiàn)看的資料跟自己需要的不一樣。雖然也從中學(xué)習(xí)到了一些自己所需要的知識(shí),但是絕大多數(shù)的時(shí)間還是浪費(fèi)了。在
39、三天多的時(shí)間里,從MFC知識(shí)的學(xué)習(xí),到界面的設(shè)計(jì)、控件的布置,到最后的函數(shù)添加,自己一步一個(gè)腳印走過來,付出了很大的努力,同時(shí)也學(xué)習(xí)到了很多的知識(shí),對(duì)插補(bǔ)的原理也進(jìn)一步理解。剛開始,先練習(xí)在控件上畫出圖形,然后就練習(xí)圖形輸出的單步控制。因?yàn)樵趫D書館里沒有找到相關(guān)的資料,所以就自己慢慢地琢磨,花了很長(zhǎng)的時(shí)間,也花了很大的功夫,我知道如何編寫插補(bǔ)步驟的程序?qū)τ谖襾碚f是沒有問題的,關(guān)鍵的地方就是如何實(shí)現(xiàn)插補(bǔ)軌跡的單步輸出。后來無意中在C+的課本上看見靜態(tài)變量可以實(shí)現(xiàn)每次程序執(zhí)行后數(shù)值不變,我才猛然意識(shí)到利用靜態(tài)變量實(shí)現(xiàn)軌跡的單步控制。我先嘗試著編寫了將一條直線分段輸出的程序,果然可以實(shí)現(xiàn)。之后,就很
40、順利的將直線的插補(bǔ)程序編寫出來,與自己預(yù)想的完全一樣。而從單步控制到連續(xù)插補(bǔ)的實(shí)現(xiàn),只花了不到五分鐘的時(shí)間。一條一條語句的編寫,看著自己一點(diǎn)點(diǎn)的進(jìn)步,心里有種莫名的激動(dòng)。第二天晚上十點(diǎn)半我將直線插補(bǔ)的兩種方式實(shí)現(xiàn)了。第三天的時(shí)候,我開始編寫圓弧插補(bǔ)的程序。因?yàn)閳A弧插補(bǔ)用DDA法實(shí)現(xiàn),這種插補(bǔ)方法沒有固定的偏差判別函數(shù),所用到的變量數(shù)目也較多,所以我感覺圓弧插補(bǔ)的實(shí)現(xiàn)要比直線繁瑣好多,但是因?yàn)橐呀?jīng)有了一定的經(jīng)驗(yàn),所以我并沒有擔(dān)心自己別寫不出來。我首先嘗試編寫第1象限的圓弧的插補(bǔ)程序,在這過程中出現(xiàn)了很多的問題,不是輸不出圖形,就是輸出的軌跡與實(shí)際的插補(bǔ)軌跡不相同。一遍一遍的修改程序,但是大半天的
41、時(shí)間過去了,還是沒有什么進(jìn)展。實(shí)在沒有辦法,我就按照自己編寫的程序,一步步往下驗(yàn)證,將結(jié)果一步步在紙上寫下來,與實(shí)際的插補(bǔ)圖形進(jìn)行比較,看看問題究竟出現(xiàn)在哪。這樣果然有效,在晚上八點(diǎn)左右的時(shí)候,我把第1象限的圓弧單步插補(bǔ)實(shí)現(xiàn)。對(duì)程序略加修改之后,不一會(huì)兒就實(shí)現(xiàn)了兩個(gè)象限的圓弧的單步插補(bǔ)。然而,圓弧的連續(xù)插補(bǔ)并沒有像直線插補(bǔ)那么容易實(shí)現(xiàn)。因?yàn)檫@其中的變量太多,用到的判別語句很多,眼睛很容易就看錯(cuò)了,一不小心就會(huì)把程序?qū)戝e(cuò),輸不出正確結(jié)果就很正常了。雖然進(jìn)過一個(gè)多小時(shí)的修改,但是程序仍然不能實(shí)現(xiàn)功能。 晚上回去之后還在一直考慮著這個(gè)問題,覺也沒有睡好。第二天清晨在腦子里又把程序理了一遍,居然發(fā)現(xiàn)了
42、一些問題。早飯后到教研室,花了不到二十分鐘就把程序改好了。當(dāng)插補(bǔ)的一條條線段出現(xiàn)在我的眼睛里的時(shí)候,心里真的是很激動(dòng),為自己這些天的努力與付出有一個(gè)滿意的結(jié)果而高興。后來在老師的幫助和提醒下,我又花了大概半天的時(shí)間將整個(gè)程序進(jìn)一步完善,例如可以逐段顯示連續(xù)插補(bǔ)的軌跡、用不同的顏色顯示插補(bǔ)軌跡、數(shù)據(jù)點(diǎn)賦初值,避免出錯(cuò)等,這樣輸出的結(jié)果比之前好了很多。在這次課程設(shè)計(jì)的過程中,我不單單是將課程設(shè)計(jì)給做完了,真的學(xué)習(xí)到了很多的東西,體會(huì)到了學(xué)習(xí)的樂趣,對(duì)數(shù)控插補(bǔ)原理的理解更加透徹,能夠更加熟練的使用Visual C+,以后也可以利用MFC做一些其他的程序。同時(shí),因?yàn)槲覍磉€要深入地學(xué)習(xí)數(shù)控技術(shù),所以這次的經(jīng)歷對(duì)自己以后也有很大的幫助,也激發(fā)了我學(xué)習(xí)的興趣。附錄1:插補(bǔ)過程完整的程序/ 數(shù)控機(jī)床技術(shù)及應(yīng)用課程設(shè)計(jì)Dlg.cpp : implementation file#include "stdafx.h"#include "數(shù)控機(jī)床技術(shù)及應(yīng)用課程設(shè)計(jì).h"#include "數(shù)控機(jī)床技術(shù)及應(yīng)用課程設(shè)計(jì)Dlg.h"#include &quo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司爬長(zhǎng)城團(tuán)建登山活動(dòng)方案
- 公司節(jié)假日內(nèi)部活動(dòng)方案
- 公司標(biāo)準(zhǔn)化體系策劃方案
- 公司策劃端午節(jié)活動(dòng)方案
- 公司組織年終滑雪活動(dòng)方案
- 公司激勵(lì)活動(dòng)方案
- 公司組織打球活動(dòng)方案
- 公司節(jié)能減排活動(dòng)方案
- 公司花樣慶祝活動(dòng)方案
- 公司策劃小活動(dòng)方案
- 機(jī)房施工方案及技術(shù)措施
- 員工培訓(xùn)矩陣表
- 摜蛋大賽招商方案
- 電影特效制作課件
- 304不銹鋼管焊接工藝
- 網(wǎng)絡(luò)安全教育安全教育
- 醫(yī)療器械經(jīng)銷商和代理商法規(guī)義務(wù)
- 糖尿病專科護(hù)士培訓(xùn)學(xué)習(xí)匯報(bào)課件
- 心理健康教育C證面試20個(gè)題目參考答案
- 危險(xiǎn)化學(xué)品庫房貯存規(guī)定培訓(xùn)課件
- Part 3-4 Unit 7 Invention and Innovation教案-【中職專用】高一英語精研課堂(高教版2021·基礎(chǔ)模塊2)
評(píng)論
0/150
提交評(píng)論