在打印开始时同时加热挤出机和床

3D打印 ultimaker-cura g代码
2021-05-24 17:30:36

我注意到如果我在没有预热打印机的情况下从 Cura 打印,它会首先升高床温,然后升高挤出机温度。它生成的 G 代码是:

M140 S55     ; set bed temperature to 55 C
M105         ; report temperatures
M190 S55     ; wait for bed temperature to reach 55 C
M104 S210    ; set hot end temperature to 210 C
M105         ; report temperatures
M109 S210    ; wait for hot end temperature to reach 210 C

Cura 的“预热”功能大概会发送“设置温度”命令,而没有相应的“等待”命令。

做这样的事情会不会更有效率:

M104 S210    ; set hot end temperature to 210 C
M140 S55     ; set bed temperature to 55 C
M105         ; report temperatures
M109 S210    ; wait for hot end temperature to reach 210 C
M105         ; report temperatures
M190 S55     ; wait for bed temperature to reach 55 C

然后该床和挤出机升温同时,我们等待较高温度之一第一假设其他将在同时达到其目标温度。

如果这是合理的,有没有办法在 Cura 中设置它,或者我是否需要提交补丁?

3个回答

这可以通过开始 G 代码改编来实现,这不需要软件更改。Cura 和大多数切片器都能够使用占位符(基本上是变量,或者更好:常量)。这些占位符在切片时被替换为正确的值。

要依次加热床和热端,您需要将以下内容添加到您的起始 G 代码中:

M117加热床1...
M190 S{material_bed_temperature_layer_0}
M117发热芯一号...
M109 S{material_print_temperature_layer_0}

对于同时加热,您需要添加:

M140 S{material_bed_temperature_layer_0} ; 将床温设置为例如 55 °C 并继续
M104 S{material_print_temperature_layer_0} ; 将热端温度设置为例如 210 °C 并继续
M190 S{material_bed_temperature_layer_0} ; 等待床温达到例如 55 °C
M109 S{material_print_temperature_layer_0} ; 等待热端温度达到例如 210 °C

请注意,Cura 在使用占位符方面非常有限。例如,Slic3r 允许使用占位符进行算术运算。下面的例子是先将床层加热到床层第一层温度负10摄氏度;然后热端开始加热,热床开始进一步加热到最终温度。对于我的机器,这会导致床和热端同时处于最终温度;因此不会浪费时间并且可以开始打印。

M117加热床...
M190 S{[first_layer_bed_temperature]-10}
M140 S[first_layer_bed_temperature]
M117发热芯...
M109 S[first_layer_temperature_0]
M190 S[first_layer_bed_temperature]

我有一个开放的错误报告/功能请求显然,Cura 不会这样做,因为某些 Ultimaker 打印机的电源供电不足,如果您尝试同时执行这两种操作,这些电源就会关闭。我一直在携带一个补丁(注意这是针对 CuraEngine 而不是 Cura GUI)来解决这个问题:

diff --git a/src/FffGcodeWriter.cpp b/src/FffGcodeWriter.cpp
index de3c771c..ced22017 100644
--- a/src/FffGcodeWriter.cpp
+++ b/src/FffGcodeWriter.cpp
@@ -500,7 +500,7 @@ void FffGcodeWriter::processInitialLayerTemperature(const SliceDataStorage& stor
                 const Temperature bed_temp = scene.current_mesh_group->settings.get<Temperature>("material_bed_temperature_layer_0");
                 if (bed_temp != 0)
                 {
-                    gcode.writeBedTemperatureCommand(bed_temp, scene.current_mesh_group->settings.get<bool>("material_bed_temp_wait"));
+                    gcode.writeBedTemperatureCommand(bed_temp, false);
                 }
             }
         }
@@ -547,6 +547,18 @@ void FffGcodeWriter::processInitialLayerTemperature(const SliceDataStorage& stor
                 }
             }
         }
+
+        if (scene.current_mesh_group->settings.get<bool>("material_bed_temp_prepend"))
+        {
+            if (scene.current_mesh_group->settings.get<bool>("machine_heated_bed"))
+            {
+                const Temperature bed_temp = scene.current_mesh_group->settings.get<Temperature>("material_bed_temperature_layer_0");
+                if (bed_temp != 0)
+                {
+                    gcode.writeBedTemperatureCommand(bed_temp, scene.current_mesh_group->settings.get<bool>("material_bed_temp_wait"));
+                }
+            }
+        }
     }
 }

有点烦人,Cura对我来说是强迫等待。在开始 G 代码时,我有:

; Ender 3 Custom Start G-code
G92 E0 ; Reset Extruder
;*** Start Dual Nozzle/Bed Preheating ***
M140 S60 ; start preheating the bed
M104 S200 T0 ; start preheating hotend
G28 ; home
M190 S60 ; heat to Cura Bed setting 
M109 S200
;*** End Preheating ***M420 S1; Load Mesh Bed Level

但是在生成的 G 代码上我有:

;Generated with Cura_SteamEngine 4.9.0
M140 S60
M105
M190 S60
M104 S200
M105
M109 S200
M82 ;absolute extrusion mode
; Ender 3 Custom Start G-code
G92 E0 ; Reset Extruder
;*** Start Dual Nozzle/Bed Preheating ***
M140 S60 ; start preheating the bed
M104 S200 T0 ; start preheating hotend
G28 ; home
M190 S60 ; heat to Cura Bed setting 
M109 S200

最后,我直接在 G 代码上更改它,这很痛苦