南航數(shù)控機床課程設(shè)計說明
《南航數(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_alx
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象限圓 ??;Ex, 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;i 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;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("請輸入位于同一圓上的坐標(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;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象限圓弧插補結(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;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ù)插補圓弧結(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_alx
- 溫馨提示:
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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運動會安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動總結(jié)+在機關(guān)“弘揚憲法精神推動發(fā)改工作高質(zhì)量發(fā)展”專題宣講報告會上的講話
- 2024年XX村合作社年報總結(jié)
- 2024-2025年秋季第一學(xué)期初中歷史上冊教研組工作總結(jié)
- 2024年小學(xué)高級教師年終工作總結(jié)匯報
- 2024-2025年秋季第一學(xué)期初中物理上冊教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學(xué)期小學(xué)語文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習(xí)整治報告
- 2025年學(xué)校元旦迎新盛典活動策劃方案
- 2024年學(xué)校周邊安全隱患自查報告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報告