?? 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 + -