⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gcodeanylys.c

📁 G代码分析 这个文件主要进行语法分析
💻 C
📖 第 1 页 / 共 2 页
字号:
 /**************************************************************** 
   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 + -