G Code 代码分析

一些概念

  1. 机床运动模式,是数控机床或运动控制系统中定义的运动方式,决定了工具或机床在执行任务时如何运动。

  2. 进给速率,进给速率是指工具在加工过程中以多快的速度移动,通常以单位时间内的移动距离来表示,比如毫米每分钟或英寸每分钟。

  3. 刀具长度补偿,用于调整刀具在加工过程中的实际切削深度,以不创刀具的不同长度。由于不同刀具的长度可能不同,刀具长度补偿可以确保刀具在加工时能够正确地达到预定的切削深度,避免因刀具长度差异而导致的加工误差。

  4. 主轴,主轴是机床的核心部分,负责旋转刀具或工件。主轴的转速和扭矩直接影响切削性能。主轴可以是固定的,也可以是可变速的,通常用于铣削、车削等加工。

  5. X轴Y轴Z轴,表示机床的水平垂直移动轴。对于车床,X轴则表示刀具在工件表面沿径向的移动。在车床中,Y轴可以用于控制刀具在某些特定操作中的移动。在车床中,Z轴通常控制刀具沿着工件的轴向移动。

  6. A轴,表示机床的旋转轴,通常用于五轴或多轴机床

  7. B轴,表示机床的旋转轴,B轴可以使刀具绕Y轴旋转,进一步增加了加工的灵活性。

  8. C轴,用于控制工件的旋转,C轴可以使工件绕Z轴旋转,使得刀具能够在不同的角度进行切削。

  9. U轴和V轴,在某些机床中,U轴和V轴用于进一步的补充运动,通常是用于特定的加工需求,像是复杂曲面的加工。

  10. 模态命令,是指在机床运行过程中,一旦被激活机会持续有效,直到被另一个模态命令锁替代或被明确取消。这意味着在后续的G代码中,无需再次重复指定该命令,机床会继续使用该命令的设置。比如G0,G1,G2,G3,G43,G90,G91

  11. 非模态命令,非模态命令是指在机床运行过程中,只在当前行有效,执行后不会持续生效。每次需要使用时都需要在G代码中明确指定。

G代码解析需要的结构体

gc_modal_t

用于存储当前的运动模式和其他控制状态

  1. uint8_t motion: 表示当前的运动模式。可能的值包括:
    • G0: 快速定位
    • G1:线性插补
    • G2: 顺时针圆弧插补
    • G3:逆时针圆弧插补
    • G38.2:探测功能
    • G80:取消固定循环
  2. uint8_t feed_rate: 表示进给速率模式。可能的值包括:
    • G93: 反向进给(每分钟指定时间)
    • G94: 正常进给(每分钟的单位长度)
  3. uint8_t units: 表示单位设置。可能的值包括:
    • G20: 英寸
    • G21: 毫米
  4. uint8_t distance: 表示距离模式。可能的值包括:
    • G90: 绝对定位
    • G91: 相对定位
  5. uint8_t plane_select: 表示选择的平面。可能的值包括:
    • G17: XY平面
    • G18: XZ平面
    • G19: YZ平面
  6. uint8_t tool_length: 表示刀具长度补偿相关的设置。可能的值包括:
    • G43.1: 启用刀具长度补偿
    • G49: 取消刀具长度补偿
  7. uint8_t coord_select: 表示当前坐标系选择。可能的值包括:
    • G54, G55, G56, G57, G58, G59: 多个工作坐标系选择。
  8. uint8_t program_flow: 表示程序流控制命令。可能的值包括:
    • M0: 停止程序
    • M1: 可选停止
    • M2: 程序结束
    • M30: 程序结束并重置
  9. uint8_t coolant: 表示冷却液控制。可能的值包括:
    • M7: 雾状冷却
    • M8: 开启冷却
    • M9: 关闭冷却
  10. uint8_t spindle: 表示主轴控制。可能的值包括:
    • M3: 顺时针旋转
    • M4: 逆时针旋转
    • M5: 停止主轴
  11. uint8_t override: 表示进给速率覆盖设置。可能的值包括:
    • M56: 进给速率覆盖命令。

gc_values_t

gc_values_t用于存储G代码指令的具体参数

  • float f: 表示进给速率(单位:mm/min)。
  • float ijk[3]: 表示圆弧插补的偏移量(I、J、K轴)。
  • uint8_t l: 可能用于G10指令或固定循环的参数。
  • int32_t n: 表示行号,用于跟踪当前执行的G代码行。
  • float p: 可能用于G10指令或暂停参数。
  • float r: 表示圆弧的半径。
  • float s: 表示主轴转速。
  • uint8_t t: 表示刀具选择编号。
  • float xyz[3]: 表示X、Y、Z轴的目标位置。

parser_state_t

用于存储解析器的当前状态

  • gc_modal_t modal: 当前的运动模式和控制状态。
  • float spindle_speed: 当前主轴转速。
  • float feed_rate: 当前进给速率(单位:mm/min)。
  • uint8_t tool: 当前跟踪的刀具编号(可能没有实际使用)。
  • int32_t line_number: 最后发送的行号。
  • float position[N_AXIS]: 表示工具在当前代码中的位置,N_AXIS 是一个常量,表示轴的数量(通常是3,即X、Y、Z轴)。
  • float coord_system[N_AXIS]: 当前工作坐标系的偏移量(单位:mm),存储机器的绝对位置。
  • float coord_offset[N_AXIS]: 相对于机器零点的坐标偏移量(单位:mm),用于G92坐标偏移。这个值是非持久性的,重置和引导时会清除。
  • float tool_length_offset: 表示刀具长度偏移值,启用时进行跟踪。

parser_block_t

用于存储单个解析块的内容

  • uint8_t non_modal_command: 表示非模态命令。
  • gc_modal_t modal: 当前的模态状态。
  • gc_values_t values: 当前G代码指令的参数值。

关于uint8_t gc_execute_line(char *line)解读

parser_state_t gc_state;
parser_block_t gc_block;

1.初始化解析器块结构并复制当前G代码状态

memset(&gc_block, 0, sizeof(parser_block_t)); // 初始化解析器块结构。
memcpy(&gc_block.modal, &gc_state.modal, sizeof(gc_modal_t)); // 复制当前模式

将当前系统的模态状态复制到G代码状态的模式中

2.初始化变量

  1. axis_command标记是否存在轴命令(如G28,G30等),初始化为AXIS_COMMAND_NONE

3.确定当前行是点动运动还是普通G代码块

4.导入块 行中的所有G代码字

  1. switch(letter): 这是一个外层的 switch 语句,根据 letter 的值来决定接下来的处理逻辑。letter 可能是 ‘G’ 或 ‘M’,分别代表 G-code 和 M-code 命令。
  2. G 命令解析:
    • letter 为 ‘G’ 时,进入第二个 switch(int_value) 语句,根据 int_value 的值来处理不同的 G 命令。
    • G 命令的处理逻辑包括检查模态组冲突、设置相应的控制状态等。
  3. M 命令解析:
    • letter 为 ‘M’ 时,类似地进入另一个 switch(int_value) 语句来处理 M 命令。
    • M 命令的处理逻辑主要包括控制程序流、主轴和冷却液的状态。
  4. 对于各个G命令的处理逻辑
    • G10, G28, G30, G92:
      • 检查是否在同一块中调用 G10/28/30/92 与 G0/1/2/3/38。
      • 如果 mantissa 为 0,且 axis_command 已经设置,则返回错误状态。
      • 设置 axis_commandAXIS_COMMAND_NON_MODAL
    • G0, G1, G2, G3, G38:
      • 这些命令涉及运动模式,检查是否与其他命令冲突。
      • 设置 axis_commandAXIS_COMMAND_MOTION_MODE
    • G17, G18, G19:
      • 这些命令用于选择平面,设置 gc_block.modal.plane_select
    • G90, G91:
      • 这些命令用于设置绝对或增量编程模式,设置 gc_block.modal.distance
    • G40:
      • 处理刀具半径补偿的禁用。
    • G43, G49:
      • 处理刀具长度补偿,检查 axis_command 冲突。
    • G54 – G59:
      • 选择坐标系。
    • G61:
      • 设置精确路径控制。
    • default: FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND);:
      • 如果 int_value 不匹配任何已知的 G 命令,则返回不支持的命令错误
  5. 对于各个M命令的处理逻辑
    • M0, M1, M2, M30:
      • 处理程序流,设置程序暂停或结束。
    • M3, M4, M5:
      • 控制主轴的启停。
    • M7, M8, M9:
      • 控制冷却液的启停。
    • default: FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND);:
      • 处理不支持的 M 命令。