3. G-code语法基础:命令格式、参数(X/Y/Z/E/F/S等)、注释、行号、大小写与空格规则
G-code是3D打印机运动控制的核心指令语言,它本质上是一种逐行解释执行的文本协议。每一行指令都包含完整的运动意图或控制意图,由固件(如Marlin、Klipper、RepRapFirmware)解析后转换为步进电机的脉冲信号。理解G-code的语法规则,是编写可靠打印程序、排查打印异常、进行二次开发的前提。本章将系统拆解G-code的命令格式、参数体系、注释规范以及解析器对大小写和空格的敏感度,帮助您建立严谨的指令编写习惯。
上图展示了G-code从原始文本到运动执行的完整解析链路。在实际打印过程中,固件首先对每一行指令进行词法分析,剔除注释、提取行号,然后按空白字符分割出命令字和参数Token;接着进入语法解析阶段,识别命令类型并校验参数合法性;最后交由运动规划器执行。理解这一链路,有助于我们定位语法错误产生的环节,并针对性地修正。
3.1 命令格式与行结构
核心原理:G-code的每一行(Block)由若干字段组成,标准格式为:[行号] [命令字] [参数1] [参数2] ... [注释]。命令字是字母G、M或T开头的代码,分别代表准备功能(运动指令)、辅助功能(机床控制)和工具选择。参数则由字母+数值构成,字母表示参数类型,数值可以是整数或浮点数。固件解析时,行号被用于错误报告和断点续打,命令字决定执行动作,参数则提供动作所需的坐标、速度、温度等数据。
判断方法:在编写或检查G-code时,应首先确认行首是否为合法的命令字。G0-G3为直线/圆弧运动,G28/G29为归零与调平,G90/G91为绝对/相对坐标模式,M104/M140为设置温度,M106/M107为风扇控制。若行首为字母N,则需检查后续是否紧跟数字和空格,再出现命令字。若行首为分号或括号,则该行为纯注释,固件直接跳过。
; 标准指令行示例
N10 G90 ; 设置绝对坐标模式
N20 G1 X100.5 Y50.2 F1800 ; 直线插补到(100.5, 50.2),速度1800mm/min
N30 M104 S210 ; 设置喷嘴目标温度210℃
N40 G28 X Y ; 仅归零X和Y轴
案例拆解:假设我们需要编写一段从原点移动到(50, 30)的指令。若省略行号,直接写G1 X50 Y30 F1500,固件同样能正确执行。但若在打印中途发生断料续打,固件会报告“Line Number: 20”之类的错误信息,此时行号就成为了定位问题的关键索引。因此,切片软件生成的G-code通常包含行号,而手工调试时则常省略。
SDSUPPORT和PRINTCOUNTER功能后,会校验行号连续性,缺失或乱序可能导致“Line Number is not consecutive”错误。
常见误区:初学者常将命令字与参数混淆,例如将G1 X10 Y20写成1G X10 Y20,或将参数字母小写(g1 x10 y20)。虽然大多数固件对大小写不敏感,但为了兼容性和可读性,建议统一使用大写。此外,行内多余的空格不会导致错误,但命令字与参数之间、参数与参数之间必须至少有一个空格,否则会被解析为同一Token。
3.2 参数体系详解:X/Y/Z/E/F/S等
核心原理:参数是G-code指令的“操作数”,不同命令字接受不同的参数组合。坐标参数X、Y、Z定义目标位置,单位由G90/G91决定(毫米或相对增量);E参数专用于挤出机,正值表示挤出耗材,负值表示回抽;F参数定义进给速率,单位通常为mm/min(Marlin)或mm/s(部分固件);S参数在不同命令中含义不同——在M104/M140中表示目标温度,在M106中表示风扇转速(0-255),在G4中表示暂停秒数。此外,P参数常用于延时(毫秒)或编号,R参数用于圆弧半径或温度回退,I/J/K用于圆弧中心坐标。
操作流程:编写参数时,应遵循以下步骤:①确认当前坐标模式(绝对或相对);②根据命令字确定所需参数类型;③检查数值范围(如温度不超过材料上限,速度不超过固件设定的最大限速);④注意E参数的单位换算——切片软件通常以“毫米丝长”为单位,但固件内部会结合挤出机步进值(steps/mm)换算为实际挤出体积。
| 参数 | 含义 | 典型命令 | 单位/范围 | 注意事项 |
|---|---|---|---|---|
| X/Y/Z | 目标坐标 | G0/G1/G28 | mm | 受限于打印尺寸 |
| E | 挤出量 | G1 | mm(丝长) | 正值挤出,负值回抽 |
| F | 进给速率 | G0/G1 | mm/min | 受固件最大速度限制 |
| S | 温度/转速/延时 | M104/M106/G4 | ℃/0-255/秒 | 含义随命令变化 |
| P | 延时/编号 | G4/M98 | ms/整数 | G4中P为毫秒 |
| R | 圆弧半径 | G2/G3 | mm | 与I/J/K互斥 |
| I/J/K | 圆弧中心偏移 | G2/G3 | mm | 相对起点偏移量 |
案例拆解:以常见的“回抽”指令为例:G1 E-5 F2400。该指令表示以2400mm/min的速度将耗材回抽5mm。若当前层高为0.2mm,挤出线宽0.4mm,则5mm丝长对应的实际体积约为0.628mm³,足以消除喷嘴内的残余压力。若回抽速度过快(如F6000),可能导致耗材与热端摩擦生热,造成堵头;过慢则可能拉丝。因此,E参数与F参数必须协同调整。
G1 E10后再执行G1 E15,实际挤出量为5mm(15-10)。若误将E当作相对值使用,会导致挤出量失控,轻则表面粗糙,重则撞坏热端。建议在切片软件中统一使用相对挤出模式(M83)。
常见误区:许多用户混淆S参数在不同命令中的含义。例如,M104 S200设置喷嘴温度,而M106 S128设置风扇半速。若在M104中误写S128,会导致喷嘴温度仅升至128℃而无法打印。此外,F参数在G0(快速移动)中通常被忽略,固件使用最大移动速度,但在G1中必须显式指定。
3.3 注释、行号与大小写/空格规则
核心原理:注释是G-code中供人类阅读的说明文本,固件解析时会完全忽略。Marlin等固件支持两种注释格式:分号(;)后的内容直至行尾均为注释;括号(())内的内容也可作为注释,但部分固件对括号支持不完整,建议优先使用分号。行号N是可选字段,用于标识指令序号,在SD卡打印和串口通信中用于错误追踪。大小写规则方面,绝大多数固件对命令字和参数字母不区分大小写,但参数值中的字母(如E、X)必须与命令字匹配,且数值部分不支持科学计数法(如1e3无效)。
操作流程:编写规范G-code的推荐流程:①使用大写命令字和参数字母;②在参数之间使用单个空格分隔;③在行尾添加分号注释,说明该指令的目的;④若需行号,确保从N1开始递增,步长可为1或10;⑤避免在参数值内插入空格(如X 10是错误的,应写为X10)。
; 规范示例
N1 G21 ; 设置单位毫米
N2 G90 ; 绝对坐标
N3 M82 ; 绝对挤出模式
N4 G28 ; 全轴归零
N5 G1 Z5 F300 ; 抬升Z轴至5mm
N6 G1 X10 Y10 F1800 ; 移动到起点
N7 M104 S200 ; 设置喷嘴温度200℃
N8 M140 S60 ; 设置热床温度60℃
N9 G1 E5 F600 ; 预挤出5mm耗材
案例拆解:假设我们收到一份第三方G-code文件,其中包含g1 x10.5y20.3 e1.5f1800。该行缺少参数间的空格,但固件仍能正确解析,因为字母与数字交替出现,词法分析器能自动切分。然而,若写成g1x10.5y20.3,则整个字符串会被视为一个Token,导致“Unknown command”错误。因此,空格是Token分隔的关键,但参数内部不允许空格。
G28与g28在Marlin中均有效,但若使用G28 X归零X轴,而写成g28 x,部分旧版固件可能无法识别参数x。因此,统一使用大写字母是行业惯例,也是保证跨平台兼容性的最佳实践。
常见误区:①在注释中使用中文或特殊字符(如℃、²),可能导致固件编码解析异常,建议使用英文或ASCII字符;②行号跳变过大(如从N1直接跳到N1000),虽然不报错,但会干扰日志分析;③在参数值后添加单位(如X10mm),固件会报错,因为单位由G20/G21统一设置;④使用制表符(Tab)分隔参数,虽然固件支持,但不同编辑器显示宽度不同,易造成视觉混淆,建议统一使用空格。
3.4 语法错误排查与固件容错机制
核心原理:固件对G-code的容错能力有限。当遇到无法识别的命令或参数时,Marlin会向串口发送“Error:Unknown command”或“Error:Invalid parameter”等提示,并跳过该行继续执行后续指令。这种“跳过”机制可能导致打印层错位或温度失控。因此,在打印前进行语法预检至关重要。Klipper固件则更为严格,会在启动时解析整个配置文件,但G-code仍为逐行解释。
判断方法:排查语法错误时,可遵循以下流程:①使用文本编辑器打开G-code文件,检查是否有非ASCII字符;②使用“查找”功能定位所有命令字,确认G/M/T后跟数字;③检查每个参数值是否在合理范围内(如X坐标不超过打印尺寸);④使用在线G-code校验工具或固件模拟器(如OctoPrint的GCode Viewer)进行预检;⑤在打印机上执行单行指令测试,观察串口回显。
| 错误类型 | 固件提示 | 可能原因 | 解决方案 |
|---|---|---|---|
| 未知命令 | Error:Unknown command | 命令字拼写错误或固件不支持 | 核对命令表,更新固件 |
| 参数缺失 | Error:Insufficient parameters | 命令需要特定参数但未提供 | 查阅命令文档,补充参数 |
| 数值越界 | Error:Value out of range | 坐标/温度/速度超出限制 | 调整参数至固件允许范围 |
| 格式错误 | Error:Bad number format | 参数值包含非法字符或科学计数法 | 使用标准十进制格式 |
| 行号不连续 | Error:Line number is not consecutive | 行号缺失或跳变 | 重新生成G-code或关闭行号校验 |
案例拆解:某用户反馈打印过程中喷嘴温度异常升高至250℃,检查G-code发现以下指令:M104 S250。该指令本身合法,但用户误将S参数理解为风扇转速,实际应为M106 S255。此案例说明,参数含义必须结合命令字理解。另一个案例:用户使用G1 X100 Y100 E10 F3000,但打印机实际移动速度仅为300mm/min,原因是固件最大速度限制为300mm/min,F3000被自动钳位。此时应检查固件配置中的DEFAULT_MAX_FEEDRATE。
G1 X-100(负坐标)可能使打印头撞向限位开关,造成机械损坏。建议在打印前使用M114查询当前坐标,确认安全后再执行移动指令。
总结复盘:G-code语法虽然简单,但细节决定成败。核心要点可归纳为:①命令字与参数必须用空格分隔;②参数字母与数值之间不能有空格;③注释使用分号,且不参与解析;④行号可选但需递增;⑤大小写不敏感但建议统一大写;⑥参数含义随命令字变化,务必查阅固件文档。掌握这些规则,您就能编写出稳定、可维护的打印程序,并为后续学习高级指令(如圆弧插补、变量定义)打下坚实基础。