Hi there!
I created a system file that can be executed as print from different macros (i.e. printer calibration macro or first layer calibration macro), called first-layer.g. This system file contains instructions to print a square that will allow to use babystepping for first layer calibration and then stores the resulting value in config-override.g. The gcode itself has been generated via Prusaslicer and I added the start and end bits.
I'm using a Duet Mini and I'm currently on RRF 3.4.0 and DWC 3.4.0
This is how first-layer.g is being called via the macro "First Layer Calibration":
;------------------------------------------------------------------------------------------------------------------------------
; First Layer Calibration
;
; Description:
; - macro file
; - calibrates the first layer distance between nozzle and bed
; - stores result in config-override.g after print completes
;------------------------------------------------------------------------------------------------------------------------------
M291 P"Do you want to start calibrating the FIRST LAYER?" S3 R"FIRST LAYER CALIBRATION" ; requires user input
M32 "0:/sys/first-layer.g" ; executes "first-layer.g" from SD card
This is first-layer.g (removed most of the Prusaslicer generated gcode as I do not think it is relevant for my problem):
;----------------------------------------------------------------------------------------------
; First Layer Calibration
;
; Description:
; - gcode file
; - print to calibrate the distance between nozzle and bed for the first layer
; - required user input to dial in first layer
; - called via the first layer calibration macro
; - needs to be stored in the gcodes folder
;----------------------------------------------------------------------------------------------
;----------------------------------------------------------------------------------------------
; Preparation
;----------------------------------------------------------------------------------------------
M98 P"0:/sys/bed-temperature.g" ; calls bed-temperature.g to set bed temperature
M568 S160 ; set hotend temperature to 160°C
M561 ; clear any bed transform
M290 R0 S0 ; clear babystepping
G31 P1000 Z0 ; set Z probe offset to 0
;----------------------------------------------------------------------------------------------
; First Layer Calibration
;----------------------------------------------------------------------------------------------
M116 ; wait for bed and hotend temperature
G32 ; true bed leveling with mesh bed leveling
M98 P"0:/sys/hotend-temperature.g" ; calls hotend-temperature.g to set hotend temperature
M116 ; wait for bed and hotend temperature
G92 E0.0 ; reset extruder position to 0
G1 X60.0 E9.0 F1000.0 ; intro line thin part
G1 X100.0 E12.5 F1000.0 ; intro line thick part
G92 E0.0 ; reset extruder position to 0
M564 S0 ; allow movement beyond axis limits defined in config.g
G21 ; set units to millimeters
G90 ; use absolute coordinates
M83 ; use relative distances for extrusion
;LAYER_CHANGE
;Z:0.2
;HEIGHT:0.2
G92 E0.0 ; reset extruder position to 0
;0.2
G1 E-1 F3000
G1 Z.4 F7200
G1 X61.617 Y47.564
G1 Z.2
G1 E1 F3000
M204 P1000
;TYPE:Skirt/Brim
;WIDTH:0.42
G1 F1200
G1 X64.531 Y44.274 E.13705
G1 X67.556 Y41.623 E.12546
G1 X70.821 Y39.39 E.12338
G1 X74.068 Y37.676 E.11451
....
....
....
;WIPE_START
G1 F5760;_WIPE
G1 X87.249 Y143.176 E-.41629
G1 F5760;_WIPE
G1 X87.784 Y143.176 E-.26456
G1 F5760;_WIPE
G1 X87.467 Y142.859 E-.22165
;WIPE_END
G1 E-.0475 F3000
G1 Z.6 F7200
;----------------------------------------------------------------------------------------------
; Saving First Layer Height
;----------------------------------------------------------------------------------------------
M98 P"layer-change.g" ; execute layer-change.g to save adjusted babysteps to config-override.g
M564 S1 ; forbid movement beyond axis limits defined in config.g
M291 P"First Layer Calibration completed! Z Offset saved!" S1 R"FIRST LAYER CALIBRATION"
M0 ; calls stop.g
Here are bed-temperature.g and hotend-temperature.g:
;-----------------------------------------------------------------------------------------------------
; bed-temperature.g
;
; Description:
; - system file
; - called to auto-select the bed temperature according to the loaded filament
;-----------------------------------------------------------------------------------------------------
if move.extruders[state.currentTool].filament == "ABS" ; if ABS is loaded
M140 S{global.abs_bed_temp} ; set bed to ABS temperature
if move.extruders[state.currentTool].filament == "GreenTec Pro" ; if GreenTec Pro is loaded
M140 S{global.greentecpro_bed_temp} ; set bed to GreenTec Pro temperature
if move.extruders[state.currentTool].filament == "PC" ; if PC is loaded
M140 S{global.pc_bed_temp} ; set bed to PC temperature
if move.extruders[state.currentTool].filament == "PTEG" ; if PETG is loaded
M140 S{global.petg_bed_temp} ; set bed to PETG temperature
if move.extruders[state.currentTool].filament == "PLA" ; if PLA is loaded
M140 S{global.pla_bed_temp} ; set bed to PLA temperature
if move.extruders[state.currentTool].filament == "TPU" ; if TPU is loaded
M140 S{global.tpu_bed_temp} ; set bed to TPU temperature
;--------------------------------------------------------------------------------------------------------
; hotend-temperature.g
;
; Description:
; - system file
; - called to auto-select the hotend temperature according to the loaded filament
;--------------------------------------------------------------------------------------------------------
if move.extruders[state.currentTool].filament == "ABS" ; if ABS is loaded
M568 S{global.abs_hotend_temp} ; set hotend to ABS temperature
if move.extruders[state.currentTool].filament == "GreenTec Pro" ; if GreenTec Pro is loaded
M568 S{global.greentecpro_hotend_temp} ; set hotend to GreenTec Pro temperature
if move.extruders[state.currentTool].filament == "PC" ; if PC is loaded
M568 S{global.pc_hotend_temp} ; set hotend to PC temperature
if move.extruders[state.currentTool].filament == "PTEG" ; if PETG is loaded
M568 S{global.petg_hotend_temp} ; set hotend to PETG temperature
if move.extruders[state.currentTool].filament == "PLA" ; if PLA is loaded
M568 S{global.pla_hotend_temp} ; set hotend to PLA temperature
if move.extruders[state.currentTool].filament == "TPU" ; if TPU is loaded
M568 S{global.tpu_hotend_temp} ; set hotend to TPU temperature
This is how the variables are defined in config.g:
;----------------------------------------------------------------------------------------------------------------------------------------------
; Global Variables
;----------------------------------------------------------------------------------------------------------------------------------------------
; Filament Temperatures
global abs_hotend_temp = 240 ; global ABS hotend temperature variable
global abs_bed_temp = 110 ; global ABS bed temperature variable
global greentecpro_hotend_temp = 230 ; global GreenTec Pro hotend temperature variable
global greentecpro_bed_temp = 60 ; GreenTec Pro bed temperature
global pc_hotend_temp = 270 ; global GreenTec Pro hotend temperature variable
global pc_bed_temp = 110 ; global GreenTec Pro bed temperature variable
global petg_hotend_temp = 235 ; global PETG hotend temperature variable
global petg_bed_temp = 80 ; global PETG bed temperature variable
global pla_hotend_temp = 210 ; global PLA hotend temperature variable
global pla_bed_temp = 60 ; global PLA bed temperature variable
global tpu_hotend_temp = 230 ; global TPU hotend temperature variable
global tpu_bed_temp = 60 ; global TPU bed temperature variable
The problem I am currently facing is that both M98 commands who are supposed to call bed-temperature.g and hotend-temperature.g before the print are being ignored and the printer tries to start printing without the hotend or bed being heated, resulting in an error.
Can someone help me understand what I am doing wrong?
Thanks a lot!