C语言模拟直线插补与圆弧插补程序设计
- 格式:doc
- 大小:71.00 KB
- 文档页数:17
项目六直线与圆弧插补指令的应用项目六直线与圆弧插补指令的应用任务描述:1. 巩固编程步骤2. 掌握绝对坐标编程和相对坐标编程的方法。
3. 掌握定位指令、直线插补指令、圆弧插补指令的使用方法和规则任务分析:本任务进入到数控程序的编制实例讲解,通过一个指明轨迹加工过程,示范一个简单编程范例,达到使学生初步掌握简单轨迹编程的方法。
一般的加工轨迹都是由直线和圆弧组成,而直线与圆弧插补指令则是描绘这样一个加工轨迹的基本指令。
一、绝对坐标编程与相对坐标编程1.1绝对和相对编程模式如图6-1所示图6-1绝对和相对坐标1.绝对坐标(G90):就是以零件上一个公共点(工件坐标原点)作为参考——称为绝对输入的原点。
例如,G90 G01 X+100 Y-50 F300;说明选择G90 绝对模式,数学符号“+”、“—”表示直角坐标系的象限,而不是运动方向;X+100 Y-50表示刀具在程序原点中的刀具位置,而不是刀具运动本身。
2.相对坐标(G91):就是以前一个目标为起点到后一点之间的距离。
例如,G91 G01 X+100 Y-50 F300;数字符号“+”、“—”制定刀具运动方向,而不表示直角坐标系的象限;X+50 Y-50表示刀具在制定方向上的运动距离。
提示:1.绝对模式下,所有的尺寸都是从程序原点开始测量。
2.相对模式下,所有程序尺寸都是制定方向上的间隔距离。
1.2快速定位指令(G00)【指令格式】坐标值:表示移动的终点坐标G00 X___ Y____ Z____;坐标值:表示移动的终点坐标提示:1.该指令只能用于定位,不能用于切削。
2.快速定位的速度由数控机床参数决定。
同时,该指令也不受“F 指令”指明的进给速度影响。
3.定位时各坐标轴为独立控制而不是联动控制。
这样可能导致各坐标轴不能同时到达目标点。
例如:执行G00 X50 Y50;由于X轴与Y 轴同时按照机床参数给定的速度运动,产生X轴先到达位置,Y轴后到达的情况。
NJ网络实验4实验目的:a.实现空间一组4个工位的合成直线运动。
工位1(0,0),工位2(2000,2000),工位3(2000, 0),工位4(0,0)b.使用圆弧插补功能,实现下图运动轨迹。
(图中数值仅供参考,可自行修改)C.学习齿轮比(变速)MC_gearin,MC_gearout指令。
速度比要求3比1实验器材:NJ、G5伺服及伺服电机两套;E3ZM-V81两个、网线若干(AT部门NJ样机箱)。
参考资料:NJ教材、NJ操作手册、运动控制指令手册指导人员:实验内容:1.样机搭建、网络组建、轴设置在前报告中已经说明,此处省略。
其中轴设置中原点返回设置选择如下图两轴原点返回均为此设置2.建立轴组:轴设置完毕后,在“配置和设置”中右键点击轴组设置,在下拉菜单中左键点击添加轴组设置,如下图添加后,左键双击MC_Group000;在轴组基本设置中“轴组使用”选择“使用轴组”如下图:构成选择“2轴”分别将“轴A0”分配MC_Axis000(0);“轴A1”分配MC_Axis001(1)如下图点击左侧“轴组操作设置”在下图中设置最大插补速度及加速度等,轴设置完毕3.编写程序A、准备程序程序本次程序依然需要MC_POWER及MC_HOME指令由于与上次程序相同这里不多介绍,程序如下图:原点返回指令“MC_GroupEnable”轴组使能指令,以下为手册截图由于直线插补指令属于轴组指令,如想进行直线插补首先要进行轴组使能指令,否则无法使用对应指令。
将上一步设置好的MC_Group000使能,程序如下指令“MC_GroupDisable”使能解除指令与MC_GroupEnable对应指令,被轴组使能后被使能轴只能使用轴组指令,而不能使用轴指令,例如MC_Move等指令,所以程序中需要编写MC_GroupEnable程序程序如下B、实验程序实验a、实现空间一组4个工位的合成直线运动。
工位1(0,0),工位2(2000,2000),工位3(2000, 0),工位4(0,0)需要用到“MC_MoveLinear”进行直线插补,程序编写如下其中P1、P2、P3、P4分别赋值1、(0,0),2、(2000,2000),3、(2000, 0),4、(0,0),v:=500如下图实验a、完成。
插补程序源代码目录1逐点比较法插补c语言程序源代码 (02)2 逐点比较法圆弧插补VB源程序 (07)3 逐点比较法直线插补VB源程序 (11)4 时间分割法直线插补参考VB程序 (13)5 时间分割法圆弧插补VB源程序 (14)1 逐点比较法插补c语言程序源代码#include "conio.h"#include "graphics.h"#include "process.h"#define Ni_circle 0#define Shun_circle 1void init_graph();void draw_Base_circle();void draw_cabu_circle();void close_graph();void acrroods();static float x0,y0;void line_cabu(), draw_line(),draw_line_cabu();void line_cabu() /*此函数控制直线插步两次*/{int i;init_graph();sleep(1);for(i=0;i<2;i++){line(0,120,300,120); outtextxy(310,120,"Z");line(100,10,100,300); outtextxy(110,300,"X");outtextxy(90,130,"O");draw_line();if(i==0)draw_line_cabu(6);else draw_line_cabu(2);gotoxy(50,5);getch();cleardevice();setcolor(WHITE);}}void draw_line()/*画直线*/{line(100,120,600,450);textcolor(YELLOW);directvideo=0;gotoxy(45,5); cprintf("Line from:X0 Y0 Z0 ");gotoxy(45,6); cprintf("Line to :X500 Y0 Z330");gotoxy(45,7); cprintf("Units :Pixel");gotoxy(45,8); cprintf("Line now:");}void draw_line_cabu(int step)/*关键的直线插补函数*/{int Xe=600,Ye=450;float Fm,Xm=100,Ym=120;setcolor(RED);moveto(Xm,Ym);while(Xm<=Xe&&Ym<=Ye){Fm=(Ym-120)*(Xe-100)-(Xm-100)*(Ye-120);if(Fm>=0)Xm=Xm+step;elseYm=Ym+step;lineto(Xm,Ym);gotoxy(55,8); printf("X%3.0f Y0 Z%3.0f",Xm-100,Ym-120);delay(1100);}}/* 圆插补部分的函数区*/void init_graph() /*图形系统初始化*/{int gdrive=DETECT,gmode;initgraph(&gdrive,&gmode,"");cleardevice();}void acrroods() /*屏幕中心坐标*/{x0=getmaxx()/2;y0=getmaxy()/2;}void draw_Base_circle() /*画圆及写参数*/{line(x0-200,y0,x0+200,y0); outtextxy(x0+220,y0,"Z");line(x0,y0-180,x0,y0+180); outtextxy(x0+10,y0+180,"X");outtextxy(x0-10,y0+10,"O");circle(x0,y0,150);textcolor(YELLOW);directvideo=0;gotoxy(46,2);cprintf("Circle start:X0 Y0 Z150");gotoxy(46,3);cprintf("Circle end :X0 Y0 Z150");gotoxy(46,4);cprintf("Units :Pixel");gotoxy(46,5);cprintf("Circle now:");}void close_graph() /*关图形系统*/{closegraph();}void draw_cabu_circle(int sstep,int Directory)/*关键的圆插补函数*/{int flag=0;float Fm,Xm,Ym;Xm=x0+150; Ym=y0;moveto(Xm,Ym);setcolor(RED);while(1) /*分象限,顺圆和逆圆讨论*/{Fm=(Xm-x0)*(Xm-x0)+(Ym-y0)*(Ym-y0)-150*150;/*圆判断公式*/ if(Fm>=0){if(!Directory){ /*逆圆判断*/if(Xm>=x0&&Ym<=y0){if(flag) break; /*if语句判断象限,以下一样*/else Xm=Xm-sstep;}if(Xm<=x0&&Ym<=y0){flag=1; Ym=Ym+sstep;}if(Xm<=x0&&Ym>=y0)Xm=Xm+sstep;if(Xm>=x0&&Ym>=y0)Ym=Ym-sstep;}else { /*it is Directory's else*/if(Xm>x0&&Ym<y0)Ym=Ym+sstep;if(Xm<=x0&&Ym<=y0)Xm=Xm+sstep;if(Xm<x0&&Ym>y0) {flag=1; Ym=Ym-sstep;}if(Xm>=x0&&Ym>=y0) {if(flag) break;Xm=Xm-sstep;}}}else{ /*it is Fm's else*/if(!Directory) {if(Xm>x0&&Ym<y0){if(flag) break;else Ym=Ym-sstep;}if(Xm<=x0&&Ym<=y0){flag=1; Xm=Xm-sstep;}if(Xm<=x0&&Ym>=y0)Ym=Ym+sstep;if(Xm>=x0&&Ym>=y0)Xm=Xm+sstep;}else{if(Xm>x0&&Ym<y0)Xm=Xm+sstep;if(Xm<=x0&&Ym<=y0)Ym=Ym-sstep;if(Xm<=x0&&Ym>=y0){flag=1; Xm=Xm-sstep;}if(Xm>=x0&&Ym>=y0) {if(flag) break;else Ym=Ym+sstep;}}}lineto(Xm,Ym);gotoxy(58,5); printf("X%3.0f Y0 Z%3.0f ",Ym-y0,Xm-x0);delay(800);}}void circle_demo(int Directory) /*控制圆插补两次*/{int i=0,sstep;init_graph();sleep(2);acrroods(&x0,&y0);for(i=0;i<2;i++){draw_Base_circle(150);if(i==0){sstep=6;draw_cabu_circle(sstep,Directory);}else{sstep=1;draw_cabu_circle(sstep,Directory);}getch();cleardevice();setcolor(WHITE);}}/* 圆插补部分的函数区结束*/main()/*主函数负责写封面和函数调用*/{int choice=0;init_graph();while(choice!=4){setfillstyle(1,RED);bar(200,30,400,80);setcolor(GREEN);settextstyle(3,0,10);outtextxy(220,50,"DEMO PROGRAM BY P.Y.F");setcolor(WHITE);settextstyle(0,0,1);outtextxy(200,120,"1. Line demo.");outtextxy(200,140,"2. Shun_Circle demo.");outtextxy(200,160,"3. Ni_Circle demo.");outtextxy(200,180,"4. Quit the program.");outtextxy(160,200,"Please enter your choice:"); gotoxy(46,13);scanf("%d",&choice);switch(choice){case 1: line_cabu();break;case 2: circle_demo(Ni_circle);break;case 3: circle_demo(Shun_circle);break;case 4: break;default: printf("\nChoice wrong,try again!");}}close_graph();}2 逐点比较法圆弧插补VB源程序Sub 偏差计算()偏差= Sqr((x动点- x圆心) 2 + (z动点- z圆心) 2) - R End SubSub 插补()x动点= x起点: z动点= z起点:动点象限判别xx: Select Case 象限标志Case 1: 单步连续判断If 顺逆标志= "顺" Then '第一象限插补Do Until (x动点- x终点) = 0 And (z动点- z终点) = 0 If 偏差>= 0 Thenx动点= x动点- 1:Line -Step(0, -x步长), vbRedElsez动点= z动点+ 1:Line -Step(z步长, 0), vbRedEnd If偏差计算动点象限判别If 象限标志<> 1 ThenGoTo xxEnd If单步连续判断LoopElseIf 顺逆标志= "逆" ThenDo Until (x动点- x终点) = 0 And (z动点- z终点) = 0If 偏差>= 0 Thenz动点= z动点- 1:Line -Step(-z步长, 0), vbRedElsex动点= x动点+ 1:Line -Step(0, x步长), vbRedEnd IfDoEvents偏差计算动点象限判别If 象限标志<> 1 ThenGoTo xxEnd IfLoopEnd IfCase 2: 单步连续判断If 顺逆标志= "顺" Then '第二象限插补Do Until (x动点- x终点) = 0 And (z动点- z终点) = 0If 偏差>= 0 Thenz动点= z动点- 1:Line -Step(-z步长, 0), vbRedElsex动点= x动点- 1:Line -Step(0, -x步长), vbRedEnd If偏差计算动点象限判别If 象限标志<> 2 ThenGoTo xxEnd IfLoopElseIf 顺逆标志= "逆" ThenDo Until (x动点- x终点) = 0 And (z动点- z终点) = 0If 偏差>= 0 Thenx动点= x动点+ 1:Line -Step(0, x步长), vbRedElsez动点= z动点+ 1:Line -Step(z步长, 0), vbRedEnd If偏差计算动点象限判别If 象限标志<> 2 ThenGoTo xxEnd IfLoopEnd IfCase 3: 单步连续判断If 顺逆标志= "顺" Then '第三象限插补Do Until (x动点- x终点) = 0 And (z动点- z终点) = 0If 偏差>= 0 Thenx动点= x动点+ 1:Line -Step(0, x步长), vbRedElsez动点= z动点- 1:Line -Step(-z步长, 0), vbRedEnd IfDoEvents偏差计算动点象限判别If 象限标志<> 3 ThenGoTo xxEnd IfLoopElseIf 顺逆标志= "逆" ThenDo Until (x动点- x终点) = 0 And (z动点- z终点) = 0 If 偏差>= 0 Thenz动点= z动点+ 1:Line -Step(z步长, 0), vbRedElsex动点= x动点- 1:Line -Step(0, -x步长), vbRedEnd If偏差计算动点象限判别If 象限标志<> 3 ThenGoTo xxEnd IfLoopEnd IfCase 4: 单步连续判断If 顺逆标志= "顺" Then '第三象限插补Do Until (x动点- x终点) = 0 And (z动点- z终点) = 0 If 偏差>= 0 Thenz动点= z动点+ 1:Line -Step(z步长, 0), vbRedElsex动点= x动点+ 1:Line -Step(0, x步长), vbRedEnd If偏差计算动点象限判别If 象限标志<> 4 ThenGoTo xxEnd IfLoopElseIf 顺逆标志= "逆" ThenDo Until (x动点- x终点) = 0 And (z动点- z终点) = 0 If 偏差>= 0 Thenx动点= x动点- 1:Line -Step(0, -x步长), vbRedElsez动点= z动点- 1:Line -Step(-z步长, 0), vbRedEnd If偏差计算动点象限判别If 象限标志<> 4 ThenGoTo xxEnd IfLoopEnd IfEnd SelectEnd Sub3 逐点比较法直线插补VB源程序Sub 偏差计算()偏差 = Abs(x终点) × z动点 - x动点× Abs(z终点) End SubSub 插补()Dim c As IntegerSelect Case 象限标志Case 1: '第一象限插补Do Until x动点 + z动点 >= 总步数If 偏差 >= 0 Thenx动点 = x动点 + 1:Line -Step(0, x步长), vbRedElsez动点 = z动点 + 1:Line -Step(z步长, 0), vbRedEnd If偏差计算LoopCase 2: '第二象限插补c = x终点: x终点= z终点: z终点= -cc = x步长: x步长 = z步长: z步长 = -cDo Until x动点 + z动点 >= 总步数If 偏差 >= 0 Thenx动点 = x动点 + 1:Line -Step(x步长, 0), vbRedElsez动点 = z动点 + 1:Line -Step(0, z步长), vbRedEnd If偏差计算LoopCase 3: '第三象限插补x步长 = -x步长: z步长 = -z步长Do Until x动点 + z动点 >= 总步数If 偏差 >= 0 Thenx动点 = x动点 + 1:Line -Step(0, x步长), vbRedElsez动点 = z动点 + 1:Line -Step(z步长, 0), vbRedEnd If偏差计算LoopCase 4: '第四象限插补c = x终点: x终点= -z终点: z终点 = cc = x步长: x步长 = -z步长: z步长 = cDo Until x动点 + z动点 >= 总步数If 偏差 >= 0 Thenx动点 = x动点 + 1: Line -Step(x步长, 0), vbRedElsez动点 = z动点 + 1: Line -Step(0, z步长), vbRedEnd If偏差计算LoopEnd SelectEnd Sub4 时间分割法直线插补参考VB程序Sub 插补()Dim l, K, a, B, f1, tx动点对起点= 0: z动点对起点= 0f1 = f × 10: t = Ts / 60000l = Sqr((x终点对起点^ 2 + z终点对起点^ 2))K = f1 × t / la = Sqr((x动点对起点- x终点对起点) ^ 2 + (z动点对起点- z终点对起点) ^ 2)x步长= K × x终点对起点: z步长= K × z终点对起点:B = Sqr(z步长^ 2 + x步长^ 2)Do Until a <= B / 2x动点对起点= x动点对起点+ x步长: z动点对起点= z动点对起点+ z步长a = Sqr((x动点对起点- x终点对起点) ^ 2 + (z动点对起点- z终点对起点) ^ 2)Line -Step(z步长×系数, x步长×系数), vbRedx动点对原点= x动点对起点+ x起点对原点: y动点对原点= y动点对起点+y起点对原点: z动点对原点= z动点对起点+ z起点对原点LoopEnd Sub5 时间分割法圆弧插补VB源程序圆弧(切线法):Sub 插补()Dim 区间符号As IntegerDim x, y, z As DoubleDim KDim 径向误差, R动As Double顺逆符号判别读数据If R < 0.001 ThenElseTs = Ts / 60000步长= f × Ts:K = 步长/ Rx动点对圆心= -x圆心对起点/ 系数: z动点对圆心= -z圆心对起点/ 系数End Ifx = ((x动点对圆心- x终点对圆心) ^ 2 + (z动点对圆心- z终点对圆心) ^ 2) ^ 0.5y = 3 ×步长×系数Do Until x <= ydeltaZ = -顺逆符号× K × x动点对圆心deltaX = 顺逆符号× K × z动点对圆心Line -Step(deltaZ, deltaX), vbRedx动点对圆心= x动点对圆心+ deltaX: z动点对圆心= z动点对圆心+ deltaZ: x动点对原点= x动点对圆心+ x圆心对原点: y动点对原点= y动点对圆心+y圆心对原点: z动点对原点= z动点对圆心+ z圆心对原点:x = ((x动点对圆心- x终点对圆心) ^ 2 + (z动点对圆心- z终点对圆心) ^ 2) ^ 0.5:y = 3 ×步长×系数R动= Sqr(x动点对圆心^ 2 + z动点对圆心^ 2)LoopEnd Sub。
直线插补C语言程序#include "conio.h"#include "graphics.h"#include "process.h"#define Ni_circle 0#define Shun_circle 1void init_graph();void draw_Base_circle();void draw_cabu_circle();void close_graph();void acrroods();static float x0,y0;void line_cabu(), draw_line(),draw_line_cabu(); void line_cabu() /*此函数控制直线插步两次*/ { int i;init_graph();sleep(1);for(i=0;i<2;i++) {line(0,120,300,120); outtextxy(310,120,"Z"); line(100,10,100,300); outtextxy(110,300,"X"); outtextxy(90,130,"O");draw_line();if(i==0)draw_line_cabu(6);else draw_line_cabu(2);gotoxy(50,5);getch();cleardevice();setcolor(WHITE);}}void draw_line()/*画直线*/{line(100,120,600,450);textcolor(YELLOW);directvideo=0;gotoxy(45,5); cprintf("Line from:X0 Y0 Z0 ");gotoxy(45,6); cprintf("Line to :X500 Y0 Z330");gotoxy(45,7); cprintf("Units :Pixel");gotoxy(45,8); cprintf("Line now:");}void draw_line_cabu(int step)/*关键的直线插补函数*/ {int Xe=600,Ye=450;float Fm,Xm=100,Ym=120;setcolor(RED);moveto(Xm,Ym);while(Xm<=Xe&&Ym<=Ye){Fm=(Ym-120)*(Xe-100)-(Xm-100)*(Ye-120);if(Fm>=0)Xm=Xm+step;elseYm=Ym+step;lineto(Xm,Ym);gotoxy(55,8); printf("X%3.0f Y0 Z%3.0f",Xm-100,Ym-120); delay(1100);}}/* 圆插补部分的函数区*/void init_graph() /*图形系统初始化*/{int gdrive=DETECT,gmode;initgraph(&gdrive,&gmode,"");cleardevice();}void acrroods() /*屏幕中心坐标*/{x0=getmaxx()/2;y0=getmaxy()/2;} void draw_Base_circle() /*画圆及写参数*/{line(x0-200,y0,x0+200,y0); outtextxy(x0+220,y0,"Z");line(x0,y0-180,x0,y0+180); outtextxy(x0+10,y0+180,"X"); outtextxy(x0-10,y0+10,"O");circle(x0,y0,150);textcolor(YELLOW);directvideo=0;gotoxy(46,2);cprintf("Circle start:X0 Y0 Z150");gotoxy(46,3);cprintf("Circle end :X0 Y0 Z150");gotoxy(46,4);cprintf("Units :Pixel");gotoxy(46,5);cprintf("Circle now:");}void close_graph() /*关图形系统*/{closegraph();}void draw_cabu_circle(int sstep,int Directory)/*关键的圆插补函数*/{int flag=0;float Fm,Xm,Ym;Xm=x0+150; Ym=y0;moveto(Xm,Ym);setcolor(RED);while(1) /*分象限,顺圆和逆圆讨论*/{Fm=(Xm-x0)*(Xm-x0)+(Ym-y0)*(Ym-y0)-150*150;/*圆判断公式*/if(Fm>=0){if(!Directory){ /*逆圆判断*/if(Xm>=x0&&Ym<=y0){if(flag) break; /*if语句判断象限,以下一样*/else Xm=Xm-sstep;}if(Xm<=x0&&Ym<=y0){flag=1; Ym=Ym+sstep;}if(Xm<=x0&&Ym>=y0)Xm=Xm+sstep;if(Xm>=x0&&Ym>=y0)Ym=Ym-sstep;}else { /*it is Directory's else*/if(Xm>x0&&Ym<y0)Ym=Ym+sstep;Xm=Xm+sstep;if(Xm<x0&&ym>y0) { flag=1; Ym=Ym-sstep;} if(Xm>=x0&&Ym>=y0) { if(flag) break;Xm=Xm-sstep;}}}else{ /*it is Fm's else*/if(!Directory) {if(Xm>x0&&Ym<y0) {if(flag) break;else Ym=Ym-sstep;}if(Xm<=x0&&Ym<=y0) {flag=1; Xm=Xm-sstep; }if(Xm<=x0&&Ym>=y0) Ym=Ym+sstep;if(Xm>=x0&&Ym>=y0) Xm=Xm+sstep;}else{if(Xm>x0&&Ym<y0) Xm=Xm+sstep;if(Xm<=x0&&Ym<=y0) Ym=Ym-sstep;flag=1; Xm=Xm-sstep;}if(Xm>=x0&&Ym>=y0) {if(flag) break;else Ym=Ym+sstep;}}}lineto(Xm,Ym);gotoxy(58,5); printf("X%3.0f Y0 Z%3.0f ",Ym-y0,Xm-x0); delay(800);}}void circle_demo(int Directory) /*控制圆插补两次*/ {int i=0,sstep;init_graph();sleep(2);acrroods(&x0,&y0);for(i=0;i<2;i++){draw_Base_circle(150);if(i==0){sstep=6;draw_cabu_circle(sstep,Directory);}else{sstep=1;draw_cabu_circle(sstep,Directory);}getch();cleardevice();setcolor(WHITE);}}/* 圆插补部分的</y0)</y0)</x0&&ym></y0)函数区结束*/main()/*主函数负责写封面和函数调用*/{int choice=0;init_graph();while(choice!=4){setfillstyle(1,RED);bar(200,30,400,80);setcolor(GREEN);settextstyle(3,0,10);outtextxy(220,50,"DEMO PROGRAM BY P.Y.F");setcolor(WHITE);settextstyle(0,0,1);outtextxy(200,120,"1. Line demo.");outtextxy(200,140,"2. Shun_Circle demo.");outtextxy(200,160,"3. Ni_Circle demo.");outtextxy(200,180,"4. Quit the program.");outtextxy(160,200,"Please enter your choice:"); gotoxy(46,13); scanf("%d",&choice);switch(choice){case 1: line_cabu();break;case 2: circle_demo(Ni_circle);break;case 3: circle_demo(Shun_circle);break; case 4: break;default: printf("\nChoice wrong,try again!"); }}close_graph();}。
直线插补与圆弧插补程序设计一.直线插补1.直线插补程序流程图直线插补程序设计:#include"stdio.h"#include"math.h"void CHABU1 (int F,int n,int Y,int X) /*第一象限调用函数*/{int nx=0,ny=0;for(;n>0; n--){printf("运算前:F=%d ",F);i f(F>=0){printf("需走步数:n=%d\n",n);printf("------向+xe方向走一步 ");F=F-Y;printf("F=%d",F);printf("+X\n");nx++; /*X方向走的总步数*/}e lse{printf("需走步数:n=%d\n",n);printf("------向+ye方向走一步 ");F=F+X;printf("F=%d",F);printf("+Y\n");ny++; /*y方向走的总步数*/}}printf("nx=%d,ny=%d\n",nx,ny);void CHABU2(int F,int n,int Y,int X) /*第二象限调用函数*/{int nx=0,ny=0;for(;n>0; n--){printf("运算前:F=%d ",F);if(F>=0){printf("需走步数:n=%d\n",n);printf("------向-xe方向走一步 ");F=F-Y;printf("F=%d ",F);printf("-X\n");nx++; /*X方向走的总步数*/}else{printf("需走步数:n=%d\n",n);printf("------向+ye方向走一步 ");F=F+X;printf("F=%d ",F);printf("+Y\n");ny++; /*y方向走的总步数*/}}printf("nx=%d,ny=%d\n",nx,ny);}void CHABU3(int F,int n,int Y,int X) /*第三象限调用函数*/{int nx=0,ny=0;for(;n>0; n--){printf("运算前:F=%d ",F);if(F>=0){printf("需走步数:n=%d\n",n);printf("------向-xe方向走一步 ");F=F-Y;printf("F=%d ",F);printf("-X\n");nx++; /*X方向走的总步数*/}else{printf("需走步数:n=%d\n",n);printf("------向-ye方向走一步 ");F=F+X;printf("F=%d ",F);printf("-Y\n");ny++; /*y方向走的总步数*/}}printf("nx=%d,ny=%d\n",nx,ny);}void CHABU4(int F,int n,int Y,int X) /*第四象限调用函数*/{int nx=0,ny=0;for(;n>0; n--){printf("运算前:F=%d ",F);if(F>=0){printf("需走步数:n=%d\n",n);printf("------向+xe方向走一步 ");F=F-Y;printf("F=%d ",F);printf("+X\n");nx++; /*X方向走的总步数*/}else{printf("需走步数:n=%d\n",n);printf("------向-ye方向走一步 ");F=F+X;printf("F=%d ",F);printf("-Y\n");ny++; /*y方向走的总步数*/}}printf("nx=%d,ny=%d\n",nx,ny);}main(){int F=0,X=0,Y=0,n,xe,ye,x0,y0,ny,nx;void CHABU1 (int,int,int,int);/*函数声明*/void CHABU2(int,int,int,int);void CHABU3(int,int,int,int);void CHABU4(int,int,int,int);/*函数声明*/printf("输入相关数据\n");printf("x0=");scanf("%d",&x0);printf("xe=");scanf("%d",&xe);printf("y0=");scanf("%d",&y0);printf("ye=");scanf("%d",&ye);X=abs(xe-x0); /*取绝对值*/Y=abs(ye-y0); /*取绝对值*//*printf("X=%d\n",X);验证绝对值函数*/n=X+Y;printf("n=%d\n",n); /*总步数*/printf("运动结果如下:\n");if(x0>=0&&y0>=0&&xe>=0&&ye>=0) { printf("第一象限\n");CHABU1(F,n,Y,X);}else if(x0<=0&&y0>=0&&xe<=0&&ye>=0) { printf("第二象限\n");CHABU2(F,n,Y,X);}else if(x0<=0&&y0<=0&&xe<=0&&ye<=0) { printf("第三象限\n");CHABU3(F,n,Y,X);}else if(x0>=0&&y0<=0&&xe>=0&&ye<=0) { printf("第四象限\n");CHABU4(F,n,Y,X);}else printf("跨象限运动");}。
直线插补与圆弧插补程序设计一.直线插补1.直线插补程序流程图直线插补程序流程图2.直线插补程序设计#include <stdio.h>#include <graphics.h>#include <stdlib.h>void cb_line(int x1, int y1, int x2, int y2) {int dx, dy, n, k, i, f;int x, y;dx = abs(x2-x1);dy = abs(y2-y1);n = dx + dy;if (x2 >= x1) {k = y2 >= y1 ? 1: 4;x = x1;y = y1;} else {k = y2 >= y1 ? 2: 3;x = x2;y = y2;}putpixel(x, y, 1);for (i = 0, f = 0; i < n; i++)if (f >= 0)switch (k) {case 1:putpixel(x++, y, 1);f -= dy;break;case 2:putpixel(x, y++, 1);f -= dx;break;case 3:putpixel(x--, y, 1);f -= dy;break;case 4:putpixel(x, y--, 1);f -= dx;break;}elseswitch (k) {case 1:putpixel(x, y++, 1);f += dx;break;case 2:putpixel(x--, y, 1);f += dy;break;case 3:putpixel(x, y--, 1);f += dx;break;case 4:putpixel(x++, y, 1);f += dy;break;}}int main(){cb_line(0,0,15,20); /* <--- you forgot ; here */return 0;}二.圆弧插补2.1.四象限圆弧插补程序流程图2.1四象限圆弧插补程序设计#include <stdio.h>#include <math.h>int ArcXY(double dfx0,double dfy0,double dfrx, double dfry,int angle); int symbol(double number);main(){ArcXY(0,0,-3,5,360);getch();}int ArcXY(double dfx0,double dfy0,double dfrx, double dfry,int angle) {FILE *f1;double i,j,dx,dy,dfr,x,y,ang,step,f = 0.01;int flag,tempx,tempy,statex,statey,direction = 1;dfr = sqrt((dfrx - dfx0) * (dfrx - dfx0) + (dfry - dfy0) * (dfry - dfy0));if(dfx0 == 0){dfx0 = 1;dfrx = dfrx + 1;statex =1;}if(dfy0 == 0){dfy0 = 1;dfry = dfry + 1;statey =1;}dfrx = 2 * dfx0 - dfrx;i = dfx0 - dfrx;j = dfy0 - dfry;x = dfx0 ;y = dfy0 ;step = ang = 180 * 2 * asin(f/(2*dfr))/3.1415926;if(((dfx0 > 0) && (dfy0 > 0)) || ((dfx0 < 0) && (dfy0 < 0))){flag = direction;}if(((dfx0 < 0) && (dfy0 > 0)) || ((dfx0 > 0) && (dfy0 < 0))) {flag = -direction;}f1=fopen("c:\\c.txt","w+");if(statex ==1){x = x - 1;}if(statey ==1){y = y - 1;}fprintf(f1,"%f,",x);fprintf(f1,"%f\n",y);while(ang < angle){dx = f * (j + flag*(f * i)/(2 * dfr))/dfr;dy = f * (i - flag*(f * j)/(2 * dfr))/dfr;tempx = symbol(x);tempy = symbol(y);x = x + dx;y = y + dy;fprintf(f1,"%f,",x);fprintf(f1,"%f\n",y);if( (tempx !=symbol(x)) || (tempy != symbol(y)) ){flag = -flag;}i = i - dx;j = j + dy;ang = ang + step;}return 0;}int symbol(double number) {if(number > 0){return 1;}else{return -1;}}。
以下是直线差补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"); }。
数控技术课程设计说明书设计题目直线插补与圆弧插补程序设计机械设计以及自动化专业机械工程学院机械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];void 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)步数坐标11,021,132,142,253,264,274,385,396,3106,4二.圆弧插补1.圆弧插补程序流程图2.圆弧插补程序#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。