G-Code 详解

玩过一段时间3D打印机的朋友,都会接触到G-code文件。所谓G-code文件, 指的是3D模型在进入3D打印机实际打印之前,必须要经过切片器处理而成的一种中间格式文件。这种中间格式文件的内容,实际上每一行都是3D打印机固件所能理解的命令。而这些命令,也被称为G-code命令,是3D打印机和电脑之间最重要的命令交互界面。

既然所有3D打印机都使用G-code作为对外联系的唯一信息交互方式,那么这种“语言”的标准就很重要了。不幸的是,虽然所有的3D打印机,都使用G-code作为与计算机的交互语言,但实际上每种3D打印机“说出”的G-code,都多多少少有些不同。这也可以说,每种3D打印机都有自己的“方言”。我们要研究G-code,就要从一种最常见的“方言”,也可以说是“普通话”开始,先了解一种,然后再学习其他类似的语言,相互对比,就很容易了。

基础运动

既然G-code是计算机指挥3D打印机干活用的一套语言,那么其中最重要的就是运动类的指令。

G0/G1 直线移动

虽然从名字上看,G0叫做“快速直线移动”,而G1叫做“直线移动”,但实际上在Repetier-firmware里面,G0和G1指令是完全等价的,没有任何区别。移动是否快速,完全是靠参数F来决定的(下面会详细介绍)。这条指令的作用也很简单,就是将挤出头线性移动到一个特定的位置。这条指令带有不少参数,完整的形式是这样的:

或者

使用时,不需要所有的参数全部存在,但至少要有一个参数。其中,

  • 表示X轴的移动位置;
  • 表示Y轴的移动位置;
  • 表示Z轴的移动位置;
  • 表示E轴(挤出头步进电机)的移动位置;
  • 表示速度,单位是毫米/每分钟;
  • 表示是否检查限位开关,S0不检查,S1检查,缺省值是S0;

举例来说,

这样两行G-code,表示了首先将速度设置为1500mm/min,也就是25mm/s,然后将挤出头移动至x=50mm, y=25.3mm的位置上,z轴高度不变,并且将挤出头步进电机移动至22.4mm的位置上。这里,速度、xyz位置都比较好理解,但挤出头步进电机的位置怎么理解呢动至22.4mm处,代表着挤出了多少耗材呢际上,这里挤出头的具体动作,要根据之前挤出头步进电机所在的状态(也就是位置)而定。比如在这两条语句之前,挤出头步进电机已经处于20mm的位置处,那么这里挤出头步进电机只要再前进2.4mm就可以了。

仔细想想,其实挤出头步进电机的工作方式,与xyz轴完全一样。xyz轴之所以比较好理解,是因为我们清楚的知道原点(0, 0, 0)的位置在哪里。而对于e轴来说原点的位置也会在打印开始处被初始化到0的位置。知道了原点的位置,就可以正确理解挤出头步进电机的工作方式了。实际上,挤出头步进电机仍然是以原点为基础,只不过是在整个打印过程中持续增加的。(思考:切片器的挤出头回抽动作,对应了什么样的G-code代码

再举一例,

这个例子与上面的例子非常类似,唯一的区别,就是F参数了。而这两条语句的意义,除了对XYZE的移动之外,还会将打印速度,从语句执行开始时的1500mm/min,提高到语句执行结束时的3000mm/min。这里有两点需要注意。

第一点,F参数与XYZE参数一样,在语句执行的过程中线性插值;

第二点,在预先知道第一点的前提下,F参数使得计算机对3D打印机的控制更加深入和精准了。计算得当的情况下,切片器可以精确控制3D打印机的加速和减速过程,使得整个3D打印过程更加顺滑。

G2/G3 圆弧移动

这两条命令中,G2是顺时针圆弧移动,G3是逆时针圆弧移动。命令的完整形式是:

或者

其中,

  • 表示移动目标点的X坐标;
  • 表示移动目标点的Y坐标;
  • 表示圆心位置,值是圆心距离当前位置的X分量;
  • 表示圆心位置,值是圆心距离当前位置的Y分量;
  • 表示圆形的半径长度;
  • 表示E轴(挤出头步进电机)的移动位置;
  • 表示速度,单位是毫米/每分钟;

根据勾股定理,。因此,如果提供了圆心位置参数,就不需要提供半径参数了。反之,如果提供了半径参数,也可以根据当前点和目标点计算出圆心位置,就不需要提供I/J参数了。其他几个的参数用法,与G0/G1是完全一样的。

G2/G3命令面临的最尴尬的问题,是常用的上位机切片器软件,包括Slic3r以及Cura engine,并不会生成这两条指令。所有3D模型中的圆弧,在STL文件中已经被转化为使用大量小线段拟合而成的曲线。这样,切片器自然也不会把这些小线段当做圆弧处理。最终的G-code输出结果,也只会存在G0/G1指令,而不会存在G2/G3指令。当然,据打印虎所知,如果你使用的是比较小众的上位机软件,比如artCAM等,因为这些软件的输入并不是STL文件,因此它们的输出G-code是很有可能出现G2/G3命令的。

如果确定了你的3D打印机只会接收到G0/G1直线移动命令,那么我们完全可以在3D打印机固件配置中,定义

这样,所有与G2/G3指令相关的代码,就都不会编译,也不会包含在最终的固件代码中了。可以节省一些固件的空间,同时并不会影响任何3D打印机的功能。

还有一个问题留给大家思考:在上位机切片软件输出G2/G3命令的情况下,相比于上位机切片软件输出G0/G1命令的情况,是否3D打印机打印圆形物体时会更圆呢答案是不会。)那么其中的原理是什么/p>

G4 暂停移动

这条命令让挤出机在当前位置停止一段时间。可能的参数包括:

  • 表示停止移动的时间,以毫秒为单位,1000毫秒等于1秒。
  • 也表示停止移动的时间,以秒为单位。

因此,G4 P2000命令与G4 S2命令是完全等价的。

G10/G11 回抽/反回抽

这两条命令使挤出头执行一个回抽(G10)或者相反的动作(G11)。所谓回抽,就是让E轴步进电机反转一小段。而反回抽则让E轴步进电机正转一小段。参数只有一个:

  • Snnn表示回抽的距离。
  • S1表示长回抽,S0表示短回抽。

实际上,目前的切片器并不太依赖于G10/G11指令执行回抽动作,而是利用G1 Ennn命令直接命令挤出头步进电机前进或倒退到某一个位置。因此,与G2/G3命令类似,G10/G11命令基本上是个摆设,除非未来有专门的切片器可以生成这两条指令,否则完全可以将这两条指令关闭,节省内存空间。在固件配置中,定义

可以关闭G10/G11功能,在编译期去除这段相关的代码。

G20/G21 设置距离单位

这两条命令非常简单,用于设置当前距离单位为英寸(G20)或者毫米(G21)。没有参数。

未设置时缺省值是毫米。

G28 归零

这条命令使3D打印机XYZ轴以及挤出头E轴归零。参数包括:

  • X表示使X轴归零
  • Y表示使Y轴归零
  • Z表示使Z轴归零

E表示重置E轴的位置为0,与XYZ轴不同的是,如果使用了E参数,E轴步进电机并不运动,而是将当前的E轴位置直接设置为0,这样下面对E轴的运动指令,都会解释为相对0点的运动。

如果使用时没有任何参数,直接使用G28,等价于G28 XYZ命令。这时并不会对E轴进行重置为0的操作。

XYZ轴归零的顺序,由固件配置决定,比如定义为

就代表着先归零X轴,然后是Y轴,最后是Z轴。

T 设置当前挤出头

对于拥有多个挤出头的3D打印机来说,需要使用T命令选择当前工作的挤出头。这条命令有一个无名参数,参数值直接跟在T后面。例如:

  • T0表示选择第一个挤出头;
  • T1表示选择第二个挤出头;

参数是T命令最特殊的一点。这与其他所有的G-code命令都不相同。

Z轴高度测试与自动调平

三角洲类型的3D打印机,由于其打印速度更快,受到很多3D打印用户的欢迎。与XYZ式3D打印机最大的一个不同,在于三角洲类型3D打印机的运动计算更加复杂,很难依赖人工调平达到较好的打印效果。因此,对Z轴的自动高度测试,以及自动调平相关的功能,就显得更加重要了。以下G-code命令,是Repetier-firmware对这方面进行支持的一组命令。当然,这些功能并不仅限于三角洲类型的3D打印机。如果是包含了Z轴高度测试微动开关的XYZ式3D打印机,也同样可以使用这些功能。

G29 Z轴高度三点测试

这条命令测试打印平面上三个点的Z轴高度,并在串口上输出结果。参数包括:

测试结果的处理方式。S1表示更新内存中的Z轴高度值(重置系统会丢失),S2表示更新内存以及EEPROM中的Z轴高度值(重置系统不会丢失)。

无参数时,G29命令表示只从串口上输出结果,不更新内存或EEPROM中的Z轴高度值。

一般来说,只有使用高位限位开关(也就是说,Z轴的限位开关位于Z轴坐标最大处),且在挤出头上附带有Z轴高度测试微动开关的机型,适合使用G29命令测试Z轴高度。其他机械配置的机型,不适合使用G29命令。G29命令由固件配置

决定是否开启。如果这个配置项定义为0,则编译时会去除对G29命令的支持,节省内存的使用。

命令执行时,打印平面上的三个点,其XY坐标由以下固件配置参数决定:

命令执行的开始和结束,分别会执行一段预定义的G-code。缺省的固件配置定义为:

可以看出,在缺省状态下,开始执行G29时,系统会自动对挤出头进行复位(G28命令)。结束执行G29时,没有特殊的动作。

G29命令的Z轴高度测试,通常由一个微动开关控制触发。这个开关的端口 ,由单独指定。

G29命令的输出,格式为:

从以上例子的输出可以看出,G29命令一共测试了三个坐标点,分别在(-52, -30), (53, 30)以及(0, 60)的位置,形成一个正三角形。三个点的Z轴高度相差比较悬殊,在第一个点正好是5mm的情况下,后两个点分别是13.04mm以及12.77mm。第一行和最后一行,是测试开始时以及测试结束时的挤出头坐标位置。

G30 Z轴高度单点测试(单步)

这条命令作为一个完整Z轴高度测试过程的一步,测试打印平面上一个点的Z轴高度,并在串口上输出结果。这个完整的Z轴高度测试过程,通常是由3D打印机控制软件连续发出的,通过参数控制G30的执行状态。因此在手动工作方式下,G30命令只适合不带参数运行(等价于G30 P3,见下面的参数说明)。

G30命令的参数包括:

Pnnn表示测试的状态,P1表示当前这步是整个Z轴高度测试过程的第一步;P2表示当前这步是整个Z轴高度测试过程的最后一步;P3表示当前这步是Z轴高度测试过程的唯一一步,也就是说既是第一步也是最后一步;P0表示当前这步是Z轴高度测试过程中的中间一步。无参数情况下,P的缺省值是3。

与G29命令类似,G30命令同样由固件配置

决定是否开启。

G30命令的输出,与上面的G29输出格式一致,但只有其中的一行,需要上位机软件多次发出G30命令,再综合处理所有的输出结果。

G31 输出Z轴高度测试微动开关状态

这条命令非常简单,没有参数。执行后会输出当前Z轴高度测试微动开关的当前状态:

其中L表示微动开关没有触发。如果是处于触发状态,这里会输出H。

G29命令、G30命令、G31命令只进行Z轴的高度测试,并不进行自动调平。有些上位机3D打印机控制软件,会通过这一组命令配合自动跳屏算法实现(上位机)热床自动调平功能。如果希望不通过上位机,只由3D打印机自身完成自动调平功能,需要使用G32命令。

G32 热床自动调平

这条命令在G29命令的基础上,不仅测试打印平面上三个点的Z轴高度,而且还会根据测试的结果,对3D打印机的机械参数进行调整,实现热床自动调平。G32命令使用的参数与G29命令是一致的:

测试结果的处理方式。S1表示更新内存中的相关参数值(重置系统会丢失),S2表示更新内存以及EEPROM中的相关参数值(重置系统不会丢失)。

G32命令执行完成时,不仅Z轴高度参数发生了改变,而且还会根据3D打印机的硬件配置,对热床进行相应的调平处理。

如果热床本身是使用步进电机进行高度控制的,那么程序会自动调整步进电机的位置,使热床自动调整为平整的状态;如果热床本身不能移动(这个应该是更常见的情况),那么G32命令会在3D打印机内存中构建一个转换矩阵(Transformation matrix),让未来3D打印机所处理的所有三维空间位置,都先经过这个矩阵的变换,保证在Z=0的情况下,正好与热床平面完全吻合。由于这里涉及到高深的计算机图形学知识,我们就不详细介绍了。有修改这方面代码需求的朋友,可以直接与打印虎进行联系。

G32命令,由固件配置

决定是否开启。

G32命令的输出,格式与G29命令类似:

除了与G29命令相似的测量信息之外,G32命令还输出了计算得到的自动调平矩阵,并且打开了自动调平功能。需要注意的一点是,G32命令虽然生成了自动调平矩阵,但并没将其保存在EEPROM中,因此下次开机这个信息将会丢失。可以配合M320 S1命令,将自动调平矩阵保存在EEPROM中。

M251 将当前Z轴位置保存为Z轴高度值

这条命令可以将当前的Z轴位置保存为Z轴高度值,以使前面的Z轴高度手动/自动测量的结果起作用。通常,M251命令只工作在三角洲机型上,并且应该与G29命令联合使用(自动测量Z轴高度)。这条命令没有相关的参数。

当3D打印机打开EEPROM支持时,这条命令还会将Z轴高度值同时保存在EEPROM中。

只有当固件配置定义

也就是Z轴向正方向归位,并且定义

也就是存在硬件的Z轴高位限位开关时,M251命令才会在编译中包含相关的代码。

通常,只有三角洲类型的3D打印机才能满足这两个条件限制。

M320/M321 开启/关闭自动调平

开启(M320)或者关闭(M321)自动调平功能,使自动调平转换矩阵起作用或不起作用。命令参数为

Snnn表示是否保存于EEPROM,没有S参数或者S0表示不保存于EEPROM,S1表示保存于EEPROM,在关闭自动调平(M321)命令中S3表示将自动调平矩阵清零且保存于EEPROM中;

M320的输出结果为:

表示自动调平已经打开。

M321的输出结果为:

表示自动调平已经关闭。

M322 清零自动调平转换矩阵

清零(M322)自动调平转换矩阵。显然,清零这个动作的同时自动调平功能也关闭了。命令参数为

Snnn表示是否保存于EEPROM,S0表示不保存于EEPROM,S1表示保存于EEPROM;

也就是说,

命令等价于

M322 S1

命令,两者都是清零自动调平矩阵,关闭自动调平功能,并且将这个设置保存于EEPROM之中。

以上三条命令,与G32命令相同,由固件配置

决定是否开启。

M322的输出结果为:

表示自动调平转换矩阵已经被清零。

第三节,坐标模式与坐标位置

G90/G91 设置坐标模式

这两条命令用于设置当前坐标模式为绝对坐标模式(G90)或者相对坐标模式(G91)。没有参数。

未设置时缺省值是绝对坐标模式。我们在这篇教程中,所有的例子也都是以绝对坐标模式给出的。

在相对坐标模式下,每次步进电机XYZE移动之后,当前位置都会重置为0。对于以下两条G-code命令

如果3D打印机当前处于相对坐标模式下,那么X轴步进电机会先向正方向移动一个单位,再向反方向移动一个单位。第二条语句,实际移动距离是1个单位(向X轴反方向)。

而如果3D打印机当前处于绝对坐标模式下,那么X轴步进电机会先移动到X=1的位置处,再移动到X=-1的位置处。第二条语句,实际移动距离是2个单位(向X轴反方向)。

G92 设置位置

设置3D打印机内存中XYZE的位置值。不移动对应的步进电机。参数包括:

  • Xnnn表示X轴的位置值;
  • Ynnn表示Y轴的位置值;
  • Znnn表示Z轴的位置值;
  • Ennn表示E轴(挤出机步进电机)的位置值;

辅助步进电机

一些3D打印机的机械设计,会在XYZE四个步进电机轴之外,使用更多的辅助步进电机。Repetier-firmware提供了一套辅助步进电机指令,让用户(以及上位机软件)可以操作这些辅助步进电机。由于辅助步进电机的用途、参数各异,为了让这套指令更加通用,这些指令被设计为非常简单的形式。

G201 移动步进电机位置

将步进电机P的位置移动到X位置处。参数包括:

  • Pnnn表示第P个辅助步进电机;
  • Xnnn表示这个步进电机的目标位置;

这条命令与G1命令非常类似。

G202 设置当前位置

将X位置设置为步进电机P的当前位置。不实际移动步进电机。参数包括:

  • Pnnn表示第P个辅助步进电机;
  • Xnnn表示这个步进电机的当前位置;

这条命令与G92命令非常类似。

G203 告当前位置

告步进电机P的当前位置。参数包括:

  • Pnnn表示第P个辅助步进电机;

这条命令与M114命令非常类似。

G203 开启/关闭步进电机

用于开启/关闭步进电机P。参数包括:

  • Pnnn表示第P个辅助步进电机;
  • Snnn表示开闭标志,S0表示关闭步进电机,S1表示开启步进电机;

步进电机开启后,有两种可能的状态。一种是“运动”状态,也就是正在进行正向或反向的旋转。另一种是“保持位置”状态,也就是保持当前的位置不变。虽然步进电机关闭也不会主动移动位置,但“保持位置”状态与步进电机关闭状态仍有显著的区别。“保持位置”状态下,当步进电机受力时,会产生一个反向的力矩,使步进电机位置保持不变。

这条命令与“节能管理”一节中的M84命令有关。M84命令用于关闭XYZE步进电机,但不能打开这些步进电机。

SD卡管理

M20 列目录

显示SD卡所有目录内容。没有相关的参数。

M20命令的输出,格式为:

这个目录内容清单,说明了这张SD卡上目前有3个文件,分别是a.gcode,b.gcode以及c.gcode,其中,a.gcode和b.gcode都保存于根目录下,而c.gcode保存于一个名称为TEST的文件夹里面。

M21 加载SD卡

尝试加载SD卡,也就是执行Mount动作。没有相关的参数。

M22 卸载SD卡

卸载SD卡,也就是执行Unmount动作。没有相关的参数。

M23 选择文件

选择一个SD卡上的文件。参数为

  • 表示被选择的文件名(包含目录名,以/分隔);

文件选择之后,可以执行打印、删除等动作。例如命令

M23 TEST/c.gcode

选定了SD卡TEST文件夹里面的c.gcode文件作为当前文件。

同时输出格式为:

表示文件已经顺利打开。

M24 开始SD卡打印

打印当前选定的SD卡文件。逐行读入SD卡文件内容G-code代码,并执行。没有相关参数。

M25 暂停SD卡打印

暂停当前的SD卡打印。没有相关参数。

M26 设置当前文件当前位置

设置当前文件的当前位置。参数为

  • Snnn表示当前位置的字节数。

M27 获取SD卡打印进度

获取SD卡打印进度。没有相关参数。

M27命令的输出,格式为:

这条命令供上位机获取当前的3D打印进度信息,用于显示在电脑界面上。

M28 写SD卡文件

写一个SD卡文件。参数为:

  • 表示待写入的文件名(包含目录名,以/分隔);

从执行M28命令开始,所有3D打印机接收到的G-code,除了M29命令以外,都会保存至指定的SD卡文件中,而不会被实际执行。这条命令可以将一个G-code文件从上位机3D打印控制软件复制到3D打印机的SD卡上,以供未来执行。

M29 结束写SD卡文件

结束以M28开始的“保存至SD卡文件”状态,将3D打印机恢复到正常状态。从此,所有接收到的G-code命令,都会被

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2017年3月26日
下一篇 2017年3月26日

相关推荐