切片软件对模型进行切片后会生成.gcode文件,这就是我们常说的G代码。G代码是用于指导3D打印机怎么动作的文件,其实最主要就是指导打印机的3轴电机和挤出机如何动作,比如某个电机正转多少、速度多少。
3D打印机本质就是gcode的执行器,同样的雕刻机、激光雕刻机也是。我们把一张平面图形通过软件生成G代码,G代码就可以控制激光雕刻机的x、y电机先运动到哪儿、再运动到哪儿、接着运动到哪儿.....一系列运动之后就把平面图形雕刻出来了。我们把3D模型经过切片软件处理后,就是把3D模型切成一层一层的平面图形,同样的道理控制电机经过一系列运动就可以把模型打印出来了。
因此3D打印机的控制固件、切片软件并不复杂,只要知道了G代码的语法,就可以自己写一个G代码的执行固件、G代码的生成上位机。甚至不需要G代码,你可以自己定义一种代码,然后自己根据定义的代码来设计执行固件和代码生成上位机。
M92 E92.640000
M190 S60.000000
M109 S210.000000
;Sliced at: Wed 04-12-2019 20:39:58
;Basic settings: Layer height: 0.2 Walls: 0.8 Fill: 20
;Print time: 59 minutes
;Filament used: 2.708m 8.0g
;Filament cost: None
;M190 S60 ;Uncomment to add your own bed temperature line
;M109 S210 ;Uncomment to add your own temperature line
G21 ;metric values
G90 ;absolute positioning
M82 ;set extruder to absolute mode
M107 ;start with the fan off
G28 X0 Y0 ;move X/Y to min endstops
G28 Z0 ;move Z to min endstops
G1 Z15.0 F9000 ;move the platform down 15mm
G92 E0 ;zero the extruded length
G1 F200 E3 ;extrude 3mm of feed stock
G92 E0 ;zero the extruded length again
G1 F9000
;Put printing message on LCD screen
M117 Printing...
;Layer count: 250
;LAYER:-2
;RAFT
G0 F9000 X70.699 Y72.424 Z0.300
;TYPE:SUPPORT
G1 F1200 X71.320 Y71.910 E0.10054
G1 X72.120 Y71.371 E0.22086
G1 X72.666 Y71.071 E0.29856
G1 X73.699 Y70.614 E0.43945
G1 X74.884 Y70.287 E0.59277
G1 X75.607 Y70.181 E0.68391
.......
上面是Cura输出的打印模型的G代码,第1行到第3行分别是M92、M190、M109命令,后面跟着的是命令的参数。第4行到第10行是“;”后面跟着模型的属性信息,“;”是G代码的注释符。再后面又是命令号跟着命令参数......当开始打印时,打印机会按照这个G代码文件,一行一行的执行。
了解了G代码文件的组成,现在来说一下G代码文件中用到的命令。命令只需要看一下就行,读G代码的时候,遇到什么命令再回来查就可以了。
G代码的命令分为:延时的G命令、即时的G命令、即时的M和T命令。延时和即时的区别在于收到命令后,对命令的回应处理不同。控制器收到命令后,都会把命令放入循环队列中,只要把延时命令成功放入队列,控制器就会给出应答,可是对于即时命令,只有执行该命令后才会给出应答。
S1000
G92 X0 Y0 Z0
G90
G1 F200
M3
G1 X1 Y1
G1 X1 Y46
G1 X63.5 Y46
G1 X63.5 Y1
G1 X1 Y1
G1 X0 Y0
G1 X0 Y47
G1 X64.5 Y47
G1 X64.5 Y0
G1 X0 Y0
M5
一、延时的G命令
RepRap固件接收到这些命令后,会先存储在一个循环队列缓存里再执行。这意味着固件在接收到一条命令后马上可以传输下一条。另一方面,这也意味着一组线段可以没有间断的情况下连续打印。为了实现命令流的控制,当接受到可缓存的命令时,如果固件把它成功放到本地缓存里,就立即给出应答,如果本地缓存已满,则会延时等到缓存有空出的位置时,才给出应答。
G0/G1: 直线移动
G0和G1命令完全等价,作用就是让喷头线性移动到一个特定的位置。参数完整形式为:
G0 Xnnn Ynnn Znnn Ennn Fnnn Snnn
或者
G1 Xnnn Ynnn Znnn Ennn Fnnn Snnn
使用时,不需要所有的参数全部存在,但至少要有一个参数。其中,
Xnnn表示X轴的移动位置;
Ynnn表示Y轴的移动位置;
Znnn表示Z轴的移动位置;
Ennn表示E轴(挤出头步进电机)的移动位置;
Fnnn表示移动速度,单位是毫米/每分钟;
Snnn表示是否检查限位开关,S0不检查,S1检查,缺省值是S0;
如:
G1 F1500
G1 X50 Y25.3 E22.4
这两行G-code,表示首先将移动速度设置为1500mm/min,然后将挤出头移动至x=50mm, y=25.3mm的位置上,z轴高度不变,并且将挤出头步进电机移动至22.4mm的位置上。注意,命令是将挤出头移动到某个位置,而不是移动多少距离。比如前一个位置是X40 Y20 E20,那么执行这条命令后,挤出头往X正方向移动10mm,往Y正方向移动5.3mm,挤出机挤出2.4mm长度的耗材。
G28:复位
打印机复位命令。执行时会让3个轴依次往限位开关的方向运行,碰到限位开关后还会减速做一次1mm左右的往返运动,来保证复位的准确性。如果在命令后面加上坐标值,则只会复位坐标值对应的坐标轴。(坐标值的数字会被忽略)
如:
G28 X0 Y72.3
只会复位x轴和y轴。
一般G代码文件开头都会用此命令来复位3轴。(如上面的示例)
G29:Z轴高度三点测试
这条命令会测试打印平面上三个点的Z轴高度,并在串口上输出结果。参数为Snnn,表示对测试结果的处理方式。S1表示更新内存中的Z轴高度值(重置系统会丢失),S2表示更新内存以及EEPROM中的Z轴高度值(重置系统不会丢失)。
无参数时,G29命令表示只从串口上输出结果,不更新内存或EEPROM中的Z轴高度值。
一般来说,只有使用高位限位开关(也就是说,Z轴的限位开关位于Z轴坐标最大处),且在挤出头上附带有Z轴高度测试微动开关的机型,适合使用G29命令测试Z轴高度。其他机械配置的机型,不适合使用G29命令。G29命令由固件配置
#define FEATURE_Z_PROBE 1
决定是否开启。如果这个配置项定义为0,则编译时会去除对G29命令的支持,节省内存的使用。
命令执行时,打印平面上的三个点,其XY坐标由以下固件配置参数决定:
#define Z_PROBE_X1 -52
#define Z_PROBE_Y1 -30
#define Z_PROBE_X2 52
#define Z_PROBE_Y2 -30
#define Z_PROBE_X3 0
#define Z_PROBE_Y3 60
在命令执行的开始和结束处,会分别执行一段预定义的G-code。缺省的预定义内容为:
#define Z_PROBE_START_SCRIPT “G28”
#define Z_PROBE_FINISHED_SCRIPT “”
可以看出,在缺省状态下,开始执行G29时,系统会自动对挤出头进行复位(G28命令)。结束执行G29时,没有特殊的动作。
G29命令的Z轴高度测试,通常由一个微动开关控制触发。这个开关的端口号,由Z_PROBE_PIN单独指定。
G29命令的输出,格式为:
X:0.00Y:0.00Z:200.00E:0.00Z-probe:5.01X:-52.00Y:-30.00Z-probe:13.04X:52.00Y:-30.00Z-probe:12.77X:0.00Y:60.00X:0.00Y:60.00Z:-98.48E:0.00
从以上例子的输出可以看出,G29命令一共测试了三个坐标点,分别在(-52, -30), (53, 30)以及(0, 60)的位置,形成一个正三角形。三个点的Z轴高度相差比较悬殊,在第一个点正好是5mm的情况下,后两个点分别是13.04mm以及12.77mm。第一行和最后一行,是测试开始时以及测试结束时的挤出头坐标位置。
G30:Z轴高度单点测试(单步)
这条命令作为一个完整Z轴高度测试过程的一步,测试打印平面上一个点的Z轴高度,并在串口上输出结果。这个完整的Z轴高度测试过程,通常是由3D打印机控制软件连续发出的,通过参数控制G30的执行状态。因此在手动工作方式下,G30命令只适合不带参数运行(等价于G30 P3,见下面的参数说明)。
命令参数为:Pnnn,表示测试的状态,P1表示当前这步是整个Z轴高度测试过程的第一步;P2表示当前这步是整个Z轴高度测试过程的最后一步;P3表示当前这步是Z轴高度测试过程的唯一一步,也就是说既是第一步也是最后一步;P0表示当前这步是Z轴高度测试过程中的中间一步。无参数情况下,P的缺省值是3。
与G29命令类似,G30命令同样由固件配置
#define FEATURE_Z_PROBE 1
决定是否开启。
G30命令的输出,与上面的G29输出格式一致,但只有其中的一行,需要上位机软件多次发出G30命令,再综合处理所有的输出结果。
G31:输出Z轴高度测试微动开关状态
这条命令非常简单,没有参数。执行后会输出当前Z轴高度测试微动开关的当前状态:
Z-probestate:L
其中L表示微动开关没有触发。如果是处于触发状态,这里会输出H。
G29命令、G30命令、G31命令只进行Z轴的高度测试,并不进行自动调平。有些上位机3D打印机控制软件,会通过这一组命令配合自动跳屏算法实现(上位机)热床自动调平功能。如果希望不通过上位机,只由3D打印机自身完成自动调平功能,需要使用G32命令。
G32:热床自动调平
这条命令在G29命令的基础上,不仅测试打印平面上三个点的Z轴高度,而且还会根据测试的结果,对3D打印机的机械参数进行调整,实现热床自动调平。G32命令使用的参数与G29命令是一致的:Snnn,表示测试结果的处理方式。S1表示更新内存中的相关参数值(重置系统会丢失),S2表示更新内存以及EEPROM中的相关参数值(重置系统不会丢失)。
G32命令执行完成时,不仅Z轴高度参数发生了改变,而且还会根据3D打印机的硬件配置,对热床进行相应的调平处理。
如果热床本身是使用步进电机进行高度控制的,那么程序会自动调整步进电机的位置,使热床自动调整为平整的状态;如果热床本身不能移动(这个应该是更常见的情况),那么G32命令会在3D打印机内存中构建一个转换矩阵(Transformation matrix),让未来3D打印机所处理的所有三维空间位置,都先经过这个矩阵的变换,保证在Z=0的情况下,正好与热床平面完全吻合。由于这里涉及到高深的计算机图形学知识,我们就不详细介绍了。
G32命令,由固件配置
#define FEATURE_AUTOLEVEL 1
决定是否开启。
G32命令的输出,格式与G29命令类似:
X:0.00Y:0.00Z:200.00E:0.00Z-probe:5.00X:-52.00Y:-30.00Z-probe:12.97X:52.00Y:-30.00Z-probe:12.76X:0.00Y:60.00Info: 0.99709-0.00319-0.076280.000000.99912-0.41910.076340.0041790.99621Info:AutolevelingenabledX:7.32Y:64.08Z:-95.66E:0.00X:0.00Y:0.00Z:200.00E:0.00
除了与G29命令相似的测量信息之外,G32命令还输出了计算得到的自动调平矩阵,并且打开了自动调平功能。需要注意的一点是,G32命令虽然生成了自动调平矩阵,但并没将其保存在EEPROM中,因此下次开机这个信息将会丢失。可以配合M320 S1命令,将自动调平矩阵保存在EEPROM中。
二、即时的G命令
以下命令也可以被缓存, 但是直到所有之前缓存的命令被执行完,并且该命令执行后,才会给出应答。 因此主机会等待命令执行完毕(才收到的应答)。这些命令导致的短暂停顿不会影响机器的正常性能。
G4: 暂停移动
让喷头在当前位置停留一段时间。参数可以为:G4 Pnnn或G4 Snnn。Pnnn表示以毫秒为单位,Snnn表示以秒为单位。
如:G4 P2000与G4 S2完全等价,都表示停顿2秒。
在停顿过程中机器仍可以被控制,如挤出头温度。
G20:使用英寸作为单位
执行这条命令后,后面的命令都以英寸作为单位。
G21: 使用毫米作为单位
执行这条命令后,后面的命令都以毫米作为单位。
G90/G91:设置坐标模式
这两条命令用于设置当前坐标模式为绝对坐标模式(G90)或者相对坐标模式(G91)。没有参数。
未设置时缺省值是绝对坐标模式。我们在这篇教程中,所有的例子也都是以绝对坐标模式给出的。
在相对坐标模式下,每次步进电机XYZE移动之后,当前位置都会重置为0。对于以下两条G-code命令
G0 X1
G0 X-1
如果3D打印机当前处于相对坐标模式下,那么X轴步进电机会先向正方向移动一个单位,再向反方向移动一个单位。第二条语句,实际移动距离是1个单位(向X轴反方向)。
而如果3D打印机当前处于绝对坐标模式下,那么X轴步进电机会先移动到X=1的位置处,再移动到X=-1的位置处。第二条语句,实际移动距离是2个单位(向X轴反方向)。
G92:设置当前位置为某个坐标值
把当前位置设定为某个坐标值,可以用来设置零点,如果参数为空表示把当前位置设置为所有轴的的零点。
如:G92 X10 E90 ;表示把当前位置设置为x=10,喷头坐标=90
再如:G92 E0 ;表示把当前喷头坐标设置为0
G94/G95:进给速率单位
使用了G94指令之后,所有的进给都是以mm/min为单位,即F100指刀具每分钟移动100毫米(默认的)
使用了G95指令之后,所有的进给都是以mm/r为单位,即F100指主轴每转一转,刀具移动100毫米
G17/G18/G19:选择加工平面

三、即时的M和T命令
M0:打印机停止
打印机会终止任何动作,然后关机。所有的电机和加热器都会被关掉,这个时候只能通过reset按钮来重启控制器。
M1: 打印机休眠
打印机会终止任何动作,然后休眠。所有的马达和加热器都会被关掉,但是接收到G或M命令时,打印机可以被唤醒并进入工作状态。
M3:主轴开启,顺时针旋转(CNC专用)
如:M3 S4000 ;主轴以4000RPM速度顺时针旋转
M4:主轴开启,逆时针旋转(CNC专用)
如:M4 S4000 ;主轴以4000RPM速度逆时针旋转
M5:主轴关闭(CNC专用)
M7:气雾冷却系统开启(CNC专用)
M8:水冷系统开启(CNC专用)
M9:所有的冷却系统关闭(CNC专用)
M10:吸尘系统开启(CNC专用)
M11:吸尘系统关闭(CNC专用)
M17:启动所有步进电机
M18:关闭所有步进电机
M20:读取SD卡根目录中的文件
读取SD卡根目录的文件,并通过串口输出文件名。
M21:初始化SD卡
初始化SD卡。如果在机器通电时插入SD卡,会默认初始化SD卡。开始其他SD卡功能时,SD卡一定要先初始化。本命令相当于文件系统中执行Mount动作。
M22:卸载SD卡
卸载SD卡,也就是执行Unmount动作。没有相关的参数。
M23:选择SD卡中的文件
选择一个SD卡上的文件。文件选择之后,可以执行打印、删除等动作。
如:M23 filename.gcode ;选中filename.gcode文件
M24:开始打印SD卡中选中的文件
开始打印通过M23命令选中的文件。
M25:暂停SD卡打印
暂停打印通过M23命令选定的文件。
M26:设置当前文件的当前位置
设置当前文件的当前位置。参数为:Snnn,表示当前位置的字节数。
比如我要从当前文件的100字节开始写入数据,那么就要先用本命令跳到100字节处。
M27:报告SD卡打印进度
获取SD卡打印进度。没有相关参数。
M27命令的输出,格式为:
SD printing byte 11518/1127578
这条命令供上位机获取当前的3D打印进度信息,用于显示在电脑界面上。
M28:开始往SD卡文件中写入数据
接收到此命令后,后续接收到的命令(除了M29)都会被当成数据写入该文件。
命令后面会跟着文件名,如果文件不存在则会被创建,如果存在则会被覆盖。接收到这条命令后,后续接收到的命令都会被写入该文件中,直到接收到M29命令。
如:M28 filename.gcode
M29:停止往SD卡文件中写入数据
接收到此命令后,后续接收到的命令要开始正常执行。
M30:删除SD卡中的文件
如:M30 filename.gcode ;删除filename.gcode文件
M32:创建子目录
在SD卡上创建一个子目录。参数为:filename,表示待创建的子目录(包含目录名,以/分隔);
以上所有SD卡相关指令,都由固件配置
define SDSUPPORT 1
决定是否开启。如果固件不需要支持SD卡,关闭这项固件配置,可以节省不少内存空间。
M42:直接读写端口
此命令直接读/写一个Arduino端口,为3D打印控制软件上位机扩展程序功能提供基础。参数包括:
Pnnn表示Arduino的输入/输出端口;输出时固件程序会同时输出到数字端口和模拟端口;输入时固件程序会从数字端口输入;
Snnn表示写入输出端口的值,0到255之间是合法的数字;当S参数不存在的时候,M42指令起输入作用;
Repetier-firmware固件中预先定义了一个表格,称为“敏感端口表格”,所有位于这个表格内的端口,也就是当前已经被步进电机、限位开关以及热敏电阻占用的端口,都不能被M42命令影响。其他当前未占用的端口,可以由这条命令进行IO操作。
M43: Stand by on material exhausted
M82/M83:设置挤出头步进电机坐标模式
与G90/G91命令类似,这两条命令用于设置挤出头当前坐标模式为绝对坐标模式(M82)或者相对坐标模式(M83)。没有参数。
未设置时缺省值是绝对坐标模式。
需要注意的是,G90/G91设置的坐标模式,同时对XYZE四个轴起作用,但M82/M83设置的坐标模式,只对E轴(挤出头步进电机)起作用。
M84:设置步进电机自动关闭时间
当3D打印机一段时间没有接收到步进电机运动指令之后,3D打印机(为了节能)会自动关闭步进电机。使用M84指令,可以设置这个自动关闭步进电机的时间。参数包括:Snnn,表示步进电机关闭的时间,以秒为单位。
如果使用M84时没有指定S参数,则步进电机会立即关闭。
M84命令的缺省值是360秒。在固件配置中,缺省值由
#define STEPPER_INACTIVE_TIME 360L
控制。
M85:设置3D打印机自动关闭时间
当3D打印机一段时间没有接收到指令之后,3D打印机(为了节能)会自动关闭步进电机以及挤出头、热床等设备。使用M85指令,可以设置这个自动关闭3D打印机的时间。参数包括:Snnn,表示在关闭步进电机之前步进电机没有活动的时间,以秒为单位。
如果使用M85时没有指定S参数,或者使用了S0参数,则代表取消3D打印机自动关闭功能,挤出头、热床等在工作完成之后,一直会处于当前状态,而不会被自动关闭。
M85命令的缺省值是0(不自动关闭)。在固件配置中,缺省值由
#define MAX_INACTIVE_TIME 0L
控制。
M92: 设置AXIS_STEPS_PER_UNIT参数(Sprinter和Marlin固件)
设置步进电机移动1mm对应的脉冲数,可脱机保存.。在校准的时候非常有用,不用每次都修改程序,然后重新下载。
参数包括:
Xnnn,表示X轴的分辨率;
Ynnn,表示Y轴的分辨率;
Znnn,表示Z轴的分辨率;
Ennn,表示E轴(挤出机步进电机)的分辨率;
M98: 获取 axis_hysteresis_mm 参数
M99: 设置 axis_hysteresis_mm 参数(Marlin固件)
Example: M99 X<mm> Y<mm> Z<mm> E<mm>
重新设置hysteresis值.。我们知道齿轮等机械结构,在转换方向时候都会有滞后现象。你可以测量在他们在转换方向的时候有多长的距离是丢失掉的,然后把它写入hysteresis值,这样之后的转向运动,机器将会进补偿运动,来弥补这些误差。
M99:暂时关闭步进电机(其他)
M99命令可以暂时关闭XYZ轴步进电机一段时间。命令参数包括:
Snnn表示所需暂时关闭步进电机的时间,以秒为单位;
X表示暂时关闭X轴步进电机;
Y表示暂时关闭Y轴步进电机;
Z表示暂时关闭Z轴步进电机;
如果S参数没有指定,则暂时关闭10秒钟时间。暂时关闭时间到达之后,重新打开相应轴的步进电机。
M104:设置挤出机(喷头)温度
设置挤出头的目标温度。执行这条命令后,不需要等待达到这个温度,控制板继续执行下一条G-code语句。相关参数包括:
Snnn,表示目标温度;
Tnnn,表示对应的挤出头;
P,表示要等待前面的指令完成之后,再开始设置挤出头温度;
Fnnn,表示到达目标温度之后,是否触发蜂鸣器。F1表示要触发;
如果执行命令时没有带T参数,则针对当前挤出头设置目标温度。
如:M104 S190 ;将挤出机的温度设置为190度
M105: 获取当前温度(单位:℃)
获取当前温度值,包括挤出头和热床的温度。相关参数包括:
X,表示输出ADC测量的原始值;
M105命令的输出,格式为:
T:18.97 /0 B:18.75 /0 B@:0 @:0
可以看到,T:之后的部分,代表挤出头的当前温度/目标温度;B:之后的部分代表热床的当前温度/目标温度。
在PID温度控制模式下,B@:后面的数字代表热床当前的输出强度,是一个0~255的值,@:后面的数字,代表挤出头当前的输出强度,也是一个0~255的值。例子中,挤出头、热床都处于关闭状态,所以这个位置的值都是0。
M106: 打开风扇
如:M106 S127 ;打开风扇(半速)。'S'表示 PWM值 (0-255). 可简单理解为:风扇有0-255级强度可选,其中 M106 S0 意味着风扇将被关掉。
在固件配置中,定义
#define FEATURE_FAN_CONTROL 1
表示支持风扇控制功能,在编译中会包含相关的代码。
M107: 关闭风扇
不推荐. 请用M106 S0 代替。
M108: 设置挤出机速度
设置挤出机电机的转速 (不推荐,请使用 M113)
M109: 等待挤出头加热达到目标温度
设置挤出头的目标温度,并等待达到这个温度。相关参数包括:
Snnn,表示目标温度;
Tnnn,表示对应的挤出头;
Fnnn,表示到达目标温度之后,是否触发蜂鸣器。F1表示要触发;
如果执行命令时没有带T参数,则针对当前挤出头设置目标温度。
如: M109 S185 ;等待挤出头加热到185度
M110: 设置当前的行码
设置当前行为第123行. 然后,接下来会执行第124行的命令。
M111:允许/禁止运行时调试标志
运行时调试标志是一组布尔值,一共有6个不同的标志,使用位域(Bit Field)的表示方式。用户可以利用M111指令修改这些标志的值。相关参数包括:
Snnn表示直接将调试标志设置为S值;
Pnnn表示以位操作的方式,将P值与当前调试标志做某种操作。如果P值是正数,则进行按位或操作(增加P参数所带的标志位);如果P值是负数,则忽略P的符号,进行取反后按位与操作(去除P参数所带的标志位);
调试标志的位域,由以下6个布尔值组成:
第1位,值为1,表示是否回显(Echo)由上位机发送至下位机的命令;
第2位,值为2,表示是否输出信息(Info),实际在固件代码中并未使用;
第3位,值为4,表示是否输出错误(Error),在固件出错时会将出错信息发送回上位机;
第4位,值为8,表示是否进入模拟执行模式(Dry run),在模拟执行模式下,3D打印机不实际执行上位机发送的命令,只修改3D打印机的内存状态;
第5位,值为16,表示是否进入调试通讯模式(Communication),实际在固件代码中似乎并未使用;
第6位,值为32,表示是否进入禁止移动模式(No Move),在这个模式下,所有对步进电机的移动命令,都会被忽略;
M112: 紧急停止
所有进行中的动作都会被立即终止,然后关掉Reprap. 所有电机和加热器都会被关掉. 可以按Reset按钮(板上)以重启.
M113: 设置挤出机的 PWM
M114: 获取挤出头当前位置
输出挤出头当前位置。没有相关的参数。
M114命令的输出,格式为:
X:20.00Y:30.00Z:10.000E:0.0000
M115: 获取3D打印机信息
输出3D打印机信息。没有相关的参数。
M115命令的输出,格式为:
FIRMWARE_NAME:Repetier_0.92.3FIRMWARE_URL:…Printedfilament:0.00mPrintingtime:0days0hours0minSpeedMultiply:100FlowMultiply:100
第一行是固件的版本信息,很长,没有列完整。第二行是已经打印了多少米耗材,打印时间是几天几小时几分钟。第三行是速度系数,参考M220命令。第四行是流率系数,参考M221命令。
M116: 等待温度达到目标温度
等待所有挤出头/热床到达由之前的M104/M140指令所指定的目标温度。没有相关参数。
M117: 在液晶上显示消息
如:M117 Hello World ;在液晶上显示Hello World
M118: Negotiate Features
M119: 输出限位开关状态
将当前限位开关状态输出。没有相关的参数。
M119命令的输出,格式为:
endstopshit:x_min:Ly_min:Lz_min:L
列出了XYZ三个轴的低位限位开关的当前状态。L代表限位开关没有触发。H代表限位开关被触发了。
M120:测试蜂鸣器
使蜂鸣器发出蜂鸣声。参数为
Snnn表示发出声音/不发出声音的时间,以毫秒为单位;
Pnnn表示重复的次数;
如果3D打印机有蜂鸣器,而且是无源蜂鸣器,那么通过S参数和P参数的组合,可以得到不同频率的声音。比如
M120 S24 P8
可以得到一个较长的蜂鸣声。如果3D打印机的蜂鸣器是有源蜂鸣器,那么M120指令只能控制蜂鸣时间,不能控制蜂鸣器的声音频率。
M121: Pop
M126: Open Valve
M127: Close Valve
M128: Extruder Pressure PWM
M129: Extruder pressure off
M130: 设置 PID P 值
M131: 设置 PID I 值
M132: 设置 PID D 值
M133: Set PID I limit value
M134: Write PID values to EEPROM
M136: Print PID settings to host
M140 设置热床目标温度
设置热床的目标温度。执行这条命令后,不需要等待达到这个温度,立即开始执行下一条G-code语句。相关参数包括:
Snnn表示目标温度;
Fnnn表示到达目标温度之后,是否触发蜂鸣器。F1表示要触发;
M141: Chamber Temperature (Fast)
M142: Holding Pressure
M143: 设置最大热头温度
M160: Number of mixed materials
M190: 等待热床加热达到目标温度
设置热床的目标温度,并等待达到这个温度。相关参数包括:
Snnn,表示目标温度;
Fnnn,表示到达目标温度之后,是否触发蜂鸣器。F1表示要触发;
M200:设置体积挤出模式
将3D打印机设置为“体积挤出模式”,同时设定挤出头直径参数。相关参数包括
Tnnn表示对应的挤出头,无T参数表示使用当前挤出头;
Dnnn表示挤出头的实际直径,无D参数表示关闭体积挤出模式;
体积挤出模式,是相对于缺省的“长度挤出模式”而言的另一种挤出模式。在常见的“长度挤出模式”下,G-code中的使E轴运动的G0/G1命令,其参数都是以长度单位mm作为单位的。这样确实比较简单,但问题是我们在切片的时候,就必须知道要使用的喷头直径,否则无法计算出耗材前进的实际长度。
为了使G-code在生成之后适用于多种不同喷头直径的3D打印机机型,我们可以在上位机切片时,将E轴参数变为以体积单位mm3作为单位,然后在下位机固件中,再设定正在使用的喷头直径,以达到最终正确输出的目的。为了以体积单位mm3作为E轴的参数单位,上位机需要将喷头直径设定为1.128mm(这样,耗材每前进1mm,会喷出1mmπ(1.128mm/2)2约等于1mm3的耗材。)同时,下位机要使用下面的语句:
M200 T0 D0.4
将实际的挤出头喷头直径设置为0.4mm。同时在上位机和下位机进行这样的操作之后,3D打印机可以在E轴参数单位为mm3的情况下,正确完成打印操作。
M201/M202:设置最大加速度
这两条命令设置打印加速度。包括挤出头工作时(打印中)的运动加速度(M201),以及挤出头不工作时(移动中)的运动加速度(M202)。参数为
Xnnn,表示X轴的加速度;
Ynnn,表示Y轴的加速度;
Znnn,表示Z轴的加速度;
Ennn,表示E轴的加速度;
在固件配置中,定义
#define RAMP_ACCELERATION 1
表示支持加速度功能,在编译中会包含相关的代码。
M203:监控温度
使用串口输出监控3D打印机的温度。参数为
Snnn表示是否监控,S0关闭监控,S1打开监控;
当监控处于打开状态,可以从串口定时获取当前的温度信息。
监控输出格式与M105命令的输出结果完全一致。
M204:设置PID参数
设置挤出头温度控制的PID参数,命令参数为
Snnn表示对应的挤出头,无S参数表示使用当前挤出头;
Xnnn表示P参数;
Ynnn表示I参数;
Znnn表示D参数;
M207:修改抖动(Jerk)值
修改当前的最大抖动值。命令参数为
Xnnn表示XY轴的最大抖动值;
Znnn表示Z轴的最大抖动值;
Ennn表示E轴的最大抖动值;
XY轴抖动指的是3D打印机同时在X轴和Y轴上移动时,产生的和速度最大值。比如,3D打印机加热头正在向X轴正方向全速移动,下一条指令变为向Y轴正方向移动。如果同时在X轴和Y轴上改变速度,那么实际产生的速度是X方向的速度和Y方向的速度的向量和,这个比较大的速度变化值,会对3D打印机的机械部件产生不利的影响,而且会造成比较大的噪音。这里的设置,就限制了这个XY轴上和速度的最大值。当然这个值也不能设置的太小,太小的话,首先打印速度会变得很慢,而且打印会产生更多的瑕疵。
Z轴抖动与XY轴抖动意义类似,不同点是Z-Jerk是Z轴方向不为0的抖动速度值。因为这项涉及到Z轴的运动,因此最大速度就低多了。
M207命令的输出,格式为:
Jerk:20.00ZJerk:0.30
这个输出意义很简单,表示XY轴抖动速度为20mm/s,Z轴抖动速度为0.3mm/s。
M208: 设置XYZ轴行程的限制
M209:开启/关闭自动回抽
开启/关闭自动回抽功能。命令参数为
Snnn表示是否开启自动回抽功能,1表示开启,0表示关闭;
通常上位机切片器负责在合适的位置处加入回抽指令。如果你的切片器功能比较弱,不能加入合适的回抽指令,那么可以打开这个特性,由固件自动回抽。
在固件配置中,定义
#define FEATURE_RETRACTION 1
表示支持自动回抽功能,在编译中会包含相关的代码。
M220:设置速度
设置3D打印机运行速度系数。命令参数为
Snnn表示系数,是一个百分数,如果S参数不存在,则使用缺省值100;
3D打印机运行速度系数,是一个在25%到500%范围内变化的值。这个系数值在3D打印机运行过程中,与切片器给出的3D打印机运动速度基础值相乘,得到最终的3D打印机实际运动速度值。
M220命令的输出,格式为:SpeedMultiply:100
M221:设置流率
设置3D打印机的流率系数(Flow rate)。命令参数为
Snnn表示系数,是一个百分数,如果S参数不存在,则使用缺省值100;
3D打印机流率系数,是在上位机切片软件通过耗材直径、喷头直径、层高以及3D打印速度等因素综合计算得到的E轴运动速度的基础上,叠加的一个E轴运动速度系数。简单地说,就是控制挤出头耗材挤出量的多少。这个系数可以在25%到500%范围内变化。
M221命令的输出,格式为:FlowMultiply:100
M226: Gcode Initiated Pause
M227: Enable Automatic Reverse and Prime
M228: Disable Automatic Reverse and Prime
M229: Enable Automatic Reverse and Prime
M230: Disable / Enable Wait for Temperature Change
M240: Start conveyor belt motor / Echo off
M241: Stop conveyor belt motor / echo on
M245: 打开风扇
M246: 关闭风扇
M251:将当前Z轴位置保存为Z轴高度值
这条命令可以将当前的Z轴位置保存为Z轴高度值,以使前面的Z轴高度手动/自动测量的结果起作用。通常,M251命令只工作在三角洲机型上,并且应该与G29命令联合使用(自动测量Z轴高度)。这条命令没有相关的参数。
当3D打印机打开EEPROM支持时,这条命令还会将Z轴高度值同时保存在EEPROM中。
只有当固件配置定义
#define Z_HOME_DIR -1
也就是Z轴向正方向归位,并且定义
#define MAX_HARDWARE_ENDSTOP_Z true
也就是存在硬件的Z轴高位限位开关时,M251命令才会在编译中包含相关的代码。
通常,只有三角洲类型的3D打印机才能满足这两个条件限制。
M280:多头重复打印模式设置
有些特殊配置的3D打印机,允许2~4个挤出头同时工作,并且这些挤出头动作完全一致,同时打印出多件完全一样的打印件,这种工作模式叫做多头重复打印模式(Ditto mode)。M280命令对这个模式进行设置。命令参数为
Snnn表示这个模式下的挤出头个数;S0表示关闭多头重复打印模式;S1S3表示工作在多头重复打印模式下,并且3D打印机拥有额外的13个挤出头。
在固件配置中,定义
#define FEATURE_DITTO_PRINTING 1
表示支持多头重复打印模式功能,在编译中会包含相关的代码。
M281:测试硬件看门狗功能
这条命令用于测试CPU硬件中的看门狗功能。实际上,就是造成一个死循环,不再执行“喂狗”动作,从而触发CPU硬件看门狗,最终(故意地)造成3D打印机重启。这条命令只是用于3D打印机固件开发测试。
M300: 播放提示音
M301: Set PID parameters - Hot End
M302:设置是否允许冷挤出
为了保护3D打印机的挤出头,通常设置下,E轴的运动必须在挤出头加热到一定温度之后才被允许。在挤出头冷却的情况下,所有的E轴运动命令是被3D打印机固件忽略的。但有些情况下我们需要在挤出头冷却的情况下运动E轴,这时可以通过M302命令进行设置。命令参数为
Snnn表示是否允许冷挤出,S0表示不允许,S1表示允许,没有S参数缺省表示允许;
M302命令的输出,为当前是否允许冷挤出。允许时会输出:Cold extrusion allowed
不允许时会输出:Code extrusion disallowed
M303:自动测试PID参数
自动测试PID参数值。命令参数为
Pnnn表示待测试的挤出头编号,从0开始,P<挤出头个数>代表待测试的是热床;
Snnn表示打印温度;
Rnnn代表重复测试次数;
X代表是否保存于EEPROM中;
由于加热、散热需要较多时间,这条命令执行时间很长。
M304: Set PID parameters - Bed
M320/M321:开启/关闭自动调平
开启(M320)或者关闭(M321)自动调平功能,使自动调平转换矩阵起作用或不起作用。命令参数为Snnn,表示是否保存于EEPROM,没有S参数或者S0表示不保存于EEPROM,S1表示保存于EEPROM,在关闭自动调平(M321)命令中S3表示将自动调平矩阵清零且保存于EEPROM中;
M320的输出结果为:
Info:Autolevelingenabled
表示自动调平已经打开。
M321的输出结果为:
Info:Autolevelingdisabled
表示自动调平已经关闭。
M322:清零自动调平转换矩阵
清零(M322)自动调平转换矩阵。显然,清零这个动作的同时自动调平功能也关闭了。命令参数为Snnn,表示是否保存于EEPROM,S0表示不保存于EEPROM,S1表示保存于EEPROM;
也就是说,M321 S3命令等价于M322 S1命令,两者都是清零自动调平矩阵,关闭自动调平功能,并且将这个设置保存于EEPROM之中。
以上三条命令,与G32命令相同,由固件配置
#define FEATURE_AUTOLEVEL 1
决定是否开启。
M322的输出结果为:
Info:Autolevelmatrixreset
表示自动调平转换矩阵已经被清零。
M330:测试蜂鸣器
测试(无源)蜂鸣器,产生一个特定频率的声音。命令参数为
Snnn表示声音的频率;
Pnnn表示声音持续的时间,以毫秒为单位;
如果命令没有包含S参数或者P参数,则会使用缺省值S1以及P1000。
M400:等待当前所有移动指令完成
等待在3D打印机内存中待处理的移动命令执行完成。没有相关的参数。
执行这条语句之后,可以保证在下一条G-code命令执行时,所有步进电机都不处于运动状态中。
M401:保存当前的位置
将当前位置,包括XYZE步进电机,保存于内存的一组专用变量中。未来可以用M402命令恢复这组位置。没有相关的参数。
M402:恢复之前保存的位置
恢复之前由M401命令保存的位置值。命令参数为
X表示恢复X位置;
Y表示恢复Y位置;
Z表示恢复Z位置;
E表示恢复E位置;
Fnnn表示使用参数给定的速度,无F参数时使用当前速度值;
M600:更换耗材
在拥有显示屏的3D打印机上,启动更换耗材向导界面。没有相关的参数。
通常,这个向导界面是从显示屏界面上触发的。M600命令提供一个接口,使更换耗材向导界面可以从上位机软件触发。
M601:暂停/恢复挤出头
暂停或者恢复挤出头。命令参数为
Snnn表示暂停或者恢复,S1表示暂停挤出头,S0表示恢复挤出头工作;
暂停挤出头包括停止挤出头加温以及停止挤出头步进电机工作。恢复则相反,加热挤出头到原来的温度。
T: 设置当前挤出头
对于拥有多个挤出头的3D打印机来说,需要使用T命令选择当前工作的挤出头。这条命令的参数值直接跟在T后面即可。例如:
T0表示选择第一个挤出头;
T1表示选择第二个挤出头;
参数是T命令最特殊的一点。这与其他所有的G-code命令都不相同。
四、辅助步进电机命令
一些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步进电机,但不能打开这些步进电机。
五、设置与EEPROM管理
固件的设置,是一个比较有趣的话题,很多玩3D打印机的朋友,在遇到设置相关的问题时都会犯迷糊。实际上,对于某一项特定的设置,比如说X轴的步进电机分辨率,在3D打印机主板上,有三个不同的位置(也是三种不同的存储器)保存了这项内容,而它们的值还有可能不同。让我们先来了解一下这些保存设置内容的位置,以方便大家的理解。
首先,是固件配置文件(configuration.h)中的设置值。配置文件中的值,会跟随固件一起编译,之后在刷机过程中,保存在了3D打印机的静态存储区(Flash ROM)中。除了刷机之外,静态存储区的内容不会发生变动,可以认为是只读的。每次开机的时候,都是一样的值在等待着我们。
第二份设置值,保存在电可擦写静态存储区(EEPROM)。EEPROM的读写代价,比静态存储区要小。因此,3D打印机允许在刷机之后,修改设置值,而这些修改之后的设置值,就存储在EEPROM之中。每次开机,程序会先检查EEPROM,如果EEPROM中是空白的,则将静态存储区的第一份设置值复制到EEPROM之中。而如果EEPROM中已经有保存好的设置值,则程序会直接使用EEPROM中的值。有些朋友在玩3D打印机过程中可能会有这样的经验,就是明明修改了固件配置文件中的设置值,但刷机之后竟然没有发生变化。这种情况,往往就是EEPROM在捣鬼了。我们完全可以使用G-code M502 M500两条指令(指令的具体含义可以参考下面),重写EEPROM,解决这样的问题。
第三份设置,保存在内存(RAM)中。实际用户使用的值,就是内存中的值。由于内存只在加电情况下能够保持其中的内容,因此每次开机时,3D打印机会根据上面描述的逻辑,重建内存中的设置值。如果某条指令修改的是内存中的设置值,那么这也代表着这次修改是一个临时修改,下次开机这个值就会消失了。
总的来说,三份固件设置,使用的优先级是
内存 > EEPROM > 配置文件
但设置的持久性,就要反过来了。明确了解了这些,特别有助于我们解决一些与设置相关的问题,自然,看下面这些命令描述的时候,也就不会迷糊了。
M205:输出EEPROM设置
输出EEPROM的当前设置值表格。没有相关的参数。
M205命令的输出,格式为:
EPR:275 115200BaudrateEPR:3129 0.000Filamentprinted[m]EPR:2125 0Printeractive[s]…
这是一个很长的输出,我们这里只截取了前三行。每行中,EPR:后面的第一个数字,是这个设置项值的类型。0代表8bit整数类型,1代表16bit整数类型,2代表32bit整数类型,3代表32bit浮点类型。第二个数字,是设置项值的位置(即EEPROM中的地址)。第三个数字,是设置项的值。最后,是设置项的意义。
以第一行为例,第一行设置的是通讯波特率(Baudrate),当前值是115200。波特率设置项,在EEPROM中的位置(地址)是75,这个值是一个32bit整数类型,因此占据了从位置75开始的连续4个字节(也就是位置75, 76, 77, 78)。
M206:修改EEPROM设置
修改EEPROM中的某个值。命令参数为
Pnnn表示待修改的值的位置(即EEPROM中的地址);
Tnnn表示值的类型,0代表8bit整数类型,1代表16bit整数类型,2代表32bit整数类型,3代表32bit浮点类型;
Snnn表示值,只能带整数,用于T为0, 1, 2的情况;
Xnnn表示值,只能带浮点数,用于T为3的情况;
可以看出,M206指令的使用是很复杂的,需要了解EEPROM中数值的存储位置以及数值类型,才能进行有效的修改。因此小编建议除非你完全理解M206指令的含义,否则不要使用这个指令。
M360:输出固件配置信息
输出固件配置信息。没有相关参数。
M360命令的输出,格式为:
Config:Baudrate:115200Config:InputBuffer:127Config:NumExtruder:1…
这是一个很长的输出,我们这里只截取了前三行。每行中,都有一项配置信息的名称,以及对应的值。
M500:保存内存中的设置值到EEPROM
将3D打印机内存中的设置值保存到EEPROM中。没有相关的参数。
M501:读取EEPROM的设置值到内存
将EEPROM中的设置值读取到3D打印机内存中。没有相关的参数。
M502:将内存中的设置值重置
将内存中的设置值重置为固件配置(configuration.h)中的值。没有相关的参数。
由于每次系统掉电后,内存中的值都会消失,重新启动时从EEPROM中读取,因此单独使用M502命令将只对3D打印机掉电重启之前起作用。如果想起长期作用,需要配合M500,将设置值保存到EEPROM中。
六、步进电机参考电压调节
目前市面上支持软件设置步进电机参考电压的3D打印机主板很少。大部分3D打印机主板只能通过调整微调电位器来控制步进电机参考电压。在这些3D打印机上,这一组命令是无效的。
M907:设置步进电机参考电压(百分比值)
设置步进电机参考电压。命令参数为
Snnn表示对所有步进电机进行统一设置;
Xnnn表示对X轴步进电机进行设置;
Ynnn表示对Y轴步进电机进行设置;
Znnn表示对Z轴步进电机进行设置;
Ennn表示对E轴步进电机进行设置;
所有的参数值,都是一个0~100之间的百分比数值。
M908:设置步进电机参考电压
与M907命令类似,设置步进电机参考电压。命令参数为
Pnnn表示步进电机编号;
Snnn表示步进电机参考电压设置值,要求为0~255之间的一个数值;
这个命令与M907命令类似,同样要求3D打印机主板支持。在不支持软件调整参考电压的3D打印机主板上,M908命令无效。
M909:输出步进电机参考电压值
输出当前的步进电机参考电压值。没有相关的参数。
M910:将步进电机参考电压值保存至EEPROM
将M907/M908命令设置的步进电机参考电压值保存至EEPROM。没有相关的参数。
七、需要辅助硬件支持的指令
M80/M81:打开/关闭ATX电源
在配置了ATX电源的3D打印机上,打开(M80)或者关闭(M81)ATX电源。没有相关的参数。
M340:伺服电机控制
伺服电机控制功能。命令参数为
Pnnn表示伺服电机编号,从0开始,最大为3,可以控制4个伺服电机;
Snnn为控制时间,单位为毫秒,应该是一个500到2500之间的数值;
Rnnn为自动关闭时间,单位为毫秒;
M350:设置步进电机细分数
在支持细分数设置的3D打印机主板上(这类主板很少见),设置步进电机细分数。命令参数为
Snnn表示将细分数的每一位(bit)都设置为相同的值,S0表示所有都设置为0,S1表示所有都设置为1;
Xnnn表示设置细分数第0位;
Ynnn表示设置细分数第1位;
Znnn表示设置细分数第2位;
Ennn表示设置细分数第3位;
Pnnn表示设置细分数第4位;
需要注意的是,在大多数3D打印机主板上,细分数设置是主板硬件设计时就固定的,不能通过软件调整。这种情况下,M350命令无效。
M355:设置照明灯开关
设置照明灯的开关。命令参数为
Snnn表示照明灯的开关状态,S0表示关闭照明灯,S1表示打开照明灯;
无参数时输出当前照明灯的状态。
在固件配置中,定义
#defineCASE_LIGHTS_PIN -1
表示照明灯的电路硬件连接pin值,-1代表照明灯未连接。
M355命令的输出,为当前是否打开了照明灯。打开时会输出:
Caselights on
关闭时会输出:
Caselights off
参考:
3、G Codes
2万+





