Script for Z offset
-
@ericlmccormick you get it from the object model
https://github.com/Duet3D/RepRapFirmware/wiki/Object-Model-Documentation#sensorsprobestriggerheight -
@jay_s_uk I am not looking for the stored position of the the trigger height as I set that with the G31 commend. I am looking to extract the Z component of the tool position.
I used a 0.5 gauge and I have to hard code my offset anytime I change the nozzle. However, If I set my offset 1.0 initially and set it to a variable z_height. Then I adjust my z height to my gauge, and my tool height returns 0.3. I want to have a scripts that does z_height = z_height + tool position - 0,5 (gauge thickness).
-
@ericlmccormick so you want the z motor position?
I'm not sure what you mean by the z component -
@jay_s_uk type in M114 in the console and look at your results. I just finished a print an mine currently says X:300.000 Y:290.000 Z:7.060 E:0.000 E0:6993.7 Count 24000 23200 2782 Machine 300.000 290.000 7.110 Bed comp -0.155
I want to be able to take the 7.060 number and set that to a variable
-
@ericlmccormick ok, well M114 is just the current axis position which is available under move.axis[].machine position (IIRC). You can then feed it back into the probe or whatever else you want to do using G31 or the appropriate gcode
-
@jay_s_uk using move.axis[2].machine position, I was able to get the value I was looking for. This is a huge step to getting this working.
However, I am now running into a new issue. Once var z_height is loaded from a file, trying to update that variable returns an error saying that the variable already exist. I am not an expert coder, but when I have programmed in other languages the past, you could just call up the variable and give it a new value. Do you know how to give an existing variable a new value? -
@ericlmccormick
You have to use SET in cases where the variable has already been created
Also access to any variable or global value is in the format
var.myVarset var.z_height = 1234 echo var.z_height
-
In addition to what @OwenD has already pointed out, you may find the following logic useful:
if !exists(global.myVariable) global myVariable = move.axis[2].machine position else set global.myVariable = move.axis[2].machine position
It's helpful for global variables especially where it might not be known if this is the first time the ste assigned.
-
I've spent a fair bit of time working on this same problem and I'll describe the macros I've come up with to help me.
Step 1 - Manual adjustment
My first step in setting a z-offset is to use a feeler gauge to get the nozzle at .2mm (I don't use paper for this, a good set of feeler gauges is less than $10). After doing this, I run my first Macro that adjusts the z offset so that the current tool position is .2mm.; This macro adjusts the zoffset of the current tool to make the current z value 0.2mm ; optional input is Z = value we want Z to be after changing the z offset ; use case: var target_z_vale = 0.2 M291 P"This macro will reset the current tool offset to make the current tools Z value 0.2mm." S3 T0 ;If no tools is selected, prompt the user if state.currentTool =-1 ; menas there is no tool selected M291 P"No tool selected. Select tool first." S1 T0 M99 ; Read the current tool offset var current_Z_offset = tools[state.currentTool].offsets[2] ; read the current z value var current_z = move.axes[2].machinePosition ; calculate z offset needed to make current Z = 0.2mm var new_z_offset = 0.2 - var.current_z ; build the command string var command = "G10 P"^{state.currentTool}^" Z"^{var.new_z_offset} ; Create the replacement for the tooloffset file echo >{"tool"^state.currentTool^"_Z_offset.g"} {"; This macro sets the Z offset for tool # "^state.currentTool} echo >>{"tool"^state.currentTool^"_Z_offset.g"} {var.command^" ;changed: "^state.time} ; run the new z_offset file M98 P{"0:/sys/tool"^state.currentTool^"_Z_offset.g"}
I have a personal peeve about using M500 to store parameters, so I write little macro files. On line 24, you'll see I build the G10 command to set the new z-offset. Then, on lines 28 and 29, I write that command to a file. I also include the date and time the file is created in a comment. Finally, I run that macro (line 33) to set the new z-offset.
And since I have a problem with M501 to restore settings, I have a line in my config.g file to run that macro on startup.
Having the date and time in the macro means I can look at it to verify that a new z-offset really got saved.
Step 2 - folding baby steps into the z-offset
My second step in setting z-offset if to use baby stepping when the first layer is printing to get it dialed in better. This macro is something I run after a print finishes to "roll" those baby steps into the z-offset.; Macro to ; 1. Read the current babysteps ; 2. Read the Z offset on the current tool ; 3. Create a command to adjust the tool z offset to use zero babysteps ; 4. Overwrite the zoffset file for this tool with the command ; 5. Set baby steps to 0 ; 6 Run the new z-offset file M291 P"This macro will reset the current tool offset incorporate the currently active babysteps." S3 T0 ;If no tools is selected, prompt the user if state.currentTool =-1 ; menas there is no tool selected M291 P"No tool selected. Select tool first." S1 T0 M99 ; Read the current baby steps var baby_steps = move.axes[2].babystep ; Positive babystep means the bed is farther from the nozzle ; Read the current tool offset var current_Z_offset = tools[state.currentTool].offsets[2] ; Calculate the new tool offset var z_offset_new = var.current_Z_offset - var.baby_steps ; build the command string var command = "G10 P"^{state.currentTool}^" Z"^{var.z_offset_new} ; clear the baby stepping M290 R0 S0 ; Create the replacemetn fro the tooloffset file echo >{"tool"^state.currentTool^"_Z_offset.g"} {"; This macro sets the Z offset for tool # "^state.currentTool} echo >>{"tool"^state.currentTool^"_Z_offset.g"} {var.command^" ;changed: "^state.time} ; run the new z_offset file M98 P{"0:/sys/tool"^state.currentTool^"_Z_offset.g"}
This macro operates similarly to the first one, but makes an adjustment based on the current baby steps. It's important to clear the baby steps (line 30) in addition to changing the z-offset.
If you have multiple tools, and want to adjust z-offsets based on the baby steps differently for each tool, you need to include it in the tool change process. That's another macro and I'll leave it out for now.
-
I ended up solving this with a few lines of code and it works really well.
Step 1.Created a file called saved_var.g with a single line in itglobal z_offset = 1
Step 2. Added the following line to the end of config.g
M98 P"saved_var.g" ;Load saved z offset
Step 3. In homez.g, I replaced my G31 code with
G31 P1000 X-32 Y0 Z{global.z_offset}
Step 4. I made a Marco with the following
set global.z_offset = global.z_offset - move.axes[2].machinePosition + 0.5 echo >"saved_var.g" "global z_offset = " ^ global.z_offset
Step 5. Reboot, Home All, bring the nozzle to the correct height using my gauge. Then run the macro.
Note: I used a metal ruler that happens to be exactly 0.5mm. If you use something else, then you need to replace the 0.5 with whatever thickness gauge you use.