G代码基础:语法结构、常见指令与坐标系统
G代码(RS-274)是数控机床和3D打印机的通用控制语言,其本质是一种基于文本的、逐行解释的指令序列。对于手写解析器而言,理解G代码的语法结构是构建词法分析器和语法分析器的前提。本章将深入剖析G代码的行结构、指令字构成、参数规则、注释格式,并系统讲解G0/G1/G2/G3及M代码的语义,最后厘清机床坐标系、工件坐标系与增量坐标的数学关系。这些内容将直接决定解析器如何拆分字符串、校验合法性以及生成运动控制数据。
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 判断方法:词法拆分规则
手写解析器时,推荐采用“字符扫描+状态机”的方式实现词法分析。核心规则如下:
- 忽略空白字符:空格、Tab、换行符均作为分隔符,不产生。
- 识别注释:遇到
(或;时,跳过直到行尾或匹配的)。 - 地址字符判定:当遇到字母A-Z时,读取该字母作为地址,然后连续读取数字、正负号、小数点,直到遇到下一个字母或空白。
- 数值校验:数值部分必须符合十进制浮点格式,如
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 为例,解析器应输出以下序列:
| 序号 | 地址 | 数值 | 语义 |
|---|---|---|---|
| 1 | N | 20 | 行号 |
| 2 | G | 02 | 顺时针圆弧插补 |
| 3 | X | 50.0 | 终点X坐标 |
| 4 | Y | 30.0 | 终点Y坐标 |
| 5 | I | 10.0 | 圆心相对起点的X偏移 |
| 6 | J | -5.0 | 圆心相对起点的Y偏移 |
| 7 | F | 200 | 进给率(mm/min) |
该行解析后,语法分析器需检查:G02是否要求至少两个轴参数(X/Y)以及I/J或R参数。若缺少必要参数,应抛出错误。此案例展示了词法分析、语法校验与语义提取的完整链路。
2.1.4 常见误区与总结
易错点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 常见误区与总结
总结:指令解析的核心是“语义表驱动”。建议将指令的合法参数集合、是否模态、是否要求平面选择等信息存入配置表,解析器通过查表完成校验,避免硬编码大量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 判断方法:坐标模式切换与偏移管理
解析器需要维护以下状态变量:
- 当前坐标系:G54~G59对应的原点偏移量(从系统参数读取)。
- 当前模式:G90或G91。
- 当前刀具位置:上一行执行后的坐标(用于增量计算)。
当解析到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 常见误区与总结
总结:坐标系统解析是解析器中最容易出错的部分,建议设计一个独立的“坐标状态机”模块,集中管理坐标系选择、模式切换、偏移量叠加。该模块应提供接口:get_machine_coord(axis, value),内部处理所有转换逻辑,从而隔离复杂性。
本章内容为后续实现词法分析器、语法分析器和运动规划器奠定了坚实基础。理解G代码的语法结构、指令语义和坐标变换规则,是手写解析器能够正确解释并执行数控程序的关键前提。