Feature Request - workpiece angle compensation CNC
-
@CanDo415 i've made another change but I don't think its going to fix the issue.
I don't know why "degrees" throws an error though as its a built in command -
that's why i added Phaedrux.
I want to change it a bit to get the corner as well. so the degrees issue has to be solved anyway.
Thanks for the great start jay -
@dc42
maybe he can help? -
-
@droftarts
jay corrected it already.
the problem shifted to the degrees command -
@jay_s_uk said in Feature Request - workpiece angle compensation CNC:
@CanDo415 i've made another change but I don't think its going to fix the issue.
I don't know why "degrees" throws an error though as its a built in commanddegrees() is a function
You've used curly braces instead of parentheses
set var.y_x_tan_deg=degrees{var.y_x_tan_rads}
try
set var.y_x_tan_deg=degrees(var.y_x_tan_rads)
-
@OwenD i knew it would be something about the way its been formatted
updated the original again -
@OwenD
thank you for showing up the problem -
G68 A0 B0 R{-var.y_x_tan_rads}
the "-" seems important. otherwise the system gets turned the wrong way round -
@jay_s_uk
i modified it quite a bit. some points are still not ready.
I'm not shure how to ent the if passage.
end if seems not to workvar y_1 = 0 var x_1 = 0 var x_2 = 0 var x_3 = 0 var x_4 = 0 var x_5 = 0 var delta_x = 0 var y_2 = 0 var y_3 = 0 var y_4 = 0 var y_5 = 0 var delta_y = 0 var z0 = 0 var d_probe = 0 var m_1 = 0 var m_2 = 0 var m_1_tan_rads = 0 var m_1_tan_deg = 0 M291 P"position probe over front left corner of workpiece" S2 X1 Y1 Z1 ; Pop up box asking for operator input M558 F300 ; Set the initial probing speed G38.2 Z-60 P0 K0 ; Probe the material as a first pass M558 F50 ; Set the final probing speed G38.4 Z50 P0 K0 ; Move away from workpiece in Z M400 ; Make sure all movement is complete set var.z0=move.axes[2].machinePosition ; Record the stop position y_first_measurement M400 ; Make sure all data recording is complete G1 Z{move.axes[2].machinePosition+5} ; Move along the workpiece in X G1 X{move.axes[0].machinePosition-20} ; Move 5mm away from the material G1 Y{move.axes[1].machinePosition+5} ; Move 5mm away from the material G1 Z{move.axes[2].machinePosition-3} ; Move along the workpiece in X M558 F1000 ; Set the initial probing speed G38.2 X100 P0 K0 ; Probe the material as a first pass M558 F50 ; Set the final probing speed G38.4 X-10 P0 K0 ; Move away from workpiece in X M400 ; Make sure all movement is complete set var.y_1=move.axes[1].machinePosition ; Record the stop position y_first_measurement set var.x_1=move.axes[0].machinePosition ; Record the stop position x_first_measurement M400 ; Make sure all data recording is complete G1 X{move.axes[0].machinePosition-5} ; Move 5mm away from the material G1 Z{move.axes[2].machinePosition+10} ; Move along the workpiece in X G1 X{move.axes[0].machinePosition+15} ; Move 5mm away from the material G1 Y{move.axes[1].machinePosition-20} ; Move 5mm away from the material G1 Z{move.axes[2].machinePosition} ; Move along the workpiece in X M558 F1000 ; Set the initial probing speed G38.2 Y100 P0 K0 ; Probe the material as a first pass M558 F50 ; Set the final probing speed G38.4 Y-10 P0 K0 ; Probe the material again M400 ; Make sure all movement is complete set var.y_2=move.axes[1].machinePosition ; Record the stop position y_first_measurement set var.x_2=move.axes[0].machinePosition ; Record the stop position x_first_measurement M400 ; Make sure all data recording is complete G1 Y{move.axes[1].machinePosition-50} ; Move 5mm away from the material G1 X{move.axes[0].machinePosition+50} ; Move along the workpiece in X M558 F1000 ; Set the initial probing speed G38.2 Y100 P0 K0 ; Probe the material as a first pass M558 F50 ; Set the final probing speed G38.4 Y-10 P0 K0 ; Probe the material again M400 ; Make sure all movement is complete set var.y_3=move.axes[1].machinePosition ; Record the stop position y_second_measurement set var.x_3=move.axes[0].machinePosition ; Record the stop position x_second_measurement M400 ; Make sure all data recording is complete M291 P"Probe Diameter" R"enter diameter of probe" S5 L0 H10 ; Pop up box asking for operator input diameter of set var.d_probe=input ; set the diameter of the probe ;calculation set var.delta_y={var.y_3-var.y_2} set var.delta_x={var.x_3-var.x_2} set var.m_1={var.delta_y/var.delta_x} ; m of the staight P2-P3 set var.m_2={(-var.delta_x)/var.delta_y} ; m of perpendicilar to straight P2-P3 set var.m_1_tan_rads=atan(var.m_1) set var.m_1_tan_deg=degrees(var.m_1_tan_rads) ;calc the corner of workpeace set var.x_4=((var.y_1-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*var.x_1)-(var.y_2-((var.y_3-var.y_2)/(var.x_3-var.x_2)*var.x_2)))/(((var.y_3-var.y_2)/(var.x_3-var.x_2))-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))) set var.y_4=(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*((var.y_1-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*var.x_1)-(var.y_2-((var.y_3-var.y_2)/(var.x_3-var.x_2)*var.x_2)))/(((var.y_3-var.y_2)/(var.x_3-var.x_2))-(-(var.x_3-var.x_2)/(var.y_3-var.y_2)))+(var.y_1-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*var.x_1) If var.y_2>var.y_3 ; workpiece Zero coordinates set var.x_5=var.x_4+(COS(ARCTAN(var.m_1))+COS(ARCTAN(var.m_2)))*var.d_probe/2 set var.y_5=var.y_4+(SIN(ARCTAN(var.m_1))+SIN(ARCTAN(var.m_2)))*var.d_probe/2 If var.y_2<var.y_3 set var.x_5=var.x_4+(COS(ARCTAN(var.m_1))-COS(ARCTAN(var.m_2)))*var.d_probe/2 set var.y_5=var.y_4+(SIN(ARCTAN(var.m_1))-SIN(ARCTAN(var.m_2)))*var.d_probe/2 ;move over workpiece zero and set tool x&y to 0 G1 Y{move.axes[1].machinePosition-1} ; Move 1mm away from the material G1 Z{move.axes[2].machinePosition+10} ; Move above workpiece ;G68 A0 B0 R{-var.m_1_tan_deg} ; set Rotation
-
@CanDo415
You have to indent the lines you want to be part of the conditional statement, thats a place to start at least. -
@Exerqtor
like:If var.y_2>var.y_3 ; workpiece Zero coordinates set var.x_5=var.x_4+(COS(ARCTAN(var.m_1))+COS(ARCTAN(var.m_2)))*var.d_probe/2 set var.y_5=var.y_4+(SIN(ARCTAN(var.m_1))+SIN(ARCTAN(var.m_2)))*var.d_probe/2 end if If var.y_2<var.y_3 set var.x_5=var.x_4+(COS(ARCTAN(var.m_1))-COS(ARCTAN(var.m_2)))*var.d_probe/2 set var.y_5=var.y_4+(SIN(ARCTAN(var.m_1))-SIN(ARCTAN(var.m_2)))*var.d_probe/2 end if
?
-
@CanDo415
No like:if var.y_2 > var.y_3 ; workpiece Zero coordinates set var.x_5 = var.x_4 + (COS(ARCTAN(var.m_1)) + COS(ARCTAN(var.m_2))) * var.d_probe / 2 set var.y_5 = var.y_4 + (SIN(ARCTAN(var.m_1)) + SIN(ARCTAN(var.m_2))) * var.d_probe / 2 if var.y_2 < var.y_3 set var.x_5 = var.x_4 + (COS(ARCTAN(var.m_1)) - COS(ARCTAN(var.m_2))) * var.d_probe / 2 set var.y_5 = var.y_4 + (SIN(ARCTAN(var.m_1)) - SIN(ARCTAN(var.m_2))) * var.d_probe / 2
-
@Exerqtor
i tried this before in another case... everything unter the 2nd if wasnt done if the if doesn't match.
the problem of the missing end if -
-
-
@CanDo415 you also need to replace SIN by sin, COS by cos, ARCTAN by atan etc. See https://docs.duet3d.com/User_manual/Reference/Gcode_meta_commands#functions.
-
@dc42
thanks so far.
Error promt is:
M292 S3
Error: Bad command: If (var.y_2) >= (var.y_3)
Error: in file macro line 179 column 8: meta command: expected "'"Makro:
G68 A0 B0 R0 var y_1 = 0 var x_1 = 0 var x_2 = 0 var x_3 = 0 var x_4 = 0 var x_5 = 0 var delta_x = 0 var y_2 = 0 var y_3 = 0 var y_4 = 0 var y_5 = 0 var delta_y = 0 var z0 = 0 var d_probe = 0 var z_probe = 0 var m_1 = 0 var m_2 = 0 var m_1_rads = 0 var m_1_deg = 0 var buff1 = 0 var buff2 = 0 var buff3 = 0 var speed = 1500 M291 P"probe Diameter" R"enter diameter of probe" S5 ; Pop up box asking for operator input diameter of set var.d_probe = input ; set the diameter of the probe M291 P"probe size in z" R"enter z-size of probe" S5 ; Pop up box asking for operator input diameter of set var.z_probe = input ; set the size of the probe in z-direction (mostly same as diameter, for plate probes 0) M291 P"position probe over front left corner of workpiece" S2 X1 Y1 Z1 ; Pop up box asking for operator input M558 F{var.speed/5} ; Set the initial movement speed G38.2 Z-10 P0 K0 ; Probe the material on top M558 F50 ; Set the final probing speed G38.4 Z50 P0 K0 ; Move away from workpiece in Z M400 ; Make sure all movement is complete set var.z0 = move.axes[2].machinePosition ; Record the stop position z_first_measurement M400 ; Make sure all data recording is complete G1 Z{move.axes[2].machinePosition+5} ; Lift probe 5mm G1 X{move.axes[0].machinePosition-20} Y{move.axes[1].machinePosition+5} ; Move 20mm to the left of the initial point and 5mm deeper into the material direction G1 Z{var.z0 - 1 - var.z_probe / 2} ; Move to probe depth M558 F{var.speed} ; Set the initial movement speed G38.2 X1000 P0 K0 ; Probe the material as a first pass M558 F50 ; Set the final probing speed G38.4 X-10 P0 K0 ; Move away from workpiece in X M400 ; Make sure all movement is complete set var.y_1 = move.axes[1].machinePosition ; Record the stop position y_first_measurement set var.x_1 = move.axes[0].machinePosition ; Record the stop position x_first_measurement M400 ; Make sure all data recording is complete G1 X{move.axes[0].machinePosition-5} ; Move 5mm away from the material G1 Z{var.z0+5} ; Move 5mm above material G1 X{move.axes[0].machinePosition+15} Y{move.axes[1].machinePosition-20} ; Move to point 2 G1 Z{var.z0 - 1 - var.z_probe / 2} ; Move to probe depth M558 F{var.speed} ; Set the initial movement speed G38.2 Y1000 P0 K0 ; Probe the material as a first pass M558 F50 ; Set the final probing speed G38.4 Y-10 P0 K0 ; Probe the material again M400 ; Make sure all movement is complete set var.y_2 = move.axes[1].machinePosition ; Record the stop position y_second_measurement set var.x_2 = move.axes[0].machinePosition ; Record the stop position x_second_measurement M400 ; Make sure all data recording is complete G1 Y{move.axes[1].machinePosition-20} ; Move 10mm away from the material G1 X{move.axes[0].machinePosition+50} ; Move 50mm along the workpiece in X M558 F{var.speed} ; Set the initial movement speed G38.2 Y1000 P0 K0 ; Probe the material as a first pass M558 F50 ; Set the final probing speed G38.4 Y-10 P0 K0 ; Probe the material again M400 ; Make sure all movement is complete set var.y_3 = move.axes[1].machinePosition ; Record the stop position y_third_measurement set var.x_3 = move.axes[0].machinePosition ; Record the stop position x_third_measurement M400 ; Make sure all data recording is complete ;calculation set var.delta_y = {var.y_3-var.y_2} set var.delta_x = {var.x_3-var.x_2} set var.m_1 = {var.delta_y/var.delta_x} ; m of the staight P2-P3 set var.m_2 = {(-var.delta_x)/var.delta_y} ; m of perpendicilar to straight P2-P3 set var.m_1_rads = atan(var.m_1) ; workpiece rotation in rad set var.m_1_deg = degrees(var.m_1_rads) ; workpiece rotation in degrees ;calc the corner of workpiece ;set var.x_4 = {((var.y_1-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*var.x_1)-(var.y_2-((var.y_3-var.y_2)/(var.x_3-var.x_2)*var.x_2)))/(((var.y_3-var.y_2)/(var.x_3-var.x_2))-(-(var.x_3-var.x_2)/(var.y_3-var.y_2)))} ;set var.y_4 = {(-(var.x_3-var.x_2)/(var.y_3-var.y_2))<>*((var.y_1-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*var.x_1)-(var.y_2-((var.y_3-var.y_2)/(var.x_3-var.x_2)*var.x_2)))<>/(((var.y_3-var.y_2)/(var.x_3-var.x_2))-(-(var.x_3-var.x_2)/(var.y_3-var.y_2)))+(var.y_1-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*var.x_1)} set var.buff1 = {var.y_1-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*var.x_1} set var.buff2 = {var.y_2-((var.y_3-var.y_2)/(var.x_3-var.x_2)*var.x_2)} set var.buff3 = {((var.y_3-var.y_2)/(var.x_3-var.x_2))-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))} set var.x_4 = {(var.buff1-var.buff2)/var.buff3} set var.buff1 = {(-(var.x_3-var.x_2)/(var.y_3-var.y_2))} set var.buff2 = {((var.y_1-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*var.x_1)-(var.y_2-((var.y_3-var.y_2)/(var.x_3-var.x_2)*var.x_2)))} set var.buff3 = {(((var.y_3-var.y_2)/(var.x_3-var.x_2))-(-(var.x_3-var.x_2)/(var.y_3-var.y_2)))+(var.y_1-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*var.x_1)} set var.y_4 = {var.buff1*var.buff2/var.buff3} If (var.y_2) >= (var.y_3) ; workpiece Zero coordinates set var.x_5 = {var.x_4+(cos(atan(var.m_1))+cos(atan(var.m_2)))*var.d_probe/2} set var.y_5 = {var.y_4+(sin(atan(var.m_1))+sin(atan(var.m_2)))*var.d_probe/2} echo 'X= '{var.x_5}', Y= '{var.y_5} If (var.y_2) < (var.y_3) set var.x_5 = {var.x_4+(cos(atan(var.m_1))-cos(atan(var.m_2)))*var.d_probe/2} set var.y_5 = {var.y_4+(sin(atan(var.m_1))-sin(atan(var.m_2)))*var.d_probe/2} ;echo X= {var.x_5}, Y= {var.y_5} ;move above workpiece zero and set tool x&y to 0 M558 F{var.speed} ; Set the initial movement speed G1 Y{move.axes[1].machinePosition-1} ; Move 1mm away from the material G1 Z{var.z0 + 5} ; Move above workpiece G1 X{var.x_5} Y{var.y_5} ; go to Zero G10 X0 Y0 ; set x&y to Zero G68 A0 B0 R{-var.m_1_deg} ; set Rotation
X seems to be working, on a psitive angle.
Y is getting some wrong outputs -
@CanDo415 replace all
If
byif
. -
@dc42
i don't know why. sometimes it works. sometimes it fails.
getting Error: line 89 column 20: meta command: unknown value 'atan'
i have no idea.
the calculation seems to be correct. but using G10 moves the tool right down to Y=0G68 A0 B0 R0 var y_1 = 0 var x_1 = 0 var x_2 = 0 var x_3 = 0 var x_4 = 0 var x_5 = 0 var delta_x = 0 var y_2 = 0 var y_3 = 0 var y_4 = 0 var y_5 = 0 var delta_y = 0 var z0 = 0 var d_probe = 0 var z_probe = 0 var m_1 = 0 var m_2 = 0 var m_1_rads = 0 var m_1_deg = 0 var m_2_rads = 0 var m_2_deg = 0 var buff1 = 0 var buff2 = 0 var buff3 = 0 var speed = 1500 M291 P"probe Diameter" R"enter diameter of probe" S5 ; Pop up box asking for operator input diameter of set var.d_probe = input ; set the diameter of the probe M291 P"probe size in z" R"enter z-size of probe" S5 ; Pop up box asking for operator input diameter of set var.z_probe = input ; set the size of the probe in z-direction (mostly same as diameter, for plate probes 0) M291 P"position probe over front left corner of workpiece" S2 X1 Y1 Z1 ; Pop up box asking for operator input M558 F{var.speed/5} ; Set the initial movement speed G38.2 Z-10 P0 K0 ; Probe the material on top M558 F50 ; Set the final probing speed G38.4 Z50 P0 K0 ; Move away from workpiece in Z M400 ; Make sure all movement is complete set var.z0 = move.axes[2].machinePosition ; Record the stop position z_first_measurement M400 ; Make sure all data recording is complete G1 Z{move.axes[2].machinePosition+5} ; Lift probe 5mm G1 X{move.axes[0].machinePosition-20} Y{move.axes[1].machinePosition+5} ; Move 20mm to the left of the initial point and 5mm deeper into the material direction G1 Z{var.z0 - 1 - var.z_probe / 2} ; Move to probe depth M558 F{var.speed} ; Set the initial movement speed G38.2 X1000 P0 K0 ; Probe the material as a first pass M558 F50 ; Set the final probing speed G38.4 X-10 P0 K0 ; Move away from workpiece in X M400 ; Make sure all movement is complete set var.y_1 = move.axes[1].machinePosition ; Record the stop position y_first_measurement set var.x_1 = move.axes[0].machinePosition ; Record the stop position x_first_measurement M400 ; Make sure all data recording is complete G1 X{move.axes[0].machinePosition-5} ; Move 5mm away from the material G1 Z{var.z0+5} ; Move 5mm above material G1 X{move.axes[0].machinePosition+15} Y{move.axes[1].machinePosition-20} ; Move to point 2 G1 Z{var.z0 - 1 - var.z_probe / 2} ; Move to probe depth M558 F{var.speed} ; Set the initial movement speed G38.2 Y1000 P0 K0 ; Probe the material as a first pass M558 F50 ; Set the final probing speed G38.4 Y-10 P0 K0 ; Probe the material again M400 ; Make sure all movement is complete set var.y_2 = move.axes[1].machinePosition ; Record the stop position y_second_measurement set var.x_2 = move.axes[0].machinePosition ; Record the stop position x_second_measurement M400 ; Make sure all data recording is complete G1 Y{move.axes[1].machinePosition-20} ; Move 10mm away from the material G1 X{move.axes[0].machinePosition+50} ; Move 50mm along the workpiece in X M558 F{var.speed} ; Set the initial movement speed G38.2 Y1000 P0 K0 ; Probe the material as a first pass M558 F50 ; Set the final probing speed G38.4 Y-10 P0 K0 ; Probe the material again M400 ; Make sure all movement is complete set var.y_3 = move.axes[1].machinePosition ; Record the stop position y_third_measurement set var.x_3 = move.axes[0].machinePosition ; Record the stop position x_third_measurement M400 ; Make sure all data recording is complete ;calculation set var.delta_y = {var.y_3-var.y_2} set var.delta_x = {var.x_3-var.x_2} set var.m_1 = {var.delta_y/var.delta_x} ; m of the staight P2-P3 set var.m_2 = {-(var.delta_x/var.delta_y)} ; m of perpendicilar to straight P2-P3 set var.m_1_rads = atan(var.m_1) ; workpiece rotation in rad set var.m_1_deg = degrees(var.m_1_rads) ; workpiece rotation in degrees set var.m_2_rads = atan(var.m_2) ; workpiece rotation in rad set var.m_2_deg = degrees(var.m_2_rads) ; workpiece rotation in degrees ;calc the corner of workpiece ;set var.x_4 = {((var.y_1-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*var.x_1)-(var.y_2-((var.y_3-var.y_2)/(var.x_3-var.x_2)*var.x_2)))/(((var.y_3-var.y_2)/(var.x_3-var.x_2))-(-(var.x_3-var.x_2)/(var.y_3-var.y_2)))} ;set var.y_4 = {(-(var.x_3-var.x_2)/(var.y_3-var.y_2))<>*((var.y_1-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*var.x_1)-(var.y_2-((var.y_3-var.y_2)/(var.x_3-var.x_2)*var.x_2)))<>/(((var.y_3-var.y_2)/(var.x_3-var.x_2))-(-(var.x_3-var.x_2)/(var.y_3-var.y_2)))+(var.y_1-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*var.x_1)} set var.buff1 = {var.y_1-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*var.x_1} set var.buff2 = {var.y_2-((var.y_3-var.y_2)/(var.x_3-var.x_2)*var.x_2)} set var.buff3 = {((var.y_3-var.y_2)/(var.x_3-var.x_2))-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))} set var.x_4 = {(var.buff1-var.buff2)/var.buff3} set var.buff1 = {(-(var.x_3-var.x_2)/(var.y_3-var.y_2))} set var.buff2 = {((var.y_1-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*var.x_1)-(var.y_2-((var.y_3-var.y_2)/(var.x_3-var.x_2)*var.x_2)))} set var.buff3 = {(((var.y_3-var.y_2)/(var.x_3-var.x_2))-(-(var.x_3-var.x_2)/(var.y_3-var.y_2)))+(var.y_1-(-(var.x_3-var.x_2)/(var.y_3-var.y_2))*var.x_1)} set var.y_4 = {var.buff1*var.buff2/var.buff3} var a = 0 set var.a= {var.y_3-var.y_2} ;if var.a >= 0 ; workpiece Zero coordinates set var.x_5 = {var.x_4+(cos(var.m_1_deg)+cos(var.m_2_deg))*var.d_probe/2} set var.y_5 = {var.y_4+(sin(var.m_1_deg)+sin(var.m_2_deg))*var.d_probe/2} ;echo 'X= '{var.x_5}', Y= '{var.y_5} ;if var.a < 0 ;set var.x_5 = {var.x_4+(cos(atan(var.m_1))-cos(atan(var.m_2)))*var.d_probe/2} ;set var.y_5 = {var.y_4+(sin(atan(var.m_1))-sin(atan(var.m_2)))*var.d_probe/2} ;echo X= {var.x_5}, Y= {var.y_5} ;move above workpiece zero and set tool x&y to 0 M558 F{var.speed} ; Set the initial movement speed G1 Y{move.axes[1].machinePosition-1} ; Move 1mm away from the material G1 Z{var.z0 + 5} ; Move above workpiece G1 X{var.x_5} G1 Y{var.y_5} ; go to Zero ;G10 L20 X0 Y0 ; set x&y to Zero ;G68 A0 B0 R{-var.m_1_deg} ; set Rotation