diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/macros/block_down.ngc b/macros/block_down.ngc index 8d0f746..ffbe2c8 100644 --- a/macros/block_down.ngc +++ b/macros/block_down.ngc @@ -2,7 +2,7 @@ o sub (cancel all Z offsets) G49 G92.1 -G10 L20 P0 Z[#<_hal[axis.2.joint-pos-cmd]>] +G10 L20 P0 Z[#<_hal[axis.z.pos-cmd]>] G91 F #<_hal[probe.ps_searchvel]> diff --git a/macros/gotots.ngc b/macros/gotots.ngc index c156e6d..ef1102f 100644 --- a/macros/gotots.ngc +++ b/macros/gotots.ngc @@ -1,6 +1,6 @@ o sub F#<_ini[TOOLSENSOR]RAPID_SPEED> -G53 G1 Z[#<_ini[AXIS_2]MAX_LIMIT>] +G53 G1 Z[#<_ini[AXIS_Z]MAX_LIMIT>] G53 G1 X[#<_ini[TOOLSENSOR]X>] Y[#<_ini[TOOLSENSOR]Y>] G53 G1 Z[#<_ini[TOOLSENSOR]Z>] diff --git a/macros/manual_change.ngc b/macros/manual_change.ngc index 4e44a9f..e679641 100644 --- a/macros/manual_change.ngc +++ b/macros/manual_change.ngc @@ -17,7 +17,7 @@ O100 return [999] O100 endif ;first go up -G53 G0 Z[#<_ini[AXIS_2]MAX_LIMIT>-0.1] +G53 G0 Z[#<_ini[AXIS_Z]MAX_LIMIT>-0.1] ; then move to change position G53 G0 X[#<_ini[CHANGE_POSITION]X>] Y[#<_ini[CHANGE_POSITION]Y>] G53 G0 Z[#<_ini[CHANGE_POSITION]Z>] @@ -46,10 +46,11 @@ O400 endif F #<_hal[probe.ps_searchvel]> G91 G38.2 Z #<_ini[TOOLSENSOR]MAXPROBE> -G0 Z0.26 +G38.4 Z2 +G0 Z0.5 ; This is commented out only for sim. F #<_hal[probe.ps_probevel]> -G38.2 Z-0.5 +G38.2 Z-3 O500 if [#5070 EQ 0] G90 @@ -58,7 +59,6 @@ O500 endif G90 G53 G0 Z[#<_ini[CHANGE_POSITION]Z>] -G53 G0 X[#<_ini[CHANGE_POSITION]X>] Y[#<_ini[CHANGE_POSITION]Y>] # = #5063 # = #<_hal[probe.probeheight]> diff --git a/macros/probe_down.ngc b/macros/probe_down.ngc index 5799f24..ab8bbf1 100644 --- a/macros/probe_down.ngc +++ b/macros/probe_down.ngc @@ -1,12 +1,12 @@ o sub F#<_ini[TOOLSENSOR]RAPID_SPEED> -G53 G1 Z[#<_ini[AXIS_2]MAX_LIMIT>-0.1] +G53 G1 Z[#<_ini[AXIS_Z]MAX_LIMIT>-0.1] G53 G1 X[#<_ini[TOOLSENSOR]X>] Y[#<_ini[TOOLSENSOR]Y>] G53 G1 Z[#<_ini[TOOLSENSOR]Z>] (cancel all Z offsets) G92.1 G49 -G10 L20 P0 Z[#<_hal[axis.2.joint-pos-cmd]>] +G10 L20 P0 Z[#<_hal[axis.z.pos-cmd]>] G91 F #<_hal[probe.ps_searchvel]> diff --git a/my-mill-postgui.hal b/my-mill-postgui.hal index a499205..246e957 100644 --- a/my-mill-postgui.hal +++ b/my-mill-postgui.hal @@ -8,14 +8,14 @@ # The next two lines are only needed if the pins had been connected before -unlinkp iocontrol.0.tool-change -unlinkp iocontrol.0.tool-changed +#unlinkp iocontrol.0.tool-change +#unlinkp iocontrol.0.tool-changed # link to auto tool measurement toolchange, so you get the advantage of tool description on change dialog # this settings were moved to probe_screen.hal: #net tool-change probe.toolchange-change <= iocontrol.0.tool-change -#net tool-changed probe.toolchange-changed <= iocontrol.0.tool-changed +#net tool-changed probe.toolchange-changed => iocontrol.0.tool-changed #net tool-prep-number probe.toolchange-number <= iocontrol.0.tool-prep-number net tool-prep-loop iocontrol.0.tool-prepare <= iocontrol.0.tool-prepared diff --git a/my-mill.ini b/my-mill.ini index e12ba33..6a89a4e 100644 --- a/my-mill.ini +++ b/my-mill.ini @@ -26,7 +26,9 @@ Y = 10 Z = 60 [RS274NGC] -FEATURES=30 +RETAIN_G43 = 0 +INI_VARS = 1 +HAL_PIN_VARS = 1 SUBROUTINE_PATH = macros REMAP=M6 modalgroup=6 prolog=change_prolog ngc=manual_change epilog=change_epilog diff --git a/probe_icons/probe_screen.hal b/probe_icons/probe_screen.hal index 4a9ffc5..daa5f8e 100644 --- a/probe_icons/probe_screen.hal +++ b/probe_icons/probe_screen.hal @@ -1,3 +1,3 @@ net tool-change probe.toolchange-change <= iocontrol.0.tool-change -net tool-changed probe.toolchange-changed <= iocontrol.0.tool-changed +net tool-changed probe.toolchange-changed => iocontrol.0.tool-changed net tool-prep-number probe.toolchange-number <= iocontrol.0.tool-prep-number diff --git a/probe_icons_1024x768/probe_screen.hal b/probe_icons_1024x768/probe_screen.hal index 4a9ffc5..daa5f8e 100644 --- a/probe_icons_1024x768/probe_screen.hal +++ b/probe_icons_1024x768/probe_screen.hal @@ -1,3 +1,3 @@ net tool-change probe.toolchange-change <= iocontrol.0.tool-change -net tool-changed probe.toolchange-changed <= iocontrol.0.tool-changed +net tool-changed probe.toolchange-changed => iocontrol.0.tool-changed net tool-prep-number probe.toolchange-number <= iocontrol.0.tool-prep-number diff --git a/python/probe_screen.py b/python/probe_screen.py index bc323fc..1458ce3 100644 --- a/python/probe_screen.py +++ b/python/probe_screen.py @@ -29,6 +29,7 @@ import ConfigParser from datetime import datetime from subprocess import Popen, PIPE +from functools import wraps CONFIGPATH1 = os.environ['CONFIG_DIR'] @@ -68,6 +69,20 @@ def putpref(self, option, value, type = bool): self.set("DEFAULT", option, type(value)) self.write(open(self.fn, "w")) +def restore_mode(f): + """ Ensures the task mode is restored when a function exits """ + @wraps(f) + def wrapper(self, *args, **kwargs): + # Store Current Task Mode + prev_task_mode = self.stat.task_mode + try: + # Execute wrapped function + return f(self, *args, **kwargs) + finally: + # Restore Previous Task Mode + self.command.mode( prev_task_mode ) + self.command.wait_complete() + return wrapper class ProbeScreenClass: @@ -156,8 +171,6 @@ def error_poll(self): return 0 - - # calculate corner coordinates in rotated coord. system def calc_cross_rott(self,x1=0.,y1=0.,x2=0.,y2=0.,a1=0.,a2=90.) : coord = [0,0] @@ -380,7 +393,7 @@ def on_btn_jog_pressed( self, widget, data = None ): else: value = 1 - velocity = float(self.inifile.find("TRAJ", "DEFAULT_VELOCITY")) + velocity = float(self.inifile.find("TRAJ", "DEFAULT_LINEAR_VELOCITY")) dir = widget.get_label()[1] if dir == "+": @@ -388,10 +401,11 @@ def on_btn_jog_pressed( self, widget, data = None ): else: direction = -1 + self.command.teleop_enable(1) if self.distance <> 0: # incremental jogging - self.command.jog( linuxcnc.JOG_INCREMENT, axisnumber, direction * velocity, self.distance ) + self.command.jog( linuxcnc.JOG_INCREMENT, False, axisnumber, direction * velocity, self.distance ) else: # continuous jogging - self.command.jog( linuxcnc.JOG_CONTINUOUS, axisnumber, direction * velocity ) + self.command.jog( linuxcnc.JOG_CONTINUOUS, False, axisnumber, direction * velocity ) def on_btn_jog_released( self, widget, data = None ): axisletter = widget.get_label()[0] @@ -401,10 +415,11 @@ def on_btn_jog_released( self, widget, data = None ): axis = "xyzabcuvw".index( axisletter.lower() ) + self.command.teleop_enable(1) if self.distance <> 0: pass else: - self.command.jog( linuxcnc.JOG_STOP, axis ) + self.command.jog( linuxcnc.JOG_STOP, False, axis ) # Spin buttons @@ -623,6 +638,7 @@ def lenght_y(self, data = None): return res # -------------- Touch off buttons ----------------- + @restore_mode def on_btn_set_x_released(self, gtkbutton, data = None): self.prefs.putpref( "ps_offs_x", self.spbtn_offs_x.get_value(), float ) self.command.mode( linuxcnc.MODE_MDI ) @@ -631,7 +647,7 @@ def on_btn_set_x_released(self, gtkbutton, data = None): self.vcp_action_reload.emit( "activate" ) time.sleep(1) - + @restore_mode def on_btn_set_y_released(self, gtkbutton, data = None): self.prefs.putpref( "ps_offs_y", self.spbtn_offs_y.get_value(), float ) self.command.mode( linuxcnc.MODE_MDI ) @@ -640,6 +656,7 @@ def on_btn_set_y_released(self, gtkbutton, data = None): self.vcp_action_reload.emit( "activate" ) time.sleep(1) + @restore_mode def on_btn_set_z_released(self, gtkbutton, data = None): self.prefs.putpref( "ps_offs_z", self.spbtn_offs_z.get_value(), float ) self.command.mode( linuxcnc.MODE_MDI ) @@ -648,6 +665,7 @@ def on_btn_set_z_released(self, gtkbutton, data = None): self.vcp_action_reload.emit( "activate" ) time.sleep(1) + @restore_mode def on_btn_set_angle_released(self, gtkbutton, data = None): self.prefs.putpref( "ps_offs_angle", self.spbtn_offs_angle.get_value(), float ) self.lb_probe_a.set_text( "%.3f" % self.spbtn_offs_angle.get_value()) @@ -674,6 +692,7 @@ def on_btn_set_angle_released(self, gtkbutton, data = None): # Measurement outside # ------------------------------------------------- # Down + @restore_mode def on_down_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -685,6 +704,7 @@ def on_down_released(self, gtkbutton, data = None): self.add_history(gtkbutton.get_tooltip_text(),"Z",0,0,0,0,0,0,0,0,a[2],0,0) self.set_zerro("Z",0,0,a[2]) # X+ + @restore_mode def on_xp_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -714,6 +734,7 @@ def on_xp_released(self, gtkbutton, data = None): self.set_zerro("X") # Y+ + @restore_mode def on_yp_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -743,6 +764,7 @@ def on_yp_released(self, gtkbutton, data = None): self.set_zerro("Y") # X- + @restore_mode def on_xm_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -772,6 +794,7 @@ def on_xm_released(self, gtkbutton, data = None): self.set_zerro("X") # Y- + @restore_mode def on_ym_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -803,6 +826,7 @@ def on_ym_released(self, gtkbutton, data = None): # Corners # Move Probe manual under corner 2-3 mm # X+Y+ + @restore_mode def on_xpyp_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -854,6 +878,7 @@ def on_xpyp_released(self, gtkbutton, data = None): self.set_zerro("XY") # X+Y- + @restore_mode def on_xpym_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -904,6 +929,7 @@ def on_xpym_released(self, gtkbutton, data = None): self.set_zerro("XY") # X-Y+ + @restore_mode def on_xmyp_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -955,6 +981,7 @@ def on_xmyp_released(self, gtkbutton, data = None): self.set_zerro("XY") # X-Y- + @restore_mode def on_xmym_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -1006,6 +1033,7 @@ def on_xmym_released(self, gtkbutton, data = None): self.set_zerro("XY") # Center X+ X- Y+ Y- + @restore_mode def on_xy_center_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -1118,6 +1146,7 @@ def on_xy_center_released(self, gtkbutton, data = None): # Corners # Move Probe manual under corner 2-3 mm # X+Y+ + @restore_mode def on_xpyp1_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -1164,6 +1193,7 @@ def on_xpyp1_released(self, gtkbutton, data = None): self.set_zerro("XY") # X+Y- + @restore_mode def on_xpym1_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -1210,6 +1240,7 @@ def on_xpym1_released(self, gtkbutton, data = None): self.set_zerro("XY") # X-Y+ + @restore_mode def on_xmyp1_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -1257,6 +1288,7 @@ def on_xmyp1_released(self, gtkbutton, data = None): self.set_zerro("XY") # X-Y- + @restore_mode def on_xmym1_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -1303,6 +1335,7 @@ def on_xmym1_released(self, gtkbutton, data = None): self.set_zerro("XY") # Hole Xin- Xin+ Yin- Yin+ + @restore_mode def on_xy_hole_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -1397,6 +1430,7 @@ def on_xy_hole_released(self, gtkbutton, data = None): # Angle # Move Probe manual under corner 2-3 mm # Y+Y+ + @restore_mode def on_angle_yp_released(self, gtkbutton, data = None): self.stat.poll() xstart=self.stat.position[0]-self.stat.g5x_offset[0] - self.stat.g92_offset[0] - self.stat.tool_offset[0] @@ -1448,6 +1482,7 @@ def on_angle_yp_released(self, gtkbutton, data = None): self.rotate_coord_system(alfa) # Y-Y- + @restore_mode def on_angle_ym_released(self, gtkbutton, data = None): self.stat.poll() xstart=self.stat.position[0]-self.stat.g5x_offset[0] - self.stat.g92_offset[0] - self.stat.tool_offset[0] @@ -1498,6 +1533,7 @@ def on_angle_ym_released(self, gtkbutton, data = None): self.rotate_coord_system(alfa) # X+X+ + @restore_mode def on_angle_xp_released(self, gtkbutton, data = None): self.stat.poll() ystart=self.stat.position[1]-self.stat.g5x_offset[1] - self.stat.g92_offset[1] - self.stat.tool_offset[1] @@ -1548,6 +1584,7 @@ def on_angle_xp_released(self, gtkbutton, data = None): self.rotate_coord_system(alfa) # X-X- + @restore_mode def on_angle_xm_released(self, gtkbutton, data = None): self.stat.poll() ystart=self.stat.position[1]-self.stat.g5x_offset[1] - self.stat.g92_offset[1] - self.stat.tool_offset[1] @@ -1598,6 +1635,7 @@ def on_angle_xm_released(self, gtkbutton, data = None): self.rotate_coord_system(alfa) # Lx OUT + @restore_mode def on_lx_out_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -1656,6 +1694,7 @@ def on_lx_out_released(self, gtkbutton, data = None): # Ly OUT + @restore_mode def on_ly_out_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -1715,6 +1754,7 @@ def on_ly_out_released(self, gtkbutton, data = None): # Lx IN + @restore_mode def on_lx_in_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -1763,6 +1803,7 @@ def on_lx_in_released(self, gtkbutton, data = None): # Ly IN + @restore_mode def on_ly_in_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -1812,6 +1853,7 @@ def on_ly_in_released(self, gtkbutton, data = None): # TOOL DIA + @restore_mode def on_tool_dia_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -1973,7 +2015,7 @@ def on_tool_change( self, gtkbutton, data = None): if result: self.halcomp["toolchange-changed"] = True else: - print"toolchange abort", self.stat.tool_in_spindle, self.halcomp['toolchange-number'] + print "toolchange abort", self.stat.tool_in_spindle, self.halcomp['toolchange-number'] self.command.abort() self.halcomp['toolchange-number'] = self.stat.tool_in_spindle self.halcomp['toolchange-change'] = False @@ -2003,6 +2045,8 @@ def on_spbtn_probe_height_value_changed( self, gtkspinbutton, data = None ): self.buffer.delete(i,self.buffer.get_end_iter()) i.set_line(0) self.buffer.insert(i, "%s \n" % c) + + @restore_mode def on_spbtn_block_height_value_changed( self, gtkspinbutton, data = None ): blockheight = gtkspinbutton.get_value() if blockheight != False: @@ -2015,10 +2059,9 @@ def on_spbtn_block_height_value_changed( self, gtkspinbutton, data = None ): self.warning_dialog( self, _( "Conversion error in btn_block_height!" ), _( "Please enter only numerical values\nValues have not been applied" ) ) # set koordinate system to new origin - origin = float(self.inifile.find("AXIS_2", "MIN_LIMIT")) + blockheight self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() - self.command.mdi( "G10 L2 P0 Z%s" % origin ) + self.command.mdi( "G10 L2 P0 Z%s" % blockheight ) self.vcp_action_reload.emit( "activate" ) c="Workpiece Height = " + "%.4f" % gtkspinbutton.get_value() i=self.buffer.get_end_iter() @@ -2027,7 +2070,9 @@ def on_spbtn_block_height_value_changed( self, gtkspinbutton, data = None ): self.buffer.delete(i,self.buffer.get_end_iter()) i.set_line(0) self.buffer.insert(i, "%s \n" % c) - def clicked_btn_probe_tool_setter(self, data = None): + + @restore_mode + def clicked_btn_probe_tool_setter(self, gtkbuttondata = None): # Start probe_down.ngc self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() @@ -2041,7 +2086,8 @@ def clicked_btn_probe_tool_setter(self, data = None): self.spbtn_probe_height.set_value( float(a[2]) ) self.add_history(gtkbutton.get_tooltip_text(),"Z",0,0,0,0,0,0,0,0,a[2],0,0) - def clicked_btn_probe_workpiece(self, data = None): + @restore_mode + def clicked_btn_probe_workpiece(self, gtkbutton, data = None): # Start probe_down.ngc self.command.mode( linuxcnc.MODE_MDI ) self.command.wait_complete() diff --git a/python/stdglue.py b/python/stdglue.py index 7940cb9..f6efcd8 100644 --- a/python/stdglue.py +++ b/python/stdglue.py @@ -1,46 +1,137 @@ -# This is a component of LinuxCNC -# Copyright 2014 Norbert Schechner +# stdglue - canned prolog and epilog functions for the remappable builtin codes (T,M6,M61,S,F) # -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# we dont use argspec to avoid the generic error message of the argspec prolog and give more +# concise ones here + +# cycle_prolog,cycle_epilog: generic code-independent support glue for oword sub cycles # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# these are provided as starting point - for more concise error message you would better +# write a prolog specific for the code # -# Remap of M6 for auto tool measurement +# Usage: +#REMAP=G84.3 modalgroup=1 argspec=xyzqp prolog=cycle_prolog ngc=g843 epilog=cycle_epilog -import os -import sys import emccanon from interpreter import * -from gscreen import preferences throw_exceptions = 1 -debug = False -if debug: - pydevdir = '/home/emcmesa/Aptana_Studio_3/plugins/org.python.pydev_2.7.0.2013032300/pysrc' - - # the 'emctask' module is present only in the milltask instance, otherwise both the UI and - # milltask would try to connect to the debug server. - - if os.path.isdir( pydevdir ) and 'emctask' in sys.builtin_module_names: - sys.path.append( pydevdir ) - sys.path.insert( 0, pydevdir ) - try: - import pydevd - emccanon.MESSAGE( "pydevd imported, connecting to Eclipse debug server..." ) - pydevd.settrace() - except: - emccanon.MESSAGE( "no pydevd module found" ) +# REMAP=S prolog=setspeed_prolog ngc=setspeed epilog=setspeed_epilog +# exposed parameter: # + +def setspeed_prolog(self,**words): + try: + c = self.blocks[self.remap_level] + if not c.s_flag: + self.set_errormsg("S requires a value") + return INTERP_ERROR + self.params["speed"] = c.s_number + except Exception,e: + self.set_errormsg("S/setspeed_prolog: %s)" % (e)) + return INTERP_ERROR + return INTERP_OK + +def setspeed_epilog(self,**words): + try: + if not self.value_returned: + r = self.blocks[self.remap_level].executing_remap + self.set_errormsg("the %s remap procedure %s did not return a value" + % (r.name,r.remap_ngc if r.remap_ngc else r.remap_py)) + return INTERP_ERROR + if self.return_value < -TOLERANCE_EQUAL: # 'less than 0 within interp's precision' + self.set_errormsg("S: remap procedure returned %f" % (self.return_value)) + return INTERP_ERROR + if self.blocks[self.remap_level].builtin_used: + pass + #print "---------- S builtin recursion, nothing to do" + else: + self.speed = self.params["speed"] + emccanon.enqueue_SET_SPINDLE_SPEED(self.speed) + return INTERP_OK + except Exception,e: + self.set_errormsg("S/setspeed_epilog: %s)" % (e)) + return INTERP_ERROR + return INTERP_OK + +# REMAP=F prolog=setfeed_prolog ngc=setfeed epilog=setfeed_epilog +# exposed parameter: # + +def setfeed_prolog(self,**words): + try: + c = self.blocks[self.remap_level] + if not c.f_flag: + self.set_errormsg("F requires a value") + return INTERP_ERROR + self.params["feed"] = c.f_number + except Exception,e: + self.set_errormsg("F/setfeed_prolog: %s)" % (e)) + return INTERP_ERROR + return INTERP_OK + +def setfeed_epilog(self,**words): + try: + if not self.value_returned: + r = self.blocks[self.remap_level].executing_remap + self.set_errormsg("the %s remap procedure %s did not return a value" + % (r.name,r.remap_ngc if r.remap_ngc else r.remap_py)) + return INTERP_ERROR + if self.blocks[self.remap_level].builtin_used: pass + #print "---------- F builtin recursion, nothing to do" + else: + self.feed_rate = self.params["feed"] + emccanon.enqueue_SET_FEED_RATE(self.feed_rate) + return INTERP_OK + except Exception,e: + self.set_errormsg("F/setfeed_epilog: %s)" % (e)) + return INTERP_ERROR + return INTERP_OK + +# REMAP=T prolog=prepare_prolog ngc=prepare epilog=prepare_epilog +# exposed parameters: # # + +def prepare_prolog(self,**words): + try: + cblock = self.blocks[self.remap_level] + if not cblock.t_flag: + self.set_errormsg("T requires a tool number") + return INTERP_ERROR + tool = cblock.t_number + if tool: + (status, pocket) = self.find_tool_pocket(tool) + if status != INTERP_OK: + self.set_errormsg("T%d: pocket not found" % (tool)) + return status + else: + pocket = -1 # this is a T0 - tool unload + self.params["tool"] = tool + self.params["pocket"] = pocket + return INTERP_OK + except Exception, e: + self.set_errormsg("T%d/prepare_prolog: %s" % (int(words['t']), e)) + return INTERP_ERROR + +def prepare_epilog(self, **words): + try: + if not self.value_returned: + r = self.blocks[self.remap_level].executing_remap + self.set_errormsg("the %s remap procedure %s did not return a value" + % (r.name,r.remap_ngc if r.remap_ngc else r.remap_py)) + return INTERP_ERROR + if self.blocks[self.remap_level].builtin_used: + #print "---------- T builtin recursion, nothing to do" + return INTERP_OK + else: + if self.return_value > 0: + self.selected_tool = int(self.params["tool"]) + self.selected_pocket = int(self.params["pocket"]) + emccanon.SELECT_TOOL(self.selected_tool) + return INTERP_OK + else: + self.set_errormsg("T%d: aborted (return code %.1f)" % (int(self.params["tool"]),self.return_value)) + return INTERP_ERROR + except Exception, e: + self.set_errormsg("T%d/prepare_epilog: %s" % (tool,e)) + return INTERP_ERROR # REMAP=M6 modalgroup=6 prolog=change_prolog ngc=change epilog=change_epilog # exposed parameters: @@ -61,21 +152,79 @@ def change_prolog(self, **words): if self.selected_pocket < 0: self.set_errormsg("M6: no tool prepared") return INTERP_ERROR - if self.cutter_comp_side: self.set_errormsg("Cannot change tools with cutter radius compensation on") return INTERP_ERROR self.params["tool_in_spindle"] = self.current_tool self.params["selected_tool"] = self.selected_tool - self.params["current_pocket"] = self.current_pocket # this is probably nonsense + self.params["current_pocket"] = self.current_pocket self.params["selected_pocket"] = self.selected_pocket return INTERP_OK - except Exception, e: self.set_errormsg("M6/change_prolog: %s" % (e)) return INTERP_ERROR def change_epilog(self, **words): + try: + if not self.value_returned: + r = self.blocks[self.remap_level].executing_remap + self.set_errormsg("the %s remap procedure %s did not return a value" + % (r.name,r.remap_ngc if r.remap_ngc else r.remap_py)) + yield INTERP_ERROR + # this is relevant only when using iocontrol-v2. + if self.params[5600] > 0.0: + if self.params[5601] < 0.0: + self.set_errormsg("Toolchanger hard fault %d" % (int(self.params[5601]))) + yield INTERP_ERROR + print "change_epilog: Toolchanger soft fault %d" % int(self.params[5601]) + + if self.blocks[self.remap_level].builtin_used: + #print "---------- M6 builtin recursion, nothing to do" + yield INTERP_OK + else: + if self.return_value > 0.0: + # commit change + self.selected_pocket = int(self.params["selected_pocket"]) + emccanon.CHANGE_TOOL(self.selected_pocket) + self.current_pocket = self.selected_pocket + self.selected_pocket = -1 + self.selected_tool = -1 + # cause a sync() + self.set_tool_parameters() + self.toolchange_flag = True + yield INTERP_EXECUTE_FINISH + else: + self.set_errormsg("M6 aborted (return code %.1f)" % (self.return_value)) + yield INTERP_ERROR + except Exception, e: + self.set_errormsg("M6/change_epilog: %s" % (e)) + yield INTERP_ERROR + +# REMAP=M61 modalgroup=6 prolog=settool_prolog ngc=settool epilog=settool_epilog +# exposed parameters: # # + +def settool_prolog(self,**words): + try: + c = self.blocks[self.remap_level] + if not c.q_flag: + self.set_errormsg("M61 requires a Q parameter") + return INTERP_ERROR + tool = int(c.q_number) + if tool < -TOLERANCE_EQUAL: # 'less than 0 within interp's precision' + self.set_errormsg("M61: Q value < 0") + return INTERP_ERROR + (status,pocket) = self.find_tool_pocket(tool) + if status != INTERP_OK: + self.set_errormsg("M61 failed: requested tool %d not in table" % (tool)) + return status + self.params["tool"] = tool + self.params["pocket"] = pocket + return INTERP_OK + except Exception,e: + self.set_errormsg("M61/settool_prolog: %s)" % (e)) + return INTERP_ERROR + +def settool_epilog(self,**words): try: if not self.value_returned: r = self.blocks[self.remap_level].executing_remap @@ -83,28 +232,56 @@ def change_epilog(self, **words): % (r.name,r.remap_ngc if r.remap_ngc else r.remap_py)) return INTERP_ERROR - if self.return_value > 0.0: - if self.return_value == 3: - message = "No tool measurement ! Please take care of the entry in the tool table" - emccanon.MESSAGE(message) + if self.blocks[self.remap_level].builtin_used: + #print "---------- M61 builtin recursion, nothing to do" return INTERP_OK else: - if self.return_value == -1: - message = "Searchvel <= 0, not permitted!, Please correct Settings." - elif self.return_value == -2: - message = "Probevel <= 0, not permitted!, Please correct Settings." - elif self.return_value == -3: - message = "Probe contact failiure !!" + if self.return_value > 0.0: + self.current_tool = int(self.params["tool"]) + self.current_pocket = int(self.params["pocket"]) + emccanon.CHANGE_TOOL_NUMBER(self.current_pocket) + # cause a sync() + self.tool_change_flag = True + self.set_tool_parameters() else: - message = "M6 aborted (return code %.1f)" % (self.return_value) - self.set_errormsg(message) - return INTERP_ERROR + self.set_errormsg("M61 aborted (return code %.1f)" % (self.return_value)) + return INTERP_ERROR + except Exception,e: + self.set_errormsg("M61/settool_epilog: %s)" % (e)) + return INTERP_ERROR +# educational alternative: M61 remapped to an all-Python handler +# demo - this really does the same thing as the builtin (non-remapped) M61 +# +# REMAP=M61 modalgroup=6 python=set_tool_number + +def set_tool_number(self, **words): + try: + c = self.blocks[self.remap_level] + if c.q_flag: + toolno = int(c.q_number) + else: + self.set_errormsg("M61 requires a Q parameter") + return status + (status,pocket) = self.find_tool_pocket(toolno) + if status != INTERP_OK: + self.set_errormsg("M61 failed: requested tool %d not in table" % (toolno)) + return status + if words['q'] > -TOLERANCE_EQUAL: # 'greater equal 0 within interp's precision' + self.current_pocket = pocket + self.current_tool = toolno + emccanon.CHANGE_TOOL_NUMBER(pocket) + # cause a sync() + self.tool_change_flag = True + self.set_tool_parameters() + return INTERP_OK + else: + self.set_errormsg("M61 failed: Q=%4" % (toolno)) + return INTERP_ERROR except Exception, e: - self.set_errormsg("M6/change_epilog: %s" % (e)) + self.set_errormsg("M61/set_tool_number: %s" % (e)) return INTERP_ERROR - _uvw = ("u","v","w","a","b","c") _xyz = ("x","y","z","a","b","c") # given a plane, return sticky words, incompatible axis words and plane name @@ -117,7 +294,7 @@ def change_epilog(self, **words): emccanon.CANON_PLANE_VW : (("u","r"),_xyz,"VW"), emccanon.CANON_PLANE_UW : (("v","r"),_xyz,"UW")} -# extract and pass parameters from current block, merged with extra paramters on a continuation line +# extract and pass parameters from current block, merged with extra parameters on a continuation line # keep tjose parameters across invocations # export the parameters into the oword procedure def cycle_prolog(self,**words): @@ -133,7 +310,7 @@ def cycle_prolog(self,**words): self.sticky_params[r.name] = dict() self.params["motion_code"] = c.g_modes[1] - + (sw,incompat,plane_name) =_compat[self.plane] for (word,value) in words.items(): # inject current parameters @@ -175,7 +352,7 @@ def cycle_prolog(self,**words): if self.cutter_comp_side: return "%s: Cannot use canned cycles with cutter compensation on" % (r.name) return INTERP_OK - + except Exception, e: raise return "cycle_prolog failed: %s" % (e)