GRBL分析:gcode解释器(一)

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 停车动作超驰控制

你可能感兴趣的:(GRBL学习)