On a “standard printer” the Z probe is used every time you print to check ”where the bed is”, you add on the Z offset, the distance between the sensor and the nozzle from the M851 value to put the nozzle at exactly the same height every time you print. This is a very consistent process and takes into account any movement/slop or change in the printer frames or structure every time you print.
Snapmaker bed position is measured by the user when they manually set the nozzle height during the final point in the calibration process. From then on, the bed is assumed to be exactly the same distance from the home position which is at the top of the rail and as far away from the bed as you can get. The Z probe is never used to measure the height of the nozzle from the bed, it is only used to ascertain the relative height differences across the bed for the bed levelling process and I will let you read all the work @Tone has done to determine whether the levelling process is fit for purpose.
This process does not take into account any movement/slop of change since the last leveling process.
I think this is part of the reason some people have very inconsistent results even when printing the same print twice without adjustment.
In addition, the only way to adjust the Z offset is to use the console just before you print. This Z offset does not seem to be available to a change via a GCODE command unlike the normal M851.
I use OctoPrint as I am lazy and like to most of the work to print on my laptop from the comfort of my armchair so I want a way to use the proximity sensor to probe the bed before every print and not to wait by the printer. I need a way to programmatically adjust the Z height but Snapmaker makes it very hard. The M851 command exists but seems to be totally ignored, adjusting it does nothing and the Z adjustment that gets created when you do the final levelling setting is only available from the console just before you do a print, not programmatically.
I now have a process but I think it’s sub optimal and would welcome comments/suggestions for improvement.
My OctoPrint start code now, heats the bed, starts a calibration using M1091, when the calibration gets to the wait position, moves the head down a fixed amount, this fixed amount is my equivalent of M851 Z offset, finishes the calibration process then prints the model as normal.
The print accuracy has been great. Yesterday I switched everything over to CNC did some stuff (badly), switched everything back to printing and my first print from OctoPrint without any adjustment was full bed square test and it worked perfectly well.
The process is a bit slow but that’s mainly because the bed heating is slow and it heats up for the calibration, cools down during calibration and has to heat up again to print. But it’s all automatic, started from my chair so it’s no hassle.
My OctoPrint start GCODE script is below. Only use this if you know what you are doing and you MUST CHANGE the Z value Offset to your own value.
All thoughts and improvements suggestions welcome especially if I am missing something obvious that can simplify things.
;bed level and Z offsite profile
G21 ; set units to millimeters
G90 ; use absolute positioning
M82 ; absolute extrusion mode
; start heaters for bed level
M104 S220.0 ; set extruder temp
M140 S65 ; set bed temp
G28 ;home
M109 S220.0 ; wait for extruder temp
M190 S65 ; wait for bed temp
;Auto Level
G1029 A ;start leveling
G91; relative positioning for Z offset move
;*****************
G0 Z-2.05; Device specific Z offset, reduce to bring print closer to the bed. (enquillent to M851)
;*****************
G1029 S ;save data
G1029 D0 ;end leveling
G0 Z10; move up 10mm
G90; restore absolute positioning