commit c1392c1b9cff01e2b7ba8fb7a6c70f12f0494d60 Author: uvos Date: Sun Feb 5 18:45:48 2023 +0100 inial commit diff --git a/3040T.hal b/3040T.hal new file mode 100644 index 0000000..51537c2 --- /dev/null +++ b/3040T.hal @@ -0,0 +1,222 @@ +#Real Time Modules +loadrt [KINS]KINEMATICS +loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS +loadrt hal_parport cfg="0 out" +setp parport.0.reset-time 5000 +loadrt stepgen step_type=0,0,0,0 ctrl_type=p,p,p,p +loadrt ilowpass count=1 +loadrt timedelay count=2 +loadrt not count=1 +loadrt or2 count=3 +loadrt xor2 count=2 +loadrt mux2 count=1 +loadrt and2 count=1 + +addf parport.0.read base-thread +addf stepgen.make-pulses base-thread +addf parport.0.write base-thread +addf parport.0.reset base-thread + +addf stepgen.capture-position servo-thread +addf motion-command-handler servo-thread +addf motion-controller servo-thread +addf stepgen.update-freq servo-thread + +#Pin Assignments + +net probe-in => motion.probe-input + +net estop-out => parport.0.pin-01-out +net xstep => parport.0.pin-02-out +setp parport.0.pin-02-out-reset 1 +net xdir => parport.0.pin-03-out +net ystep => parport.0.pin-04-out +setp parport.0.pin-04-out-reset 1 +net ydir => parport.0.pin-05-out +net zstep => parport.0.pin-06-out +setp parport.0.pin-06-out-reset 1 +setp parport.0.pin-07-out-invert 1 +net zdir => parport.0.pin-07-out +net astep => parport.0.pin-16-out +net adir => parport.0.pin-17-out + +net estop-ext <= parport.0.pin-10-in +net min-home-x <= parport.0.pin-11-in-not +net min-home-y <= parport.0.pin-12-in-not +net max-home-z <= parport.0.pin-13-in-not +net probe-in <= parport.0.pin-15-in-not + +#X-Axis +setp stepgen.0.position-scale [JOINT_0]SCALE +setp stepgen.0.steplen 1 +setp stepgen.0.stepspace 0 +setp stepgen.0.dirhold 36000 +setp stepgen.0.dirsetup 36000 +setp stepgen.0.maxaccel [JOINT_0]STEPGEN_MAXACCEL +net xpos-cmd joint.0.motor-pos-cmd => stepgen.0.position-cmd +net xpos-fb stepgen.0.position-fb => joint.0.motor-pos-fb +net xstep <= stepgen.0.step +net xdir <= stepgen.0.dir +net xenable joint.0.amp-enable-out => stepgen.0.enable +net min-home-x => joint.0.home-sw-in +net min-home-x => joint.0.neg-lim-sw-in + +#Y-Axis +setp stepgen.1.position-scale [JOINT_1]SCALE +setp stepgen.1.steplen 1 +setp stepgen.1.stepspace 0 +setp stepgen.1.dirhold 36000 +setp stepgen.1.dirsetup 36000 +setp stepgen.1.maxaccel [JOINT_1]STEPGEN_MAXACCEL +net ypos-cmd joint.1.motor-pos-cmd => stepgen.1.position-cmd +net ypos-fb stepgen.1.position-fb => joint.1.motor-pos-fb +net ystep <= stepgen.1.step +net ydir <= stepgen.1.dir +net yenable joint.1.amp-enable-out => stepgen.1.enable +net min-home-y => joint.1.home-sw-in +net min-home-y => joint.1.neg-lim-sw-in + +#Z-Axis +setp stepgen.2.position-scale [JOINT_2]SCALE +setp stepgen.2.steplen 1 +setp stepgen.2.stepspace 0 +setp stepgen.2.dirhold 36000 +setp stepgen.2.dirsetup 36000 +setp stepgen.2.maxaccel [JOINT_2]STEPGEN_MAXACCEL +net zpos-cmd joint.2.motor-pos-cmd => stepgen.2.position-cmd +net zpos-fb stepgen.2.position-fb => joint.2.motor-pos-fb +net zstep <= stepgen.2.step +net zdir <= stepgen.2.dir +net zenable joint.2.amp-enable-out => stepgen.2.enable +net max-home-z => joint.2.home-sw-in +net max-home-z => joint.2.pos-lim-sw-in + +#A-Axis +setp stepgen.3.position-scale [JOINT_3]SCALE +setp stepgen.3.steplen 1 +setp stepgen.3.stepspace 0 +setp stepgen.3.dirhold 36000 +setp stepgen.3.dirsetup 36000 +setp stepgen.3.maxaccel [JOINT_3]STEPGEN_MAXACCEL +net astep <= stepgen.3.step +net adir <= stepgen.3.dir +net aenable joint.3.amp-enable-out => stepgen.3.enable +#net apos-cmd joint.3.motor-pos-cmd => stepgen.3.position-cmd +#net apos-fb stepgen.3.position-fb => joint.3.motor-pos-fb + +net estop-out <= iocontrol.0.user-enable-out +net estop-ext => iocontrol.0.emc-enable-in + +#Toolchanger +loadusr -W hal_manualtoolchange +net tool-change iocontrol.0.tool-change => hal_manualtoolchange.change +net tool-changed iocontrol.0.tool-changed <= hal_manualtoolchange.changed +net tool-number iocontrol.0.tool-prep-number => hal_manualtoolchange.number +net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared + +#CNCExtension +loadusr -Wn cncextension ./cncextension + +#Amp enable +net amp-enable halui.machine.is-on => cncextension.wr0 + +#Spindle Control + +addf mux2.0 servo-thread +net spindle-select => mux2.0.sel +sets spindle-select 1 +net spindle-cmd-rpm <= spindle.0.speed-out +net spindle-cmd-rpm => mux2.0.in0 +setp mux2.0.in1 0 +net spindle-axis-rpm mux2.0.out => stepgen.3.velocity-cmd + +addf and2.0 servo-thread +net spindle-fwd-and spindle.0.forward => and2.0.in0 +net spindle-select => and2.0.in1 +net spindle-main-fwd <= and2.0.out +net spindle-main-fwd => cncextension.ch0 +net spindle-main-fwd => cncextension.opt + +addf timedelay.0 servo-thread +setp timedelay.0.on-delay 10 +setp timedelay.0.off-delay 0 +net spindle-main-fwd => timedelay.0.in +net spindle-on-timer <= timedelay.0.out + +addf timedelay.1 servo-thread +setp timedelay.1.on-delay 10 +setp timedelay.1.off-delay 0 +net spindle-main-break spindle.0.brake => timedelay.1.in +net spindle-off-timer <= timedelay.1.out + +addf or2.0 servo-thread +net spindle-on-timer => or2.0.in0 +net spindle-off-timer => or2.0.in1 +net spindle-main-inhibit <= or2.0.out + +addf or2.1 servo-thread +addf not.0 servo-thread +net spindle-select => not.0.in +net spindle-select-neg <= not.0.out +net spindle-select-neg => or2.1.in0 +net spindle-main-inhibit => or2.1.in1 +net spindle-inhibit <= or2.1.out +net spindle-inhibit => spindle.0.at-speed + +net spindle-position <= stepgen.3.position-fb +net spindle-position => spindle.0.revs +net spindle-axis-rpm => spindle.0.speed-in +net spindle-index-enable encoder.3.index-enable <=> spindle.0.index-enable + +#MPG +setp joint.0.jog-vel-mode 0 +setp axis.x.jog-vel-mode 0 + +setp joint.1.jog-vel-mode 0 +setp axis.y.jog-vel-mode 0 + +setp joint.2.jog-vel-mode 0 +setp axis.z.jog-vel-mode 0 + +setp joint.0.jog-scale 0.0001 +setp axis.x.jog-scale 0.0001 + +setp joint.1.jog-scale 0.0001 +setp axis.y.jog-scale 0.0001 + +setp joint.2.jog-scale 0.00005 +setp axis.z.jog-scale 0.00005 + +net x_enable cncextension.xEnable => axis.x.jog-enable +net y_enable cncextension.yEnable => axis.y.jog-enable +net z_enable cncextension.zEnable => axis.z.jog-enable +net raw-encoder-counts <= cncextension.encoder + +addf ilowpass.0 servo-thread +setp ilowpass.0.scale 1024 +setp ilowpass.0.gain 0.01 +net raw-encoder-counts => ilowpass.0.in +net encoder-counts <= ilowpass.0.out + +net encoder-counts => axis.x.jog-counts +net encoder-counts => axis.y.jog-counts +net encoder-counts => axis.z.jog-counts + +#Collisionavoid +loadusr -Wn collisionavoid ./collisionavoid + +net xpos-abs-cmd joint.0.pos-cmd => collisionavoid.xaxis +net ypos-abs-cmd joint.1.pos-cmd => collisionavoid.yaxis +net zpos-abs-cmd joint.2.pos-cmd => collisionavoid.zaxis +net collision-stop collisionavoid.stop => halui.estop.activate + +#Autolevel +loadusr -Wn compensation python2 compensation.py probe-results.txt cubic +net xpos-abs-cmd => compensation.x-pos +net ypos-abs-cmd => compensation.y-pos +net zpos-abs-cmd => compensation.z-pos +net eoffset-enable compensation.enable-out => axis.z.eoffset-enable +net eoffset-scale compensation.scale => axis.z.eoffset-scale +net eoffset-counts compensation.counts => axis.z.eoffset-counts +net eoffset-clear compensation.clear => axis.z.eoffset-clear + diff --git a/3040T.ini b/3040T.ini new file mode 100644 index 0000000..772a387 --- /dev/null +++ b/3040T.ini @@ -0,0 +1,191 @@ +# This config file was created 2021-03-12 16:42:08.823352 by the update_ini script +# The original config files may be found in the /home/philipp/linuxcnc/configs/3040T/3040T.old directory + +[EMC] +# The version string for this INI file. +VERSION = 1.1 + +MACHINE = 3040T +DEBUG = 0 + +[DISPLAY] +DISPLAY = axis +EDITOR = gedit +POSITION_OFFSET = RELATIVE +POSITION_FEEDBACK = ACTUAL +ARCDIVISION = 64 +GRIDS = 10mm 20mm 50mm 100mm +MAX_FEED_OVERRIDE = 2 +MIN_SPINDLE_OVERRIDE = 0.5 +MAX_SPINDLE_OVERRIDE = 1.2 +DEFAULT_LINEAR_VELOCITY = 6.00 +MIN_LINEAR_VELOCITY = 0 +MAX_LINEAR_VELOCITY = 55 +DEFAULT_ANGULAR_VELOCITY = 40 +MAX_ANGULAR_VELOCITY = 250 +INTRO_GRAPHIC = ./UVOSBannerLCNC.gif +INTRO_TIME = 5 +INCREMENTS = 5mm 1mm .5mm .1mm .05mm .01mm .005mm +PYVCP=pannel.xml +OPEN_FILE ="" +PROGRAM_PREFIX=/home/philipp/linuxcnc/nc_files + + +[FILTER] +PROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image +PROGRAM_EXTENSION = .py Python Script +png = image-to-gcode +gif = image-to-gcode +jpg = image-to-gcode +py = python + +[RS274NGC] +PARAMETER_FILE = linuxcnc.var +SUBROUTINE_PATH = /home/philipp/linuxcnc/configs/3040T +USER_M_PATH = /home/philipp/linuxcnc/configs/3040T +RS274NGC_STARTUP_CODE =G64 P0.1 s2400 +REMAP=M6 modalgroup=6 ngc=tool-change +REMAP=M400 modalgroup=10 ngc=touchoff-z-to-bead +REMAP=M600 modalgroup=6 ngc=tool-job-begin +FEATURES=12 + +[EMCMOT] + +EMCMOT = motmod +COMM_TIMEOUT = 1.0 +BASE_PERIOD = 35000 +SERVO_PERIOD = 1000000 + +[TASK] +TASK = milltask +CYCLE_TIME = 0.010 + +[HAL] +HALUI=halui +HALFILE = 3040T.hal +POSTGUI_HALFILE = custom_postgui.hal + +[HALUI] +MDI_COMMAND = M600 +MDI_COMMAND = G0 X0 Y0 +MDI_COMMAND = G53 G0 X0 Y0 Z0 +MDI_COMMAND = G53 g0 z0 +MDI_COMMAND = G10 L20 p0 x0 y0 z0 +MDI_COMMAND = G10 L20 p0 x36.575 y-38.364 +MDI_COMMAND = G10 L2 p0 x261.3 y286.9 +MDI_COMMAND = M400 +MDI_COMMAND = o call + +[TRAJ] + +COORDINATES = XYZA +LINEAR_UNITS = mm +ANGULAR_UNITS = degree +DEFAULT_LINEAR_VELOCITY = 6.00 +MAX_LINEAR_VELOCITY = 60.00 + +[EMCIO] +EMCIO = io +CYCLE_TIME = 0.100 +TOOL_TABLE = tool.tbl +TOOL_CHANGE_AT_G30 = 0 + + +[KINS] +KINEMATICS = trivkins coordinates=XYZA +JOINTS = 4 + +[AXIS_X] +MIN_LIMIT = -0.001 +MAX_LIMIT = 290.0 +MAX_VELOCITY = 55 +MAX_ACCELERATION = 1500.0 + +[JOINT_0] +TYPE = LINEAR +HOME = 0.0 +MAX_VELOCITY = 55 +MAX_ACCELERATION = 1500.0 +STEPGEN_MAXACCEL = 1875.0 +SCALE = -400.0 +FERROR = 1 +MIN_FERROR = .25 +MIN_FERROR = 10.25 +MIN_LIMIT = -0.001 +MAX_LIMIT = 290.0 +HOME_OFFSET = -1.000000 +HOME_SEARCH_VEL = -20.000000 +HOME_LATCH_VEL = -1.250000 +HOME_IGNORE_LIMITS = YES +HOME_SEQUENCE = 1 + +[AXIS_Y] +MIN_LIMIT = -0.001 +MAX_LIMIT = 395.0 +MAX_VELOCITY = 55 +MAX_ACCELERATION = 800.0 + +[JOINT_1] +TYPE = LINEAR +HOME = 0.0 +MAX_VELOCITY = 55 +MAX_ACCELERATION = 800.0 +STEPGEN_MAXACCEL = 1250.0 +SCALE = -400.0 +FERROR = 1 +MIN_FERROR = .25 +MIN_LIMIT = -0.001 +MAX_LIMIT = 395.0 +BACKLASH = 0.01 +HOME_OFFSET = -1.000000 +HOME_SEARCH_VEL = -20.000000 +HOME_LATCH_VEL = -1.250000 +HOME_IGNORE_LIMITS = YES +HOME_SEQUENCE = 1 + +[AXIS_Z] +MIN_LIMIT = -75 +MAX_LIMIT = 0.001 +MAX_VELOCITY = 50 +MAX_ACCELERATION = 2000.0 +OFFSET_AV_RATIO = 0.2 + +[JOINT_2] +TYPE = LINEAR +HOME = 0.0 +MAX_VELOCITY = 50 +MAX_ACCELERATION = 2000.0 +STEPGEN_MAXACCEL = 2500.0 +SCALE = -400.0 +FERROR = 1 +MIN_FERROR = .25 +MIN_LIMIT = -75 +MAX_LIMIT = 0.001 +HOME_OFFSET = 1.000000 +HOME_SEARCH_VEL = 30.000000 +HOME_LATCH_VEL = 1.250000 +HOME_IGNORE_LIMITS = YES +HOME_SEQUENCE = 0 + +[AXIS_A] +MIN_LIMIT = -99999 +MAX_LIMIT = 99999 +MAX_VELOCITY = 3.33 +MAX_ACCELERATION = 2000.0 + +[JOINT_3] +TYPE = ANGULAR +HOME = 0.0 +MAX_VELOCITY = 3.33 +MAX_ACCELERATION = 2000.0 +STEPGEN_MAXACCEL = 2500.0 +#SCALE = 4.6296 #old scale maybe accurate for absolute positon mode? +SCALE = 27.7776 +FERROR = 1 +MIN_FERROR = .25 +MIN_LIMIT = -99999 +MAX_LIMIT = 99999 +SEARCH_VEL = 0 +LATCH_VEL = 0 +USE_INDEX = NO +HOME_SEQUENCE = 0 diff --git a/M100 b/M100 new file mode 100755 index 0000000..a69417c --- /dev/null +++ b/M100 @@ -0,0 +1,6 @@ +#!/bin/bash + +cd ~/linuxcnc/scannout/default + +LAST=$(find . -maxdepth 1 -name "*.jpg" -type f -printf "%p\n" | sed -e s/.\\/out-//g -e s/.jpg//g | sort -g | tail -1) +cnccapture -D /dev/v4l/by-id/usb-Etron_Technology__Inc._XWJ200-video-index0 out-$(($LAST + 1)).jpg diff --git a/M101 b/M101 new file mode 100755 index 0000000..449b01f --- /dev/null +++ b/M101 @@ -0,0 +1,4 @@ +#!/bin/bash + +rm ~/linuxcnc/scannout/default/* 2> /dev/null +exit 0 diff --git a/M102 b/M102 new file mode 100755 index 0000000..8b28657 --- /dev/null +++ b/M102 @@ -0,0 +1,32 @@ +#!/bin/bash + +cd ~/linuxcnc/scannout/multiscan + +if [ -p /tmp/CNCCaptureCtl ] +then + echo exit > /tmp/CNCCaptureCtl + sleep 2 +fi + +LAST=$(find . -maxdepth 1 -type d -printf "%p\n" | sed -e s/.\\///g | sort -g | tail -1) + +re='^[0-9]+$' +if ! [[ $LAST =~ $re ]] ; then + LAST=0 +fi + +mkdir $(($LAST+1)) + +cnccapture -d -D /dev/v4l/by-id/usb-Etron_Technology__Inc._XWJ200-video-index0 ~/linuxcnc/scannout/multiscan/$(($LAST+1))/ & + +sleep 3 + +for i in {1..600} +do + if [ -f /tmp/CNCCaptureRdy ]; then + break + else + sleep 0.1 + fi +done + diff --git a/M103 b/M103 new file mode 100755 index 0000000..ac99358 --- /dev/null +++ b/M103 @@ -0,0 +1,24 @@ +#!/bin/bash + +ctlPipe=/tmp/CNCCaptureCtl + +if [[ -p $ctlPipe ]] +then + echo snap > "$ctlPipe" + sleep 0.5 + + for i in {1..600} + do + sleep 0.1 + if [ -f /tmp/CNCCaptureRdy ]; then + echo "redy" + break + fi + done + + exit 0 +else + echo "no ctlPipe" + exit 1 +fi + diff --git a/M104 b/M104 new file mode 100755 index 0000000..82e2644 --- /dev/null +++ b/M104 @@ -0,0 +1,12 @@ +#!/bin/bash + +if [ -p /tmp/CNCCaptureCtl ] +then + echo exit > /tmp/CNCCaptureCtl + sleep 1 + exit 0 +else + exit 1 +fi + + diff --git a/UVOSBannerLCNC.gif b/UVOSBannerLCNC.gif new file mode 100644 index 0000000..0820529 Binary files /dev/null and b/UVOSBannerLCNC.gif differ diff --git a/compensation.py b/compensation.py new file mode 100644 index 0000000..1438840 --- /dev/null +++ b/compensation.py @@ -0,0 +1,232 @@ +#!/usr/bin/env python2 +"""Copyright (C) 2020 Scott Alford, scottalford75@gmail.com + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU 2 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. + +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 +""" + +update = 0.025 # this is how often the z external offset value is updated based on current x & y position +safeOffset = 20 + +import sys +import os.path, time +import numpy as np +from scipy.interpolate import griddata +from enum import Enum, unique + +import linuxcnc + +@unique +class States(Enum): + START = 1 + IDLE = 2 + LOADMAP = 3 + RUNNING = 4 + RESET = 5 + STOP = 6 + + +class Compensation : + def __init__(self) : + self.comp = {} + if len(sys.argv)<2: + print "ERROR! No input file name specified!" + sys.exit() + + self.filename = sys.argv[1] + self.method = sys.argv[2] + + # default to cubic if not specified + if self.method == "" : self.methond = "cubic" + + + def loadMap(self) : + # data coordinates and values + self.data = np.loadtxt(self.filename, dtype=float, delimiter=" ", usecols=(0, 1, 2)) + self.x_data = np.around(self.data[:,0],1) + self.y_data = np.around(self.data[:,1],1) + self.z_data = self.data[:,2] + + # get the x and y, min and max values from the data + self.xMin = int(np.min(self.x_data)) + self.xMax = int(np.max(self.x_data)) + self.yMin = int(np.min(self.y_data)) + self.yMax = int(np.max(self.y_data)) + + print " xMin = ", self.xMin + print " xMax = ", self.xMax + print " yMin = ", self.yMin + print " yMax = ", self.yMax + + # target grid to interpolate to, 1 grid per mm + self.xSteps = (self.xMax-self.xMin)+1 + self.ySteps = (self.yMax-self.yMin)+1 + self.x = np.linspace(self.xMin, self.xMax, self.xSteps) + self.y = np.linspace(self.yMin, self.yMax, self.ySteps) + self.xi,self.yi = np.meshgrid(self.x,self.y) + print " xSteps = ", self.xSteps + print " ySteps = ", self.ySteps + print " x = ", self.x + + # interpolate, zi has all the offset values but need to be transposed + self.zi = griddata((self.x_data,self.y_data),self.z_data,(self.xi,self.yi),method=self.method) + self.zi = np.transpose(self.zi) + + + def compensate(self) : + # get our nearest integer position + self.xpos = int(round(self.h['x-pos'])) + self.ypos = int(round(self.h['y-pos'])) + + zo = safeOffset + + if self.xpos >= self.xMin and self.xpos <= self.xMax and self.ypos >= self.yMin and self.ypos <= self.yMax : + self.Xn = self.xpos - self.xMin + self.Yn = self.ypos - self.yMin + + # get the nearest compensation offset and convert to counts (s32) with a scale (float) + # Requested offset == counts * scale + zo = self.zi[self.Xn,self.Yn] + if np.isnan(zo) : + zo = safeOffset + + self.scale = 0.001 + compensation = int(zo / self.scale) + return compensation + + + def run(self) : + import hal, time + + self.h = hal.component("compensation") + self.h.newpin("enable-in", hal.HAL_BIT, hal.HAL_IN) + self.h.newpin("enable-out", hal.HAL_BIT, hal.HAL_OUT) + self.h.newpin("scale", hal.HAL_FLOAT, hal.HAL_IN) + self.h.newpin("counts", hal.HAL_S32, hal.HAL_OUT) + self.h.newpin("clear", hal.HAL_BIT, hal.HAL_IN) + self.h.newpin("x-pos", hal.HAL_FLOAT, hal.HAL_IN) + self.h.newpin("y-pos", hal.HAL_FLOAT, hal.HAL_IN) + self.h.newpin("z-pos", hal.HAL_FLOAT, hal.HAL_IN) + self.h.newpin("fade-height", hal.HAL_FLOAT, hal.HAL_IN) + self.h.ready() + + s = linuxcnc.stat() + + currentState = States.START + prevState = States.STOP + + try: + while True: + time.sleep(update) + + # get linuxcnc task_state status for machine on / off transitions + s.poll() + + if currentState == States.START : + if currentState != prevState : + print("\nCompensation entering START state") + prevState = currentState + + # do start-up tasks + print(" %s last modified: %s" % (self.filename, time.ctime(os.path.getmtime(self.filename)))) + + prevMapTime = 0 + + self.h["counts"] = 0 + + # transition to IDLE state + currentState = States.IDLE + + elif currentState == States.IDLE : + if currentState != prevState : + print("\nCompensation entering IDLE state") + prevState = currentState + + # stay in IDLE state until compensation is enabled + if self.h["enable-in"] : + currentState = States.LOADMAP + + elif currentState == States.LOADMAP : + if currentState != prevState : + print("\nCompensation entering LOADMAP state") + prevState = currentState + + mapTime = os.path.getmtime(self.filename) + + if mapTime != prevMapTime: + self.loadMap() + print(" Compensation map loaded") + prevMapTime = mapTime + + # transition to RUNNING state + currentState = States.RUNNING + + elif currentState == States.RUNNING : + if currentState != prevState : + print("\nCompensation entering RUNNING state") + prevState = currentState + + if self.h["enable-in"] : + # enable external offsets + self.h["enable-out"] = 1 + + fadeHeight = self.h["fade-height"] + zPos = self.h["z-pos"] + + if fadeHeight == 0 : + compScale = 1 + elif zPos < fadeHeight: + compScale = (fadeHeight - zPos)/fadeHeight + if compScale > 1 : + compScale = 1 + else : + compScale = 0 + + if s.task_state == linuxcnc.STATE_ON : + # get the compensation if machine power is on, else set to 0 + # otherwise we loose compensation eoffset if machine power is cycled + # when copensation is enable + compensation = self.compensate() + self.h["counts"] = compensation * compScale + self.h["scale"] = self.scale + else : + self.h["counts"] = 0 + + else : + # transition to RESET state + currentState = States.RESET + + elif currentState == States.RESET : + if currentState != prevState : + print("\nCompensation entering RESET state") + prevState = currentState + + # reset the eoffsets counts register so we don't accumulate + self.h["counts"] = 0 + # toggle the clear output + self.h["clear"] = 1; + time.sleep(0.1) + self.h["clear"] = 0; + + # disable external offsets + #self.h["enable-out"] = 0 + + # transition to IDLE state + currentState = States.IDLE + + except KeyboardInterrupt: + raise SystemExit + +comp = Compensation() +comp.run() diff --git a/custom_postgui.hal b/custom_postgui.hal new file mode 100644 index 0000000..6705080 --- /dev/null +++ b/custom_postgui.hal @@ -0,0 +1,55 @@ +# Include your customized HAL commands here +# The commands in this file are run after the AXIS GUI (including PyVCP panel) starts + +net mpg pyvcp.mpg-chkbtn => cncextension.enableMpg + +#spindle +net spindle-select <= pyvcp.spindle-select.Milling + +# Vacuume and coolant +addf xor2.0 servo-thread +net sigVacuumeBtn pyvcp.vacuume-chkbtn => xor2.0.in0 +net sigIoctlFlood iocontrol.0.coolant-flood => xor2.0.in1 +net vacuume <= xor2.0.out +net vacuume => cncextension.wr1 + +addf xor2.1 servo-thread +net sigAirBtn pyvcp.air-chkbtn => xor2.1.in0 +net sigIoctlAir iocontrol.0.coolant-mist => xor2.1.in1 +net air <= xor2.1.out +net air => cncextension.wr2 + +#alcohol +net alcohol pyvcp.alcohol-scale-i => cncextension.pwm +net alcoholPrime pyvcp.prime-chkbtn => cncextension.pwmPrime + +net spindle-inhibit => pyvcp.feed-inhibit-led + +addf or2.2 servo-thread +net touchoffall-btn pyvcp.touchoffall-btn => or2.2.in0 +net button1 cncextension.button2 => or2.2.in1 + +net m600 halui.mdi-command-00 <= pyvcp.m600-btn +net g0x0y0 halui.mdi-command-01 <= pyvcp.x0y0-btn +net g53g0x0y0z0 halui.mdi-command-02 <= pyvcp.g53g0x0y0z0-btn +net g53g0z0 halui.mdi-command-03 <= pyvcp.g53g0z0-btn +net g10l20x0y0z0 halui.mdi-command-04 <= or2.2.out +net g10l20x20y20 halui.mdi-command-05 <= pyvcp.microscope-btn +net g53g10l20pin halui.mdi-command-06 <= pyvcp.touchoffpin-btn +net touchofzpin halui.mdi-command-07 <= pyvcp.touchofz-btn + +#Collisionavoid + +net collision-stop => pyvcp.collision-led +net chuck pyvcp.chuck-chkbtn => collisionavoid.chuck +setp pyvcp.chuck-chkbtn.changepin 1 + +#Autolevel +net levelpin pyvcp.level-chkbtn => compensation.enable-in +net runalprobe halui.mdi-command-08 <= pyvcp.alprobe-btn + +#Autolevel spinbox display +net alprsx pyvcp.alprsx => pyvcp.alprsxDisp +net alprsy pyvcp.alprsy => pyvcp.alprsyDisp +net alintervl pyvcp.alintervl => pyvcp.alintervlDisp +net alheight pyvcp.alheight => pyvcp.alheightDisp diff --git a/gcodeUtils/3dscann.ngc b/gcodeUtils/3dscann.ngc new file mode 100644 index 0000000..af92f8e --- /dev/null +++ b/gcodeUtils/3dscann.ngc @@ -0,0 +1,77 @@ +% +(Workpice Settings) +# = 10 +# = 10 +# = 20 + +(Imaging Settings) +# = 5 +# = 5 +# = 5 + +(Milling Settings) +# = 2000 +# = 8 +# = 1 + + +# = 0 + +g90 +G64 P0.05 + +O010 while [[-1*#] LT #] + + (MAKE IMAGES) + #1 = 0 + #2 = 0 + g0 z[#+#] + g0 x0y0 + M102 + + + O100 while [#1 LT [#]] + #2 = 0 + g0 x0 y[#1] + M103 + O101 while [#2 LT [#]] + #2 = [#2+#] + g0 x[#2] + M103 + O102 if [ #1 EQ 0 ] + # = [#+1] + O102 endif + O101 endwhile + #1 = [#1+#] + # = [#+1] + O100 endwhile + M104 + + (AREA MILL) + G0 X0.0 Y0.0 + M3 + G4 P10 + G1 F[#] Z# + + #1 = 0 + O110 while [#1 LT #] + x0 y[#1] + G1 z# + x[#] + #1 = [#1+#] + G0 z[#+1] + O110 endwhile + + O111 if [ #1 NE # ] + x0 y# + G1 z# + x[#] + G0 z[#+1] + O111 endif + + m5 + G4 P12 + + #=[#-#] +O010 endwhile +% diff --git a/gcodeUtils/AreaMill.ngc b/gcodeUtils/AreaMill.ngc new file mode 100644 index 0000000..9c5993b --- /dev/null +++ b/gcodeUtils/AreaMill.ngc @@ -0,0 +1,29 @@ +% +# = 2500 +# = 75 +# = 90 +# = 3 + +G91 G28 Z0 +M3 +G0 G90 X0.0 Y0.0 S2400 +G0 z5 + + +#1 = 0 +O100 while [#1 LT #] + G1 F[#] z0 + x[#] + #1 = [#1+#] + G0 z5 + x0 y[#1] +O100 endwhile + +g1 z0 +F[#] x[#] +G0 z5 +x0 y0 + +G91 G28 Z0 +G90 +% diff --git a/gcodeUtils/XCut.ngc b/gcodeUtils/XCut.ngc new file mode 100644 index 0000000..a00dcfb --- /dev/null +++ b/gcodeUtils/XCut.ngc @@ -0,0 +1,33 @@ +% +# = 2000 +# = 110 +# = 3 +# =1 + +(G91 G28 Z0) +G91 G28 Z0 +G90 +M3 s24000 +G00 G90 X0.0 Y0.0 +G0 z5 +G1 F[#] + + +#1 = 0 +O100 while [#1 gt 0-[#-# ]] + #1 = [#1-#] + G1 F[#] z[#1] + x[#] + G0 z5 + x0 +O100 endwhile + +G1 F[#] +z[0-#] +x[#] +G0 z5 +x0 +G91 G28 Z0 +G90 +M2 +% diff --git a/gcodeUtils/YCut.ngc b/gcodeUtils/YCut.ngc new file mode 100644 index 0000000..1570169 --- /dev/null +++ b/gcodeUtils/YCut.ngc @@ -0,0 +1,29 @@ +% +# = 2000 +# = 110 +# = 3 +# =1 + +G91 G28 Z0 +G00 G90 X0.0 Y0.0 S0 +G0 z5 +G1 F[#] + + +#1 = 0 +O100 while [#1 gt 0-[#-#]] + #1 = [#1-#] + G1 F[#] z[#1] + Y[#] + G0 z5 + Y0 +O100 endwhile + +G1 F[#] +z[0-#] +Y[#] +G0 z5 +Y0 +G91 G28 Z0 +G90 +% diff --git a/gcodeUtils/scann.ngc b/gcodeUtils/scann.ngc new file mode 100644 index 0000000..23b9b7d --- /dev/null +++ b/gcodeUtils/scann.ngc @@ -0,0 +1,36 @@ +% +# = 50 +# = 50 +# = 5 +# = 5 + +# = 0 +# = 0 + +#1 = 0 +#2 = 0 + +M102 +g90 g0 x0y0 + +O100 while [#1 LT [#]] + #2 = 0 + g0 x0 y[#1] + M103 + O101 while [#2 LT [#]] + #2 = [#2+#] + g0 x[#2] + M103 + O102 if [ #1 EQ 0 ] + # = [#+1] + O102 endif + O101 endwhile + #1 = [#1+#] + # = [#+1] +O100 endwhile + +M104 + +(DEBUG, # by #) + +% diff --git a/gcodeUtils/scannSync.ngc b/gcodeUtils/scannSync.ngc new file mode 100644 index 0000000..08e4376 --- /dev/null +++ b/gcodeUtils/scannSync.ngc @@ -0,0 +1,34 @@ +% +# = 50 +# = 50 +# = 5 +# = 5 + +# = 0 +# = 0 + +#1 = 0 +#2 = 0 + +M101 +g90 g0 x0y0 + +O100 while [#1 LT [#]] + #2 = 0 + g0 x0 y[#1] + M100 + O101 while [#2 LT [#]] + #2 = [#2+#] + g0 x[#2] + M100 + O102 if [ #1 EQ 0 ] + # = [#+1] + O102 endif + O101 endwhile + #1 = [#1+#] + # = [#+1] +O100 endwhile + +(DEBUG, # by #) + +% diff --git a/microscopeTuchoff.ngc b/microscopeTuchoff.ngc new file mode 100644 index 0000000..e69de29 diff --git a/rectangle_probe.ngc b/rectangle_probe.ngc new file mode 100644 index 0000000..a67ef41 --- /dev/null +++ b/rectangle_probe.ngc @@ -0,0 +1,73 @@ +( Rectangular area probe ) +o sub +# = 0 +# = #<_hal[pyvcp.alprsx]> +# = #<_hal[pyvcp.alintervl]> +# = 0 +# = #<_hal[pyvcp.alprsy]> +# = #<_hal[pyvcp.alintervl]> +# = #<_hal[pyvcp.alheight]> +# = 0 +# = 50 + +# = [fix [abs[# - #]/# + 1]] +# = [fix [abs[# - #]/# + 1]] + +O1 if[[#*#-#] lt #] + # = [# + 1] +O1 endif +O2 if[[#*#-#] lt #] + # = [# + 1] +O2 endif + +# = [# * #] + +(debug, Probing # * # = # points) +(LOGOPEN,probe-results.txt) + +# = 0 +# = 0 +G53 G0 Z0 +G0 X0 Y0 +G30.1 +G0Z# +F# + +O12 while [# lt #] + # = 0 + # = [#+#*#] +O13 if [# gt #] + # = # +O13 endif + G0 Y# +O14 while [# lt #] + # = 0 +O15 if [[#/2] - fix[#/2] eq 0] + # = [# + # * #] +O15 else + # = [# + # * [# - # - 1]] +O15 endif +O16 if [# gt #] + # = # +O16 endif + # = 1 + G0 x# + G38.2Z# (probe until contact, toward work, with error) + G0z# + # = [#5061+#5181] + # = [#5062+#5182] + # = #5063 + (LOG,# # #) + # = [# + 1] +O14 endwhile + G0Z# + # = [# + 1] +O12 endwhile + +(LOG,# Finished: total points = #) +(LOGCLOSE) +(debug, Finished: see probe-results.txt) + +G0Z# +G0X#Y# +o endsub diff --git a/testpannel.hal b/testpannel.hal new file mode 100644 index 0000000..b18a081 --- /dev/null +++ b/testpannel.hal @@ -0,0 +1 @@ +loadusr pyvcp ./pannel.xml diff --git a/tool-change.ngc b/tool-change.ngc new file mode 100644 index 0000000..33cd7cd --- /dev/null +++ b/tool-change.ngc @@ -0,0 +1,96 @@ +O SUB + +#<_UseInches> = 0 ( set to 1 to use inches here, or 0 to use millimeters; should match units on tool.tbl dimensions ) +#<_TravelZ> = 0 ( machine Z coordinate for travelling, typically near max Z to avoid ever hitting the work ) +#<_TravelFeed> = 3000 ( feedrate used for general Z moves when avoiding G0 ) +#<_ProbeX> = 9.5 ( machine X coordinate of switch/touch-off plate ) +#<_ProbeY> = 24.5 ( machine Y coordinate of switch/touch-off plate ) +#<_ProbeFastZ> = -20 ( machine Z coord to move to before starting probe, longest tool should not touch switch at this Z ) +#<_ProbeMinZ> = -70 ( machine Z coord to stop probe, shortest tool must touch switch at this Z, must be > min Z ) +#<_ProbeRetract> = 0.2 ( small distance to retract before approaching switch/touch-off plate second time ) +#<_ProbeFastFeed> = 3000 ( feed rate for moving to _ProbeFastZ ) +#<_ProbeFeed1> = 750 ( feed rate for touching switch/touch-off plate first time ) +#<_ProbeFeed2> = 3 ( feed rate for touching switch/touch-off plate second time ) +#<_ToolChangeX> = 100 ( machine X coordinate to pause at for manual tool changing ) +#<_ToolChangeY> = 100 ( machine Y coordinate to pause at for manual tool changing ) +#<_MistOnDuringProbe> = 0 ( set to 1 for mist, or 2 for coolant, or 0 for nothing during probing, to clear switch of swarf ) + + + +O100 IF [ EXISTS[#<_ToolDidReferance>] EQ 0 ] + #<_ToolDidReferance> = 0 +O100 ENDIF + +O101 IF [ EXISTS[#<_IgnoreFirstTool>] EQ 0 ] + #<_IgnoreFirstTool> = 0 +O101 endif + +O102 IF [ #<_IgnoreFirstTool> EQ 0 ] + #<_IgnoreFirstTool> = 1 +O102 ELSE + M49 (disable spindle speed and feed rate override controls) + O105 IF [ #<_ToolDidReferance> EQ 0 ] + G49 ( clear tool length compensation prior to saving state if this is first time ) + O105 ENDIF +(AXIS,hide) + M6 ( do the normal M6 stuff ) + M70 ( save current modal state ) + + M9 ( turn off coolant, will be restored on return if it was on ) + M5 ( turn off spindle, cannot be on during the probe ) + G[21 - #<_UseInches>] ( use inches or millimeters as required here, units will be restored on return ) + G30.1 ( save current position in #5181-#5183... ) + G49 ( clear tool length compensation ) + G90 ( use absolute positioning here ) + G94 ( use feedrate in units/min ) + G40 ( turn cutter radius compensation off here ) + + G53 G1 F[#<_TravelFeed>] Z[#<_TravelZ>] ( go to high travel level on Z ) + + O200 IF [ #<_ToolDidReferance> EQ 0 ] + G53 G0 X[#<_ProbeX>] Y[#<_ProbeY>] ( to probe switch ) + G53 G1 F[#<_ProbeFastFeed>] Z[#<_ProbeFastZ>]( move tool closer to switch -- we shouldn't hit it ) + G54 G1 F[#<_ProbeFeed1>] G91 ( use relative positioning ) + O103 IF [ #<_MistOnDuringProbe> EQ 1 OR #<_MistOnDuringProbe> EQ 2 ] + M[7 + #<_MistOnDuringProbe> - 1] ( turn on mist/coolant ) + O103 ENDIF + G38.2 Z[#<_ProbeMinZ> - #<_ProbeFastZ>] F[#<_ProbeFeed1>] ( trip switch slowly ) + G0 Z[#<_ProbeRetract>] ( go up slightly ) + G38.2 Z[#<_ProbeRetract>*-1.25] F[#<_ProbeFeed2>] ( trip switch very slowly ) + M9 ( turn off mist ) + G90 ( use absolute positioning ) + #<_ToolZRef> = #5063 ( save trip point ) + #<_ToolZLast> = #<_ToolZRef> ( save last tool Z position ) + G53 G1 F[#<_TravelFeed>] Z[#<_TravelZ>] ( return to safe level ) + #<_ToolDidReferance> = 1 ( we have been in this section to set reference value already ) + G53 G0 X[#<_ToolChangeX>] Y[#<_ToolChangeY>] ( nice place for changing tool ) + (MSG, SwitchTool ) + M0 ( pause execution ) + O200 ENDIF + + G53 G0 X[#<_ProbeX>] Y[#<_ProbeY>] ( to high place directly over switch ) + G53 G1 F[#<_ProbeFastFeed>] Z[#<_ProbeFastZ>]( move tool closer to switch -- we shouldn't hit it ) + G54 G1 F[#<_ProbeFeed1>] G91 ( use relative positioning ) + O104 IF [ #<_MistOnDuringProbe> EQ 1 OR #<_MistOnDuringProbe> EQ 2 ] + M[7 + #<_MistOnDuringProbe> - 1] ( turn on mist/coolant ) + O104 ENDIF + G38.2 Z[#<_ProbeMinZ> - #<_ProbeFastZ>] F[#<_ProbeFeed1>] ( trip switch slowly ) + G0 Z[#<_ProbeRetract>] ( go up slightly ) + G38.2 Z[#<_ProbeRetract>*-1.25] F[#<_ProbeFeed2>] ( trip switch very slowly ) + M9 ( turn off mist ) + G90 ( use absolute positioning ) + #<_ToolZ> = #5063 ( save new tool length ) + G43.1 Z[#<_ToolZ> - #<_ToolZRef>] ( set new tool length Z offset, we do this now to show operator even though it has to be set again after M72 ) + #<_ToolZLast> = #<_ToolZ> ( save last tool length ) + G53 G0 Z[#<_TravelZ>] ( return to safe level ) + G53 G0 X[#5181] Y[#5182] ( return to saved position ) + G53 G0 Z[#5183] + M72 ( restore modal state ) + M3 + G43.1 Z[#<_ToolZ> - #<_ToolZRef>] ( set new tool length Z offset ) + M48 (enable spindle speed and feed rate override controls) + (AXIS,show) +O102 ENDIF + +O ENDSUB +M2 diff --git a/tool-job-begin.ngc b/tool-job-begin.ngc new file mode 100644 index 0000000..ca1255e --- /dev/null +++ b/tool-job-begin.ngc @@ -0,0 +1,12 @@ +O SUB +( Filename: tool-job-begin.ngc ) +( LinuxCNC Manual Tool-Change Subroutines for Milling Machines version 1.1: subroutine 2/2 ) +( Intended to be run as a remapped M600 command. Used to indicate that the next tool change, M6, is the first tool of a job. ) + +#<_ToolDidFirst> = 0 ( new job, we haven't yet called for the first time ) +#<_IgnoreFirstTool> = 0 +#<_ToolDidReferance> = 0 +G49 ( clear tool height adjustment ) + +O ENDSUB +M2 diff --git a/tool.tbl b/tool.tbl new file mode 100644 index 0000000..adf759b --- /dev/null +++ b/tool.tbl @@ -0,0 +1,15 @@ +T1 P1 D2 Z0 +T2 P2 D2 Z0 +T3 P3 D2 Z0 +T4 P4 D2 Z0 +T5 P5 D2 Z0 +T6 P6 D2 Z0 +T7 P7 D2 Z0 +T8 P8 D2 Z0 +T9 P9 D2 Z0 +T10 P10 D2 Z0 +T11 P11 D2 Z0 +T12 P12 D2 Z0 +T13 P13 D2 Z0 +T14 P14 D2 Z0 + diff --git a/touchoff-z-to-bead.ngc b/touchoff-z-to-bead.ngc new file mode 100644 index 0000000..283c1a1 --- /dev/null +++ b/touchoff-z-to-bead.ngc @@ -0,0 +1,38 @@ +o sub +#<_TravelZ> = 0 ( machine Z coordinate for travelling, typically near max Z to avoid ever hitting the work ) +#<_ProbeX> = 9.5 ( machine X coordinate of switch/touch-off plate ) +#<_ProbeY> = 24.5 ( machine Y coordinate of switch/touch-off plate ) +#<_ProbeFastZ> = -20 ( machine Z coord to move to before starting probe, longest tool should not touch switch at this Z ) +#<_ProbeMinZ> = -70 ( machine Z coord to stop probe, shortest tool must touch switch at this Z, must be > min Z ) +#<_ProbeRetract> = 0.2 ( small distance to retract before approaching switch/touch-off plate second time ) +#<_ProbeFastFeed> = 3000 ( feed rate for moving to _ProbeFastZ ) +#<_ProbeFeed1> = 750 ( feed rate for touching switch/touch-off plate first time ) +#<_ProbeFeed2> = 3 ( feed rate for touching switch/touch-off plate second time ) + +#<_ProbeToBeadZ> = 13.1 + +m73 +G30.1 ( save current position in #5181-#5183... ) +G49 ( clear tool length compensation ) +G90 ( use absolute positioning here ) +G94 ( use feedrate in units/min ) +G40 ( turn cutter radius compensation off here ) +G54 (use coordinate system 1) +M49 (disable spindle speed and feed rate override controls) +G53 G0 Z[#<_TravelZ>] ( go to high travel level on Z ) +G53 G0 X[#<_ProbeX>] Y[#<_ProbeY>] ( to probe switch ) +G53 G1 F[#<_ProbeFastFeed>] Z[#<_ProbeFastZ>] ( move tool closer to switch -- we shouldn't hit it ) +G54 G1 F[#<_ProbeFeed1>] G91 ( use relative positioning ) + +G38.2 Z[#<_ProbeMinZ> - #<_ProbeFastZ>] F[#<_ProbeFeed1>] ( trip switch slowly ) +G0 Z[#<_ProbeRetract>] ( go up slightly ) +G38.2 Z[#<_ProbeRetract>*-1.25] F[#<_ProbeFeed2>] ( trip switch very slowly ) +G90 ( use absolute positioning ) +G10 L20 p0 z[#<_ProbeToBeadZ>] +(DEBUG, #5063) +G53 G0 Z[#<_TravelZ>] ( return to safe level ) +G53 G0 X[#5181] Y[#5182] +G53 G0 Z[#5183] +M48 (enable spindle speed and feed rate override controls) +o endsub +M2