G代码基础:语法结构、常见指令与坐标系统

G代码(RS-274)是数控机床和3D打印机的通用控制语言,其本质是一种基于文本的、逐行解释的指令序列。对于手写解析器而言,理解G代码的语法结构是构建词法分析器和语法分析器的前提。本章将深入剖析G代码的行结构、指令字构成、参数规则、注释格式,并系统讲解G0/G1/G2/G3及M代码的语义,最后厘清机床坐标系、工件坐标系与增量坐标的数学关系。这些内容将直接决定解析器如何拆分字符串、校验合法性以及生成运动控制数据。

G代码解析器核心知识框架 语法结构 • 行号 N10 • 指令字 G01 / M03 • 参数 X10.5 Y-2.0 • 注释 (钻孔循环) 常见指令 • G0 快速定位 • G1 线性插补 • G2/G3 圆弧插补 • M代码 辅助功能 坐标系统 • 机床坐标系 (MCS) • 工件坐标系 (WCS) • 坐标 G90 • 增量坐标 G91 解析器核心任务 词法拆分 → 语法校验 → 语义转换 → 运动数据生成 解析器设计关键点 1. 指令字与参数必须严格区分大小写与正负号 2. 圆弧指令需要同时处理圆心(I/J/K)与半径(R)两种模式

2.1 G代码语法结构:从行到指令字的拆解

2.1.1 核心原理:行的组成与词法单元

一段G代码程序由若干“行”(Block)组成,每行通常包含一个或多个“指令字”(Word)。指令字由地址字符(A-Z)和紧随其后的数值构成,例如 X10.5、G01、M03。解析器的首要任务是将原始文本行拆分为独立的词法单元()。标准行结构如下:

N10 G01 X10.5 Y-2.0 F300 (直线切削)
│   │   │     │     │     └── 注释
│   │   │     │     └─────── 进给率参数
│   │   │     └───────────── Y轴坐标参数
│   │   └─────────────────── X轴坐标参数
│   └─────────────────────── 准备功能指令
└─────────────────────────── 行号(可选)

词法分析器需要识别四种基本类型:行号(N后跟整数)、指令字(G/M/T/S等后跟数值)、参数(X/Y/Z/I/J/K/R/F等后跟带符号浮点数)、注释(括号内或分号后的内容)。值得注意的是,G代码对空格不敏感,G01X10Y-2 与 G01 X10 Y-2 完全等价,但解析器必须正确处理正负号与小数点。

2.1.2 判断方法:词法拆分规则

手写解析器时,推荐采用“字符扫描+状态机”的方式实现词法分析。核心规则如下:

  1. 忽略空白字符:空格、Tab、换行符均作为分隔符,不产生。
  2. 识别注释:遇到 ( 或 ; 时,跳过直到行尾或匹配的 )。
  3. 地址字符判定:当遇到字母A-Z时,读取该字母作为地址,然后连续读取数字、正负号、小数点,直到遇到下一个字母或空白。
  4. 数值校验:数值部分必须符合十进制浮点格式,如 10、-2.5、.75(等价于0.75)。
解析器实现提示:建议将每个存储为结构体 { char address; double value; }。对于G代码,地址字符决定语义;对于参数,地址字符决定轴或功能。例如 X 映射到X轴坐标,F 映射到进给率。这种设计便于后续语法分析时快速查找。

2.1.3 案例拆解:典型行解析过程

以实际加工中常见的行 N20 G02 X50.0 Y30.0 I10.0 J-5.0 F200 为例,解析器应输出以下序列:

序号地址数值语义
1N20行号
2G02顺时针圆弧插补
3X50.0终点X坐标
4Y30.0终点Y坐标
5I10.0圆心相对起点的X偏移
6J-5.0圆心相对起点的Y偏移
7F200进给率(mm/min)

该行解析后,语法分析器需检查:G02是否要求至少两个轴参数(X/Y)以及I/J或R参数。若缺少必要参数,应抛出错误。此案例展示了词法分析、语法校验与语义提取的完整链路。

2.1.4 常见误区与总结

易错点1:忽略行号N的重复校验。同一程序中N值不应重复,但解析器通常不强制检查,而是由上层逻辑处理。
易错点2:将注释中的字母误识别为指令字。必须优先处理注释状态。
易错点3:未处理“模态指令”的默认值。例如G01在首次出现前,若未指定G0/G1,则默认沿用上一行的模态值。

总结:语法结构解析是解析器的地基,建议采用“先拆词、后校验、再转换”的三段式设计。词法分析器应输出无歧义的流,语法分析器负责检查指令组合的合法性,语义分析器则将转换为内部运动指令结构。

2.2 常见指令:G0/G1/G2/G3与M代码语义

2.2.1 核心原理:运动指令与辅助指令

G代码分为准备功能(G指令)和辅助功能(M指令)。G指令控制机床的运动方式,M指令控制开关量(主轴启停、冷却液开关等)。解析器必须区分这两类指令,因为G指令影响坐标计算,而M指令仅触发外部I/O操作。核心运动指令如下:

  • G0(快速定位):以机床最大速度移动,不进行切削。参数为终点坐标,如 G0 X100 Y50。
  • G1(线性插补):以指定进给率F做直线切削。参数为终点坐标和F值。
  • G2/G3(圆弧插补):G2为顺时针,G3为逆时针。需要终点坐标(X/Y/Z)和圆心参数(I/J/K)或半径R。
  • M03/M05:主轴正转/停止。M03通常需要配合S指令(主轴转速)。

2.2.2 判断方法:指令参数校验规则

解析器在处理G指令时,应建立“指令-参数”映射表。例如:

G0  → 需要 X/Y/Z 至少一个轴参数(可选)
G1  → 需要 X/Y/Z 至少一个轴参数 + F参数(可选,有默认值)
G2/G3 → 需要 X/Y/Z 终点 + (I/J/K 或 R) 二选一
M03 → 需要 S参数(主轴转速)
M05 → 无参数

对于圆弧指令,若同时提供I/J/K和R,应优先使用I/J/K(更精确),并忽略R。若两者均缺失,则报错。此外,G2/G3的平面选择由G17(XY平面)、G18(XZ平面)、G19(YZ平面)决定,解析器需记录当前平面状态。

2.2.3 案例拆解:圆弧指令的两种编程方式

假设在XY平面上从点(10,10)加工到点(30,10),圆心在(20,10),半径为10mm。两种写法如下:

方式代码解析器处理逻辑
I/J形式G03 X30 Y10 I10 J0计算圆心 = 起点 + (I,J) = (20,10),验证距离
R形式G03 X30 Y10 R10根据起点、终点和半径计算圆心(存在两个解,需根据G2/G3方向选择)

对于R形式,解析器需使用几何公式:圆心到起点的距离d = 弦长/2,圆心到弦中点的距离h = sqrt(R² - d²)。然后根据顺逆时针方向确定圆心位于弦的哪一侧。这一计算过程必须在解析阶段完成,以便后续插补器直接使用圆心坐标。

2.2.4 常见误区与总结

经验提醒:M代码并非全部无参数。例如M19(主轴定向)可能需要Q参数指定角度。解析器应维护一个M代码参数表,而不是假设所有M代码均无参数。此外,G代码的模态特性(如G01一旦指定,后续行若未指定G指令则沿用G01)必须在解析器中通过状态变量实现。

总结:指令解析的核心是“语义表驱动”。建议将指令的合法参数集合、是否模态、是否要求平面选择等信息存入配置表,解析器通过查表完成校验,避免硬编码大量if-else逻辑。

2.3 坐标系统:机床坐标、工件坐标与增量模式

2.3.1 核心原理:三种坐标系的数学关系

数控系统存在三个关键坐标系:机床坐标系(MCS)是机床固有的机械零点,由限位开关确定;工件坐标系(WCS)是编程时设定的原点,通过G54-G59指令选择;局部坐标系可通过G52偏移。解析器必须维护当前坐标系偏移量,将工件坐标转换为机床坐标。此外,G90(坐标)和G91(增量坐标)决定了参数的解释方式:

  • 模式(G90):X/Y/Z值相对于当前工件原点。
  • 增量模式(G91):X/Y/Z值相对于当前刀具位置。

转换公式:机床坐标 = 工件坐标 + 工件原点偏移量。在增量模式下,目标机床坐标 = 当前机床坐标 + 增量值。

2.3.2 判断方法:坐标模式切换与偏移管理

解析器需要维护以下状态变量:

  1. 当前坐标系:G54~G59对应的原点偏移量(从系统参数读取)。
  2. 当前模式:G90或G91。
  3. 当前刀具位置:上一行执行后的坐标(用于增量计算)。

当解析到G54时,切换当前工件坐标系;当解析到G90/G91时,切换后续参数的解释模式。对于每一行运动指令,解析器执行以下步骤:

1. 读取目标轴参数(X/Y/Z)
2. 若为G91模式,则目标坐标 = 当前坐标 + 参数值
3. 若为G90模式,则目标坐标 = 参数值
4. 加上当前工件原点偏移量,得到机床坐标
5. 更新当前刀具位置

2.3.3 案例拆解:多坐标系切换的解析过程

假设机床原点偏移量:G54为(100, 200, 0),G55为(150, 250, 0)。程序片段如下:

N10 G54 G90 G00 X0 Y0
N20 G01 X50 Y50 F100
N30 G55 G91 G01 X10 Y10

解析过程:

行号解析前状态计算过程解析后状态
N10当前坐标(0,0),G54目标= (0,0)+G54偏移=(100,200)当前坐标(100,200)
N20当前坐标(100,200),G54目标= (50,50)+G54偏移=(150,250)当前坐标(150,250)
N30当前坐标(150,250),G55增量= (10,10),目标=(160,260)+G55偏移=(310,510)当前坐标(310,510)

注意N30行中,G91模式下的增量值先加到当前坐标,再叠加G55偏移。若解析器未正确切换坐标系,将导致严重加工偏差。

2.3.4 常见误区与总结

风险提示:许多解析器错误地将G91模式下的增量值直接加上工件偏移,导致坐标计算错误。正确顺序是:先计算工件坐标系内的目标点(或增量),再统一转换为机床坐标。此外,G52局部坐标系偏移会临时叠加在G54-G59之上,解析器需支持偏移量的嵌套计算。

总结:坐标系统解析是解析器中最容易出错的部分,建议设计一个独立的“坐标状态机”模块,集中管理坐标系选择、模式切换、偏移量叠加。该模块应提供接口:get_machine_coord(axis, value),内部处理所有转换逻辑,从而隔离复杂性。

本章内容为后续实现词法分析器、语法分析器和运动规划器奠定了坚实基础。理解G代码的语法结构、指令语义和坐标变换规则,是手写解析器能够正确解释并执行数控程序的关键前提。