资源描述
机床数控技术课程设计
29
2020年4月19日
文档仅供参考
机床数控技术课程设计
说明书
学 校:南京航空航天大学
专 业:机械工程及自动化
学 号:
姓 名:
设计题目:PL1 DC21
指导老师:
时 间:
一.课设任务:
1.PL1-----逐点比较法插补第1象限直线;
2.DC21---DDA法插补第2~1象限顺圆弧。
二.课设要求:
1.具有数据输入界面,如输入直线插补的起点、终点,圆弧插补的起止点、圆心或半径、插补的步长等;
2.具有插补过程的动态显示功能,如单步插补、连续插补等;
3.插补的步长可调;
4.直线的起点、圆弧的圆心在坐标系中的位置可变(即直线的起点、圆弧的圆心可不设定在坐标原点)
5.建议使用C语言编程,有条件者可使用VB、VC等语言编程。
三.程序界面及运行截图
1.直线连续插补:
2. 直线单步插补:
3. 圆弧连续插补:
4.圆弧单步插补:
四、程序流程图
1.PL1:逐点比较法插补第1象限直线
逐点比较法插补直线的过程为每进给一步需完成偏差判别,坐标进给,偏差计算,
终点判别四个步骤,具体流程如图1 所示。
开始
E=E-1
Y
N
Y
向正Y方向前进一步
F=F+(x02-x01)
向正X方向前进一步
F=F-(y02-y01)
F>=0
E>0
N
结束
E=(abs(x01-x02)+abs(y01-y02))/k (总步数)
F=0 (判别函数)
初始化,输入起点x01、y01,终点x02、y02,步长k
2、DDA法圆弧插补
xm=fix((xx-x03)/b);
ym=fix((yy+R-y03)/b)
Y
jvx=0;jvy=0
m=2^j
xm>0?
jvx=jvx+yj-yy
Y
N
ym>0?
jvy=jvy+xx-xj
Y
jvx溢出?
>0?
+X前进一步
xm=xm-1
Y
jvy溢出?
>0?
+Y前进一步
ym=ym-1
xm>0||ym>0?
N
二一象限顺圆?
计算圆心坐标(xx,yy)
xj=x03,yj=y03
初始化,输入起点坐标(xr03,y03),终点坐标(x04,y04) 半径R步长b和寄存器位数j
开始
N
Y
+X前进一步
xn=xn-1
-Y前进一步
yn=yn-1
xn=fix((x04-xx)/b);
yn=fix((yy+R-y04)/b);
N
xn>0?
jvx=jvx+yj-yy
Y
N
yn>0?
jvy=jvy+xj-xx
Y
jvx溢出?
>0?
Y
jvy溢出?
>0?
xn>0||yn>0?
N
Y
结束
五.程序及变量说明(Matlab)
function varargout = cxy_(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @cxy__OpeningFcn, ...
'gui_OutputFcn', @cxy__OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function cxy__OpeningFcn(hObject, eventdata, handles, varargin)
global u
u=0;
global fla;
fla=0;
handles.output = hObject;
guidata(hObject, handles);
function varargout = cxy__OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function x1_Callback(hObject, eventdata, handles)
global x01;
x01=str2double(get(handles.x1,'string'));
function x1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function x2_Callback(hObject, eventdata, handles)
global x02;
x02=str2double(get(handles.x2,'string'));
function x2_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function y1_Callback(hObject, eventdata, handles)
global y01;
y01=str2double(get(handles.y1,'string'));
function y1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function y2_Callback(hObject, eventdata, handles)
global y02;
y02=str2double(get(handles.y2,'string'));
function y2_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function x3_Callback(hObject, eventdata, handles)
global x03;
x03=str2double(get(handles.x3,'string'));
function x3_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function y3_Callback(hObject, eventdata, handles)
global y03;
y03=str2double(get(handles.y3,'string'));
function y3_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function x4_Callback(hObject, eventdata, handles)
global x04;
x04=str2double(get(handles.x4,'string'));
function x4_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function y4_Callback(hObject, eventdata, handles)
global y04;
y04=str2double(get(handles.y4,'string'));
function y4_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function r_Callback(hObject, eventdata, handles)
global R;
R=str2double(get(handles.r,'string'));
function r_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function clear_Callback(hObject, eventdata, handles)
cla;
function straightline_Callback(hObject, eventdata, handles)
global s;
grid on;
x01=str2double(get(handles.x1,'string'));
x02=str2double(get(handles.x2,'string'));
y01=str2double(get(handles.y1,'string'));
y02=str2double(get(handles.y2,'string'));
x=linspace(x01,x02,1000);
y=((y02-y01)/(x02-x01))*(x-x01)+y01;
plot(x,y,'b');
hold on;
s=1;
function circular_arc_Callback(hObject, eventdata, handles)
grid on;
x03=str2double(get(handles.x3,'string'));
x04=str2double(get(handles.x4,'string'));
y03=str2double(get(handles.y3,'string'));
y04=str2double(get(handles.y4,'string'));
R=str2double(get(handles.r,'string'));
l=sqrt((y04-y03).^2+(x04-x03).^2);
k=sqrt(R^2-(l^2)/4);
x0=(x03+x04)/2+((y04-y03)*k)/l;
y0=(y03+y04)/2-((x04-x03)*k)/l;
x=linspace(x03,x04,1000);
y=y0+sqrt(R^2-(x-x0).^2);
plot(x,y,'b');
axis equal;
hold on;
global s
s=0;
function lxcb_Callback(hObject, eventdata, handles)
global s F X Y;
if s==1
x01=str2double(get(handles.x1,'string'));
x02=str2double(get(handles.x2,'string'));
y01=str2double(get(handles.y1,'string'));
y02=str2double(get(handles.y2,'string'));
k=str2double(get(handles.buchang,'string'));
X=x01;Y=y01;
F=0;
E=(abs(x01-x02)+abs(y01-y02))/k;
while E>0
if F>=0
X=X+k;
m=linspace(X-k,X,100);
n=Y;
F=F-(y02-y01);
plot(m,n,'r');
else
Y=Y+k;
p=X;
q=linspace(Y-k,Y,100);
F=F+(x02-x01);
plot(p,q,'r');
end
E=E-1;
end
else
x03=str2double(get(handles.x3,'string'));
x04=str2double(get(handles.x4,'string'));
y03=str2double(get(handles.y3,'string'));
y04=str2double(get(handles.y4,'string'));
b=str2double(get(handles.buchang,'string'));
j=str2double(get(handles.jcq,'string'));
R=str2double(get(handles.r,'string'));
l=((y04-y03)^2+(x04-x03)^2)^0.5;
m=(y04-y03)/l;
n=(x03-x04)/l;
xx=(x03+x04)/2+(R^2-l^2/4)^0.5*m;
yy=(y03+y04)/2+(R^2-l^2/4)^0.5*n;
if ~(x03<=xx&xx<=x04&y03>=yy&y04>=yy)
errordlg('请输入第二一象限的顺圆弧');
else
xi=x03;yi=y03;xii=x03;yii=y03;
jvx=0;
jvy=0;
xj=fix((xx-x03)/b);yj=fix((yy+R-y03)/b); %计算步数
m=2^j; %模
while (xj>0||yj>0)
if xj>0
jvx=jvx+yi-yy;
end
if yj>0
jvy=jvy+xx-xi;
end
flag=0;
if(jvx>m)
xj=xj-1;flag=1;
xi=xi+b;
jvx=mod(jvx,m);
end
if(jvy>m)
yj=yj-1;flag=1;
yi=yi+b;
jvy=mod(jvy,m);
end
if flag==1
line([xii,xi],[yii,yi],'color','r');
hold on;
xii=xi;
yii=yi;
end
end
end
line([xi,xx],[yi,yy+R],'color','r');
xi=xx;yi=yy+R;xii=xx;yii=yy+R;
jvx=0;
jvy=0;
xj=fix((x04-xx)/b);yj=fix((yy+R-y04)/b);
m=2^j;
axis auto;
while (xj>0||yj>0)
if xj>0
jvx=jvx+yi-yy;
end
if yj>0
jvy=jvy+xi-xx;
end
flag=0;
if(jvx>m)
xj=xj-1;flag=1;
xi=xi+b;
jvx=mod(jvx,m);
end
if(jvy>m)
yj=yj-1;flag=1;
yi=yi-b;
jvy=mod(jvy,m);
end
if flag==1
line([xii,xi],[yii,yi],'color','r');
xii=xi;
yii=yi;
hold on;
end
end
end
function dbcb_Callback(hObject, eventdata, handles)
global X Y F u E s;
if s==1
x01=str2double(get(handles.x1,'string'));
y01=str2double(get(handles.y1,'string'));
x02=str2double(get(handles.x2,'string'));
y02=str2double(get(handles.y2,'string'));
k=str2double(get(handles.buchang,'string'));
if u==0
X=x01;
Y=y01;
u=u+1;
E=(abs(x01-x02)+abs(y01-y02))/k;
F=0;
else
if E>0
if F>=0
X=X+k;
m=linspace(X-k,X,1000);
n=Y;
F=F-(y02-y01);
plot(m,n,'r');
hold on;
else
Y=Y+k;
p=X;
q=linspace(Y-k,Y);
F=F+(x02-x01);
plot(p,q,'r');
hold on;
end
E=E-1;
else
u=0;
end
end
else
global fla;
x03=str2double(get(handles.x3,'string'));
x04=str2double(get(handles.x4,'string'));
y03=str2double(get(handles.y3,'string'));
y04=str2double(get(handles.y4,'string'));
b=str2double(get(handles.buchang,'string'));
j=str2double(get(handles.jcq,'string'));
R=str2double(get(handles.r,'string'));
l=((y04-y03)^2+(x04-x03)^2)^0.5;
m=(y04-y03)/l;
n=(x03-x04)/l;
xx=(x03+x04)/2+(R^2-l^2/4)^0.5*m;
yy=(y03+y04)/2+(R^2-l^2/4)^0.5*n;
if ~(x03<=xx&&xx<=x04&&y03>=yy&&y04>=yy)
errordlg('请输入第二一象限的顺圆弧');
else %第二象限的顺圆插补
xi=x03;yi=y03;
jvx=0;
jvy=0;
xj=fix((xx-x03)/b);yj=fix((yy+R-y03)/b); %第二象限的计数器
m=2^j;
k=1;
while (xj>0||yj>0)
if xj>0
jvx=jvx+yi-yy;
end
if yj>0
jvy=jvy+xx-xi;
end
flag=0;
if(jvx>m)
xj=xj-1;flag=1;
xi=xi+b;
jvx=mod(jvx,m);
end
if(jvy>m)
yj=yj-1;flag=1;
yi=yi+b;
jvy=mod(jvy,m);
end
if flag==1
XC(k)=xi;
YC(k)=yi;
k=k+1;
end
end
end
xi=xx;yi=yy+R;xii=xx;yii=yy+R; %第一象限顺圆插补
jvx=0;
jvy=0;
xn=fix((x04-xx)/b);yn=fix((yy+R-y04)/b); %第一象限的计数器
m=2^j;
axis auto;
while (xn>0||yn>0)
if xn>0
jvx=jvx+yi-yy;
end
if yn>0
jvy=jvy+xi-xx;
end
flag=0;
if(jvx>m)
xn=xn-1;flag=1;
xi=xi+b;
jvx=mod(jvx,m);
end
if(jvy>m)
yn=yn-1;flag=1;
yi=yi-b;
jvy=mod(jvy,m);
end
if flag==1
XC(k)=xi;
YC(k)=yi;
k=k+1;
end
end
a=pi-atan(abs((y03-yy)/(x03-xx)));
b=atan(abs((y04-yy)/(x04-xx)));
alpha=b:pi/100:a;
XQ=xx+R*cos(alpha);
YQ=yy+R*sin(alpha);
plot(XQ,YQ)
hold on;
plot(xx,yy,'Ro');
if fla==0
fla=fla+1;
elseif fla==1
line([x03,XC(1)],[y03,YC(1)],'color','r');
fla=fla+1;
elseif fla<=k-2
line([XC(fla),XC(fla+1)],[YC(fla),YC(fla+1)],'color','r');
fla=fla+1;
else
errordlg('插补结束');
fla=0;
end
end
function buchang_Callback(hObject, eventdata, handles)
function buchang_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function jcq_Callback(hObject, eventdata, handles)
function jcq_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
六. 心得体会
本次课设是在考研结束后的一周内做完的,时间其实应该是很够的,可是由于本人不善于编程,因此最后完成得很仓促。经过这次课设,我对matlab的操作有了更深的认识,对相关函数语句还有逻辑循环套用的应用有了更深的理解。而且此次课设,让我对逐点比较法直线插补和DDA圆弧插补有了感性和理性的全面认识,对我学习数控机床这门课也有非常大的帮助。最后,遇到困难不要着急,静下心来总有解决办法~
展开阅读全文