圆弧插补C语言程序
圆弧插补指令G02(精)
![圆弧插补指令G02(精)](https://img.taocdn.com/s3/m/7ae5456c02768e9950e73802.png)
圆弧插补指令G02/G03指令格式:G02R__X (U )__ Z (W )__ F__ ;G03 I__ K__指令意义:刀具沿X 、Z 两轴同时从起点位置(当前程序段运行前的位置)以R 指定的值为半径或以I 、K 值确定的圆心顺时针(G02)/逆时针(G03)圆弧插补至X(U )、Z (W )指定的终点位置。
指令地址:G02:顺时针圆弧插补,见图3-15A ; G03:逆时针圆弧插补,见图3-15B ;X :终点位置在X 轴方向的绝对坐标值,其取值范围是:-9999.999mm ~+9999.999mm;Z :终点位置在Z 轴方向的绝对坐标值,其取值范围是:-9999.999mm ~+9999.999mm;U :终点位置相对起点位置在X 轴方向的坐标值,其取值范围是:-9999.999mm ~+9999.999mm;W :终点位置相对起点位置在Z 轴方向的坐标值,其取值范围是:-9999.999mm ~+9999.999mm;I :圆心相对圆弧起点在X 轴上的坐标值,其取值范围是:-9999.999mm ~+9999.999mm;K :圆心相对圆弧起点在Z 轴上的坐标值,其取值范围是:-9999.999mm ~+9999.999mm;R :圆弧半径;F :沿圆周运动的切线速度,其取值范围是:1~15000mm/min,其速度合成图见本手册3.6节进给功能F 代码。
图3-15A G02轨迹图图3-15B G03轨迹图指令说明:● 顺时针或逆时针是从垂直于圆弧所在平面的坐标轴的正方向看到的回转方向,它是与采用前刀座坐标系还是后刀座坐标系有关的,如图3-16;图3-16 圆弧方向的确定● 圆弧中心用地址I 、K 指定时,其分别对应于X ,Z 轴。
I 、K 表示从圆弧起点到圆心的矢量分量,是增量值:I =圆心坐标X -圆弧起始点的X 坐标; K =圆心坐标Z -圆弧起始点的Z 坐标;OKI图3-17 圆弧I 、K 值I 、K 根据方向带有符号,I 、K 方向与X 、Z 轴方向相同,则取正值;否则,取负值。
圆弧插补指令编程
![圆弧插补指令编程](https://img.taocdn.com/s3/m/4c108f04e53a580216fcfe96.png)
•%
小结
所有不同型号的数控车床、铣床都必须用到G00、G01、G02、 G03指令,这四个指令在所有数控系统中都通用。在数控车、铣床 自动编程中,任何平面、曲面加工的路径最后都是由直线、圆弧插 补组成。所以说,这四个指令是数控编程的最基本组成单元。
① 用绝对值编程时,圆弧终点坐标为圆弧终点在工件坐标系中的坐标值,用X、Z 表 示。当用增量值编程时,圆弧终点坐标为圆弧终点相对于圆弧起点的增量值,用U、W表示。
② 圆心坐标(I, K)为圆弧起点到圆弧中心点所作矢量分别在X、Z坐标轴方向上分矢 量(矢量方向指向圆心)。本系统I、K为增量值,并带有“±”号,当矢量的方向与坐标轴 的方向不一致时取“”号。
安全操作和注意事项
(1)选刀时,刀尖角一定要控制在40°以下,如果刀尖角过大,凹圆 弧将过切。
(2)装刀时,刀尖同工件中心高对齐,对刀前,先将工件端面车平。 (3)为保证精加工尺寸准确性,可分半精加工、精加工。 (4)由于暂不计刀尖圆弧半径,因此实际圆弧存有过切或欠切现象。
工件的参考程序
• O0304 (O0304); • G40G97G99M03S500T0101F
用G02、G03指令加工圆弧面时,要注意顺、逆方向及圆弧半径 和圆心坐标编程的不同之处。
通过实训项目的学习,了解数控车床对刀与工件坐标系之间的 关系;通过半精加工、精加工掌握如何控制工件尺寸。
数控机床操作入门
模块三 单一指令加工应用
G02 G03圆弧插补指令编程
![G02 G03圆弧插补指令编程](https://img.taocdn.com/s3/m/06bf4565a8114431b80dd836.png)
圆弧终点坐标
确定圆心位置 进给速度
绝对值 X、Z 增量值 U、W 混合编程 X、W
α≤180° 用+R 360°>α>180° 用-R
车床刀架前后置,圆弧顺逆不相同 刀架后置为标准,前置顺逆方向反
教学重点
圆弧顺、逆的判断和圆心位置R正负的确定。
教学难点
圆弧顺逆的判断。
主目录
能力训练题:
YHCNC实 习 卡 片
N78 G01X21
(切断工件 )
N80 G00X100
(X轴方向退刀)
N82 Z120 M09 (回换刀点,切削液关 )
N84 M30
(程序结束,返回第一条程序段 )
四、典型零件加工演示
(用YHCNC仿真软件)
课堂小结
G02(G03)X(U)——Z(W)—— R—— F——
圆弧顺、逆
刀架后置 刀架前置
N62 T0404
(换切断刀)
N64 G00X82S400M03(点定位到φ82,正转,400r/min )
N66 Z-44
(快速点定位到离端面44处)
N68 G01X75F200 (切槽 )
N70 G00X82
(退刀到φ82 )
N72 W2
(增量移动2mm )
N74 G01X80F200 (进刀到φ80 ) N76 G?03X76W-2R2 (车R2圆弧 )
模块 学习单元
FANUC-0i数控车
G02、G03圆弧插补 指令编程
考核项目 考 核 标 准 配 分 得 分 总 分
编程考核 任错一处扣5分 70
设 YHCNC 学时
软件操作考核 任错一处扣10分 30
备 仿真软件 件数 1 记 事
数字积分法插补C语言程序
![数字积分法插补C语言程序](https://img.taocdn.com/s3/m/68a0ce156bd97f192279e9bd.png)
#include<stdio.h>#include<math.h>#include<stdlib.h>/********************************************************************/ /* 函数名: InsertPoint *//* 功能:控制机床各轴进给并将进给结果写入文件中 *//* 参数:double x, double y 插补点单位:毫米 *//* 说明:与机床硬件关联,每产生一个点调用一次 *//********************************************************************/ void InsertPoint(double xCur,double yCur){extern FILE *fp;char ch=10;printf("xCur=%f,yCur=%f\n",xCur,yCur);fprintf(fp,"%f,%f",xCur,yCur);fputc(ch,fp);}/********************************************************************/ /* 函数名: Judge_Quadrant *//* 功能:判断参数坐标的所在象限并返回相应象限值 *//* 参数:double x mm *//* double y mm *//********************************************************************/ unsigned short Judge_Quadrant(double x, double y){unsigned short nDir;if (x>=0){ //象限判断if (y>=0){nDir=1;return 1;}else{nDir=4;return 4;}}else{if (y>=0){nDir=2;return 2;}else{nDir=3;return 3;}}}/********************************************************************/ /* 函数名: DDA_Line */ /* 功能:数字积分法直线插补 *//* 参数:double XEnd, double YEnd 插补终点 mm *//* int step 步长 mm *//* unsigned short n 寄存器位数 *//********************************************************************/ void DDA_Line(unsigned short n, int step, double XEnd, double YEnd){long XRes,YRes; //寄存器溢出后余数long xEnd,yEnd; //插补终点值long XCur=0,YCur=0; //当前位置int IPCount=0;//累加值int nQuadrant;//象限int Q; //累加器容量int bInterpXEnable,bInterpYEnable;XRes=YRes=0;bInterpXEnable=bInterpYEnable=0;xEnd=labs(XEnd);yEnd=labs(YEnd);Q=(fabs(YEnd)+fabs(XEnd))/step;nQuadrant=Judge_Quadrant(XEnd,YEnd);//计算插补象限switch(nQuadrant){case 1:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur+=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur+=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1) {InsertPoint(XCur,YCur);bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;case 2:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur-=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur+=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1) { InsertPoint(XCur,YCur); bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;case 3:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur-=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur-=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1) {InsertPoint(XCur,YCur); bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;case 4:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur+=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur-=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1) {InsertPoint(XCur,YCur); bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;}}/********************************************************************//* 函数名: DDA_Line *//* 功能:数字积分法圆弧插补 *//* 参数:double XEnd, double YEnd 插补终点 mm *//* int step 步长 mm *//* unsigned short n 寄存器位数 *//********************************************************************/void DDA_Circle(unsigned short n, int step, double XStart, double YStart, double XEnd, double Y End, double radius, int bIsCW){double xCur=XStart,yCur=YStart;long xRes=0,yRes=0;int ndir,Q;int judge=1;int full_circle=0;int xEnable,yEnable;xEnable=yEnable=0;Q=radius;//溢出基值,也可取为pow(2,n)InsertPoint(xCur,yCur);if(XStart==XEnd&YStart==YEnd)full_circle=1;//判断是否要画整圆while(judge==1||full_circle==1)//检测终点{xRes+=fabs(xCur);yRes+=fabs(yCur);if(xRes>=Q&fabs(yCur)<=radius){xRes=xRes%Q;yEnable=1;}if(yRes>=Q&fabs(xCur)<=radius){yRes=yRes%Q;xEnable=1;}if(bIsCW==0)//逆圆插补{ndir=Judge_Quadrant(xCur,yCur);if(yEnable==1)//xRes溢出,y轴进给{switch(ndir){case 1:if(fabs(yCur)<radius) yCur+=step;break;//防止y轴超出半径范围case 2:yCur-=step;break;case 3:if(fabs(yCur)<radius) yCur-=step;break;//防止y轴超出半径范围case 4:yCur+=step;break;}}if(xEnable==1)//yRes溢出,x轴进给{switch(ndir){ case 1:xCur-=step;break;case 2:if(fabs(xCur)<radius) xCur-=step;break;//防止x轴超出半径范围case 3:xCur+=step;break;case 4:if(fabs(xCur)<radius) xCur+=step;break;//防止x轴超出半径范围}}}else//顺圆插补{ndir=Judge_Quadrant(xCur,yCur);if(yEnable==1)//xRes溢出,y轴进给{switch(ndir){case 1:yCur-=step;break;case 2:if(fabs(yCur)<radius) yCur+=step;break;//防止y轴超出半径范围case 3:yCur+=step;break;case 4:if(fabs(yCur)<radius) yCur-=step;break;//防止y轴超出半径范围}}if(xEnable==1)//yRes溢出,x轴进给{switch(ndir){case 1:if(fabs(xCur)<radius) xCur+=step;break;//防止x轴超出半径范围case 2:xCur+=step;break;case 3:if(fabs(xCur)<radius) xCur-=step;break;//防止x轴超出半径范围case 4:xCur-=step;break;}}}judge=(fabs(xCur-XEnd)>=step||fabs(yCur-YEnd)>=step);if(xEnable||yEnable)//判断并进行进给运动{InsertPoint(xCur,yCur);xEnable=yEnable=0;full_circle=0;}}}FILE *fp;int main(){char fn[10];printf("please input filename:\n");scanf("%s",fn);if((fp=fopen(fn,"w"))==NULL) { printf("can't open file\n"); exit(0);}DDA_Circle(4,1,50,0,40,-30,50,1);//输入要插补的圆弧的参数// DDA_Line(4,1,50,-20);//输入要插补的圆弧的参数fclose(fp);return 0;}。
G2G3 圆弧插补指令
![G2G3 圆弧插补指令](https://img.taocdn.com/s3/m/815ecc165f0e7cd184253655.png)
3、G2/G3 :圆弧插补指令刀具从现处位置沿圆弧轨迹移动至圆弧终点。
移动的速度由进给速度F指令指定。
编程格式:XY平面圆弧: G2或G3 X — Y — R — F—X — Y—:为圆弧的终点位置坐标。
R—:圆弧的半径。
F—:为刀具移动的速度,即切削进给速度。
G2 —:顺时针圆弧插补。
G3 —:逆时针圆弧插补。
G2/G3 :圆弧插补指令应用将执行动作:刀具从现处位置C点沿CD之间的圆弧轨迹移移动至圆弧终点D。
CD段圆弧是一段顺时针圆弧轨迹,所以用G2指令。
加工程序:绝对坐标编程:N80 G90 G2 X63.0 Y20.0 R23.0相对坐标编程:N80 G91 G2 X23.0 Y-23.0 R23.0 F100平面的选择:数控系统一般可以加工XY、XZ、YZ平面的圆弧。
G17:该指令表示选择XY平面,在此平面中进行圆弧插补和刀具补偿。
此代码为系统初始代码。
电源一接通G17 就作为平面选择的起始代码而自动生效。
G18:该指令表示选择XZ平面,在此平面中进行圆弧插补和刀具补偿。
G19:该指令表示选择YZ平面,在此平面中进行圆弧插补和刀具补偿。
G17、G18、G19平面顺逆圆弧判断示意图:G17、G18、G19平面顺逆圆弧判断用IJK代替R编程I:表示圆心点相对起点在X轴上的增量坐标。
J:表示圆心点相对起点在Y轴上的增量坐标。
K:表示圆心点相对起点在Z轴上的增量坐标。
用IJK代替R编程应用加工程序:。
N50 G1 G90 X15 Y0N60 G2 I-15 。
直线圆弧插补指令编程
![直线圆弧插补指令编程](https://img.taocdn.com/s3/m/25c73974f7ec4afe04a1df39.png)
快速定位
1、G00指令格式:G00 X(U)_ Z(W)_
式中:X、Z:绝对编程时,目标点在工件坐标系中的坐标;
U、W:增量编程时刀具移动的距离。
2、G00指令刀具相对于工件以各轴预先设定的速度,从当前位置快速移动到程序段指令的 定位目标点。
3、G00指令中的快移速度由机床参数“快移进给速度”对各轴分别设定,所以快速移动速 度不能在地址F中规定,快移速度可由面板上的快速修调按钮修正。
G01倒角、倒圆功能
G01倒角控制功能可以在两相邻轨迹的程序段之间插入直线倒角或圆弧倒角。 指令格式:G01 X(U) Z(W) C_ (直线倒角)
G01 X(U) Z(W) R_ (圆弧倒角) 式中:X、Z值为在绝对指令时,是两相邻直线的交点,即假想拐角交点(G点)的坐标值;
U、W值为在增量指令时,是假想拐角交点相对于起始直线轨迹的始点E的移动距离。 C值是假想拐角交点(G点)相对于倒角始点(F点)的距离;R值是倒圆弧的半径值, 如图5-7所示
所以 ,∠CHJ = 90°∠DHI∠DHG = 90°24.62°24.51° = 40.87°
HJ=CH×cos∠CHJ=12×cos40.87°=9.075
CJ=CH×sin∠CHJ= 12×sin40.87°=7.852
所以X(C)=2HJ=18.15 ,Z(C)=33CJ=25.148 , 圆弧切点C坐标为(X18.15,Z25.148 )
② 根据图5-15得各点绝对坐标值为:
M(100, 100)、A(0, 47)、B(0, 45)、C(18.15, 25.148);
D(22, 9)、E(22, 0)、F(26, 0)。
工件参考程序与加工操作过程
(1)工件的参考程序,如表5-5所示。 (2)输入程序。 (3)数控编程模拟软件对加工刀具轨迹仿真,或数控系统图形仿真
插补程序
![插补程序](https://img.taocdn.com/s3/m/8b1528e919e8b8f67c1cb993.png)
#include "math.h"#include "stdio.h"main(){int type;while(1){printf("请输入线型:\n");printf("1表示直线\n2表示圆弧\n3表示退出\n");scanf("%d",&type);if(type==1)Line();elseif(type==2)Arc();elsebreak;}}void Line(){int m=0,x,y,x0,y0,xe,ye,JX,JY,JS,F1=0,F2;printf("请输入直线的起点坐标和终点坐标(数据之间用逗号分隔):\n");scanf("%d,%d,%d,%d",&x0,&y0,&xe,&ye);x=x0;y=y0;JX=xe-x0;JS=abs(JX)+abs(JY);printf("偏差判别坐标进给终点判断偏差运算\n");while(JS!=0){if(F1>=0){if(JX>0)x++;elsex--;F2=F1-abs(JY);JS-=1;if(F1>0)if(JX>0)printf(" F%d>0 +X %d F%d=F%d-|Ye-Y0|=%d\n",m,JS,m+1,m,F2);elseprintf(" F%d>0 -X %d F%d=F%d-|Ye-Y0|=%d\n",m,JS,m+1,m,F2);elseif(JX<0)printf(" F%d=0 +X %d F%d=F%d-|Ye-Y0|=%d\n",m,JS,m+1,m,F2);elseprintf(" F%d=0 -X %d F%d=F%d-|Ye-Y0|=%d\n",m,JS,m+1,m,F2);F1=F2;}else{if(JY>0)y++;elsey--;F2=F1+abs(JX);if(JY<0)printf(" F%d<0 +Y %d F%d=F%d+|Xe-X0|=%d\n",m,JS,m+1,m,F2);elseprintf(" F%d<0 -Y %d F%d=F%d+|Xe-X0|=%d\n",m,JS,m+1,m,F2);F1=F2;m++;}}}void Arc(){int m=0,x,y,x0,y0,xe,ye,dox,doy,JX,JY,Ie,Je,F1=0,F2,flag;int R1,R2,R3,R4,SR1,SR2,SR3,SR4,NR1,NR2,NR3,NR4;printf("请输入圆弧类型:\n1表示顺园\n2表示逆圆\n");scanf("%d",&flag);printf("请输入圆弧的起点,终点坐标以及圆心相对起点的坐标(数据之间用逗号分隔):\n");scanf("%d,%d,%d,%d,%d,%d",&x0,&y0,&xe,&ye,&dox,&doy);x=x0;y=y0;Ie=xe-(x0+dox);Je=ye-(y0+doy);printf("偏差判别坐标进给偏差运算终点判别\n");while((Ie-JX)!=0||(Je-JY)!=0)/*for(;i<=1;)*/{R1=(JX>0)&&(JY>=0);R3=(JX<0)&&(JY<=0);R4=(JX>=0)&&(JY<0);SR1=(flag==1)&&R1;SR2=(flag==1)&&R2;SR3=(flag==1)&&R3;SR4=(flag==1)&&R4;NR1=(flag==2)&&R1;NR2=(flag==2)&&R2;NR3=(flag==2)&&R3;NR4=(flag==2)&&R4;if(F1>=0)if(SR1||NR2||SR3||NR4)if(SR3||NR4){y++;F2=F1+2*JY+1;JY+=1;if(F1>0){printf(" F%d>0 +Y F%d=F%d+2*J%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}else{printf(" F%d=0 +Y F%d=F%d+2*J%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}F1=F2;m++;}else{y--;F2=F1-2*JY+1;JY-=1;if(F1>0){printf(" F%d>0 -Y F%d=F%d-2*J%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}else{printf(" F%d=0 -Y F%d=F%d-2*J%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}F1=F2;}elseif(SR2||NR3){x++;F2=F1+2*JX+1;JX+=1;if(F1>0){printf(" F%d>0 +X F%d=F%d+2*I%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}else{printf(" F%d=0 +X F%d=F%d+2*I%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}F1=F2;m++;}else{x--;F2=F1-2*JX+1;JX-=1;if(F1>0){printf(" F%d>0 -X F%d=F%d-2*I%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}else{printf(" F%d=0 -X F%d=F%d-2*I%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}F1=F2;m++;}elseif(SR2||NR1||SR4||NR3)if(NR1||SR2){y++;F2=F1+2*JY+1;JY+=1;printf(" F%d<0 +Y F%d=F%d+2*J%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);F1=F2;else{y--;F2=F1-2*JY+1;JY-=1;printf(" F%d<0 -Y F%d=F%d-2*J%d+1=%dI%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);F1=F2;m++;}elseif(SR1||NR4){F2=F1+2*JX+1;JX+=1;printf(" F%d<0 +X F%d=F%d+2*I%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);F1=F2;m++;}else{x--;F2=F1-2*JX+1;JX-=1;printf(" F%d<0 -X F%d=F%d-2*I%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);F1=F2;}}。
圆弧插补指令
![圆弧插补指令](https://img.taocdn.com/s3/m/8aeae27658fb770bf78a55f3.png)
. ❖圆弧插补指令
1.G02顺时针圆弧插补:沿着刀具进给路径,圆弧段为顺时针。
2.G03逆时针圆弧插补:沿着刀具进给路径,圆弧段位逆时针。
❖圆弧半径编程
1.格式:G02/G03X_Y_Z_R_F;
2.移到圆弧初始点;
3.G02/G03+圆弧终点坐标+R圆弧半径。
(圆弧<或=半圆用+R;大于半圆
(180度)小于整圆(360度)用-R。
圆弧半径R编程不能用于整圆加工。
)
❖用I、J、K编程(整圆加工)
1.格式:G02\G03X_Y_Z_I_J_K_F_;
2.I、J、K分别表示X\Y\Z方向相对于圆心之间的距离,X方向用I表示,
Y方向用J表示,z方向用K表示(G17平面K为0)。
正负判断方法:刀具停留在轴的负方向,往正方向进给,也就是与坐标轴同向,那么就取正值,反之为负。
❖技巧
1.在加工整圆时,一般把刀具定位到中心点,下刀后移动到x轴或Y轴的
轴线上,这样就有一根轴是0,便于编程。
1 / 1'.。
项目四 圆弧轴的编程与加工
![项目四 圆弧轴的编程与加工](https://img.taocdn.com/s3/m/6ab6568bdaef5ef7ba0d3c58.png)
说明:用华中数控系统编写该指令与 GSK980TD一致。
任务三 编程中的简单计算
三角函数公式:
B
a
C
• • • •
正弦:sin 余弦:cos 正切:tan 余切:cot
α α α α
=对边/斜边 =邻边/斜边 =对边/邻边 =邻边/对边
A
特殊角三角函数值 正弦和余弦:Sin 、 Cos
Sin0 = 0 Sin30 = 0.5 Sin45 = √2/2 Sin60 = √3/2 Sin90 = 1
分别为800r/mi和精车1500r/min。 (3)进给速度的选择 确定粗车时每转进给量为0.2mm/r, 精车时每转进给量为0.08mm/r,再根据公式Vf=nf计算出粗、 精车进给速度分别为160mm/min和120mm/min。
二、确定工步内容
三、程序编写
程序
说明
O0001;
N0010 T0101 M03 S800 F160; N0020 G41 G00 X36.0 Z2.0; N0030 X18; N0040 G01 Z0;
2、作辅助线AC
3、通过分析在直角三角形COA中, ∠COA=10°OA=7,COS10°=O.98 4 Sin10°=0.174 根据三角函数可计算出OC和AC的长 度
任务四 带圆弧轴类零件的编程与加工练习
一、制定加工工艺
1.零件的工艺分析:
本零件主要由圆柱和圆弧构成,零件形状简单,表面粗糙度要
每把刀假想刀尖方位号与刀尖半径补偿值必须在应用刀补
前预先设置。刀尖半径补偿值在偏置页面下设置,R为刀 尖半径补偿值,T为假想刀尖方位号。
(七)G41、G42、G40运用的注意点
1、刀尖圆弧半径补偿号和刀具偏置号对应
圆弧插补指令示例程序
![圆弧插补指令示例程序](https://img.taocdn.com/s3/m/0fe26e781a37f111f0855b4a.png)
DRVI指令的多次应用
示例程序1
1、使用DRVI指令以频率1运行 2、在收到传感器信号1时断开DRVI指 令前的 触点, 脉冲将 减速停 止 3、清除指令前触点断开停止错误标志 位,执 行用户 自定义 任务 4、改变下一次DRVI指令要运行的参 数(频 率2、脉 冲个数 等) 5、闭合DRVI指令前的触点,进行第 二次运 行
示例程序3
DRVI指令和DRVSTOP、DRVREAD 指令联 合应用
示例程序4
1、使用DRVI指令以较低频率运行 2、在收到传感器信号时运行DRVST OP指令 ,停止 脉冲输 出 3、读取此过程发出的脉冲总数(即所 经历的 路程) 4、清除DRVSTOP强行停止错误标志 位,断 开DRVI指令 前的触 点 5、将DRVREAD指令读取的脉冲数写 入寄存 器,方 向反转 (将脉 冲个数 前加负 号即可 ) 6、闭合DRVI指令前的触点,以更高 的速度 按原路 返回至 起始点
示例程序10
圆弧插补指令
圆弧从起点(500,500)以外围速度1000Hz顺 时针运 动到终 点(1000,1000)。 在编写 指令时 ,要虚 拟圆心 坐标为 (0,0),这 时起点 的相对 坐标位 置为(- 250,- 250) ,终点 的相对 圆心坐 标位置 为(250,250),设 定加减 速时间 为500mS。
增强型运动控制指令概览
示例程序目录
示例程序1--DRVI指令的多次应用 示例程序2--DRVI指令和DRVSTOP指令联合应用 示例程序3--DRVA指令和DRVPAUSE、DRVRSME指令联合应用 示例程序4--DRVI指令和DRVSTOP、DRVREAD指令联合应用 示例程序5--DVIT指令示例 示例程序6--CAMA示例 示例程序7--CAMI示例 示例程序8--脉冲同步指令 示例程序9--直线插补指令 示例程序10--圆弧出脉冲根据比例系数同步输入脉冲 。 输出脉冲数 = 输入脉冲数 * 同步比例系数。 输出频率 = 输入频率 * 同步比例系数。
C语言模拟直线插补与圆弧插补程序设计
![C语言模拟直线插补与圆弧插补程序设计](https://img.taocdn.com/s3/m/38a8b3423186bceb18e8bb04.png)
数控技术课程设计说明书设计题目直线插补与圆弧插补程序设计机械设计以及自动化专业机械工程学院机械102班设计者青岛理工大学 2013年6月20日目录1.设计题目 (1)2.目录 (2)3.直线插补流程图 (3)4.直线插补程序 (4)5.程序结果 (8)6.圆弧插补流程图 (9)7.圆弧插补程序 (10)8.程序结果 (21)一.直线插补1.直线插补程序流程图2.直线插补程序设计#include "stdio.h"int i,X,Y,X0,Y0,Xe,Ye,F,N; int a[30][2];置FM=0输入XE 、YE 、XOY 、NXYFM ≥0?XOR=1或4?XOR=1或2?ZF=1ZF=2ZF=3ZF=4FM=FM-YE FM=FM+YE调用走步控制程序NXY=NXY-1NXY=0?开始结束YNYNYNYNvoid main(){int m;int menu();void yi();void er();void san();void si();void te();void shuchu();m=menu();a[0][0]=X0;a[0][1]=Y0;switch(m){case 1:yi();shuchu();break;case 2:er();shuchu();break;case 3:san();shuchu();break;case 4:si();shuchu();break;case 5:te();shuchu();break;default:printf("无法插补\n");}}int menu(){int t;printf("输入起点坐标\n");scanf("%d,%d",&X0,&Y0);printf("输入终点坐标\n");scanf("%d,%d",&Xe,&Ye);if (Xe>=X0&&Ye>=Y0)t=1;else if (Xe<=X0&&Ye>=Y0)t=2;else if (Xe<=X0&&Ye<=Y0)t=3;else if (Xe>=X0&&Ye<=Y0)t=4;else if (Xe==X0&&((Ye>Y0&&Y0>=0)||(Ye<Y0&&Y<=0))) t=5;elset=6;return(t); }void yi(){F=0;N=Xe-X0+Ye-Y0;X=X0;Y=Y0;for(i=1;i<=N;i++) { if(F>=0){X++;a[i][0]=X;a[i][1]=Y;F-=Ye-Y0;}else{Y++;a[i][0]=X;a[i][1]=Y;F+=Xe-X0;}}}void er(){F=0;N=X0-Xe+Ye-Y0;X=X0;Y=Y0;for(i=1;i<=N;i++) {if(F>=0){ X--;a[i][0]=X;a[i][1]=Y;F-=Ye-Y0;}else{Y++;a[i][0]=X;a[i][1]=Y;F+=X0-Xe;}}}void san(){F=0;N=X0-Xe+Y0-Ye;X=X0;Y=Y0;for(i=1;i<=N;i++) {if(F>=0){X--;a[i][0]=X;a[i][1]=Y;F-=Y0-Ye;}else{Y--;a[i][0]=X;a[i][1]=Y;F+=X0-Xe;}}}void si(){F=0;N=Xe-X0+Y0-Ye;X=X0;Y=Y0;for(i=1;i<=N;i++) {if(F>=0){X++;a[i][0]=X;a[i][1]=Y;F-=Y0-Ye;}else{ Y--;a[i][0]=X;a[i][1]=Y;F+=Xe-X0;}}}void te(){N=Ye-Y0;for(i=1;i<=N;i++) {if(Ye>0){Y++;a[i][0]=X;a[i][1]=Y;}else if(Ye<0){Y--;a[i][0]=X;a[i][1]=Y;}}}void shuchu(){for(i=0;i<=N;i++){printf("%d ",i);printf("%d,%d\n",a[i][0],a[i][1]); }}3.程序结果例如起点(0,0)终点(6,4)步数坐标1 1,02 1,13 2,14 2,25 3,26 4,27 4,38 5,39 6,310 6,4二.圆弧插补1.圆弧插补程序流程图2.圆弧插补程序输入X0、Y0、NXY 、RNS 置FM=0、XM=X0、YM=Y0RNS=1,2,6,8?FM ≥0?FM ≥0?RNS=2,7?RNS=1,8?ZF=3ZF=2ZF=1ZF=1ZF=2ZF=3FM=FM-2XM=1 FM=FM+2XM=1 FM=FM-2YM=1FM=FM+2YM+1 YM=YM+1 YM=XM-1 YM=XM+1 YM=YM-1调用走步控制程序NXY=NXY-1NXY=0?结束NYNY YNNYNYNYNYNRNS=1,6?RNS=2,5?ZF=4ZF=4#include "stdio.h"#include "math.h"int X0,Y0,X1,Y1,X2,Y2,X3,Y3,X4,Y4; int i=1,r,f,s;void main(){int m;int menu();void yishun();void yini();void ershun();void erni();void sanshun();void sanni();void sishun();void sini();void shuchu();m=menu();switch(m){case 1:yishun();break;case 2:yini();break;case 3:ershun();break;case 4:yini();break;case 5:sanshun();break;case 6:yini();break;case 7:sishun();break;case 8:yini();break;default:printf("无法插补\n"); }}int menu(){int t;printf("输入原点坐标\n");scanf("%d,%d",&X0,&Y0);printf("输入起点坐标\n");scanf("%d,%d",&X3,&Y3);printf("输入终点坐标\n");scanf("%d,%d",&X4,&Y4);printf("1:顺时针圆弧\n");printf("2:逆时针圆弧\n");scanf("%d",&s);X1=X3-X0;Y1=Y3-Y0;X2=X4-X0;Y2=Y4-Y0;r=X1*X1+Y1*Y1;if (X1>=0&&Y1>0&&s==1)t=1;else if (X1>0&&Y1>=0&&s==2)t=2;else if (X1<0&&Y1>=0&&s==1)t=3;else if (X1<=0&&Y1<0&&s==2)t=4;else if (X1<=0&&Y1<0&&s==1) t=5;else if (X1<0&&Y1<=0&&s==2) t=6;else if (X1>0&&Y1<=0&&s==1) t=7;else if (X1>=0&&Y1<0&&s==2) t=8;elset=9;return(t);}void yishun(){do{f=X1*X1+Y1*Y1-r;if(f>=0){Y1--;f-=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{X1++;f+=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(Y1!=0&&(X1!=X2||Y1!=Y2)); if(Y1==0){void sishun();sishun();}}void yini(){do{f=X1*X1+Y1*Y1-r;if(f>=0){X1--;f-=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{Y1++;f+=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(X1!=0&&(X1!=X2||Y1!=Y2));if(X1==0){void erni();erni();}}void ershun(){do{f=X1*X1+Y1*Y1-r;if(f>=0){X1++;f+=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{Y1++;f+=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(X1!=0&&(X1!=X2||Y1!=Y2));if(X1==0){void yishun();yishun();}}void erni(){do{f=X1*X1+Y1*Y1-r;if(f>=0){Y1--;f-=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{X1--;f-=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(Y1!=0&&(X1!=X2||Y1!=Y2)); if(Y1==0){void sanni();sanni();}}void sanshun(){do{f=X1*X1+Y1*Y1-r;if(f>=0){Y1++;f+=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{X1--;f-=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(Y1!=0&&(X1!=X2||Y1!=Y2)); if(Y1==0){void ershun();ershun();}}void sanni(){do{f=X1*X1+Y1*Y1-r;if(f>=0){X1++;f+=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{Y1--;f+=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(X1!=0&&(X1!=X2||Y1!=Y2)); if(X1==0){void sini();sini();}}void sishun(){do{f=X1*X1+Y1*Y1-r;if(f>=0){X1--;f-=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{Y1--;f-=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(X1!=0&&(X1!=X2||Y1!=Y2)); if(X1==0){void sanshun();sanshun();}}void sini(){do{f=X1*X1+Y1*Y1-r;if(f>=0){Y1++;f+=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{X1++;f+=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(Y1!=0&&(X1!=X2||Y1!=Y2)); if(Y1==0){void yini();yini();}}3.程序结果例如圆心(0,0)起点(4,3)终点(4,3)步数坐标04,313,323,432,442,551,560,570,48-1,49-2,410-3,411-3,312-4,313-4,214-5,215-5,116-5,017-4,018-4,-119-4,-220-4,-3 21-3,3 22-3,-4 23-2,-4 24-2,-5 25-1,-5 260,-5 270,-4 281,-4 292,-4 303,-4 313,-3 324,-3 334,-2 345,-2 355,-1 365,0 374,0 384,1 394,2 404,3。
数控技术c语言直线、圆弧插补程序
![数控技术c语言直线、圆弧插补程序](https://img.taocdn.com/s3/m/bfb83cf8c8d376eeaeaa3196.png)
以下是直线差补c语言程序,后面还有圆弧差补,数控老师布置的作业,没办法,自己编的,运行时没问题,保证质量,#include<stdio.h>#include<math.h>main(){int x, y,x2,y2,dx, dy, n, k, i, f,a;printf ("请输入起始点:\n");scanf("%d%d",&x,&y);printf("请输入终止点:\n");scanf("%d%d",&x2,&y2);dx=abs(x2-x);dy=abs(y2-y);n=dx+dy;printf("步数n=%d\n",n);{if(x2>0) if(y2>0) k=1;else k=4;else if(y2>0) k=2;else k=3;} printf("相限k=%d\n",k);for (i=0,f=0;i<n;i++)if (f>= 0){switch (k) {case 1:x++;printf("%d %d\n",x ,y);f-=dy;continue;case 2:y++;printf("%d %d\n",x,y);f-=dx;continue;case 3:x--;printf("%d %d\n",x,y);f-=dy;continue;case 4:y--;printf("%d %d\n",x,y);f-=dx;continue;}}else{ switch (k) {case 1:y++;printf("%d %d\n",x ,y);f+=dx;continue;case 2:x--;printf("%d %d\n",x,y);f+=dy;continue;case 3:y--;printf("%d %d\n",x,y);f+=dx;continue;case 4:x++;printf("%d %d\n",x,y);f+=dy;continue;} }}下面为圆弧差补c语言程序#include"stdio.h"#include"math.h"#include"ctype.h"main(){ int X0,Y0,Xe,Ye,a,I,J,Ie,Je,f;printf("请输入圆弧上的两个点:");scanf("%d %d %d %d",&X0,&Y0,&Xe,&Ye);printf("(X0,Y0)=(%d,%d),(Xe,Ye)=(%d,%d)",X0,Y 0,Xe,Ye);printf("请选择圆弧加工方向,逆时针加工请输入1,顺时针加工请输入2\n");scanf("%d",&a);I=X0,J=Y0,Ie=Xe,Je=Ye,f=0;switch(a){ case 1:{loop: while((Ie!=I)||(Je!=J)){ if(I>=0&&J>0){if(f>=0){f=f-2*I+1;I=I-1;printf("f=%dI=%dJ=%d \n",f,I,J);}else{f=f+2*J+1;J=J+1;printf("f=%dI=%dJ=%d\n ",f,I,J);}goto loop;}if(I<0&&J>=0){if(f>=0){f=f-2*J+1;J=J-1;printf("f=%dI=%dJ=% d\n",f,I,J);}else{f=f-2*I+1;I=I-1;printf("f=%dI=%dJ=%d\n", f,I,J);}goto loop;}if(I<=0&&J<0){if(f>=0){f=f+2*I+1;I=I+1;printf("f=%dI=%dJ=% d\n",f,I,J);}else{f=f-2*J+1;J=J-1;printf("f=%dI=%dJ=%d\n" ,f,I,J);}goto loop;}if(I>0&&J<=0){if(f>=0){f=f+2*J+1;J=J+1;printf("f=%dI=%dJ=% d\n",f,I,J);}else{f=f+2*I+1;I=I+1;printf("f=%dI=%dJ=%d\n" ,f,I,J);}goto loop;}} }case 2:{loop1: while((Ie!=I)||(Je!=J)){ if(I>=0&&J>0){if(f>=0){f=f-2*J+1;J=J-1;printf("f=%dI=%dJ=% d\n",f,I,J);}else{f=f+2*I+1;I=I+1;printf("f=%dI=%dJ=%d\n" ,f,I,J);}goto loop1;}if(I<0&&J>=0){if(f>=0){f=f+2*I+1;I=I+1;printf("f=%dI=%dJ=% d\n",f,I,J);}else{f=f+2*J+1;J=J+1;printf("f=%dI=%dJ=%d\n ",f,I,J);}goto loop1;}if(I<=0&&J<0){if(f>=0){f=f+2*J+1;J=J+1;printf("f=%dI=%dJ=% d\n",f,I,J);}else{f=f-2*I+1;I=I-1;printf("f=%dI=%dJ=%d\n", f,I,J);}goto loop1;}if(I>0&&J<=0){if(f>=0){f=f-2*I+1;I=I-1;printf("f=%dI=%dJ=%d \n",f,I,J);}else{f=f-2*J+1;J=J-1;printf("f=%dI=%dJ=%d\n" ,f,I,J);}goto loop1;}} }}system("pause"); }。
圆弧插补(二)[1]
![圆弧插补(二)[1]](https://img.taocdn.com/s3/m/28a1036627d3240c8447efdd.png)
顺逆圆弧的判别方法:从沿垂 直于要加工圆弧所在平面的坐 标轴由正方向向负方向看,顺 时针方向为G02,逆时针方向 为 G03。
1、圆心角θ 0º≤θ≤180º R取正值 180º<θ<360º R取负值 2、R编程方式不能加工整圆
圆弧插补(二)
圆弧插补(二)
70
70
圆弧插补(二)
三、小结:
• 本节课主要讲述了圆弧编程的第二种编程 方式,此种编程方式可以编制任何形式的 圆。希望同学们掌握。
圆弧插补(二)
作业: 用圆弧I、J编程方式编写如下图形轮廓
y R30
A R20 B R25 C x
45 70
G02/G03 X_ Y_ R_ F_
圆弧插补(二)
复习
1、圆弧插补的功能 2、指令格式以及其字符含义 3、圆弧方向判断 4、注意事项
平面选择
G17 XY面 Z轴
G18 ZX面 Y轴 G19 YZ面 X轴
• (1)圆弧a
G00 X-30 Y0 G02 X0 Y30 R30 F100
• (2)圆弧b
G00 X-30 Y0 G02 X0 Y30 R-30 F100
圆弧插补(二)
编思 程考 方: 式如 编图 写所 吗示 ?整 圆 能 用 R
圆弧插补(二)
• 新课讲解
一、圆弧指令格式2 G02/G03 X _ Y_ I_ J_ F_ 注释:X、Y 圆弧终点坐标 I、J 圆弧起点到圆心在x、y 方向的坐标增量 =圆心坐标 — 起点坐标 二、指令应用
圆弧插补(二)
圆弧插补2
![圆弧插补2](https://img.taocdn.com/s3/m/1ca4611de55c3b3567ec102de2bd960591c6d972.png)
例2程序如下:
(G90)R方式(A点起刀)
% O0001; T01; M06; G90G54G18G00X10.0Z40.0S600M03; G03X30.0Z20.0R20.0F100; G02X20.0Z10.0R10.0; M05; M30; %
程序如下:
•% • O0001; • T01; • M06; • G90G54G17G00X0Y0S1000M03; • G02I20.0F100; • G03X-20.0Y20.0I-20.0; • X-10.0Y10.0J-10.0; • M05; • M30; •%
②、用指令G18时圆心坐标X轴方 向用I表示,Z轴方向用K表示。
③、用指令G19时圆心坐标Y轴方 向用J表示,Z轴方向用K表示。
④、 I_、J_、K_的取值由圆心坐 标值减去起点坐标值所得的 结果确定。
<4>R为圆弧半径值,用半径法编写程 序时应注意,在使用同一半径R的情况 下,从起点A到终点B的圆弧有两个,即 圆弧段c与b(如下图所示),因此,规定 圆弧段所对应的圆心角小于180度时 (圆弧段b)半径用+R表示,圆心角大于 180度时(圆弧段c)半径用-R表示,圆心 角等于180度时用”+R”或”-R”均 可。
是圆弧的终点坐标减去起点坐标 所得的数值。
<3> 坐标字I_、J_、K_表示圆弧 圆心的坐标值, I、J、K分别与 X、Y、Z相对应,它是圆心相对 于圆弧起点在X、Y、Z轴方向上
G03圆弧插补指令编程
![G03圆弧插补指令编程](https://img.taocdn.com/s3/m/225822ec998fcc22bcd10d85.png)
学会用G02、G03指令编程 在编程中能用R表达圆心的位置
考核项目
编程考核
考核标准
任错一处扣5分 任错一处扣10分
配分 得分
70 30 教师 签名
总分
模 块 学习单元
FANUC-0i数控车 G02、G03圆弧插补 指令编程
学时 设 YHCNC 备 仿真软件 件数
软件操作考核
1
记 事
例:试编制图示零件的精加工程序(采用 刀架后置数控车床)。
工艺分析: 1. 车端面; 2. 钻孔; 3. 车内孔; 4. 车外圆各圆弧; 5. 切断;
加工 内容 车外圆 钻孔 车内孔 切断 刀具号 T01 T02 T03 T04 刀具 名称 90°外圆 车刀 φ18 麻花钻 镗孔刀 切断刀 主轴 转速 800 r/min 250 r/min 800 r/min 400 r/min 进给 速度 150 mm/min 240 mm/min 150 mm/min 200 mm/min
序
N44 N46 N48 N50 N52 N54 N56 N58 N60 N62 N64 N66 N68 N70 N72 N74 N76 N78 N80 N82 N84 G00X28Z1S800M03 G01Z0F100 G02X40Z6 R6 G01W-4 G X56Z-18 R G03U W R12 G01Z-50 X87 G00X100Z120M05 T0404(硬质合金切断刀) G00X82S400M03 Z-44 G01X75F80 G00X82 W2 G01X80F80 G01X21 G00X100 Z120 M09 M30
O0003 (调用外圆车刀) N02 T0101 N04 G00 X100 Z120 (外圆车刀到换刀点) (主轴正转,转速800r/min) N06 M03 S800 N08 G00 X87 Z0 M08 (快速点定位到工件端面) N10 (车端面) (快速到换刀点,主轴停) N12 G00 X100 Z120 M05 (换钻头) N14 T0202 N16 G00 X0 S250 M03 (钻头定位到轴线, 正转,250r/min ) (钻头快速点定位到离端面1mm) N18 Z1 N20 G01 Z-60 F240 (钻孔深60) N22 G00Z120 (钻头快速退刀到Z120) (钻头回到换刀点) N24 X100 M05 (换镗孔刀) N26 T0303 (快速点定位,主轴正转,800r/min ) N28 G00 X24 Z1 S800 M03 (直线进给到端面) N30 G01 Z0 F150 N32 G 02 X ? Z ? R (车内孔R2圆弧) ? 20 -2 ? 2 (直线进给到孔深45) N34 G01 Z-45 (切出工件) N36 X17 N38 G00 Z120 (退刀至Z120) (回换刀点,主轴停) N40 X100 M05
插补程序
![插补程序](https://img.taocdn.com/s3/m/8b1528e919e8b8f67c1cb993.png)
#include "math.h"#include "stdio.h"main(){int type;while(1){printf("请输入线型:\n");printf("1表示直线\n2表示圆弧\n3表示退出\n");scanf("%d",&type);if(type==1)Line();elseif(type==2)Arc();elsebreak;}}void Line(){int m=0,x,y,x0,y0,xe,ye,JX,JY,JS,F1=0,F2;printf("请输入直线的起点坐标和终点坐标(数据之间用逗号分隔):\n");scanf("%d,%d,%d,%d",&x0,&y0,&xe,&ye);x=x0;y=y0;JX=xe-x0;JS=abs(JX)+abs(JY);printf("偏差判别坐标进给终点判断偏差运算\n");while(JS!=0){if(F1>=0){if(JX>0)x++;elsex--;F2=F1-abs(JY);JS-=1;if(F1>0)if(JX>0)printf(" F%d>0 +X %d F%d=F%d-|Ye-Y0|=%d\n",m,JS,m+1,m,F2);elseprintf(" F%d>0 -X %d F%d=F%d-|Ye-Y0|=%d\n",m,JS,m+1,m,F2);elseif(JX<0)printf(" F%d=0 +X %d F%d=F%d-|Ye-Y0|=%d\n",m,JS,m+1,m,F2);elseprintf(" F%d=0 -X %d F%d=F%d-|Ye-Y0|=%d\n",m,JS,m+1,m,F2);F1=F2;}else{if(JY>0)y++;elsey--;F2=F1+abs(JX);if(JY<0)printf(" F%d<0 +Y %d F%d=F%d+|Xe-X0|=%d\n",m,JS,m+1,m,F2);elseprintf(" F%d<0 -Y %d F%d=F%d+|Xe-X0|=%d\n",m,JS,m+1,m,F2);F1=F2;m++;}}}void Arc(){int m=0,x,y,x0,y0,xe,ye,dox,doy,JX,JY,Ie,Je,F1=0,F2,flag;int R1,R2,R3,R4,SR1,SR2,SR3,SR4,NR1,NR2,NR3,NR4;printf("请输入圆弧类型:\n1表示顺园\n2表示逆圆\n");scanf("%d",&flag);printf("请输入圆弧的起点,终点坐标以及圆心相对起点的坐标(数据之间用逗号分隔):\n");scanf("%d,%d,%d,%d,%d,%d",&x0,&y0,&xe,&ye,&dox,&doy);x=x0;y=y0;Ie=xe-(x0+dox);Je=ye-(y0+doy);printf("偏差判别坐标进给偏差运算终点判别\n");while((Ie-JX)!=0||(Je-JY)!=0)/*for(;i<=1;)*/{R1=(JX>0)&&(JY>=0);R3=(JX<0)&&(JY<=0);R4=(JX>=0)&&(JY<0);SR1=(flag==1)&&R1;SR2=(flag==1)&&R2;SR3=(flag==1)&&R3;SR4=(flag==1)&&R4;NR1=(flag==2)&&R1;NR2=(flag==2)&&R2;NR3=(flag==2)&&R3;NR4=(flag==2)&&R4;if(F1>=0)if(SR1||NR2||SR3||NR4)if(SR3||NR4){y++;F2=F1+2*JY+1;JY+=1;if(F1>0){printf(" F%d>0 +Y F%d=F%d+2*J%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}else{printf(" F%d=0 +Y F%d=F%d+2*J%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}F1=F2;m++;}else{y--;F2=F1-2*JY+1;JY-=1;if(F1>0){printf(" F%d>0 -Y F%d=F%d-2*J%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}else{printf(" F%d=0 -Y F%d=F%d-2*J%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}F1=F2;}elseif(SR2||NR3){x++;F2=F1+2*JX+1;JX+=1;if(F1>0){printf(" F%d>0 +X F%d=F%d+2*I%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}else{printf(" F%d=0 +X F%d=F%d+2*I%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}F1=F2;m++;}else{x--;F2=F1-2*JX+1;JX-=1;if(F1>0){printf(" F%d>0 -X F%d=F%d-2*I%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}else{printf(" F%d=0 -X F%d=F%d-2*I%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);}F1=F2;m++;}elseif(SR2||NR1||SR4||NR3)if(NR1||SR2){y++;F2=F1+2*JY+1;JY+=1;printf(" F%d<0 +Y F%d=F%d+2*J%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);F1=F2;else{y--;F2=F1-2*JY+1;JY-=1;printf(" F%d<0 -Y F%d=F%d-2*J%d+1=%dI%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);F1=F2;m++;}elseif(SR1||NR4){F2=F1+2*JX+1;JX+=1;printf(" F%d<0 +X F%d=F%d+2*I%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);F1=F2;m++;}else{x--;F2=F1-2*JX+1;JX-=1;printf(" F%d<0 -X F%d=F%d-2*I%d+1=%d I%d-Ie=%d\n",m,m+1,m,m,F2,m+1,JX-Ie);printf(" (%d,%d) J%d-Je=%d\n",JX,JY,m+1,JY-Je);F1=F2;}}。
DDA圆弧插补
![DDA圆弧插补](https://img.taocdn.com/s3/m/f6f43a45a8956bec0975e310.png)
{iy=iy+dy;
ey=ey-1;
ry=ry%32;
}
}
printf("ix=%d,iy=%d\n",ix,iy);/*输出刀具所在点坐标*/
if(dy!=0)
jx=jx+c*i;
if(dx!=0)
jy=jy+d*i;
}}
}
四.实验结果:
仿真:
半加载及左移规格化顺弧第一象限:
半加载及左移规格化顺弧第三象限:
一.实验名称:DDA圆弧插补(四象限、左移规格化、半加载、全加载)
二.实验原理:
三.实验内容:
#include<stdio.h>
#include<math.h>
void main()
{
int xa,ya,xe,ye; /*起点和终点横纵坐标*/
intjx,jy,rx,ry;
int dx,dy,ex,ey;
{
while(jx<8&&jy<8)
{
jx=jx*2;
jy=jy*2;
i=i*2;
}/*左移规格化*/
rx=ry=16;/*半加载赋值*/
for(;ex>0||ey>0;)
{
if((xa>0&&ya>0)||(xa==0&&ya>0))
a=1,b=-1,c=-1,d=1;
else if((xa<0&&ya>0)||(xa<0&&ya==0))
a=1,b=1,c=-1,d=1;
/*给不同象限走刀的变量赋值*/