简介:本资源是一份面向3D打印与CNC初学者及固件调试人员的G代码与M代码权威参考手册,聚焦RepRapFirmware开源固件生态,系统解析指令语法、结构规范与实际应用场景。PDF文档完整覆盖G/M代码定义、字段含义(如X/Y/Z坐标、E挤出量、F进给速度、S温度参数等)、注释规则、大小写敏感性、引号字符串处理、校验机制,以及笛卡尔/Delta/CoreXY等多种机型的配置要点,特别强调“无处不在的G代码”设计理念——即所有交互(UI、宏、文件、手动输入)均统一通过G代码完成,极大提升操作一致性与可复用性。资源为单文件PDF,共1个文件,大小1.79MB,内容精炼、术语准确、示例详实(含多行真实指令拆解),适合作为切片软件输出分析、手动调参、故障排查及固件定制的案头速查资料。目前已有576人学习下载,是理解底层控制逻辑、提升3D打印自主调试能力的实用入门指南。
1. G代码和M代码到底是什么:一台3D打印机的“普通话”说明书
你有没有试过给一台陌生的咖啡机倒豆子、调研磨度、设水温,最后按下按钮——结果机器毫无反应?不是它坏了,而是你没说对它的“话”。G代码和M代码,就是3D打印机、CNC雕刻机、激光切割机这类设备唯一听得懂的“普通话”。它不是编程语言里的高阶魔法,而是一套极简、直白、带编号的指令卡片:G1 X100 Y50 Z0.3 F3000意思是“把打印头直线移到X=100mm、Y=50mm、Z=0.3mm的位置,速度是每分钟3000毫米”;M140 S60则像一句口头命令:“把热床加热到60℃”。它们不讲语法逻辑,只认字母+数字的组合;不依赖界面按钮,哪怕你用记事本写好发过去,机器也能照做。这份《G代码M代码详细解释(翻译).pdf》,就是一本从零开始的“设备普通话词典”——它不教你写诗,但能让你第一次亲手指挥一台打印机移动、加热、归位、探测、暂停,甚至校准整个打印平台。搞懂它,你就从“看切片软件生成结果”的用户,变成了“知道每一行命令在干什么”的掌控者。这不是玄学,是让机器听你话的第一步。
2. 为什么非得用G和M开头?——一套为机械运动量身定制的“最小指令集”
2.1 G代码:专管“怎么动”的运动指令
G代码(Geometry Code,几何指令)的核心使命只有一个:告诉机器“往哪走、怎么走、走多快”。它不关心温度、风扇、WiFi密码这些“周边事务”,只聚焦于物理空间中的位移与轨迹。比如:
G0是“快速空跑”:打印头以最大允许速度飞过去,不挤出材料,常用于换层、换位置;G1是“边走边干”:受控线性移动,同时可以挤出耗材(E参数)、控制速度(F参数),是打印过程中最频繁出现的指令;G2/G3是“画弧线”:顺时针(G2)或逆时针(G3)画圆弧,用I/J指定圆心偏移,或用R直接给半径;G28是“回家”:触发限位开关,让各轴回到物理原点,是每次开机或打印前的必做动作;G90/G91是“坐标模式开关”:前者用绝对坐标(所有位置都从机器原点算起),后者用相对坐标(从上一个位置算起),就像导航里“去北京站” vs “往前开500米”。
提示:G代码的“G”后面跟的数字没有数学意义,只是历史沿袭的编号。G0、G1、G2不是“第一代、第二代”,而是不同功能的独立指令。就像交通灯的红黄绿,编号本身不重要,关键是你看到哪个就执行对应动作。
2.2 M代码:专管“做什么”的辅助指令
如果说G代码是司机,那M代码(Miscellaneous Function,杂项功能)就是车上的各种按钮和开关:空调、雨刷、双闪、手刹。它不负责方向盘,但决定整辆车的状态。典型例子包括:
M104/M109:给喷嘴加热(S参数设温度),区别在于M104是“发个指令就继续干活”,M109是“必须等温度真正升到设定值才往下走”;M140/M190:同理,给热床加热;M106/M107:开/关冷却风扇(P参数可调转速);M18/M84:启用/禁用步进电机(让轴“松开”或“锁死”);M557:定义自动调平的探测网格点(比如在床面上选9个点测高度);M587:配置WiFi(S参数是SSID,P参数是密码),注意:密码里有分号?那就得用引号包起来,否则分号会被当成注释开头。
注意:M代码的“M”同样只是分类标识。M104和M109功能相近,但行为差异巨大——一个异步,一个同步。这正是初学者最容易翻车的地方:以为设了温度就万事大吉,结果打印头还没热透就开始挤料,导致堵料。
2.3 为什么不用更“高级”的语言?——机械世界的硬约束
你可能会问:Python多灵活,JavaScript多强大,为啥非要用这种看起来原始的G/M代码?答案藏在硬件底层:
- 实时性要求:打印机运动是毫秒级响应。固件(如RepRapFirmware)运行在资源有限的微控制器(如ARM Cortex-M系列)上,没有操作系统,没有内存管理,必须在几微秒内解析并执行一条指令。G/M代码结构简单(字母+数字+空格分隔),解析器只需几十行C代码就能搞定,而Python解释器光启动就要几百毫秒;
- 确定性优先:机械运动不容许“可能”“大概率”。G1 X100 Y100 必须精确走到(100,100),不能因为内存不足就跳过一段。G/M代码无变量、无循环、无条件判断(宏文件除外),每条指令含义唯一、执行路径唯一;
- 跨平台通用性:从千元级DIY打印机到百万级工业CNC,只要支持G代码标准(如NIST G-Code Interpreter v3),同一段
G1 X10 Y20 F1500就能跑通。它像USB接口一样,是硬件厂商共同遵守的“物理层协议”。
2.4 RepRapFirmware的“无处不在G代码”哲学
这份PDF重点介绍的RepRapFirmware固件,把G/M代码的通用性推到了极致。它奉行“无处不在的G代码”(Ubiquitous G-code)理念——意思是:无论命令从哪来,固件都只认G/M代码这一种语言。
- 你用网页界面(Duet Web Control)点“归位”,后台发的是
G28; - 你在串口调试工具里手动敲
M140 S60,固件照样执行; - 打印中途触发错误,固件自动运行
stop.g宏文件,里面写的还是G/M代码; - 连WiFi密码、设置PID参数、校准Delta塔臂长度……全用
M587、M301、G32等G/M指令完成。
这彻底消灭了“配置命令”和“运行命令”的割裂。传统固件可能用AT指令配WiFi、用专用协议调温度,而RepRapFirmware坚持:一切皆G/M。好处显而易见——你不需要记住两套语法;写一个宏文件,既能用在网页端,也能用在SD卡启动时;调试时直接发指令,比翻UI菜单快十倍。它把复杂性压在固件层,把简洁性留给用户。
3. G代码长啥样?——拆解一行真实指令的DNA结构
3.1 一行G代码的完整构成:字段、注释、校验的三层嵌套
拿PDF里反复出现的经典例子看:
G10 P0 S195 R175 T0 G1 X100 Y100 Z0.3 F3000 ; 这是首层移动别被一长串吓到,它其实由三部分组成:
字段(Fields):指令的“主干”
这是G代码的骨骼,由字母+数字组成的键值对,空格分隔。每个字母代表一类参数:
G10:G类指令,编号10,这里是“设置工具参数”;P0:P参数,值为0,指“工具0”(第一个喷嘴);S195:S参数,值为195,指“工作温度195℃”;R175:R参数,值为175,指“待机温度175℃”;T0:T类指令,编号0,指“选择工具0”;G1:另一个G指令,编号1,直线移动;X100/Y100/Z0.3:坐标参数,目标位置;F3000:F参数,进给速度3000 mm/min。
关键细节:
X100和X100.0完全等价,固件自动识别小数;但T0.5就非法——工具编号必须是整数。参数顺序无关紧要(G1 F3000 X100和G1 X100 F3000效果相同),但同一行不能有两个相同字母的参数(G1 X100 X200会报错)。
注释(Comments):给人看的“便签纸”
以分号;开头,到行尾结束;或用括号()包裹,但必须在同一行:
G28 (归位所有轴) ; 这是注释,固件直接忽略 G1 X100 Y50 ; 移动到右上角,准备打印注释里可以写中文、英文、emoji,固件视而不见。它是你留给半年后自己的后悔药——当你发现某行G30导致探针撞床,注释里的# 警惕!此处需先抬高Z就是救命稻草。
校验与行号(Optional Checksum & Line Number):防通信出错的“保险丝”
在高干扰环境(如USB长线传输),数据可能被篡改。RepRapFirmware支持两种防护:
- 行号
N123:放在行首,表示这是第123行; - 校验和
*71:放在行尾(注释前),是前面所有字符的异或值(XOR)。
N123 G1 X100 Y50 F1500 *71固件收到后,会自己算一遍校验和。如果*71对不上,就要求重发这一行。注意:二者必须成对出现,只写一个会报错。日常SD卡打印通常省略它们,但串口调试时建议开启,避免因一个比特错误导致整机失控。
3.2 大小写、引号、空格:那些差点让你崩溃的细节
PDF里特别强调的几个“魔鬼细节”,新手踩坑率高达90%:
区分大小写?看固件版本!
- RepRapFirmware 1.18及更早:只认大写。
g1 x100会被无视; - 1.19及更新:不区分大小写,但引号内的字符串例外(
"my_ssid"必须小写)。
血泪经验:升级固件后,旧宏文件里全是小写指令,突然全失效——第一反应不是固件坏了,而是检查大小写。
引号字符串:对付空格和分号的终极武器
WiFi密码含空格?文件名有中文?用双引号包起来:
M587 S"MY_ROUTER" P"123 456" ; 密码含空格,必须加引号 M23 "calibration piece.gcode" ; 文件名含空格,引号保命引号内想打双引号?重复两次:P"abc""def"→ 密码是abc"def。
更绝的是:很多串口工具会自动转大写,导致"my_ssid"变成"MY_SSID"。这时用单引号强制小写:P"ABC'X'Y'Z"→ 实际密码是ABCxyz。
单行多个命令:省事还是埋雷?
RepRapFirmware允许:
G1 X100 Y100 F3000 G92 E0 G1 E10 F200等价于三行。好处是减少通信次数;坏处是一旦中间某条出错,整行作废。生产环境建议分行写,调试时可合并。
3.3 缓冲机制:为什么打印不卡顿?——固件的“流水线车间”
你一定疑惑:为什么G代码发得飞快,打印机却能稳稳跟上,不丢步、不抖动?秘密在环形缓冲区(Ring Buffer)。
- RepRapFirmware内部有个小仓库(默认8~16条指令),专门存
G0/G1/G2/G3这类运动指令; - 主机(电脑/网页)发来
G1 X100 Y100,固件立刻存进仓库并回ok,不等它真动; - 电机控制器从仓库取指令执行,执行完再取下一条;
- 仓库满了?主机发新指令时会卡住,直到有空位——这天然实现了流量控制。
但注意:
M指令(如M104加热)不进缓冲区!M104 S200发出去,固件必须等加热命令处理完才回ok。所以别在运动指令行里混写M指令,否则流水线就堵死了。
4. 常见误区与易混概念:G代码不是“猜谜游戏”
4.1 G代码 vs M代码:不是“G更高级,M更次要”
易混点:看到G开头的指令多、常出现在切片输出里,就以为G代码是“主程序”,M代码是“配角”。
为什么混:文档常把G代码放前面讲,M代码放后面,形成心理暗示;且G指令直接关联运动,视觉上更“核心”。
怎么区分:
- G代码管空间位移(X/Y/Z/E/F),本质是几何描述;
- M代码管设备状态(温度/风扇/电机/网络),本质是功能开关;
- 二者地位完全平等。没有M104设温度,G1挤料会失败;没有G1移动,M106开风扇只是空转。
类比:G代码是汽车的“方向盘+油门”,M代码是“点火开关+空调按钮”。没点火,方向盘再准也白搭。
4.2 G90/G91 绝对/相对模式:不是“哪种更好”,而是“何时切换”
易混点:认为G90是“标准模式”,G91是“临时模式”,应该尽量少用G91。
为什么混:教程常强调“G90是默认”,让人误以为G91是异常状态。
怎么区分:
G90(绝对):所有坐标以机器原点(0,0,0)为基准。适合宏观定位,如G90 G1 X0 Y0 Z0.2回到起点;G91(相对):所有坐标以上一个位置为基准。适合微调,如G91 G1 Z0.1抬高喷嘴0.1mm,G1 Z-0.1再降下来;- 关键原则:G90/G91切换后,模式持续生效,直到再次切换。切片软件通常全程用G90,但手动调平、探针测试时,G91能避免计算绝对坐标的手动失误。
真实场景:用
G91 G1 Z10把喷嘴抬高10mm避开模型,再G90切回绝对模式继续打印——这才是高手用法。
4.3 G28 归位 vs G92 设定位置:不是“都能归零”,而是“零点来源不同”
易混点:看到G28和G92都能让坐标变0,就以为可以互相替代。
为什么混:两者都出现在“初始化”环节,且效果表面相似(Z坐标归零)。
怎么区分:
| 指令 | 物理动作 | 零点依据 | 典型用途 |
|---|---|---|---|
G28 | 真实移动到限位开关,触发硬件信号 | 机器物理原点(由限位器位置决定) | 开机校准、确保坐标系准确 |
G92 | 不动机器,仅修改固件记录的“当前位置”数值 | 人为指定的任意点(如当前喷嘴位置) | 手动调平后补偿Z高度、临时偏移 |
举例:打印中途暂停,你想让喷嘴停在(100,100,0.3),但固件显示Z=0.2。此时
G92 Z0.3告诉固件“现在Z其实是0.3”,后续G1 Z0.3就不会动——这是软件补偿。而G28会直接撞限位器,把Z强行拉回物理0点,可能撞坏模型。
4.4 G1 F参数:不是“固定速度”,而是“理论最大值”
易混点:设了F3000就以为打印头一定以3000mm/min狂奔。
为什么混:F参数字面意思是“Feed Rate”(进给速率),容易理解为恒定速度。
怎么区分:
- F是线性插值的目标速度,实际速度受多重限制:
- 电机扭矩极限(高速时力矩下降,可能失步);
- 加速度限制(
M204设置),短距离来不及加速到F值; - 轴行程限制(如Z轴最大速度仅5mm/s);
- 固件会动态计算每一段的实际速度曲线,确保平滑加减速。
G1 X100 Y100 F3000的真实轨迹是:从0加速→匀速→减速到0,全程时间由F值反推。
验证方法:用
M120开启详细日志,看实际执行的move指令中speed字段,常低于F设定值。
4.5 M104/M109 与 M140/M190:不是“喷嘴用M109,热床用M190”,而是“同步/异步”逻辑统一
易混点:记不住哪个是等待,哪个是不等待,靠死记硬背。
为什么混:编号无规律(M104 vs M109),且喷嘴/热床指令分开,增加记忆负担。
怎么区分:
- 末位是4 → 异步(Async):
M104(喷嘴加热不等待)、M140(热床加热不等待); - 末位是9 → 同步(Sync):
M109(喷嘴加热并等待)、M190(热床加热并等待); - 统一逻辑:所有加热指令都遵循“4=发令即走,9=等到位再动”。
实战口诀:“加热用4,打印用9”——M104/M140发加热指令后立刻执行G1打印;M109/M190必须等温度达标才执行下一行,避免冷料挤出。
5. G代码实战边界:什么时候该写,什么时候该交给切片软件?
5.1 必须手动写G代码的5个生死时刻
当切片软件的图形界面失效,G代码就是你的最后一根绳索。以下场景,不写G代码等于放弃控制权:
场景1:首次装机校准——绕不开的G28+G30组合
新打印机通电,第一步不是切模型,而是验证硬件是否“听懂人话”。
G28 ; 先归位,确认XYZ轴能触到限位器 G1 Z5 F200 ; 抬高喷嘴5mm,避免撞床 G30 ; 在当前XY位置探床,看Z探针是否触发(返回Z高度)如果G30返回Z:0.000,说明探针没触发——检查接线、供电、M558配置;如果返回Z:-1.234,说明触发了,但数值异常(应接近0),需调G31 Z参数。这一步不成功,后面所有打印都是空中楼阁。
场景2:Z轴精度救急——用G92临时补偿0.05mm误差
打印第一层总刮板?不是床不平,可能是Z轴零点漂移。不用重调机械,一行代码解决:
G28 ; 先归位 G1 Z0.2 ; 移动到Z=0.2mm(理论喷嘴离床0.2mm) G92 Z0.25 ; 告诉固件:“现在Z其实是0.25mm”,相当于抬高喷嘴0.05mm后续所有G1 Z0.2都会按0.25mm执行,第一层间隙增大。这是老手调参的“后悔药”。
场景3:探针撞床急救——M564 S0临时禁用安全限制
用G30探床时,喷嘴猛地下扎撞床?可能是M564(运动限制)太严。临时放行:
M564 S0 ; 关闭所有运动限制(危险!仅调试用) G30 ; 安全探床 M564 S1 ; 立刻恢复限制警告:
M564 S0后任何G1都可能超限,用完必须立刻恢复!
场景4:WiFi密码含特殊字符——M587引号语法避坑
路由器密码是P@ssw0rd!,直接写M587 P"P@ssw0rd!"会报错(!被当注释)。正确写法:
M587 S"MyRouter" P"P@ssw0rd!" ; 双引号包住,固件自动识别或者更保险:
M587 S"MyRouter" P"P'@'S'S'W'0'R'D'!" ; 单引号强制小写,兼容所有串口工具场景5:SD卡文件乱码——M20查文件列表定位问题
网页界面显示“找不到文件”,但SD卡明明有model.gcode。用串口发:
M20 ; 列出SD卡根目录文件如果返回GCode files: "model.gco", "test.g",说明切片软件生成了.gco而非.gcode;如果返回空,说明SD卡未初始化(补M21)或接触不良。
5.2 绝对不该手动写G代码的3个陷阱
有些事看似能“优化”,实则自寻死路。以下操作,请把键盘焊死:
陷阱1:重写切片软件的层间指令(如G1 Z0.28)
切片软件(PrusaSlicer/Cura)生成的G代码,每一行Z高度都经过精密计算:考虑层高、初始层厚、Z-hop抬升、回抽距离。你手动把G1 Z0.28改成G1 Z0.30,会导致:
- 第二层厚度突增,与第三层脱节;
- Z-hop高度错位,喷嘴在移动中刮蹭已打印模型;
- 回抽时机紊乱,产生拉丝。
正确做法:在切片软件里改“层高”参数,让所有G代码自动重生成。
陷阱2:在运动指令中混用M指令(如G1 X100 M106 S255)
如前所述,M指令不进缓冲区。G1 X100 M106 S255执行流程是:
- 发送整行 → 固件存入缓冲区;
- 执行
G1 X100(进缓冲); - 执行
M106 S255(不进缓冲,阻塞等待); G1执行完,M106才开始——风扇启动严重滞后。
正确写法:分行!
G1 X100+M106 S255,确保运动与功能解耦。
陷阱3:用G92替代G28做日常归位
有人图省事,G28归位后手动G92 X0 Y0 Z0,下次就直接G92跳过G28。后果:
- 限位器物理磨损,零点漂移;
G92只改软件值,硬件位置仍是错的,G30探床数据全废;- 某天
G92值被意外覆盖,整机坐标系崩塌。
正确习惯:每天开机必
G28,G92仅用于临时微调,用完即弃。
5.3 一份值得珍藏的G代码速查表(精简版)
| 指令 | 作用 | 关键参数 | 典型用例 |
|---|---|---|---|
G28 | 归位所有轴 | X/Y/Z(指定轴) | 开机、打印前校准 |
G30 | 单点探床 | X/Y(位置),S-2(设Z偏移) | 手动调平、验证探针 |
G90/G91 | 绝对/相对模式 | 无参数 | G91 G1 Z0.1微调高度 |
G92 | 设定当前位置 | X/Y/Z/E(数值) | G92 E0重置挤出长度 |
G1 | 直线移动 | X/Y/Z/E(位置),F(速度) | 所有打印运动 |
M104/M109 | 喷嘴加热 | S(温度) | M109 S200预热喷嘴 |
M140/M190 | 热床加热 | S(温度) | M190 S60等床热稳 |
M106/M107 | 风扇开关 | S(0-255转速) | M106 S255全速冷却 |
M557 | 定义探床网格 | X/Y(点坐标) | M557 X10:190 Y10:190 S20设9点网格 |
M587 | 配置WiFi | S(SSID),P(密码) | M587 S"MyNet" P"12345678" |
从那以后我每次装新探针、换新热床、升级固件,第一件事就是打开串口,按顺序敲
G28→G30→M109 S200→G1 X100 Y100 F1500,亲眼看着喷嘴动、探针响、温度升、风扇转——确认每一个物理部件都在我的指令下呼吸。这套动作成了我的开工仪式,比任何UI按钮都让我安心。希望帮到你。
本文还有配套的精品资源,点击获取