📄 processg73.c
字号:
#include "base.h"
/*
BOOLEAN ProcessG73(INT32U StartHang,INT32U EndHang,FP32 G73_Uaction,FP32 G73_Waction,FP32 G73_Uremain,FP32 G73_Wremain,INT8U LoopCount);
INT8U G73ProcessAllCode(INT32U EndHang);
BOOLEAN G73ProcessHangCode(void);
INT8U G73GetNextSeg(INT8U *First,INT8U *buf,INT8U *End);
INT32U G73FindStartHang(INT32U Hang);
FP32 G73ConstructionFunc(FP32 Xpos);
void G73ResetPara(void);
BOOLEAN G73Motion(void);
*/
FP32 G73_Pos_U;
FP32 G73_Pos_W;
FP32 G73_Pos_X;
FP32 G73_Pos_Z;
FP32 G73_Pos_I;
FP32 G73_Pos_K;
FP32 G73_Pos_R;
FP32 G73_Abs_PosX;
FP32 G73_Abs_PosZ;
FP32 G73_Abs_PosI;
FP32 G73_Abs_PosK;
FP32 G73_Abs_PosR;
BOOLEAN G73_bEnd;
BOOLEAN ProcessG73(INT32U StartHang,INT32U EndHang,FP32 G73_Uaction,FP32 G73_Waction,FP32 G73_Uremain,FP32 G73_Wremain,INT16U LoopCount)
{
FP32 StartPointX;
FP32 StartPointZ;
FP32 ProgStartPointX;
FP32 ProgStartPointZ;
FP32 ProgEndPointX;
FP32 ProgEndPointZ;
FP32 XAdd;
FP32 ZAdd;
FP32 LoopAbsXpos,LoopAbsZpos;
INT32U i,j,k;
INT8U ret;
BOOLEAN bLine;
BOOLEAN bCircle;
FP32 Start_X;
FP32 Start_Z;
FP32 TempX;
FP32 TempZ;
FP32 TempI;
FP32 TempK;
for (i=0;i<MAXNUMBER;i++)
{
LineValue[i].Pos=0;
CircleValue[i].Pos=0;
LineValue[i].StartX=0;
CircleValue[i].StartZ=0;
LineValue[i].EndX=0;
CircleValue[i].EndZ=0;
LineValue[i].K=0;
CircleValue[i].K=0;
CircleValue[i].I=0;
CircleValue[i].Cw=0;
}
G73_bEnd=0;
CircleShapNum=0;
AllNum=0;
LineShapNum=0;
G73ResetPara();
Xdec=0;Xinc=0;Zdec=0;Zinc=0;
G73.CurrentNum=G73FindStartHang(StartHang);
if (G73.CurrentNum==0xfffff){
DispErrCode(19);
return FALSE;
}
if (G73FindStartHang(EndHang)==0xfffff){
DispErrCode(35);
return FALSE;
}
if (G73ProcessAllCode(EndHang)!=6){
DispErrCode(21);
return FALSE;
}
if(AllNum<=1){
DispErrCode(40);
return FALSE;
}
if(Xdec && Zinc){
DispErrCode(39);return FALSE;
}
if(Xdec && Zdec){
DispErrCode(39);return FALSE;
}
if(Xinc && Zinc){
bit=FALSE;
}
if(Xinc && Zdec){
bit=TRUE;
}
Start_X=Get_AbsPos(1);
Start_Z=Get_AbsPos(3);
G73_Uaction=fabs(G73_Uaction);
G73_Waction=fabs(G73_Waction);
// if (LoopCount>=200){DispErrCode(26);return FALSE;}
if (LoopCount>=LOOPTIMES){DispErrCode(26);return FALSE;}
if (LoopCount==0){DispErrCode(27);return FALSE;}
XAdd=(G73_Uaction-G73_Uremain)/LoopCount;
ZAdd=(G73_Waction-G73_Wremain)/LoopCount;
ProgStartPointX=Get_AbsPos(1);
ProgStartPointZ=Get_AbsPos(3);
ProgEndPointX=Get_AbsPos(1)-G73_Uaction;
ProgEndPointZ=Get_AbsPos(3)-G73_Waction;
i=1;
while(1){
if (CircleValue[i].Pos==1){
StartPointX=CircleValue[i].StartX;
StartPointZ=CircleValue[i].StartZ;
break;
}
if (LineValue[i].Pos==1){
StartPointX=LineValue[i].StartX;
StartPointZ=LineValue[i].StartZ;
break;
}
i++;
if(g_Scram)return FALSE;
}
if(bit){
StartPointX=StartPointX+G73_Uaction;
StartPointZ=StartPointZ+G73_Waction;
}
else{
StartPointX=StartPointX+G73_Uaction;
StartPointZ=StartPointZ-G73_Waction;
}
i=0;j=0;k=0;bCircle=0;bLine=0;
while(1){
if(bit){
TempX=StartPointX-i*XAdd;TempZ=StartPointZ-i*ZAdd;
}
else{
TempX=StartPointX-i*XAdd;TempZ=StartPointZ+i*ZAdd;
}
Set_InpSpeed(g_Sysparam.Max_FastSpeed);
Target_PosX=TempX;
Target_PosZ=TempZ;
bRunInp=FALSE;
while(1){
g_MoveMode=1;
G01_AbsPos(TempX,TempZ);
ret=WaitMotionEnd();
if(ret==255)return FALSE;
if(ret==0)break;
}
for (j=1;j<=AllNum;j++){
for (k=1;k<=MAXNUMBER;k++){
if (LineValue[k].Pos==j){
bLine=TRUE;
if(bit){
LoopAbsXpos=LineValue[k].EndX-LineValue[k].StartX+Get_AbsPos(1);
LoopAbsZpos=LineValue[k].EndZ-LineValue[k].StartZ+Get_AbsPos(3);
}else{
LoopAbsXpos=Get_AbsPos(1)+LineValue[k].EndX-LineValue[k].StartX;
LoopAbsZpos=Get_AbsPos(3)+LineValue[k].EndZ-LineValue[k].StartZ;
}
break;
}
if (CircleValue[k].Pos==j){
bCircle=TRUE;
if(bit){
LoopAbsXpos=CircleValue[k].EndX-CircleValue[k].StartX+Get_AbsPos(1);
LoopAbsZpos=CircleValue[k].EndZ-CircleValue[k].StartZ+Get_AbsPos(3);
}else{
LoopAbsXpos=Get_AbsPos(1)+CircleValue[k].EndX-CircleValue[k].StartX;
LoopAbsZpos=Get_AbsPos(3)+CircleValue[k].EndZ-CircleValue[k].StartZ;
}
break;
}
}
if (bLine){
g_Current_ASpeed=g_Current_PSpeed*g_Current_Inp_Rate;
if(g_Current_ASpeed>g_Sysparam.Max_FastSpeed)
g_Current_ASpeed=g_Sysparam.Max_FastSpeed;
Set_InpSpeed(g_Current_ASpeed);
Target_PosX=LoopAbsXpos;
Target_PosZ=LoopAbsZpos;
bRunInp=TRUE;
while(1){
g_MoveMode=1;
G01_AbsPos(LoopAbsXpos,LoopAbsZpos);
ret=WaitMotionEnd();
if(ret==255)return FALSE;
if(ret==0)break;
}
}
if(bCircle){
g_Current_ASpeed=g_Current_PSpeed*g_Current_Inp_Rate;
if(g_Current_ASpeed>g_Sysparam.Max_FastSpeed)
g_Current_ASpeed=g_Sysparam.Max_FastSpeed;
Set_InpSpeed(g_Current_ASpeed);
if(bit){
TempK=CircleValue[k].K+(LoopCount-i)*ZAdd;
TempI=CircleValue[k].I+(LoopCount-i)*XAdd;
}
else{
TempK=CircleValue[k].K-(LoopCount-i)*ZAdd;
TempI=CircleValue[k].I+(LoopCount-i)*XAdd;
}
Target_PosX=LoopAbsXpos;
Target_PosZ=LoopAbsZpos;
bRunInp=TRUE;
/**************************************************************************************
除工圆弧拆分
***************************************************************************************/
if(CircleValue[k].Cw==2){
ret=G02G03_CW_ZX(LoopAbsXpos,LoopAbsZpos,0,TempK,TempI,FALSE);
if(ret)return TRUE;
}
else{
ret=G02G03_CW_ZX(LoopAbsXpos,LoopAbsZpos,0,TempK,TempI,TRUE);
if(ret)return TRUE;
}
/* while(1){ ///改为拆分线段拆分
if(CircleValue[k].Cw==2){
G02_AbsPos(LoopAbsXpos,LoopAbsZpos,TempI,TempK);
}
else{
G03_AbsPos(LoopAbsXpos,LoopAbsZpos,TempI,TempK);
}
g_MoveMode=1;
ret=WaitMotionEnd();
if(ret==255)return FALSE;
if(ret==0)break;
}*/
}
bCircle=0;bLine=0;
}
if(bit){
LoopAbsXpos=ProgStartPointX-(i+1)*XAdd;
LoopAbsZpos=ProgStartPointZ-(i+1)*ZAdd;
}else{
LoopAbsXpos=ProgStartPointX-(i+1)*XAdd;
LoopAbsZpos=ProgStartPointZ+(i+1)*ZAdd;
}
Set_SipSpeed(1,g_Current_Fast_Rate*g_Sysparam.X_FastSpeed);
Set_SipSpeed(3,g_Current_Fast_Rate*g_Sysparam.Z_FastSpeed);
Target_PosX=LoopAbsXpos;
Target_PosZ=LoopAbsZpos;
bRunInp=FALSE;
while(1){
g_MoveMode=1;
G01_AbsPos(LoopAbsXpos,LoopAbsZpos);
ret=WaitMotionEnd();
if(ret==255)return FALSE;
if(ret==0)break;
}
i++;
if (i==LoopCount)break;
}
Set_InpSpeed(g_Sysparam.Max_FastSpeed);
Target_PosX=Start_X;
Target_PosZ=Start_Z;
bRunInp=FALSE;
while(1){
G01_AbsPos(Start_X,Start_Z);
g_MoveMode=1;
ret=WaitMotionEnd();
if(ret==255)return FALSE;
if(ret==0)break;
}
return TRUE;
}
INT8U G73GetNextSeg(INT8U *First,INT8U *buf,INT8U *End)
{
INT8U s;
INT16U i;
for(;;)
{
s=g_DataBuf.DataBuf[G73.CurrentNum];
switch(s)
{
case '%':
*First=s;
buf[0]=0x0;
return 4;
break;
case '(':
case '/'://注释
*First=s;
i=0;
while(i<=255){
G73.CurrentNum++;
if(g_iCurrentNum>=g_DataBuf.DataLength)
{
buf[0]=0x0;
*End=FALSE;
return 255;
}
s=g_DataBuf.DataBuf[G73.CurrentNum];
if(s!=0x0a && s!=0x0d){
buf[i]=s;
}
if(s==0x0a){
buf[i]=0x00;
*End=FALSE;
G73.CurrentNum++;
if(G73.CurrentNum>=g_DataBuf.DataLength)return 255;
return 0;//一行代码结束
}
i++;
}
buf[0]=0x0;
*End=TRUE;
return 2;//注释超长
case 0x0d:
G73.CurrentNum++;
break;
case 0x0a:
*First=s;
G73.CurrentNum++;
if(G73.CurrentNum>=g_DataBuf.DataLength)
{
buf[0]=0x0;
*End=FALSE;
return 255;
}
return 0;//一行代码结束
break;
case 'A':case 'B':case 'C':case 'D':case 'E':
case 'F':case 'G':case 'H':case 'I':case 'J':
case 'K':case 'L':case 'M':case 'N':case 'O':
case 'P':case 'Q':case 'R':case 'S':case 'T':
case 'U':case 'V':case 'W':case 'X':case 'Y':case 'Z':
*First=s;
i=0;
while(i<=255){
G73.CurrentNum++;
if(G73.CurrentNum>=g_DataBuf.DataLength)
{
buf[0]=0x0;
*End=TRUE;
return 255;
}
s=g_DataBuf.DataBuf[G73.CurrentNum];
if((s>='0' && s<='9') || s=='.' || s=='-' || s=='+'){
buf[i]=s;
i++;
}
else if(s==0x0d)
{
;
}
else if(s==0x0a)
{
buf[i]=0x00;
*End=FALSE;
G73.CurrentNum++;
if(G73.CurrentNum>=g_DataBuf.DataLength)
return 255;
return 0;//一行代码结束
}
else
{
buf[i]=0x00;
*End=FALSE;
return 5;//字代码结束
}
}
return 2; //数据超长
default:
*First=s;
buf[0]=0x00;
*End=TRUE;
return 3;//其它的字
}
}
}
INT8U G73ProcessAllCode(INT32U EndHang)
{
INT8U Error;
INT8U End;
INT8U num,len;
INT8U First,buf[255];
INT8U k,j;
INT32U Hang;
while(1){
Error=G73GetNextSeg(&First,buf,&End);
if(Error != 0 && Error !=5)break;
if(End)break;
switch(First)
{
case '%':
case '/':
case '(':
case 0x0d:
case 0x0a:
break;
case 'N':
if(strlen((char *)buf)==0){Error=73;break;}
if(bN_Code==1) {Error=73;break;}
k=0;Hang=0;j=strlen((char *)buf);
while(j){
Hang=(buf[k]-'0')+Hang*10;
k++;
j--;
}
if(EndHang==Hang)
{
G73_bEnd=TRUE;
G73ResetPara();
}
bN_Code=TRUE;
break;
case 'G':
len=strlen((char *)buf);
if(len !=1 && len !=2 ){Error=73;break;}
if(len==1) num=buf[0]-'0';
else num=(buf[0]-'0')*10+buf[1]-'0';
switch(num){
case 0:
case 1:
case 2:
case 3:
case 4:
bG_Code=1;
break;
default:
Error=73;
break;
}
iG_Code=num;
break;
case 'M':
len=strlen((char *)buf);
if(len !=1 && len !=2 ){Error=73;break;}
if(len==1) num=buf[0]-'0';
else num=(buf[0]-'0')*10+buf[1]-'0';
switch(num){
case 3:
case 4:
case 5:
case 8:
case 9:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -