Gcode头文件分析

Gcode部分就是GRBL中的G代码解释器,因此本部分比较复杂,但是文件整体组成较为简单,只有三个函数和三个结构体以及一些其他变量组成(虽然只有三个函数,但是确实整个项目中代码数量最多的)需要理解gcode解释器,首先需要了解解释器中使用的相关数据结构,因此第一步就是分析gcode部分数据结构!!!

2020-4-14更新
  • 更新了G代码描述块的注释,以及相关G代码在GRBL中的宏定义

2020-4-12更新

gcode解释器的数据结构

数据结构部分

这里我删除了源码中已经被注释的部分

  • 首先是一个整体的结构 block,整个是gcode完成解释之后形成的数据结构,包含了gcode的全部信息,交给后面运动规划部分
typedef struct {
  uint8_t non_modal_command;    //非模态命令
  gc_modal_t modal;             //该部分主要记录一些G代码的描述信息
  gc_values_t values;           //主要记录G代码中的数据部分
} parser_block_t;
//注意:当此结构为零时,上面定义了设置系统的默认值。
//改结构记录了当前block的相关描述信息
//相关G代码信息可以查看附录
typedef struct {
  uint8_t motion;          // {G0,G1,G2,G3,G38.2,G80}	运动模式
  uint8_t feed_rate;       // {G93,G94}	给进速度
  uint8_t units;           // {G20,G21} 单位
  uint8_t distance;        // {G90,G91} 距离
  uint8_t plane_select;    // {G17,G18,G19} 平面选择
  uint8_t tool_length;     // {G43.1,G49} 协调选择
  uint8_t coord_select;    // {G54,G55,G56,G57,G58,G59} 工件坐标系选择
  uint8_t program_flow;    // {M0,M1,M2,M30} 程序状态控制
  uint8_t coolant;         // {M7,M8,M9} 冷却液控制
  uint8_t spindle;         // {M3,M4,M5} 主轴控制
  uint8_t override;        // {M56} 
} gc_modal_t;

//block块的数据部分,G代码中的坐标信息翻译成此部分

typedef struct {
  float f;         // 给进速度
  float ijk[3];    // I,J,K 弧线原点坐标(相对当前位置的坐标)
  uint8_t l;       // G10 or canned cycles parameters
  int32_t n;       // 行号
  float p;         // G10 or dwell parameters
  float r;         // 圆弧半径
  float s;         // 主轴转速
  uint8_t t;       // 工具选择
  float xyz[3];    // xyz移动值(圆弧的终点坐标)
} gc_values_t;
typedef struct {
  gc_modal_t modal;

  float spindle_speed;          // 主轴速度
  float feed_rate;              // 给进速度 mm/min
  uint8_t tool;                 // 工具编号 未使用
  int32_t line_number;          // 最后发送给的行号
  float position[N_AXIS];       // 解释器认为工具位于代码中的此位置

  float coord_system[N_AXIS];    // 当前工作坐标(G54+),存储与机器坐标的偏移,mm为单位,调用时从EEPROM加载
  float coord_offset[N_AXIS];    // 保留相对于G92的坐标偏移(工作坐标),mm单位,复位后清零
                                 // machine zero in mm. Non-persistent. Cleared upon reset and boot.
  float tool_length_offset;      // 启用时跟踪刀具的长度
} parser_state_t;
extern parser_state_t gc_state;

附录

  • 附录1:G代码解释

G代码

注释

GRBL中对应的宏定义

对应的值

G0

快速定位

MOTION_MODE_SEEK

0

G1

直线插补

MOTION_MODE_LINEAR

1

G2

圆弧插补

MOTION_MODE_CW_ARC

2

G3

螺旋线运动

MOTION_MODE_CCW_ARC

3

G38.2

探针

MOTION_MODE_PROBE_TOWARD

140

G80

运动模式取消

MOTION_MODE_NONE

80

G93

FEED_RATE_MODE_INVERSE_TIME

1

G94

FEED_RATE_MODE_UNITS_PER_MIN

0

G20

英制尺寸

UNITS_MODE_INCHES

G21

公制尺寸

UNITS_MODE_MM

0

G90

绝对值位置

DISTANCE_MODE_ABSOLUTE

0

G91

相对值位置

DISTANCE_MODE_INCREMENTAL

1

G17

XY平面选择

PLANE_SELECT_XY

0

G18

ZX平面选择

PLANE_SELECT_ZX

1

G19

YZ平面选择

PLANE_SELECT_YZ

2

G43.1

刀具长度补偿

G49

刀具长度补偿取消

G54

工件坐标系1

G55

工件坐标系2

G56

工件坐标系3

G57

工件坐标系4

G58

工件坐标系5

G59

工件坐标系6

M0

程序停

PROGRAM_FLOW_PAUSED

3

M1

选择停止

PROGRAM_FLOW_OPTIONAL_STOP

1

M2

程序终止

PROGRAM_FLOW_COMPLETED_M2

2

M30

程序结束

PROGRAM_FLOW_COMPLETED_M30

M7

M8

冷却液开

M9

冷却液关

M3

主轴顺时针旋转

M4

主轴逆时针旋转

M5

主轴停止

M56

停车动作超驰控制