📄 gcodeanylys.c
字号:
/****************************************************************
Description:
这个文件主要进行语法分析,主要包括以下几个方面
[1]判断字符地址(同种类型)时候有重复定义
[2]字符串提取数据,并把数据储存在语法分析变量数组里
[3]完整G代码匹配语句具体格式,其中格式合法性定义参照
需求分析的详细文档,在这个文件参照具体规则如下
对应指令要求语法规则:
(i) < >表示复合指令:字母+数字
例如:<G01>、<G02>、<X100.0>、<C24.31>、<Z>、<A>
除功能定义(G、M、S、T等)外,其他指令中的数字可省略
(ii) { }中的指令字至少要有一个存在
G00 {<X> <Y> <Z> <U> <V> <W>}
(iii) [ ]中的指令字允许部分或全部省略
G01 <X> <Y> <Z> [<F>]
(v) ( ) 表示其内指令字选一
(G02 G03) [<X> <Y>] {<I> <J>} [<F>]
(vi) @ #表示其内指令字至多有一个存在
(G02 G03) [<X> <Y>] @{<I> <J>} <R># [<F>]
根据上面五条规则来描述所有合法G代码
主要函数:
int Yacc_Coordinator_Handle(char *string);
void Yacc_Save_Coordinate(void);
double Handle_Coordinate(char *str);
int Yacc_Run_Analyser(int value);
void Yacc_Run_Handle(void);
int Yacc_Quick_Speed_Handle(void);
void YaccLineMultiDefine(void);
int Yacc_Line_Handle(void);
int YaccSpeedF(char *str);
int Yacc_Circle_Handle(int value);
void YaccModeG(void);
void Yacc_Reset_Array(void);
History:
*****************************************************************/
// 文件调用库文件
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
// 自定义头文件
#include "TsingAnalyser.h"
// 宏定义变量,声明G0中系统最大速度
#define FMAX 3000.0
// 文件用到外部变量
extern unsigned char Yacc_Format[3];
extern double Yacc_Floatcode[20];
extern int Yacc_Function[3];
extern int Yacc_Intcode[25];
extern int Yacc_Prec_Function[3];
extern int Yacc_Prec_Intcode[25];
extern int Yacc_Coordinate_Plane; // 0-xy(G17),1-zx(G18),2-yz(G19)
extern int Yacc_Abs_Increase; // 0-(G90), 1-(G91)
extern int yylval;
extern int currlinenum;
extern int curr[100];
// NC程序段的数据结构定义
typedef struct block_struct{
int iLineNo;
int iGcode;
unsigned int CoordinateFlag; // xyz uvw.
double dbCoordinate[10];
double dbSpeedF;
}COORDINATE;
COORDINATE Cdata;
// 文件用到局部变量
int count = 0;
// 函数实现的原型
/***************************************************************************
Function :Yacc_Coordinator_Handle
Description: NC程序段坐标处理,其中从LEX文件返回是token标记,这里是字符串
变量,首先判断程序段出现重复定义,如果有重复定义坐标代码则报错,
如果没有出错,把数据提取出来并存储在相应变量中,并设置相应标志。
这个函数处理坐标相关动作,其中涉及到的坐标有:
XYZ IJK UVW ABC R,其中标志定义及储存变量见编译部分语法变量定义
---------------------编程文档1。
Input : 字符串string(字符串从Lex得到)
Output : 0(没有实际意思,留作扩展)
***************************************************************************/
int Yacc_Coordinator_Handle(char *string)
{
char *temp;
double coordinate;
temp = string;
switch(temp[0])
{
case 'X':
{
if(Yacc_Format[0] & 0x01)
{
printf("Line[%d] n%d X multidefine.\n", currlinenum, curr[currlinenum-1]);
}
else
{
Yacc_Format[0] |= 0x01;
coordinate = Handle_Coordinate(temp);
Yacc_Floatcode[0] = coordinate;
}
break;
}
case 'Y':
{
if(Yacc_Format[0] & 0x02)
{
printf("Line[%d] n%d Y multidefine.\n", currlinenum, curr[currlinenum-1]);
}
else
{
Yacc_Format[0] |= 0x02;
coordinate = Handle_Coordinate(temp);
Yacc_Floatcode[1] = coordinate;
}
break;
}
case 'Z':
{
if(Yacc_Format[0] & 0x04)
{
printf("Line[%d] n%d Z multidefine.\n", currlinenum, curr[currlinenum-1]);
}
else
{
Yacc_Format[0] |= 0x04;
coordinate = Handle_Coordinate(temp);
Yacc_Floatcode[2] = coordinate;
}
break;
}
case 'U':
{
if(Yacc_Format[0] & 0x08)
{
printf("Line[%d] n%d U multidefine.\n", currlinenum, curr[currlinenum-1]);
}
else
{
Yacc_Format[0] |= 0x08;
coordinate = Handle_Coordinate(temp);
Yacc_Floatcode[3] = coordinate;
}
break;
}
case 'V':
{
if(Yacc_Format[0] & 0x10)
{
printf("Line[%d] n%d V multidefine.\n", currlinenum, curr[currlinenum-1]);
}
else
{
Yacc_Format[4] |= 0x10;
coordinate = Handle_Coordinate(temp);
Yacc_Floatcode[4] = coordinate;
}
break;
}
case 'W':
{
if(Yacc_Format[0] & 0x20)
{
printf("Line[%d] n%d W multidefine. \n", currlinenum, curr[currlinenum-1]);
}
else
{
Yacc_Format[0] |= 0x20;
coordinate = Handle_Coordinate(temp);
Yacc_Floatcode[5] = coordinate;
}
break;
}
case 'I':
{
if(Yacc_Format[1] & 0x01)
{
printf("Line[%d] n%d I multidefine.\n", currlinenum, curr[currlinenum-1]);
}
else
{
Yacc_Format[1] |= 0x01;
coordinate = Handle_Coordinate(temp);
Yacc_Floatcode[8] = coordinate;
}
break;
}
case 'J':
{
if(Yacc_Format[1] & 0x02)
{
printf("Line[%d] n%d J multidefine.\n", currlinenum, curr[currlinenum-1]);
}
else
{
Yacc_Format[1] |= 0x02;
coordinate = Handle_Coordinate(temp);
Yacc_Floatcode[9] = coordinate;
}
break;
}
case 'K':
{
if(Yacc_Format[1] & 0x04)
{
printf("Line[%d] n%d K multidefine.\n", currlinenum, curr[currlinenum-1]);
}
else
{
Yacc_Format[1] |= 0x04;
coordinate = Handle_Coordinate(temp);
Yacc_Floatcode[12] = coordinate;
}
break;
}
case 'A':
{
if(Yacc_Format[2] & 0x01)
{
printf("A multidefine.\n");
}
else
{
Yacc_Format[2] |= 0x01;
coordinate = Handle_Coordinate(temp);
Yacc_Floatcode[16] = coordinate;
}
break;
}
case 'B':
{
if(Yacc_Format[2] & 0x02)
{
printf("B multidefine.\n");
}
else
{
Yacc_Format[2] |= 0x02;
coordinate = Handle_Coordinate(temp);
Yacc_Floatcode[17] = coordinate;
}
break;
}
case 'C':
{
if(Yacc_Format[2] & 0x04)
{
printf("C multidefine.\n");
}
else
{
Yacc_Format[2] |= 0x04;
coordinate = Handle_Coordinate(temp);
Yacc_Floatcode[18] = coordinate;
}
break;
}
case 'R':
{
if(Yacc_Format[1] & 0x08)
{
printf("Line[%d] n%d R multidefine.\n", currlinenum, curr[currlinenum-1]);
}
else
{
Yacc_Format[1] |= 0x08;
coordinate = Handle_Coordinate(temp);
Yacc_Floatcode[11] = coordinate;
}
break;
}
default:
break;
}
return 0;
}
/***************************************************************************
Function :Yacc_Save_Coordinate
Description: 存储坐标代码,把NC一条程序段存储到Cdata数据结构里,其中
数据结构定义项有
iLineNo : 程序段行号
iGcode : 程序段运动G指令值
CoordinateFlag : 程序段运动G指令跟有效坐标指令标识
dbCoordinate[10]: 程序段中坐标值
dbSpeedF : 程序段速度
把分析出来的数据填充到Cdata数据结构里,同时把数据结构数据写
到cood.txt的文件里,提供给具体实现指令使用。
Input : null
Output : 0
***************************************************************************/
void Yacc_Save_Coordinate(void)
{
FILE *fp;
int i = 0;
fp = fopen("cood.txt", "a+");
if(fp == NULL)
{
printf("Can not open file.\n");
}
for(i=0; i<14; i++)
Cdata.dbCoordinate[i] = Yacc_Floatcode[i];
Cdata.dbSpeedF = Yacc_Floatcode[15];
Cdata.iGcode = Yacc_Intcode[1];
if((Yacc_Intcode[1] == 0)||(Yacc_Intcode[1] == 1))
{
printf("N%d [G%d] X:%4.3f Y:%4.3f Z:%4.3f U:%4.3f V:%4.3f W:%4.3f F:%4.3f\n",
curr[currlinenum - 1], Cdata.iGcode, Cdata.dbCoordinate[0], Cdata.dbCoordinate[1],
Cdata.dbCoordinate[2], Cdata.dbCoordinate[3], Cdata.dbCoordinate[4],
Cdata.dbCoordinate[5], Cdata.dbSpeedF);
}
if((Yacc_Intcode[1] == 2)||(Yacc_Intcode[1] == 3))
{
printf("N%d [G%d] X:%4.3f Y:%4.3f Z:%4.3f I:%4.3f J:%4.3f K:%4.3f R:%4.3f F:%4.3f\n",
curr[currlinenum - 1], Cdata.iGcode, Cdata.dbCoordinate[0], Cdata.dbCoordinate[1],
Cdata.dbCoordinate[2], Cdata.dbCoordinate[8], Cdata.dbCoordinate[9],
Cdata.dbCoordinate[12], Cdata.dbCoordinate[11], Cdata.dbSpeedF);
}
fwrite(&Cdata, sizeof(Cdata), 1, fp);
fclose(fp);
}
/***************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -