How do you change/save updated Z offset without calibrating?

I feel like Im missing something very obvious here but… Im a complete nooby with 3D printing so I guess thats just a likelihood…

Ive been playing with my A350 and struggling to get anything like a successful print. Been running through tutorials etc for general printer calibration and Im fairly certain I havent got the z offset dialled properly.

The problem I have is that everytime I calibrate the bed, I have to reset the Z offset from scratch. I cant just just keep adding/taking away from the current value to optimise. I feel there HAS to be a way to do this but I cant find it from googling or messing around.

I feel I should be able to do the following:

  • Calibrate
  • Set Z Offset (in calibration flow)
  • Test print for 1st layer
  • Iterate Z Offset
  • Repeat cycle until right then save & move onto other calibrations

Any hints how to actually do this? Or am I just missing something really simple…

You’re not missing something obvious here, but there is a way to do this. Several ways in fact. I think you’re after item 1, but here’s everything I know just in case.

  1. Touchscreen Z offset
  2. M421 Q command
  3. M206
  4. G1029 D which is a secret undocumented gcode Snapmaker added.
  1. Use the Z offset function in the touchscreen. I believe it’s saved between power cycles, and is great for quickly adjusting a z offset.

  2. It’s not as straightforward as you probably hope, but the machine stores the Z offset embedded in the mesh, which can be viewed with M420 V. So the most correct way of adjusting the Z offset is to add or subtract a constant from each mesh point. This can be done with M421 Q I0 J0, etc, for each point.

  3. Another way is to ignore that and just set a home offset with M206, but that will not be reset next time you calibrate and can cause an issue if you forget to reset it to 0.

  4. The G1029 D command does all of the work of M421 Q for you, but I haven’t personally run it, just seen it in the source code.

    1. You’ll need to know the delta you want to change it by. If you have to measure it G42 to the middle mesh coordinate (if you are using 3x3 the middle is I1 G1, if 5x5 it’s I2 J2). If at Z=0 you measure a gap of 0.1mm, your delta is 0.1.
    2. Then set the Z, then issue this terminal command G1029 D0, but where the 0 is replaced with the delta you want to offset the matrix by. For the above example, G1029 D0.1
    • This last way is what reading the source code indicates it should be, however, again, I haven’t personally run this. It’s safe to run in the sense you can always recalibrate, but don’t just issue that command and then zip down to Z=0 or you might crash something. Also, whenever you change the offset I believe it’s safest to G28 home before doing another move. It’s not strictly required, but there’s weird behavior sometimes when you’re close to the bed and the mesh is changing, better safe than accidentally crashing.

Thanks, lots to try out there. Probably, youre right - option 1 is best for me as my Gcode is shall we say - formative… :wink:

Its literally just the up/down arrow in the jog screen then? I had tried that before whilst printing from luban but it was greyed out. Looks like when I initiate print from the device itself I see a different menu with Z offset present vs from Luban usb connect.

Interesting UX decision!

Thanks a bunch for the advice btw.

I don’t have the machine in front of me, but no, not the jog screen. I think there’s another screen that has a scrolling left/right thing for adjusting the z offset. Try swiping to the side and see if there’s another screen?

Maybe it’s only available after starting a job? That would seem weird. I know I’ve used it during a print.

The screen where you can jog the machine and heat the nozzle and so forth says z-offset, but that one doesnt actually save z-offset, (at least i dont think, and i certainly hope not because its stupid if it does and it should not say z-offset at all)

if you open the settings during a print and adjust it there that will save it

some slicers such as cura allow you to assign a z-offset and add it to the gcode too.

1 Like

I’ll add that there’s something in the firmware that does not allow it to go below 0. Like if you’re at Z=0 and try and go down, it won’t let you.

Practically this means that after calibration, your Z offset can only be positive (further away from the bed).

If you need to get closer to the bed, you can’t because you can’t go to negative Z heights.

I don’t actually know how the touchscreen z offset in a print works - I suspect it won’t go below Z=0 either, and is mostly only useful to raise the nozzle at the start, or to change something mid print.

The z offset, nozzle temp, bed temp, and speed can all be changed before you start the print or on the fly while printing. You can go either direction (+ or -) on all 4 settings. Once the print starts just touch the little < symbol on the right side of the screen and adjust to your hearts content. Too much stringing; drop the nozzle temp a few degrees. Not getting good “squish” on the bottom layer; drop the head in .05mm increments. Bad adhesion raise your bed temp. Don’t forget to coat your bed with some cheap extra hold hairspray and squeegee it smooth.

1 Like

Yes, I see that now.

I think the issue was if you trigger the build direct from Luban via USB you get a different set of screens on the touchscreen.

When i trigger via “send via wifi” I get a dedicated Z-offset tab that wasnt present with a USB run.

Anyway, sorted. Thanks everyone.

Has anyone tried using G1029 D?

Using octoprint, I’ve found that using the touchscreen causes… issues. (If I try to do something using the touch screen while octo is running a print, it fails almost every time)

I similarly found G1029 D in the source code, and I think @brent113 is right in his reading of it, but I’m wary of trying it and ending up with a broken printhead/damaged bed.

Alternatively, it’d be great if the snapmaker team could add support for M290, since that seems to be the “standard” way of adjusting z mid print.

So let’s say I do a calibration and set the Z offset using a feeler gauge.

I start a test print, and notice it is too high or low while the skirt/brim/raft is being printed.

I can modify the Z offset for the print using the touchscreen, but how do I apply this change to the saved calibration? Does this really require maually modifying each point in the mesh?

My workaround is to note the value, then re-run the calibration when the print is finished, using a feeler gauge that is the original + the empirical Z offset. This is prone to error, of course, because setting the Z offset by feel duing calibration does not guarantee the same value as was used previously.

Yea, that’s my solution right now too, which is why I was hopeful when digging through the firmware and seeing the G1029 D code. I guess I’ll have to be the guinea pig, since I’m looking at my elephants foot on a recent print (after my most recent calibration because I moved the machine) and it’s absolutely unacceptable.

Ok, I just used G1029 D -0.04 to fine tune my Z offset after an ABL run. It appears to be working (I was having ever so slight adhesion issues).

I’m curious if may be @Edwin could answer if G1029 D is what the touchscreen is doing when you dial the z offset outside calibration?

It’s not, it uses another method tied into the HMI handling process. It doesn’t use gcode at all, the touchscreen has a special z offset variable.

G1029 D directly modifies the z_values[i][j] store containing the mesh offsets, in abl.cpp via the compensate_offset function

BedLevelService::UpdateLiveZOffset is dispatched from SystemService::ChangeRuntimeEnv, which itself is an event callback registered to the touchscreen and handled by DispatchEvent called in the main system loop.

1 Like

According to our firmware developer, @scotthuang, the Z offset value is automatically saved by the controller and you have no need to do calibration when you reboot the machine. Please update the firmware to V1.12.0.

When you swap the tool-heads or platform, you need to re-calibrate before you print.


This is actually a seriously useful command for those of us that don’t do all (or indeed any) printing from the touchscreen and use things like Octoprint.
It’s an alternative for the “normal” M851 Z offset. You do a calibration and need to adjust slightly, use G1029 D (offset) where offset is the amount you want to move the head up or down with a minus number being down. This changes all the heights in the bed level by the offset amount. Unlike M851 it’s a set and forget adjustment, you make it and thats your new level. Good enough though, you can change as much as you like and remains until you do another bed level when its effectively reset. As Edwin says you should always do a level after a change of head or bed. I think it is a much more convenient and understandable way to set level than using the console.

I somehow missed a few months of updates on this, likely because April is when I got busy and had to pack the A350 away for a few months.

The “G1029 D” command is good news; that makes updating the mesh a lot easier.

I was searching the forums today looking for where exactly the touchscreen stores the Z offset, and how it can be viewed and/or reset. A different thread mentioned that negative offsets entered via the touchscreen are not saved, which would be awful (a calibration would be required to restore a valid Z offset, and it is not guaranteed to be the same value unless you use the console to monitor the state while setting it). That is not entirely the case; I was able to return a too-high calibration to the original value using the touchscreen. Most likely the internal value is an unsigned integer representing the change to the stored Z offset.

This secretly-save-the-Z-offset can be pretty annoying. When iterating through Z offsets trying to get a tricky (read: wider than the central 4 squares of the build plate) print to adhere, I quickly lost track of the what the original calibrated value was, because every subsequent print shows a Z Offset of 0 regardless of what changes to Z offset have been made (since calibration or since boot, take your pick). A little weird, that should probably always show the changes to the calibrated Z offset that are currently in effect (and, of course, saved across reboots).

Anyways, I learned my lesson and now make it a point to bring the touchscreen Z-offset back to zero every time I change it, before aborting a print even. What this means in practice is I now do all of my Z offset testing in Cura, which actually works better because I can set it using finer values (0.01, 0.03, etc). Wandering off into the woods a bit, another handy Cura trick for determining a viable Z offset for a specific print job: generate a cube using the Part for Calibration extension, resize the cube so it is the size of the future print (e.g. 150mmx150mm) and a height of 1mm, then set Surface Mode to Surface. This prints a 1mm high outline of a square enclosing the object to be printed, and you can fine-tune the Z-offset in Cura until this square sticks. Very fast and very effective.

Staying slightly off topic.
I agree Cura is great for managing Z offset using the Z offset plugin. I hadn’t heard of the Part for Calibration extension. Looking at the marketplace I think it’s called Calibration Shapes plugin and it’s a great find. Loads of calibration models right from Cura including multiple temp towers. So simple, so clever. Your method of ensuring a good first layer is also very inventive and simple to execute.
I have to say that since I moved to a glass bed and converted the print head to use an IR sensor my Z offset is set and I just use my auto level macro on a bed/head/temperature change and print.

Hi I have a question regarding Z-Offset on the touchscreen…I can’t find the option…it’s only displayed, when I started a print from the touchscreen…I can’t see it during calibration of the bed (where I need it I guess). Do I oversee something? Whats the best method of setting Z-Offset?

That’s where you set it.
Run calibration as prompted.
When you run the print you check if the first layer looks good and adjust appropriately.
Once you set it, it will the stay the same for the next job.


1 Like

The Z-Offset can also set set while printing. They are one and the same. If you adjust it while printing, in particular the first layer, it is automatically saved for the next time that you print. Be aware that there is a negative max value of 0.40mm.