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_SEEK0
G1直线插补MOTION_MODE_LINEAR1
G2圆弧插补MOTION_MODE_CW_ARC2
G3螺旋线运动MOTION_MODE_CCW_ARC3
G38.2探针MOTION_MODE_PROBE_TOWARD140
G80运动模式取消MOTION_MODE_NONE80
G93FEED_RATE_MODE_INVERSE_TIME1
G94FEED_RATE_MODE_UNITS_PER_MIN0
G20英制尺寸UNITS_MODE_INCHES
G21公制尺寸UNITS_MODE_MM0
G90绝对值位置DISTANCE_MODE_ABSOLUTE0
G91相对值位置DISTANCE_MODE_INCREMENTAL1
G17XY平面选择PLANE_SELECT_XY0
G18ZX平面选择PLANE_SELECT_ZX1
G19YZ平面选择PLANE_SELECT_YZ2
G43.1刀具长度补偿
G49刀具长度补偿取消
G54工件坐标系1
G55工件坐标系2
G56工件坐标系3
G57工件坐标系4
G58工件坐标系5
G59工件坐标系6
M0程序停PROGRAM_FLOW_PAUSED3
M1选择停止PROGRAM_FLOW_OPTIONAL_STOP1
M2程序终止PROGRAM_FLOW_COMPLETED_M22
M30程序结束PROGRAM_FLOW_COMPLETED_M30
M7
M8冷却液开
M9冷却液关
M3主轴顺时针旋转
M4主轴逆时针旋转
M5主轴停止
M56停车动作超驰控制
  • 8
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值