西门子数控车床椭圆编程

西门子数控车床椭圆编程,第1张

数控椭圆编程

1、毛坯Ф30,加工右半个椭圆(Z向有偏心)。

主程序:WGF1.MPF

G95G23G90G71

T1D1M03S500F0.3

G00X32Z2

R20=14.2(取最大切削余量30的一半为15,考虑到每次单边1mm的切削深度及预留0.2mm的单边精加工余量,则取14.2)

MA1:G158

X=R20

WGF2

R20=R20-1

IF

R20>=0.2

GOTOB

MA1

G00X32Z2

M03S800F0.15

G158

R20=0

WGF2

G00X60Z80

M05

M02

子程序:WGF2.SPF

R1=20(椭圆长半轴)

R2=12(短半轴)

R3=20(以椭圆中心为坐标原点的坐标系O1X1Z1中的坐标,是所加工椭圆轮廓起始点的Z坐标)

MA2:R4=R2*SQRT(R1*R1-R3*R3)/R1

(通过本公式算出对应的椭圆坐标系O1X1Z1中的X值)

G01

X=2*R4

Z=R3-20

(将上述O1X1Z1坐标系中的X、Z转换到工件坐标系OXZ中,进行直线插补)

R3=R3-0.05

IF

R3>=0

GOTOB

MA2

(R3=0是在椭圆坐标系O1X1Z1中的坐标,是所加工椭圆轮廓终点的Z坐标)

G91X2

G90Z2

M02

2、毛坯Ф30,加工右小半个椭圆(Z向有偏心)。

主程序:WGF1.MPF

G95G23G90G71

T1D1M03S500F0.3

G00X32Z2

R20=6.2(取最大切削余量的一半7.06,考虑到每次单边1mm的切削深度及预留0.2mm的单边精加工余量,则取6.2)

MA1:G158

X=R20

WGF2

R20=R20-1

IF

R20>=0.2

GOTOB

MA1

G00X32Z2

M03S800F0.15

G158

R20=0

WGF2

G00X60Z80

M05

M02

子程序:WGF2.SPF

R1=20(椭圆长半轴)

R2=12(短半轴)

R3=15(以椭圆中心为坐标原点时椭圆轮廓的Z坐标起始点)

MA2:R4=R2*SQRT(R1*R1-R3*R3)/R1

G01X=2*R4

Z=R3-15

R3=R3-0.05

IF

R3>=0

GOTOB

MA2

G91X2

G90Z2

M02

3、毛坯Ф30,加工右半个椭圆(X、Z向都有偏心)。

#include <reg52.h>

#include "inc/delay.h"

#include "inc/hc595.h"

#define uchar unsigned char

#define uint unsigned int

sbit PIN_ROTARY_A = P2^0 //引脚1接口

sbit PIN_ROTARY_B = P2^1 //引脚2接口

sbit PIN_ROTARY_C = P2^2 //按下的接口

sbit PIN_ROTARY_D = P2^3 //按下的接口

//uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}

/* 存储待发送的数据 */

/* 1->8的段码表 */

code unsigned char ucDis_Segmentcode[16] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}

/* 位码表 */

code unsigned char ucDis_Bitcode[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}

uchar dis_XS[8] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d}

uchar count = 0

uchar flag

uchar Last_BMB_status

uchar Current_BMB_status

void display()

{

uchar i

dis_XS[0] = ucDis_Segmentcode[count/100]//百位

dis_XS[1] = ucDis_Segmentcode[count%100/10]//十位

dis_XS[2] = ucDis_Segmentcode[count%10]//个位

if(i <2)

{

i++

}

else

{

i = 0

}

// for (i = 0i <3i++ )

{

Send_Data(dis_XS[i], ucDis_Bitcode[i])

//PIN_ROTARY_D = 0

// Delay1ms(1)

}

}

//************************************************

void main()

{

TMOD=0x01//定时器0,工作方式1

TH0=0xD8

TL0=0xF0//给定时器装上初值,10ms中断一次

ET0=1//打开定时器中断

EA =1//打开总中断

TR0=1//启动定时器0

while(1)

{

//display()

Last_BMB_status=PIN_ROTARY_B

while(!PIN_ROTARY_A) //BMA为低电平时

{

Current_BMB_status = PIN_ROTARY_B

flag = 1//标志位置为1说明编码开关被旋转了

}

if(flag == 1)

{

flag = 0//时刻要注意这一点!给标志位清零

if((Last_BMB_status == 0)&&(Current_BMB_status == 1)) //BMB上升沿表示正转

{

count++

if(count == 255)

{

count = 0

}

}

if((Last_BMB_status == 1)&&(Current_BMB_status == 0)) //BMB下降沿表示反转

{

count--

if(count == 0)

{

count = 255

}

}

}

}

}

//***********************************************

void timer0() interrupt 1//定时器0的中断服务程序

{

TH0=0xF8 // TH0=0xD8

TL0=0xF0//再次装入初值

display()//每隔10ms显示一次

if(!PIN_ROTARY_C) //按下旋转编码开关则计数清零

{

count = 0

}

PIN_ROTARY_D = !PIN_ROTARY_D

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11973922.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存