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