Import LinuxCNC source tree

This commit is contained in:
Wang Dequan
2026-08-20 06:17:39 +08:00
commit 2c814634c3
9429 changed files with 10556013 additions and 0 deletions

View File

@@ -0,0 +1,284 @@
#!/usr/bin/env python3
# Rolf Redford, Nov 2018
#import libraries
from vismach import *
import hal
import math
import sys
#----------------------------------------------------------------------------------------------------------------------------------
# Starting and defining
# used for diameter for versions less than 2.8.
# it gives us way to access variable values from vismach script.
import linuxcnc
s = linuxcnc.stat()
s.poll()
# Here is where we define pins that linuxcnc will send
# data to, in order to make movements.
# We will need 5 pins, 3 for motion and 2 for tool stats.
# tooldiameter isn't really used but if you are using 2.8 you can make couple changes
# in this file, and uncomment last line in HAL file.
# add joints. Mill has 3.
c = hal.component("3axis-tutorial")
c.newpin("jointX", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("jointY", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("jointZ", hal.HAL_FLOAT, hal.HAL_IN)
# tool length and diameter pins?
c.newpin("toollength", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("tooldiameter", hal.HAL_FLOAT, hal.HAL_IN)
# tells loadusr pins is ready
c.ready()
# Used for tool cylinder
# it will be updated in shape and length by function below.
toolshape = CylinderZ(0)
toolshape = Color([1, .5, .5, .5],[toolshape])
# updates tool cylinder shape.
class HalToolCylinder(CylinderZ):
def __init__(self, comp, *args):
# get machine access so it can
# change itself as it runs
# specifically tool cylinder in this case.
CylinderZ.__init__(self, *args)
self.comp = c
def coords(self):
# update data - not needed if using 2.8 and self.comp["tooldiameter"]
# 2.7 does not have direct pin for diameter so this is workaround. commented out code is direct way to do it.
# s.poll() # 2.8 don't need this, comment out if using 2.8.
# get diameter and divide by 2 to get radius.
# rad = ( s.tool_table[s.tool_in_spindle].diameter ) # 2.7 workaround
rad = ( self.comp["tooldiameter"] ) # 2.8 only
rad = rad / 2 # change to rad
# this instantly updates tool model but tooltip doesn't move till -
# tooltip, the drawing point will NOT move till g43h(tool number) is called, however.
# Tool will "crash" if h and tool length does not match.
leng = s.tool_table[s.tool_in_spindle].zoffset
# Update tool length when g43h(toolnumber) is called, otherwise stays at 0 or previous size.
# commented out as I prefer machine to show actual tool size right away.
#leng = self.comp["toollength"]
return (-leng, rad, 0, rad)
#----------------------------------------------------------------------------------------------------------------------------------
# Concept of machine design
# The model follows logical tree design - picture the tree, with branch and smaller branches off it
# if you move the larger branch, smaller branches will move with it, but if you move smaller branch larger will not.
#
# Machine design follows that conceptal design, so for example if you move X, it can move on its own, but if you move Y,
# it will also move X assembly, as it is attached to Y assembly.
# so for this machine, tree looks like this:
# model
# |
# |---frame
# | |
# | |---base
# | |
# | |---column
# | |
# | |---top
# |
# |
# |---yassembly
# | |
# | |
# | |---xassembly
# | | |
# | | |
# | | |---xbase
# | | |
# | | |---work
# | |
# | |
# | |---ybase
# |
# |
# |---zassembly
# |
# |
# |---zframe
# | |
# | |---zbody
# | |
# | |---spindle
# |
# |
# |---toolassembly
# |
# |---cat30
# |
# |---tool
# |
# |---tooltip
# |
# |---(tool cylinder function)
# As you can see, lowest parts must exist first before it can be grouped with others into assembly.
# So you build upwards from lowest point in tree and assembly them together.
# Same is applicable for any design of machine. Look at machine arm example and you will see that it starts
# with tip and adds to larger part of arm then it finally groups with base.
#----------------------------------------------------------------------------------------------------------------------------------
# Starting with fixed frame
# start creating base itself, floor and column for z. box is centered on 0,0,0
base = BoxCentered(200, 560, 20)
# translate it so top of base is at zero
base = Translate([base], 0,0,-10)
# column, attached to base on side.
# Box() accepts extents
# ie -100 to 100 is 200 wide, and rightmost is at -100 on coord.
# Box(x rightmost, y futherest, z lowest, x leftmost, y nearest, z highest)
column = Box( -60, -260, 0, 60, -200, 400)
# add block on top
# not really needed, but I like how it looks with it.
# bare column looks little bit strange for some reason.
top = Box(-80,-280,400, 80,-160,440)
# now fuse it into "frame"
frame = Collection([base, column, top])
# color it grayish
frame = Color([.8,.8,.8,1],[frame])
#----------------------------------------------------------------------------------------------------------------------------------
# Moving parts section
# Start with X, Y then finally Z with tool and spindle.
# X table addition
xbase = BoxCentered(1000,200,30)
# let's color it blue
xbase = Color([0,0,1,1], [xbase])
# Move table so top is at zero for now,
# so work (default 0,0,0) is on top of table.
xbase = Translate([xbase], 0,0, -15)
# now create work which would be defined by Linuxcnc.
# I suspect we would need to define shape but not enough is known.
# for now just create an point that would be bottom center of stock.
work = Capture()
# group work and xbase together so they move together.
xassembly = Collection([xbase, work])
# work is now defined and grouped, and default at 0,0,0, or
# currently on top of x part table.
# so we move table group upwards, taking work with it.
xassembly = Translate([xassembly], 0,0, 35)
# Must define part motion before it becomes part of collection.
# Must have arguments, object itself, c (defined above), then finally scale from the pin to x y z.
# since this moves solely on X axis, only x is 1, rest is zero.
# you could use fractions for say axis that moves in compound like arm for example
# but this machine is very simple, so all axis will be purely full on axis and zero on other axis.
xassembly = HalTranslate([xassembly], c, "jointX", 1, 0, 0)
# Y assembly creation
ybase = BoxCentered(200, 200, 10)
# colorize it green so we can see it separate from frame.
ybase = Color([0,1,0,1], [ybase])
# don't define translation for this one, as y also moves X table.
# translating this would move itself alone. You want it to move X parts also.
# X table is moved by Y base, so we have to make X child of Y.
# now define collection of ybase and xassembly.
yassembly = Collection([ybase, xassembly])
# define its motion first before translate.
yassembly = HalTranslate([yassembly], c, "jointY", 0, 1, 0)
# Now that translate is locked with part,
# move it upwards so its on frame base.
yassembly = Translate([yassembly], 0,0,5)
# spindle head
# define small cylinder where tool will be attached to.
# It is shallow, basically exposed end of "cat30" toolholder.
# let's pretend machine uses cat30.
cat30 = CylinderZ(0, 30, 20, 40) # cone wider top smaller bottom
# color it red, as in danger, tool!
cat30 = Color([1,0,0,1], [cat30])
# Define tool and grab such model information from linuxcnc
# tooltip is initially in vismach "world" 0,0,0.
# what it does is place where line drawing is in world, so
# you can see where machine think tip of tool is.
# first capture it, so we can use it and move it to where
# defined end of tool is.
tooltip = Capture()
# Now that we have tooltip, let's attach it to cylinder function (see above)
# it creates cylinder then translates tooltip to end of it.
tool = Collection([
Translate([HalTranslate([tooltip], c, "toollength", 0, 0, -1)], 0, 0, 0),
HalToolCylinder(toolshape)
])
# Since tool is defined, lets attach it to cat30
# Group cat30 and tooltip
toolassembly = Collection([cat30, tool])
# now that tool is properly attached, we can move it
# and tool will "move" with it now.
# BUT we need to build rest of head in such way that TOP of head is defined as Z zero.
# Move it so it attaches to bottom of spindle body.
toolassembly = Translate([toolassembly],0,0,-120)
# Start building Z assembly head, including spindle and support
# top is at zero as I want top to be defined as Z home top.
spindle = CylinderZ(-100, 60, 0, 60) # top is at zero
# define rest of head using Box
zbody = Box(-30, -200, 0, 30, 0, -100)
# fuse into z assembly
zframe = Collection([zbody, spindle])
# color it yellow
zframe = Color([1,1,0,1], [zframe])
# Now that all parts are created, let's group it and finally make Z motion
zassembly = Collection([zframe, toolassembly])
# define Z motion
zassembly = HalTranslate([zassembly], c, "jointZ", 0, 0, 1)
# Now that motion is defined,
# we can now move it to Z home position.
zassembly = Translate([zassembly], 0,0, 400)
#----------------------------------------------------------------------------------------------------------------------------------
# Getting it all together and finishing model
# Assembly everything into single model.
# xassembly is already included into yassembly so don't need to include it.
model = Collection([frame, yassembly, zassembly])
# Finally, call main() with parameter to let linuxcnc know.
# parameter list:
# final model name must include all parts you want to use
# tooltip (special for tool tip inclusuion)
# work (special for work part inclusion)
# size of screen (bigger means more zoomed out to show more of machine)
# last 2 is where view point source is.
main(model, tooltip, work, 600, lat=-75, lon=215)

View File

@@ -0,0 +1,71 @@
# core HAL config file for simulation
# first load all the RT modules that will be needed
# kinematics
loadrt [KINS]KINEMATICS
#autoconverted trivkins
# motion controller, get name and thread periods from ini file
loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS
# load 6 differentiators (for velocity and accel signals
loadrt ddt names=ddt_x,ddt_xv,ddt_y,ddt_yv,ddt_z,ddt_zv
# load additional blocks
loadrt hypot names=vel_xy,vel_xyz
# add motion controller functions to servo thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
# link the differentiator functions into the code
addf ddt_x servo-thread
addf ddt_xv servo-thread
addf ddt_y servo-thread
addf ddt_yv servo-thread
addf ddt_z servo-thread
addf ddt_zv servo-thread
addf vel_xy servo-thread
addf vel_xyz servo-thread
# create HAL signals for position commands from motion module
# loop position commands back to motion module feedback
net Xpos joint.0.motor-pos-cmd => joint.0.motor-pos-fb ddt_x.in
net Ypos joint.1.motor-pos-cmd => joint.1.motor-pos-fb ddt_y.in
net Zpos joint.2.motor-pos-cmd => joint.2.motor-pos-fb ddt_z.in
# send the position commands thru differentiators to
# generate velocity and accel signals
net Xvel ddt_x.out => ddt_xv.in vel_xy.in0
net Xacc <= ddt_xv.out
net Yvel ddt_y.out => ddt_yv.in vel_xy.in1
net Yacc <= ddt_yv.out
net Zvel ddt_z.out => ddt_zv.in vel_xyz.in0
net Zacc <= ddt_zv.out
# Cartesian 2- and 3-axis velocities
net XYvel vel_xy.out => vel_xyz.in1
net XYZvel <= vel_xyz.out
# estop loopback
net estop-loop iocontrol.0.user-enable-out iocontrol.0.emc-enable-in
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
# start 3axis-tutorial vismach addition
loadusr -W ./3axis-tutorial
# "wire" linuxcnc pins to joints defined in vismach file
net j0 joint.0.pos-fb => 3axis-tutorial.jointX
net j1 joint.1.pos-fb => 3axis-tutorial.jointY
net j2 joint.2.pos-fb => 3axis-tutorial.jointZ
#tool sinput
net tool_len 3axis-tutorial.toollength <= motion.tooloffset.z
net tool_rad halui.tool.diameter 3axis-tutorial.tooldiameter # Only in 2.8 or later

View File

@@ -0,0 +1,216 @@
# This config file was created 2018-11-21 06:26:44.941844 by the update_ini script
# The original config files may be found in the /home/john/linuxcnc/configs/rolfmill/rolfmill.old directory
# EMC controller parameters for a simulated machine.
# General note: Comments can either be preceded with a # or ; - either is
# acceptable, although # is in keeping with most linux config files.
# General section -------------------------------------------------------------
[EMC]
# Version of this INI file
VERSION = 1.0
# Name of machine, for use with display, etc.
MACHINE = 3axis-tutorial
# Debug level, 0 means no messages. See src/emc/nml_int/emcglb.h for others
# DEBUG = 0x7FFFFFFF
DEBUG = 0
# Sections for display options ------------------------------------------------
[DISPLAY]
# Name of display program, e.g., xemc
DISPLAY = axis
# Cycle time, in seconds, that display will sleep between polls
CYCLE_TIME = 0.100
# Path to help file
HELP_FILE = doc/help.txt
# Initial display setting for position, RELATIVE or MACHINE
POSITION_OFFSET = RELATIVE
# Initial display setting for position, COMMANDED or ACTUAL
POSITION_FEEDBACK = ACTUAL
# Highest value that will be allowed for feed override, 1.0 = 100%
MAX_FEED_OVERRIDE = 1.2
MAX_SPINDLE_OVERRIDE = 1.0
# Prefix to be used
PROGRAM_PREFIX =/home/rolf/linuxcnc/nc_files #need to change
# Introductory graphic
INTRO_GRAPHIC = linuxcnc.gif
INTRO_TIME = 5
#EDITOR = geany
INCREMENTS = 1 mm, .01 in, .1mm, 1 mil, .1 mil, 1/8000 in
[FILTER]
PROGRAM_EXTENSION = .png,.gif,.jpg Grayscale Depth Image
PROGRAM_EXTENSION = .py Python Script
png = image-to-gcode
gif = image-to-gcode
jpg = image-to-gcode
py = python3
# Task controller section -----------------------------------------------------
[RS274NGC]
# File containing interpreter variables
PARAMETER_FILE = 3axis-tutorial_mm.var
# Motion control section ------------------------------------------------------
[EMCMOT]
EMCMOT = motmod
# Timeout for comm to emcmot, in seconds
COMM_TIMEOUT = 1.0
# BASE_PERIOD is unused in this configuration but specified in core_sim.hal
BASE_PERIOD = 0
# Servo task period, in nano-seconds
SERVO_PERIOD = 1000000
# Hardware Abstraction Layer section --------------------------------------------------
[TASK]
# Name of task controller program, e.g., milltask
TASK = milltask
# Cycle time, in seconds, that task controller will sleep between polls
CYCLE_TIME = 0.001
# Part program interpreter section --------------------------------------------
[HAL]
# The run script first uses halcmd to execute any HALFILE
# files, and then to execute any individual HALCMD commands.
#
# list of hal config files to run through halcmd
# files are executed in the order in which they appear
HALFILE = 3axis-tutorial.hal
# list of halcmd commands to execute
# commands are executed in the order in which they appear
#HALCMD = save neta
# Single file that is executed after the GUI has started. Only supported by
# AXIS at this time (only AXIS creates a HAL component of its own)
#POSTGUI_HALFILE = test_postgui.hal
HALUI = halui
# Trajectory planner section --------------------------------------------------
[HALUI]
#No Content
[TRAJ]
AXES = 3
COORDINATES = X Y Z
HOME = 0 0 0
LINEAR_UNITS = mm
ANGULAR_UNITS = degree
DEFAULT_LINEAR_VELOCITY = 30.48
MAX_LINEAR_VELOCITY = 53.34
DEFAULT_ACCELERATION = 508
MAX_LINEAR_ACCELERATION = 508
POSITION_FILE = position_mm.txt
ARC_BLEND_ENABLE = 1
ARC_BLEND_FALLBACK_ENABLE = 1
ARC_BLEND_OPTIMIZATION_DEPTH = 50
#Use this setting for no smoothing (for debugging and stress-testing)
ARC_BLEND_SMOOTHING_THRESHOLD = .75
#Use this setting for "normal" smoothing, i.e. if we blend over more than 40% of a segment
#ARC_BLEND_SMOOTHING_THRESHOLD = 0.40
# Axes sections ---------------------------------------------------------------
[EMCIO]
# tool table file
TOOL_TABLE = tool.tbl
TOOL_CHANGE_POSITION = 0 0 0
[KINS]
KINEMATICS = trivkins
#This is a best-guess at the number of joints, it should be checked
JOINTS = 3
[AXIS_X]
MIN_LIMIT = -500.0
MAX_LIMIT = 500.0
MAX_VELOCITY = 25.0
MAX_ACCELERATION = 750.0
[JOINT_0]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 25.0
MAX_ACCELERATION = 750.0
STEPGEN_MAXACCEL = 937.5
SCALE = 80.0
FERROR = 1
MIN_FERROR = .25
MIN_LIMIT = -500.0
MAX_LIMIT = 500.0
HOME_OFFSET = 0.0
[AXIS_Y]
MIN_LIMIT = -100.0
MAX_LIMIT = 100.0
MAX_VELOCITY = 25.0
MAX_ACCELERATION = 750.0
[JOINT_1]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 25.0
MAX_ACCELERATION = 750.0
STEPGEN_MAXACCEL = 937.5
SCALE = 80.0
FERROR = 1
MIN_FERROR = .25
MIN_LIMIT = -100.0
MAX_LIMIT = 100.0
HOME_OFFSET = 0.0
[AXIS_Z]
MIN_LIMIT = -240.0
MAX_LIMIT = 0.001
MAX_VELOCITY = 25.0
MAX_ACCELERATION = 750.0
[JOINT_2]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 25.0
MAX_ACCELERATION = 750.0
STEPGEN_MAXACCEL = 937.5
SCALE = 80.0
FERROR = 1
MIN_FERROR = .25
MIN_LIMIT = -240.0
MAX_LIMIT = 0.001
HOME_OFFSET = 0.0
# section for main IO controller parameters -----------------------------------

View File

@@ -0,0 +1,2 @@
A simple vismach 3 axis mill example built using primitives.
Comments is in 3axis-tutorial vismach file, and some in 3axis-tutorial.hal explains step by step the process to build.

View File

@@ -0,0 +1,4 @@
T1 P1 Z12 D30 ;big
T2 P2 Z50 D10 ;1/16 end mill
T3 P3 Z50 D5 ;#7 tap drill
T99999 P99999 Z0.1 ;big tool number

View File

@@ -0,0 +1,200 @@
[EMC]
VERSION = 1.1
MACHINE = Sim-5Axis Bridge Mill (xyzbcw)
DEBUG = 0
[DISPLAY]
GEOMETRY = XYZCBW
OPEN_FILE = ./5axisgui.ngc
INCREMENTS = 10 mm, 1 mm, .1 mm
JOG_AXES = XYZC
DISPLAY = axis
CYCLE_TIME = 0.200
POSITION_OFFSET = RELATIVE
POSITION_FEEDBACK = ACTUAL
MAX_FEED_OVERRIDE = 2.0
PROGRAM_PREFIX = ../../nc_files/
INTRO_GRAPHIC = linuxcnc.gif
INTRO_TIME = 5
TOOL_EDITOR = tooledit z diam
#EDITOR = geany
PYVCP = 5axis.xml
[RS274NGC]
SUBROUTINE_PATH = ./remap_subs
HAL_PIN_VARS = 1
REMAP = M428 modalgroup=10 ngc=428remap
REMAP = M429 modalgroup=10 ngc=429remap
REMAP = M430 modalgroup=10 ngc=430remap
PARAMETER_FILE = 5axis.var
[EMCMOT]
EMCMOT = motmod
COMM_TIMEOUT = 1.0
SERVO_PERIOD = 1000000
[TASK]
TASK = milltask
CYCLE_TIME = 0.010
[HAL]
HALUI = halui
HALFILE = LIB:basic_sim.tcl
HALFILE = 5axisgui.hal
HALCMD = net :kinstype-select <= motion.analog-out-03 => motion.switchkins-type
POSTGUI_HALFILE = 5axis_postgui.hal
[HALUI]
# M428:bridgemill (kinstype==0 startupDEFAULT)
# M429:identity kins (kinstype==1)
# M430:userk kins (kinstype==2)
MDI_COMMAND = M428
MDI_COMMAND = M429
MDI_COMMAND = M430
[TRAJ]
COORDINATES = XYZBCWY
LINEAR_UNITS = mm
ANGULAR_UNITS = degree
MAX_ANGULAR_VELOCITY = 360.0
DEFAULT_LINEAR_VELOCITY = 200.0
MAX_LINEAR_VELOCITY = 346.0
MAX_LINEAR_ACCELERATION = 800.0
DEFAULT_LINEAR_ACCELERATION = 800.0
[EMCIO]
TOOL_TABLE = 5axis.tbl
[KINS]
# Note: Supported coordinates are XYZBCW but the W coordinate
# motion is incorporated into the X,Y,Z axes.
# Use of the W coordinate requires a joint (5)
# in order to allow display of W values.
# Use immediate homing for this joint (JOINT_5)
# Note: 5axiskins is misnomer
# (xyzbcw uses 6 joints)
# (xyzbcwy uses 7 joints)
# xyzbcw
# type0:5axiskins, type1:identity, type2:userk
# x:joint0,y:joint1,z:joint2,b:joint3,c:joint4,w:joint5
# JOINTS = 6
# KINEMATICS = 5axiskins
# illustraed below is complex example with duplicate
# coord letters for y, 7 joints total):
# type0:5axiskins, type1:identity, type2:userk
# x:joint0
# y:joint1 AND joint6
# z:joint2
# b:joint3
# c:joint4
# w:joint5
JOINTS = 7
KINEMATICS = 5axiskins coordinates=xyzbcwy
[AXIS_X]
MIN_LIMIT = -500
MAX_LIMIT = 500
MAX_VELOCITY = 200
MAX_ACCELERATION = 800
[AXIS_Y]
MIN_LIMIT = -500
MAX_LIMIT = 500
MAX_VELOCITY = 200
MAX_ACCELERATION = 800
[AXIS_Z]
MIN_LIMIT = -500
MAX_LIMIT = 100
MAX_VELOCITY = 200
MAX_ACCELERATION = 800
# B is one-to-one to JOINT_3
[AXIS_B]
MIN_LIMIT = -120
MAX_LIMIT = 120
MAX_VELOCITY = 60
MAX_ACCELERATION = 200
# C is one-to-one to JOINT_4
[AXIS_C]
MIN_LIMIT = -36000
MAX_LIMIT = 36000
MAX_VELOCITY = 60
MAX_ACCELERATION = 200
# W motion is incorporated in Z motion
# but a joint (JOINT_5) must be configured
# to support display of W values
[AXIS_W]
MIN_LIMIT = -100
MAX_LIMIT = 500
MAX_VELOCITY = 200
MAX_ACCELERATION = 800
[JOINT_0]
TYPE = LINEAR
MAX_VELOCITY = 200
MAX_ACCELERATION = 800
MIN_LIMIT = -500
MAX_LIMIT = 500
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_1]
TYPE = LINEAR
MAX_VELOCITY = 200
MAX_ACCELERATION = 800
MIN_LIMIT = -500
MAX_LIMIT = 500
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = -1
# joints 1 and 6 used for y
[JOINT_6]
TYPE = LINEAR
MAX_VELOCITY = 200
MAX_ACCELERATION = 800
MIN_LIMIT = -500
MAX_LIMIT = 500
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = -1
[JOINT_2]
TYPE = LINEAR
MAX_VELOCITY = 200
MAX_ACCELERATION = 800
MIN_LIMIT = -500
MAX_LIMIT = 100
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_3]
TYPE = ANGULAR
MAX_VELOCITY = 60
MAX_ACCELERATION = 200
MIN_LIMIT = -120
MAX_LIMIT = 120
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_4]
TYPE = ANGULAR
MAX_VELOCITY = 60
MAX_ACCELERATION = 200
MIN_LIMIT = -36000
MAX_LIMIT = 36000
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
# immediate homing for JOINT_5 (w coordinate)
[JOINT_5]
TYPE = LINEAR
MIN_LIMIT = -100
MAX_LIMIT = 500
MAX_VELOCITY = 200
MAX_ACCELERATION = 800
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0

View File

@@ -0,0 +1,4 @@
T10 P10 Z10 D10
T11 P11 Z11 D10
T100 P100 Z100 D10
T150 P150 Z150 D10

View File

@@ -0,0 +1,128 @@
<?xml version='1.0' encoding='UTF-8'?>
<pyvcp>
<vbox>
<relief>"ridge"</relief>
<bd>5</bd>
<label>
<text>"SWITCHKINS"</text>
<relief>RIDGE</relief>
<bd>3</bd>
</label>
<multilabel>
<legends>[" 0:BRIDGE ", "1:IDENTITY", " 2:USERK "]</legends>
<font>("DejaVu Sans Mono",16)</font>
<bg>"black"</bg>
<fg>"yellow"</fg>
</multilabel>
<button>
<halpin>"type0-button"</halpin>
<text>"Brigemill"</text>
<bd>3</bd>
</button>
<button>
<halpin>"type1-button"</halpin>
<text>"Identity "</text>
<bd>3</bd>
</button>
<button>
<halpin>"type2-button"</halpin>
<text>"userk "</text>
<bd>3</bd>
</button>
</vbox>
<vbox>
<labelframe text="Joints values">
<font>("Helvetica",14)</font>
<hbox>
<label>
<text>"0: "</text>
<font>("Helvetica",14)</font>
</label>
<number>
<halpin>"joint0"</halpin>
<font>("Helvetica",14)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"1: "</text>
<font>("Helvetica",14)</font>
</label>
<number>
<halpin>"joint1"</halpin>
<font>("Helvetica",14)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"2: "</text>
<font>("Helvetica",14)</font>
</label>
<number>
<halpin>"joint2"</halpin>
<font>("Helvetica",14)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"3: "</text>
<font>("Helvetica",14)</font>
</label>
<number>
<halpin>"joint3"</halpin>
<font>("Helvetica",14)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"4: "</text>
<font>("Helvetica",14)</font>
</label>
<number>
<halpin>"joint4"</halpin>
<font>("Helvetica",14)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"5: "</text>
<font>("Helvetica",14)</font>
</label>
<number>
<halpin>"joint5"</halpin>
<font>("Helvetica",14)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"6: "</text>
<font>("Helvetica",14)</font>
</label>
<number>
<halpin>"joint6"</halpin>
<font>("Helvetica",14)</font>
<format>"4.4f"</format>
</number>
</hbox>
</labelframe>
</vbox>
<vbox>
<relief>"ridge"</relief>
<bd>5</bd>
<button>
<halpin>"vismach-clear"</halpin>
<text>"vismach-clear"</text>
<bd>3</bd>
</button>
</vbox>
</pyvcp>

View File

@@ -0,0 +1,17 @@
net :kinstype.is-0 <= kinstype.is-0 => pyvcp.multilabel.0.legend0
net :kinstype.is-1 <= kinstype.is-1 => pyvcp.multilabel.0.legend1
net :kinstype.is-2 <= kinstype.is-2 => pyvcp.multilabel.0.legend2
net :type0-button <= pyvcp.type0-button => halui.mdi-command-00
net :type1-button <= pyvcp.type1-button => halui.mdi-command-01
net :type2-button <= pyvcp.type2-button => halui.mdi-command-02
net :jx => pyvcp.joint0
net :jy => pyvcp.joint1
net :jz => pyvcp.joint2
net :jb => pyvcp.joint3
net :jc => pyvcp.joint4
net :jw => pyvcp.joint5
net :jy2 => pyvcp.joint6
net :vismach-clear <= pyvcp.vismach-clear => vismach.plotclear

View File

@@ -0,0 +1,32 @@
loadusr -W 5axisgui
# to set different pivot_len, use:
# 'loadusr -W 5axisgui pivot_len=value'
net :jx joint.0.pos-fb 5axisgui.jx
net :jy joint.1.pos-fb 5axisgui.jy
net :jz joint.2.pos-fb 5axisgui.jz
net :jb joint.3.pos-fb 5axisgui.jb
net :jc joint.4.pos-fb 5axisgui.jc
net :jw joint.5.pos-fb
net :jy2 joint.6.pos-fb
# Note: no joint or motor connections are used
# for the w coordinate
# compute pivot-length needed for 5axiskins
# according to gui pivot_len and tool z offset
loadrt sum2 names=pivotsum
addf pivotsum servo-thread
net :gui-pivot-len <= 5axisgui.pivot_len
net :gui-pivot-len => pivotsum.in0
net :tool-len <= motion.tooloffset.z
net :tool-len => pivotsum.in1
net :tool-len => 5axisgui.tool_length
net :pivot-len <= pivotsum.out
net :pivot-len => 5axiskins.pivot-length
net :tool-diam <= halui.tool.diameter
net :tool-diam => 5axisgui.tool_diam

View File

@@ -0,0 +1,53 @@
#<r> = 60 ; sphere radius
#<rdelta> = 5 ; safe distance
#<drilldepth> = -5
#<zstart> = 0
#<bctmax> = 8
#<cctmax> = 16
#<toolno> = 100
#<frate> = 1000
#<bct> = 0
#<cct> = 0
#<cdelta> = [360/#<cctmax>]
#<bdelta> = [90/#<bctmax>]
g49
t#<toolno>m6g43
g53 g0 x0y0z#<zstart>b0c0 w0
g10l20 p0 x0 y0 z[#<r>+#<rdelta>] b0 c0 w0
g0 z0
f#<frate>
o100 while [#<bct> lt #<bctmax>]
#<b> = [#<bct>*#<bdelta>]
#<rnow> = [[#<r>+#<rdelta>]*[cos[#<b>]]]
#<x> = [#<rnow>]
#<y> = 0
#<z> = [-#<rnow>]
g0 x#<x> y#<y>
m66e0l0 ; force sync
g0 z#<z>
g0b[-90+#<b>]
#<cct> = 0
o200 while [#<cct> lt #<cctmax>]
o210 if [[#<bct> mod 2] eq 0]
#<c> = [#<cct> * #<cdelta>]
o210 else
#<c> = [360 - [1+ #<cct>] * #<cdelta>]
o210 endif
#<x> = [#<rnow>*[cos[#<c>]]]
#<y> = [#<rnow>*[sin[#<c>]]]
g0 x#<x> y#<y> z#<z> c#<c>
f#<frate>
g1 w[ #<drilldepth> - #<rdelta>]
g0 w0
m66e0l0 ;force sync
#<cct> = [#<cct>+1]
o200 endwhile
#<bct> = [#<bct>+1]
o100 endwhile
g0x0y0z0b0c0w0
g53 g0 x0y0z0
m2

View File

@@ -0,0 +1,38 @@
This is a simulation of an XYZBCWY 5 axis bridge mill.
Example demo:
1) $ linuxcnc 5axis.ini
2) F1 ---------- Estop off
F2 ---------- Machine on
CTRL-HOME --- home all
F5 ---------- MDI tab
3) orient vismach gui as required
4) g0w10 ; retract w
5) g43h100 ; tool offset (100)
6) g0b45 ; tilt 45 deg wrt z
7) g0c30 ; rotate 30 deg in xy
8) g0w-10 ; simulate drill
9) g0w10 ; retract drill
10) etc
Note: Motion for the W coordinate is incorporated
into the motions of the joints used for X,Y,Z
motion but a corresponding joint.5 is needed to
correctly display W values.
The joint.5.motor-pos-cmd should be looped to the
joint.5.motor-pos-fb and joint.5 should use immediate
homimg (HOME_SEARCH_VEL = 0).
The 5axis.ini illustrates how to use multiple (2)
joints for the axis y coordinate.
Configuration for XYZBCWY (7 joints total)
J0: X
J1: Y
J2: Z
J3: B
J4: C
J5: W
J6: Y

View File

@@ -0,0 +1,24 @@
;M428 by remap: select kinstype=0 genhexkins
o<428remap>sub
#<kinstype> = 0
#<SWITCHKINS_PIN> = 3 ; set N as required: motion.analog-out-0N
o1 if [exists [#<_hal[motion.switchkins-type]>]]
o1 else
(debug,M428:Missing [RS274NGC]HAL_PIN_VARS=1)
(debug,STOP)
M2
o1 endif
M68 E#<SWITCHKINS_PIN> Q#<kinstype> ; set kinstype value
M66 E0 L0 ; force synch
o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #<kinstype>]]
(debug,M428: Wrong motion.switchkins-type)
(debug,or missing hal net to analog-out-0x)
(debug,STOP)
M2
o2 else
o2 endif
o<428remap>endsub

View File

@@ -0,0 +1,24 @@
;M429 by remap: select kinstype==1 Identity kinematics
o<429remap>sub
#<kinstype> = 1
#<SWITCHKINS_PIN> = 3 ; set N as required: motion.analog-out-0N
o1 if [exists [#<_hal[motion.switchkins-type]>]]
o1 else
(debug,M429:Missing [RS274NGC]HAL_PIN_VARS=1)
(debug,STOP)
M2
o1 endif
M68 E#<SWITCHKINS_PIN> Q#<kinstype> ; set kinstype value
M66 E0 L0 ; force synch
o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #<kinstype>]]
(debug,M429:Wrong motion.switchkins-type)
(debug,or missing hal net to analog-out-0x)
(debug,STOP)
M2
o2 else
o2 endif
o<429remap>endsub

View File

@@ -0,0 +1,24 @@
;M430 by remap: select kinstype==2 userk kins
o<430remap>sub
#<kinstype> = 2
#<SWITCHKINS_PIN> = 3 ; set N as required: motion.analog-out-0N
o1 if [exists [#<_hal[motion.switchkins-type]>]]
o1 else
(debug,M30:Missing [RS274NGC]HAL_PIN_VARS=1)
(debug,STOP)
M2
o1 endif
M68 E#<SWITCHKINS_PIN> Q#<kinstype> ; set kinstype value
M66 E0 L0 ; force synch
o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #<kinstype>]]
(debug,M430:Wrong motion.switchkins-type)
(debug,or missing hal net to analog-out-0x)
(debug,STOP)
M2
o2 else
o2 endif
o<430remap>endsub

View File

@@ -0,0 +1,10 @@
max5 5 axis XYZBC configs
max5triv.ini -- implemented with trivkins
max5kins.ini -- implemented with max5 kinematics
non-identity kinematics
automatic teleop after homing
max5_base.inc -- shared settings

View File

@@ -0,0 +1,4 @@
T1 P1 D0.125000 Z+0.511000 ;1/8 end mill
T2 P2 D0.062500 Z+0.100000 ;1/16 end mill
T3 P3 D0.201000 Z+1.273000 ;#7 tap drill
T99999 P99999 Z+0.100000 ;big tool number

View File

@@ -0,0 +1,159 @@
[MAX]
# distance from the end of the "reference tool" (tool-length - 0) to the
# center of the head tilt axis
B_PIVOT_LENGTH = 0
[DISPLAY]
DISPLAY = axis
CYCLE_TIME = 0.200
POSITION_OFFSET = RELATIVE
POSITION_FEEDBACK = ACTUAL
MAX_FEED_OVERRIDE = 2.0
PROGRAM_PREFIX = ../../nc_files/
INTRO_GRAPHIC = linuxcnc.gif
INTRO_TIME = 5
EDITOR = gedit
[RS274NGC]
PARAMETER_FILE = max5triv.var
[EMCMOT]
EMCMOT = motmod
COMM_TIMEOUT = 1.0
SERVO_PERIOD = 1000000
[TASK]
TASK = milltask
CYCLE_TIME = 0.010
[TRAJ]
COORDINATES = X Y Z B C
LINEAR_UNITS = mm
ANGULAR_UNITS = deg
DEFAULT_LINEAR_VELOCITY = 200.0
MAX_LINEAR_VELOCITY = 346.0
MAX_LINEAR_ACCELERATION = 800.0
DEFAULT_LINEAR_ACCELERATION = 800.0
[EMCIO]
TOOL_TABLE = max5.tbl
[AXIS_X]
MIN_LIMIT = -100
MAX_LIMIT = 200
MAX_VELOCITY = 20.0
MAX_ACCELERATION = 100.0
[JOINT_0]
# this is the table
TYPE = LINEAR
HOME = 0.000
MAX_VELOCITY = 20.0
MAX_ACCELERATION = 100.0
MIN_LIMIT = -100
MAX_LIMIT = 200
HOME_OFFSET = 101.0
HOME_SEARCH_VEL = 20.0
HOME_LATCH_VEL = 5.0
HOME_IGNORE_LIMITS = YES
HOME_SEQUENCE = 1
[AXIS_Y]
MIN_LIMIT = -60
MAX_LIMIT = 60
MAX_VELOCITY = 20.0
MAX_ACCELERATION = 100.0
[JOINT_1]
# this is the saddle
TYPE = LINEAR
HOME = 0.000
MAX_VELOCITY = 20.0
MAX_ACCELERATION = 100.0
MIN_LIMIT = -60
MAX_LIMIT = 60
HOME_OFFSET = -61
HOME_SEARCH_VEL = -20
HOME_LATCH_VEL = -3
HOME_IGNORE_LIMITS = YES
HOME_SEQUENCE = 1
[AXIS_Z]
MIN_LIMIT = -149.0
MAX_LIMIT = 1.0
MAX_VELOCITY = 20.0
MAX_ACCELERATION = 100.0
[JOINT_2]
# this is the head moving up and down the column
TYPE = LINEAR
HOME = 0.000
MAX_VELOCITY = 20.0
MAX_ACCELERATION = 100.0
MIN_LIMIT = -149.0
MAX_LIMIT = 1.0
HOME_OFFSET = 2.0
HOME_SEARCH_VEL = 20.0
HOME_LATCH_VEL = 5.0
HOME_IGNORE_LIMITS = YES
HOME_SEQUENCE = 0
[AXIS_A]
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
MAX_VELOCITY = 45.0
MAX_ACCELERATION = 100.0
[JOINT_3]
TYPE = ANGULAR
HOME = 0.000
MAX_VELOCITY = 45.0
MAX_ACCELERATION = 100.0
MIN_LIMIT = -10.0
MAX_LIMIT = 10.0
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_IGNORE_LIMITS = NO
HOME_SEQUENCE = 0
[AXIS_B]
MIN_LIMIT = -90.0
MAX_LIMIT = 90.0
MAX_VELOCITY = 45.0
MAX_ACCELERATION = 225.0
[JOINT_4]
# this is the head tilting side to side
TYPE = ANGULAR
HOME = 0.000
MAX_VELOCITY = 45.0
MAX_ACCELERATION = 225.0
MIN_LIMIT = -90.0
MAX_LIMIT = 90.0
HOME_OFFSET = 91.0
HOME_SEARCH_VEL = 25.0
HOME_LATCH_VEL = 3.0
HOME_IGNORE_LIMITS = YES
HOME_SEQUENCE = 1
[AXIS_C]
MIN_LIMIT = -3600.0
MAX_LIMIT = 3600.0
MAX_VELOCITY = 45.0
MAX_ACCELERATION = 225.0
[JOINT_5]
# this is a rotary table sitting on the main table
TYPE = ANGULAR
HOME = 0.000
MAX_VELOCITY = 45.0
MAX_ACCELERATION = 225.0
MIN_LIMIT = -3600.0
MAX_LIMIT = 3600.0
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 20.0
HOME_LATCH_VEL = 3.0
HOME_IGNORE_LIMITS = NO
HOME_SEQUENCE = 1

View File

@@ -0,0 +1,112 @@
# HAL config file for vismach simulation of max5 - 9-axis version
# first load all the RT modules that will be needed
# kinematics
loadrt [KINS]KINEMATICS
# motion controller, get name and thread periods from ini file
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS
# load five limit3 blocks to simulate the accel and vel limits of the motors
loadrt limit3 count=5
# load window comparators for home/limit switches
loadrt wcomp count=5
loadrt not count=5
# load the vismach model
loadusr -W max5gui
# set a visible tool
#setp max5gui.tool-length 35
setp max5gui.tool-radius 3
net tool-len motion.tooloffset.w max5gui.tool-length
# add motion controller functions to servo thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
# add other functions
addf limit3.0 servo-thread
addf limit3.1 servo-thread
addf limit3.2 servo-thread
addf limit3.3 servo-thread
addf limit3.4 servo-thread
addf wcomp.0 servo-thread
addf wcomp.1 servo-thread
addf wcomp.2 servo-thread
addf wcomp.3 servo-thread
addf wcomp.4 servo-thread
addf not.0 servo-thread
addf not.1 servo-thread
addf not.2 servo-thread
addf not.3 servo-thread
addf not.4 servo-thread
# create HAL signals for position commands from motion module
# send them to limit blocks so it will ferror if it exceeds a limit
net table-pos-cmd joint.0.motor-pos-cmd => limit3.0.in
net saddle-pos-cmd joint.1.motor-pos-cmd => limit3.1.in
net head-pos-cmd joint.2.motor-pos-cmd => limit3.2.in
net tilt-pos-cmd joint.4.motor-pos-cmd => limit3.3.in
net rotate-pos-cmd joint.5.motor-pos-cmd => limit3.4.in
# set the limit block parameters from the ini file
setp limit3.0.maxv [JOINT_0]MAX_VELOCITY
setp limit3.0.maxa [JOINT_0]MAX_ACCELERATION
setp limit3.1.maxv [JOINT_1]MAX_VELOCITY
setp limit3.1.maxa [JOINT_1]MAX_ACCELERATION
setp limit3.2.maxv [JOINT_2]MAX_VELOCITY
setp limit3.2.maxa [JOINT_2]MAX_ACCELERATION
setp limit3.3.maxv [JOINT_4]MAX_VELOCITY
setp limit3.3.maxa [JOINT_4]MAX_ACCELERATION
setp limit3.4.maxv [JOINT_5]MAX_VELOCITY
setp limit3.4.maxa [JOINT_5]MAX_ACCELERATION
# loop limited position commands back to motion module feedback
# also send them to the vismach model and to the "limit switches"
net table-pos-fb limit3.0.out => joint.0.motor-pos-fb max5gui.table wcomp.0.in
net saddle-pos-fb limit3.1.out => joint.1.motor-pos-fb max5gui.saddle wcomp.1.in
net head-pos-fb limit3.2.out => joint.2.motor-pos-fb max5gui.head wcomp.2.in
net tilt-pos-fb limit3.3.out => joint.4.motor-pos-fb max5gui.tilt wcomp.3.in
net rotate-pos-fb limit3.4.out => joint.5.motor-pos-fb max5gui.rotate wcomp.4.in
# route home/limit switch signals to EMC
net table-limits-ok wcomp.0.out => not.0.in
net table-limits-tripped not.0.out => joint.0.neg-lim-sw-in joint.0.pos-lim-sw-in joint.0.home-sw-in
net saddle-limits-ok wcomp.1.out => not.1.in
net saddle-limits-tripped not.1.out => joint.1.neg-lim-sw-in joint.1.pos-lim-sw-in joint.1.home-sw-in
net head-limits-ok wcomp.2.out => not.2.in
net head-limits-tripped not.2.out => joint.2.neg-lim-sw-in joint.2.pos-lim-sw-in joint.2.home-sw-in
net tilt-limits-ok wcomp.3.out => not.3.in
net tilt-limits-tripped not.3.out => joint.4.neg-lim-sw-in joint.4.pos-lim-sw-in joint.4.home-sw-in
net rotate-home-tripped wcomp.4.out => joint.5.home-sw-in
# set location of switches
# these positions are in vismach coords - they can be are offset from machine coords
# these hardware limits are set to allow 2mm more overall travel than the soft limits
setp wcomp.0.min -101
setp wcomp.0.max 101
setp wcomp.1.min -101
setp wcomp.1.max 21
setp wcomp.2.min -96
setp wcomp.2.max 57
setp wcomp.3.min -91
setp wcomp.3.max 91
setp wcomp.4.min 90
setp wcomp.4.max 100
# kins needs this value
setp maxkins.pivot-length [MAX]B_PIVOT_LENGTH
# estop loopback
net estop-loop iocontrol.0.user-enable-out iocontrol.0.emc-enable-in
# create signals for tool loading loopback
net tool-prep-loop iocontrol.0.tool-prepare iocontrol.0.tool-prepared
net tool-change-loop iocontrol.0.tool-change iocontrol.0.tool-changed
net spindle-fwd spindle.0.forward
net spindle-rev spindle.0.reverse
net spindle-speed spindle.0.speed-out
net flood iocontrol.0.coolant-flood
net mist iocontrol.0.coolant-mist
net Aloop joint.3.motor-pos-cmd joint.3.motor-pos-fb

View File

@@ -0,0 +1,14 @@
#INCLUDE max5_base.inc
[KINS]
KINEMATICS = maxkins
JOINTS = 6
[HAL]
HALFILE = max5kins.hal
HALUI = halui
[EMC]
VERSION = 1.1
MACHINE = MAX5 with kinematics Simulation
DEBUG = 0

View File

@@ -0,0 +1,109 @@
# HAL config file for vismach simulation of max5 - trivkins version
# first load all the RT modules that will be needed
# kinematics
loadrt [KINS]KINEMATICS
# motion controller, get name and thread periods from ini file
loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS
# load five limit3 blocks to simulate the accel and vel limits of the motors
loadrt limit3 count=5
# load window comparators for home/limit switches
loadrt wcomp count=5
loadrt not count=5
# load the vismach model
loadusr -W max5gui
# set a visible tool
setp max5gui.tool-radius 3
# get tool length from motion controller
net tool-len motion.tooloffset.z max5gui.tool-length
# add motion controller functions to servo thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
# add other functions
addf limit3.0 servo-thread
addf limit3.1 servo-thread
addf limit3.2 servo-thread
addf limit3.3 servo-thread
addf limit3.4 servo-thread
addf wcomp.0 servo-thread
addf wcomp.1 servo-thread
addf wcomp.2 servo-thread
addf wcomp.3 servo-thread
addf wcomp.4 servo-thread
addf not.0 servo-thread
addf not.1 servo-thread
addf not.2 servo-thread
addf not.3 servo-thread
addf not.4 servo-thread
# create HAL signals for position commands from motion module
# send them to limit blocks so it will ferror if it exceeds a limit
net table-pos-cmd joint.0.motor-pos-cmd => limit3.0.in
net saddle-pos-cmd joint.1.motor-pos-cmd => limit3.1.in
net head-pos-cmd joint.2.motor-pos-cmd => limit3.2.in
net tilt-pos-cmd joint.4.motor-pos-cmd => limit3.3.in
net rotate-pos-cmd joint.5.motor-pos-cmd => limit3.4.in
# set the limit block parameters from the ini file
setp limit3.0.maxv [JOINT_0]MAX_VELOCITY
setp limit3.0.maxa [JOINT_0]MAX_ACCELERATION
setp limit3.1.maxv [JOINT_1]MAX_VELOCITY
setp limit3.1.maxa [JOINT_1]MAX_ACCELERATION
setp limit3.2.maxv [JOINT_2]MAX_VELOCITY
setp limit3.2.maxa [JOINT_2]MAX_ACCELERATION
setp limit3.3.maxv [JOINT_4]MAX_VELOCITY
setp limit3.3.maxa [JOINT_4]MAX_ACCELERATION
setp limit3.4.maxv [JOINT_5]MAX_VELOCITY
setp limit3.4.maxa [JOINT_5]MAX_ACCELERATION
# loop limited position commands back to motion module feedback
# also send them to the vismach model and to the "limit switches"
net table-pos-fb limit3.0.out => joint.0.motor-pos-fb max5gui.table wcomp.0.in
net saddle-pos-fb limit3.1.out => joint.1.motor-pos-fb max5gui.saddle wcomp.1.in
net head-pos-fb limit3.2.out => joint.2.motor-pos-fb max5gui.head wcomp.2.in
net tilt-pos-fb limit3.3.out => joint.4.motor-pos-fb max5gui.tilt wcomp.3.in
net rotate-pos-fb limit3.4.out => joint.5.motor-pos-fb max5gui.rotate wcomp.4.in
# route home/limit switch signals to EMC
net table-limits-ok wcomp.0.out => not.0.in
net table-limits-tripped not.0.out => joint.0.neg-lim-sw-in joint.0.pos-lim-sw-in joint.0.home-sw-in
net saddle-limits-ok wcomp.1.out => not.1.in
net saddle-limits-tripped not.1.out => joint.1.neg-lim-sw-in joint.1.pos-lim-sw-in joint.1.home-sw-in
net head-limits-ok wcomp.2.out => not.2.in
net head-limits-tripped not.2.out => joint.2.neg-lim-sw-in joint.2.pos-lim-sw-in joint.2.home-sw-in
net tilt-limits-ok wcomp.3.out => not.3.in
net tilt-limits-tripped not.3.out => joint.4.neg-lim-sw-in joint.4.pos-lim-sw-in joint.4.home-sw-in
net rotate-home-tripped wcomp.4.out => joint.5.home-sw-in
# set location of switches
# these positions are in vismach coords - they can be are offset from machine coords
# these hardware limits are set to allow 2mm more overall travel than the soft limits
setp wcomp.0.min -101
setp wcomp.0.max 101
setp wcomp.1.min -101
setp wcomp.1.max 21
setp wcomp.2.min -96
setp wcomp.2.max 57
setp wcomp.3.min -91
setp wcomp.3.max 91
setp wcomp.4.min 90
setp wcomp.4.max 100
# estop loopback
net estop-loop iocontrol.0.user-enable-out iocontrol.0.emc-enable-in
# create signals for tool loading loopback
net tool-prep-loop iocontrol.0.tool-prepare iocontrol.0.tool-prepared
net tool-change-loop iocontrol.0.tool-change iocontrol.0.tool-changed
net spindle-fwd spindle.0.forward
net spindle-rev spindle.0.reverse
net spindle-speed spindle.0.speed-out
net flood iocontrol.0.coolant-flood
net mist iocontrol.0.coolant-mist
net Aloop joint.3.motor-pos-cmd joint.3.motor-pos-fb

View File

@@ -0,0 +1,14 @@
#INCLUDE max5_base.inc
[KINS]
KINEMATICS = trivkins coordinates=xyzabc
JOINTS = 6
[HAL]
HALFILE = max5triv.hal
HALUI = halui
[EMC]
VERSION = 1.1
MACHINE = MAX5-trivkins Simulation
DEBUG = 0

View File

@@ -0,0 +1,42 @@
Switchable Table Dual Rotary (tdr) Sim config
xyzab-tdr (switchable kinematics)
Demonstrations:
For a demonstration of XYZAB_TCP kinematics the user can run the preloaded demo gcode with the default offsets.
In the right hand panel of the axis gui sliders are provided to
- change the geometrical (x,z)-offsets as measured from the rotation-point of the A/B rotary-assembly to the
face center of the rotary A table. The offsets are visibly adjusted in the vismach simulation and represented by a red indicator
for the x-offset and a blue indicator for the z-offset.
- see the effects of misconfiguring the (x,y,z)-rot-point values used in the kinematics. These values represent the
physical position of the rotary-assembly in the machine as measured from the machine home position to the rotation-point
of the assembly. The rotation-point is identical to the intersection of the two rotational axes A and B when the (x,z)-offsets
are zero. When (x,z)-offsets are applied the rotation-point stays on the rotational B axis. The 'rot-point' as set by
these values as well as the true rotation-point of the rotary-assembly are indicated in the vismach simulation by a yellow cross
and a red sphere respectively.
NOTE:
For proper tool-path preview RELOAD THE CGODE after startup and after changing offset values.
***********************************************
Note: IMPORTANT ini file requirements:
[HAL]
HALCMD = net :kinstype-select <= motion.analog-out-0N => motion.switchkins-type
[RS274NGC]
SUBROUTINE_PATH = ./remap_subs
REMAP = M428 modalgroup=10 ngc=428remap
REMAP = M429 modalgroup=10 ngc=429remap
[HALUI]
MDI_COMMAND = M429
MDI_COMMAND = M428
***********************************************

View File

@@ -0,0 +1,49 @@
; -- RELOAD GCODE FOR PROPER TOOL-PATH PREVIEW --
g21 g90 g49 g54
; switch to identity mode
m429
; clear g54
g10 l2 p0 x0 y0 z0 a0 b0
; go to machine origin
g53 g0 x0 y0 z0 a0 b0
; set g54 for face center of rotary
g10 l20 p0 x-[#<_hal[xyzab_tdr_kins.x-rot-point]>+#<_hal[xyzab_tdr_kins.x-offset]>] y-#<_hal[xyzab_tdr_kins.x-rot-point]> z-[#<_hal[xyzab_tdr_kins.z-rot-point]>+#<_hal[xyzab_tdr_kins.z-offset]>] a0 b0
; load a tool
M61 Q2 G43 H2
; switch to tcp mode
m428
g0 b30
; go to face center of rotary a
g0 x0 y0 z0
; show basic tcp functionality
g0 x30 a180
g0 x0 a0
g0 b100
g0 y-50
g0 a90
g0 b120
g0 y0
g0 a0 b30
g0 x1
; start with square
f1000
g0 y-30 z-30
g1 z30
g1 a45
g1 y30
g1 a90 b45
g1 z-30
g1 a180 b100
g1 y30
g1 a90 b120
g1 y-30
g1 a0 b30
g0 x5
g1 y-30 z-30 a90
g1 z30 a45 b60
g1 y30 a90 b90
g1 z-30 a135 b120
g1 y-30 a0 b30
; go to machine origin
g53 g0 x0 y0 z0 a0 b0
m2

View File

@@ -0,0 +1,24 @@
;M428 by remap: kinstype==1 (xyzac,xyzbc) (note: sparm=identityfirst)
o<428remap>sub
#<kinstype> = 1 ; xyzac,xyzbc
#<SWITCHKINS_PIN> = 3 ; set N as required: motion.analog-out-0N
o1 if [exists [#<_hal[motion.switchkins-type]>]]
o1 else
(debug,M428:Missing [RS274NGC]HAL_PIN_VARS=1)
(debug,STOP)
M2
o1 endif
M68 E#<SWITCHKINS_PIN> Q#<kinstype> ; set kinstype value
M66 E0 L0 ; force synch
o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #<kinstype>]]
(debug,M428: Wrong motion.switchkins-type)
(debug,or missing hal net to analog-out-0x)
(debug,STOP)
M2
o2 else
o2 endif
o<428remap>endsub

View File

@@ -0,0 +1,24 @@
;M429 by remap: kinstype==0 Identity kinematics
o<429remap>sub
#<kinstype> = 0
#<SWITCHKINS_PIN> = 3 ; set N as required: motion.analog-out-0N
o1 if [exists [#<_hal[motion.switchkins-type]>]]
o1 else
(debug,M429:Missing [RS274NGC]HAL_PIN_VARS=1)
(debug,STOP)
M2
o1 endif
M68 E#<SWITCHKINS_PIN> Q#<kinstype> ; set kinstype value
M66 E0 L0 ; force synch
o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #<kinstype>]]
(debug,M429:Wrong motion.switchkins-type)
(debug,or missing hal net to analog-out-0x)
(debug,STOP)
M2
o2 else
o2 endif
o<429remap>endsub

View File

@@ -0,0 +1,23 @@
# switchkins pyvcp connections for:
# xyzab-tdr-kins.ini
net :kinstype.is-0 <= kinstype.is-0 => pyvcp.multilabel.0.legend0
net :kinstype.is-1 <= kinstype.is-1 => pyvcp.multilabel.0.legend1
net :vismach-clear <= pyvcp.vismach-clear => vismach.plotclear
net :type0-button <= pyvcp.type0-button => halui.mdi-command-00
net :type1-button <= pyvcp.type1-button => halui.mdi-command-01
net :axis-x => pyvcp.joint0
net :axis-y => pyvcp.joint1
net :axis-z => pyvcp.joint2
net :rotary-a => pyvcp.joint3
net :rotary-b => pyvcp.joint4
net :x-offset => pyvcp.x-offset-f
net :z-offset => pyvcp.z-offset-f
net :x-rot-point => pyvcp.x-rot-point-f
net :y-rot-point => pyvcp.y-rot-point-f
net :z-rot-point => pyvcp.z-rot-point-f

View File

@@ -0,0 +1,183 @@
[EMC]
VERSION = 1.1
MACHINE = sim-xyzab-tdr-kins (switchkins)
[DISPLAY]
GEOMETRY = XYZA-B
OPEN_FILE = ./demos/xyzab-tdr-demo.ngc
PYVCP = ./xyzab-tdr.xml
DISPLAY = axis
MAX_ANGULAR_VELOCITY = 360
MAX_LINEAR_VELOCITY = 1000
POSITION_OFFSET = RELATIVE
POSITION_FEEDBACK = ACTUAL
MAX_FEED_OVERRIDE = 2
PROGRAM_PREFIX = ../../nc_files
INTRO_GRAPHIC = emc2.gif
INTRO_TIME = 1
TOOL_EDITOR = tooledit z diam
[RS274NGC]
SUBROUTINE_PATH = ./remap_subs
REMAP = M428 modalgroup=10 ngc=428remap
REMAP = M429 modalgroup=10 ngc=429remap
PARAMETER_FILE = xyzab-tdr.var
[KINS]
#NOTE:
# switchkins-type == 0 is identity kins
# switchkins-type == 1 is xyzab-tdr-kins
KINEMATICS = xyzab_tdr_kins
JOINTS = 5
[HAL]
HALUI = halui
HALFILE = LIB:basic_sim.tcl
POSTGUI_HALFILE = xyzab-tdr-postgui.hal
# net for control of motion.switchkins-type
HALCMD = net :kinstype-select <= motion.analog-out-03 => motion.switchkins-type
# Values '(x,z)-offsets' for geometric offset of the rotary-assembly and the
# values '(x,y,z)-rot-point' that describe the position of the
# rotation-point of the rotary-assembly can be changed using the sliders
# in the axis-gui.
# Default values (initval) and ranges (min,max) are set
# in the corresponding 'scale' sections in the file 'xyzab-tdr.xml'
# vismach xyzab-tdr-gui items
HALCMD = loadusr -W xyzab-tdr-gui
HALCMD = net :axis-x joint.0.pos-fb xyzab-tdr-gui.axis-x
HALCMD = net :axis-y joint.1.pos-fb xyzab-tdr-gui.axis-y
HALCMD = net :axis-z joint.2.pos-fb xyzab-tdr-gui.axis-z
HALCMD = net :rotary-a joint.3.pos-fb xyzab-tdr-gui.rotary-a
HALCMD = net :rotary-b joint.4.pos-fb xyzab-tdr-gui.rotary-b
HALCMD = net :tool-offset motion.tooloffset.z xyzab-tdr-gui.tool_length
HALCMD = net :tool-diam halui.tool.diameter xyzab-tdr-gui.tool_diameter
HALCMD = net :x-offset xyzab-tdr-gui.x_offset
HALCMD = net :z-offset xyzab-tdr-gui.z_offset
HALCMD = net :x-rot-point xyzab-tdr-gui.x-rot-point
HALCMD = net :y-rot-point xyzab-tdr-gui.y-rot-point
HALCMD = net :z-rot-point xyzab-tdr-gui.z-rot-point
# xyzab_tdr_kins items
HALCMD = net :tool-offset xyzab_tdr_kins.tool-offset-z
HALCMD = net :x-offset xyzab_tdr_kins.x-offset
HALCMD = net :z-offset xyzab_tdr_kins.z-offset
HALCMD = net :x-rot-point xyzab_tdr_kins.x-rot-point
HALCMD = net :y-rot-point xyzab_tdr_kins.y-rot-point
HALCMD = net :z-rot-point xyzab_tdr_kins.z-rot-point
# This is only used to preset the vismach model to the default values as set
# in the xml scale widgets
# These will be overwritten by the values in the xml
HALCMD = sets :x-offset -20
HALCMD = sets :z-offset -10
[HALUI]
# M429:identity kins (motion.switchkins-type==0 startupDEFAULT)
# M428:xyzab-tdr kins (motion.switchkins-type==1)
MDI_COMMAND = M429
MDI_COMMAND = M428
[TRAJ]
COORDINATES = XYZAB
LINEAR_UNITS = mm
ANGULAR_UNITS = deg
DEFAULT_LINEAR_VELOCITY = 20
MAX_LINEAR_VELOCITY = 35
MAX_LINEAR_ACCELERATION = 400
DEFAULT_LINEAR_ACCELERATION = 300
[EMCMOT]
EMCMOT = motmod
SERVO_PERIOD = 1000000
COMM_TIMEOUT = 1
[TASK]
TASK = milltask
CYCLE_TIME = 0.010
[EMCIO]
TOOL_TABLE = xyzab-tdr.tbl
[AXIS_X]
MIN_LIMIT = -200
MAX_LIMIT = 200
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
[AXIS_Y]
MIN_LIMIT = -200
MAX_LIMIT = 200
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
[AXIS_Z]
MIN_LIMIT = -300
MAX_LIMIT = 300
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
[AXIS_A]
MIN_LIMIT = -3600
MAX_LIMIT = 3600
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
[AXIS_B]
MIN_LIMIT = -180
MAX_LIMIT = 180
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
[JOINT_0]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
MIN_LIMIT = -200
MAX_LIMIT = 200
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_1]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
MIN_LIMIT = -200
MAX_LIMIT = 200
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_2]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
MIN_LIMIT = -300
MAX_LIMIT = 300
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_3]
TYPE = ANGULAR
HOME = 0
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
MIN_LIMIT = -3600
MAX_LIMIT = 3600
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_4]
TYPE = ANGULAR
HOME = 0
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
MIN_LIMIT = -180
MAX_LIMIT = 180
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0

View File

@@ -0,0 +1,4 @@
T1 P1 D1
T2 P2 Z30 D3
T3 P3 Z40 D4
T4 P4 Z50 D5

View File

@@ -0,0 +1,325 @@
<?xml version='1.0' encoding='UTF-8'?>
<pyvcp>
<vbox>
<relief>"ridge"</relief>
<bd>5</bd>
<multilabel>
<legends>["0:IDENTITY", "1: XYZAB ", "2: USERK "]</legends>
<font>("Helvetica",16)</font>
<bg>"black"</bg>
<fg>"yellow"</fg>
</multilabel>
<button>
<halpin>"type0-button"</halpin>
<text>"IDENTITY"</text>
<bd>3</bd>
</button>
<button>
<halpin>"type1-button"</halpin>
<text>"TCP:XYZAB"</text>
<bd>3</bd>
</button>
</vbox>
<!-- create a space to the next element -->
<vbox>
<hbox>
<label>
<text>" "</text>
<font>("Helvetica",4)</font>
</label>
</hbox>
</vbox>
<vbox>
<labelframe text="Joint position">
<font>("Helvetica",14)</font>
<hbox>
<vbox>
<hbox>
<label>
<text>"0: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint0"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"1: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint1"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"2: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint2"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
</vbox>
<vbox>
<label>
<text>" "</text>
<font>("Helvetica",10)</font>
</label>
</vbox>
<vbox>
<hbox>
<label>
<text>"3: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint3"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"4: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint4"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"5: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint5"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
</vbox>
</hbox>
</labelframe>
</vbox>
<!-- create a space to the next element -->
<vbox>
<hbox>
<label>
<text>" "</text>
<font>("Helvetica",4)</font>
</label>
</hbox>
</vbox>
<vbox>
<relief>"ridge"</relief>
<bd>5</bd>
<button>
<halpin>"vismach-clear"</halpin>
<text>"vismach-clear"</text>
<bd>3</bd>
</button>
</vbox>
<!-- create a space to the next element -->
<vbox>
<hbox>
<label>
<text>" "</text>
<font>("Helvetica",4)</font>
</label>
</hbox>
</vbox>
<vbox>
<labelframe text="Rotary Assembly Offset">
<font>("Helvetica",14)</font>
<hbox>
<label>
<text>"x-offset: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"15"</width>
<halpin>"x-offset"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>-20</initval>
<min_>-50</min_>
<max_>50</max_>
</scale>
</hbox>
<hbox>
<label>
<text>"z-offset: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"15"</width>
<halpin>"z-offset"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>-10</initval>
<min_>-50</min_>
<max_>50</max_>
</scale>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>" "</text>
</label>
</hbox>
<hbox>
<label>
<text>"Use hover + mouse wheel to change values"</text>
<font>("Helvetica",6)</font>
</label>
</hbox>
</labelframe>
</vbox>
<!-- create a space to the next element -->
<vbox>
<hbox>
<label>
<text>" "</text>
<font>("Helvetica",4)</font>
</label>
</hbox>
</vbox>
<vbox>
<labelframe text="Rotation Point Offset">
<font>("Helvetica",14)</font>
<hbox>
<label>
<text>" This should demonstrate that TCP kinematics\n require the 'rot-point' settings (yellow)\n to match the physical location\n of the rotation-point (red)."</text>
<font>("Helvetica",8)</font>
</label>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>" "</text>
</label>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>"Physical location of rotation-point in the model\n in absolute machine coordinates:"</text>
</label>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>" x: -50\n y: -50\n z: -100"</text>
</label>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>" "</text>
</label>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>"these are also the correct 'rot-point' settings\n for this model"</text>
</label>
</hbox>
<hbox>
<label>
<text>"x-rot-point: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"15"</width>
<halpin>"x-rot-point"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>-50</initval>
<min_>-55</min_>
<max_>-45</max_>
</scale>
</hbox>
<hbox>
<label>
<text>"y-rot-point: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"15"</width>
<halpin>"y-rot-point"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>-50</initval>
<min_>-55</min_>
<max_>-45</max_>
</scale>
</hbox>
<hbox>
<label>
<text>"z-rot-point: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"15"</width>
<halpin>"z-rot-point"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>-100</initval>
<min_>-105</min_>
<max_>-95</max_>
</scale>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>" "</text>
</label>
</hbox>
<hbox>
<label>
<text>"Use hover + mouse wheel to change values"</text>
<font>("Helvetica",6)</font>
</label>
</hbox>
</labelframe>
</vbox>
<!-- create a space to the next element -->
<vbox>
<hbox>
<label>
<text>" "</text>
<font>("Helvetica",4)</font>
</label>
</hbox>
</vbox>
<vbox>
<hbox>
<label>
<text>" FOR PROPER TOOL-PATH PREVIEW \n RELOAD AND RESTART THE\n GCODE AFTER STARTUP AND\n AFTER CHANGING OFFSETS!"</text>
<font>("Helvetica",9)</font>
</label>
</hbox>
</vbox>
</pyvcp>

View File

@@ -0,0 +1,32 @@
Switchable Table Rotary/Tilting (trt) Sim configs
xyzac-trt-switchkins
xyzbc-trt-switchkins
Demonstrations:
demos/xyzac_switchkins.ngc
demos/xyzac_switchkins_test_1.ngc
demos/xyzac_switchkins_test_2.ngc
demos/xyzac_switchkins_test_3.ngc
demos/boat-xyzac.ngc
demos/impeller-7bl-xyzac.ngc
demos/xyzbc_switchkins.ngc
demos/boat-xyzbc.ngc
***********************************************
Note: IMPORTANT ini file requirements:
[HAL]
HALCMD = net :kinstype-select <= motion.analog-out-0N => motion.switchkins-type
[RS274NGC]
SUBROUTINE_PATH = ./remap_subs
REMAP = M428 modalgroup=10 ngc=428remap
REMAP = M429 modalgroup=10 ngc=429remap
[HALUI]
MDI_COMMAND = M429
MDI_COMMAND = M428
MDI_COMMAND = M430
***********************************************

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,3 @@
; zmax zmin r frate n a b c dist
o<xyzac_switchkins_sub> call [10] [5] [10][1000][3][20][0][45][20]
m2

View File

@@ -0,0 +1,39 @@
; for debugging, use mdi to set global #<_switchkins_debug>=1
#<FRATE>=1000
M429
G0 X0 Y0 Z0 A0 C0
G0 C90 X10 Y0
G1 F#<FRATE> Z2
M428
G1 F#<FRATE> Z0
M429
G1 F#<FRATE> Z2
G0 C90 X0 Y10
G1 F#<FRATE> Z0
M428
G1 F#<FRATE> Z2
M429
G1 F#<FRATE> Z0
G0 C90 X10 Y30
G1 F#<FRATE> Z2
M428
G1 F#<FRATE> Z0
M429
G1 F#<FRATE> Z2
G0 C90 X30 Y10
G1 F#<FRATE> Z0
M428
G1 F#<FRATE> Z2
M429
G1 F#<FRATE> Z0
G0 X0 Y0 Z0 A0 C0
M2

View File

@@ -0,0 +1,49 @@
; for debugging, use mdi to set global #<_switchkins_debug>=1
#<FRATE>=1000
M429 ;Trivkins
G64 P0.01
S1500 M3
G0 X0 Y0 Z5 A0 C0
G1 F#<FRATE> Z0
G1 X20 Y0 F#<FRATE>
M428 ;XYZAC
G1 C90
G1 X20
G1 Y20
G1 X0
G1 Y0
G1 A20
G1 X-20
G1 Y-20
G1 X0
G1 Y0
(-------)
G1 C45
G1 X-15
G1 Y15
G1 X0
G1 Y0
G1 Y-15
G1 X15
G1 Y0
G1 X0
(-------)
G1 C90 X15
G1 C180 Y15
G1 C270 X0
G1 C360 Y0
G1 C0
G1 C-90 X-15
G1 C-180 Y-15
G1 C-270 X0
G1 C-360 Y0
G1 Z5
M429 ;Trivkins
G1 X0 Y0 Z1 A0 C0
M2

View File

@@ -0,0 +1,15 @@
;# enable optional stop for m1
m429 ;trivkins
G0 X0 Y0 Z0 A0 C0
G0 C90 X10 Y0
G1 F1000 Z2
(debug,A expect: 10 0 2) m1
(debug,B expect: 10 0 2) m1
m428 ;tcp
(debug,C expect: 0 -10 2) m1
g1f1000 z0
(debug,D expect: 0 -10 0) m1
(debug,E expect: 0 -10 0) m1
m429 ;trivkins
(debug,F expect: 10 0 0)
m2

View File

@@ -0,0 +1,3 @@
; zmax zmin r frate n a b c dist
o<xyzbc_switchkins_sub> call [10] [5] [10][1000][3][0][20][45][20]
m2

View File

@@ -0,0 +1,24 @@
;M428 by remap: kinstype==1 (xyzac,xyzbc) (note: sparm=identityfirst)
o<428remap>sub
#<kinstype> = 1 ; xyzac,xyzbc
#<SWITCHKINS_PIN> = 3 ; set N as required: motion.analog-out-0N
o1 if [exists [#<_hal[motion.switchkins-type]>]]
o1 else
(debug,M428:Missing [RS274NGC]HAL_PIN_VARS=1)
(debug,STOP)
M2
o1 endif
M68 E#<SWITCHKINS_PIN> Q#<kinstype> ; set kinstype value
M66 E0 L0 ; force synch
o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #<kinstype>]]
(debug,M428: Wrong motion.switchkins-type)
(debug,or missing hal net to analog-out-0x)
(debug,STOP)
M2
o2 else
o2 endif
o<428remap>endsub

View File

@@ -0,0 +1,24 @@
;M429 by remap: kinstype==0 Identity kinematics
o<429remap>sub
#<kinstype> = 0
#<SWITCHKINS_PIN> = 3 ; set N as required: motion.analog-out-0N
o1 if [exists [#<_hal[motion.switchkins-type]>]]
o1 else
(debug,M429:Missing [RS274NGC]HAL_PIN_VARS=1)
(debug,STOP)
M2
o1 endif
M68 E#<SWITCHKINS_PIN> Q#<kinstype> ; set kinstype value
M66 E0 L0 ; force synch
o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #<kinstype>]]
(debug,M429:Wrong motion.switchkins-type)
(debug,or missing hal net to analog-out-0x)
(debug,STOP)
M2
o2 else
o2 endif
o<429remap>endsub

View File

@@ -0,0 +1,24 @@
;M430 by remap: kinstype==2 userk kins
o<430remap>sub
#<kinstype> = 2
#<SWITCHKINS_PIN> = 3 ; set N as required: motion.analog-out-0N
o1 if [exists [#<_hal[motion.switchkins-type]>]]
o1 else
(debug,M430:Missing [RS274NGC]HAL_PIN_VARS=1)
(debug,STOP)
M2
o1 endif
M68 E#<SWITCHKINS_PIN> Q#<kinstype> ; set kinstype value
M66 E0 L0 ; force synch
o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #<kinstype>]]
(debug,M430:Wrong motion.switchkins-type)
(debug,or missing hal net to analog-out-0x)
(debug,STOP)
M2
o2 else
o2 endif
o<430remap>endsub

View File

@@ -0,0 +1,42 @@
(info: tests for values of [xyz]-rot-point)
o<centering>sub
#<xstart> = #1 (=-2.5)
#<ystart> = #2 (=-2.5)
#<xlen> = #3 (= 5)
#<ylen> = #4 (= 5)
#<zfinal> = #5 (=60)
#<n> = #6 (=12)
#<f> = #7 (=1000 feed)
#<angle> = 0
#<delta_angle> = [360/#<n>]
o1 if [exists [#<_hal[xyzac-trt-kins.x-rot-point]>]]
(debug,x-rot-point=#<_hal[xyzac-trt-kins.x-rot-point]>)
(debug,y-rot-point=#<_hal[xyzac-trt-kins.y-rot-point]>)
(debug,z-rot-point=#<_hal[xyzac-trt-kins.z-rot-point]>)
o1 endif
o2 if [exists [#<_hal[xyzbc-trt-kins.x-rot-point]>]]
(debug,x-rot-point=#<_hal[xyzbc-trt-kins.x-rot-point]>)
(debug,y-rot-point=#<_hal[xyzbc-trt-kins.y-rot-point]>)
(debug,z-rot-point=#<_hal[xyzac-trt-kins.z-rot-point]>)
o2 endif
M429 ;Identity kinematics
g0 x#<xstart> y#<ystart> z0 c0
M428 ;tcp
g61
o10 while [#<angle> le 360]
g1 f#<f>
#<angle> = [#<angle> + #<delta_angle>]
g0 c#<angle>
g1 x[#<xstart> + #<xlen>]
g1 y[#<ystart> + #<ylen>]
g1 x[#<xstart> + 0 ]
g1 y[#<ystart> + 0 ]
o10 endwhile
M429 ;Identity kinematics
g0 x0 y0 z#<zfinal> c0
o<centering>endsub

View File

@@ -0,0 +1,22 @@
; helix using switchkins (xyzac) a,c angles
o<helix_ac>sub
#<zmax> = #1 (=10)
#<zmin> = #2 (= 5)
#<r> = #3 (=10)
#<frate> = #4 (=1000)
#<n> = #5 (=3)
#<a> = #6 (=45)
#<b> = #7 (=0 NA)
#<c> = #8 (=20)
M429 ;Identity kinematics
g0 x[#<_x> - #<r>] ;adjust for radius
g10l20p0 x0y0 z#<zmax> a0 c0 ;new g54
M428 ;XYZAC
g0a#<a>c#<c> ;exercise a,c
f#<frate> g2i#<r>z#<zmin> p#<n> ;helix
M429 ;Identity kinematics
g0 x0 y0 z#<zmax> a0 c0 ;return to start
g0 x[#<_x> + #<r>] ;adjust restore
M428 ;XYZAC
o<helix_ac>endsub

View File

@@ -0,0 +1,22 @@
; helix using switchkins (xyzbc) b,c angles
o<helix_bc>sub
#<zmax> = #1 (=10)
#<zmin> = #2 (= 5)
#<r> = #3 (=10)
#<frate> = #4 (=1000)
#<n> = #5 (=3)
#<a> = #6 (=0 NA)
#<b> = #7 (=45)
#<c> = #8 (=20)
M429 ;Identity kinematics
g0 x[#<_x> - #<r>] ;adjust for radius
g10l20p0 x0y0 z#<zmax> b0 c0 ;new g54
M428 ;XYZBC
g0b#<b>c#<c> ;exercise b,c
f#<frate> g2i#<r>z#<zmin> p#<n> ;helix
M429 ;Identity kinematics
g0 x0 y0 z#<zmax> b0 c0 ;return to start
g0 x[#<_x> + #<r>] ;adjust restore
M428 ;XYZBC
o<helix_bc>endsub

View File

@@ -0,0 +1,47 @@
; ngcgui-compatible subroutine
(info: helix in each quadrant at angles A,C)
o<xyzac_switchkins_sub>sub
#<zmax> = #1 (=10)
#<zmin> = #2 (= 5)
#<r> = #3 (=10 radius)
#<frate> = #4 (=1000 feedrate)
#<n> = #5 (=3 n circles)
#<a> = #6 (=30 A angle)
#<b> = #7 (=0 B angle NA)
#<c> = #8 (=45 C angle)
#<dist> = #9 (=20 distance)
; quadrant I
M429 ;Identity kinematics
g53 g0 x0y0 z#<zmax> a0 c0 ;MACHINE coordinates
g10l20p0 x0y0 z#<zmax> a0 c0 ;new g54
g0 x+#<dist> y+#<dist> z#<zmax> ;move to pattern center position
o<helix_ac> call [#<zmax>][#<zmin>][#<r>][#<frate>][#<n>][#<a>][#<b>][#<c>]
; quadrant II
M429 ;Identity kinematics
g53 g0 x0y0 z#<zmax> a0 c0
g10l20p0 x0y0 z#<zmax> a0 c0
g0 x-#<dist> y+#<dist> z#<zmax>
o<helix_ac> call [#<zmax>][#<zmin>][#<r>][#<frate>][#<n>][#<a>][#<b>][#<c>]
; quadrant III
M429 ;Identity kinematics
g53 g0 x0y0 z#<zmax> a0 c0
g10l20p0 x0y0 z#<zmax> a0 c0
g0 x-#<dist> y-#<dist> z#<zmax>
o<helix_ac> call [#<zmax>][#<zmin>][#<r>][#<frate>][#<n>][#<a>][#<b>][#<c>]
; quadrant IV
M429 ;Identity kinematics
g53 g0 x0y0 z#<zmax> a0 c0
g10l20p0 x0y0 z#<zmax> a0 c0
g0 x+#<dist> y-#<dist> z#<zmax>
o<helix_ac> call [#<zmax>][#<zmin>][#<r>][#<frate>][#<n>][#<a>][#<b>][#<c>]
;final position
M429 ;Identity kinematics
g53 g0 x0y0 z#<zmax> ;MACHINE coordinates
g10l20p0 x0y0 z#<zmax> ;new g54
o<xyzac_switchkins_sub>endsub

View File

@@ -0,0 +1,47 @@
; ngcgui-compatible subroutine
(info: helix in each quadrant at angles B,C)
o<xyzbc_switchkins_sub>sub
#<zmax> = #1 (=10)
#<zmin> = #2 (= 5)
#<r> = #3 (=10 radius)
#<frate> = #4 (=1000 feedrate)
#<n> = #5 (=3 n circles)
#<a> = #6 (=0 A angle NA)
#<b> = #7 (=30 B angle)
#<c> = #8 (=45 C angle)
#<dist> = #9 (=20 distance)
; quadrant I
M429 ;Identity kinematics
g53 g0 x0y0 z#<zmax> b0 c0 ;MACHINE coordinates
g10l20p0 x0y0 z#<zmax> b0 c0 ;new g54
g0 x+#<dist> y+#<dist> z#<zmax> ;move to pattern center position
o<helix_bc> call [#<zmax>][#<zmin>][#<r>][#<frate>][#<n>][#<a>][#<b>][#<c>]
; quadrant II
M429 ;Identity kinematics
g53 g0 x0y0 z#<zmax> b0 c0
g10l20p0 x0y0 z#<zmax> b0 c0
g0 x-#<dist> y+#<dist> z#<zmax>
o<helix_bc> call [#<zmax>][#<zmin>][#<r>][#<frate>][#<n>][#<a>][#<b>][#<c>]
; quadrant III
M429 ;Identity kinematics
g53 g0 x0y0 z#<zmax> b0 c0
g10l20p0 x0y0 z#<zmax> b0 c0
g0 x-#<dist> y-#<dist> z#<zmax>
o<helix_bc> call [#<zmax>][#<zmin>][#<r>][#<frate>][#<n>][#<a>][#<b>][#<c>]
; quadrant IV
M429 ;Identity kinematics
g53 g0 x0y0 z#<zmax> b0 c0
g10l20p0 x0y0 z#<zmax> b0 c0
g0 x+#<dist> y-#<dist> z#<zmax>
o<helix_bc> call [#<zmax>][#<zmin>][#<r>][#<frate>][#<n>][#<a>][#<b>][#<c>]
;final position
M429 ;Identity kinematics
g53 g0 x0y0 z#<zmax> ;MACHINE coordinates
g10l20p0 x0y0 z#<zmax> ;new g54
o<xyzbc_switchkins_sub>endsub

View File

@@ -0,0 +1,29 @@
pin+motion.analog-out-03
pin+motion.switchkins-type
pin+joint.0.pos-cmd
pin+joint.1.pos-cmd
pin+joint.2.pos-cmd
pin+joint.3.pos-cmd
pin+joint.4.pos-cmd
pin+axis.x.pos-cmd
pin+axis.y.pos-cmd
pin+axis.z.pos-cmd
pin+axis.a.pos-cmd
pin+axis.b.pos-cmd
pin+axis.c.pos-cmd
pin+pyvcp.tcpkins-button
pin+pyvcp.identitykins-button
pin+pyvcp.vismach-clear
pin+kinstype-0
pin+kinstype-1
pin+halui.mdi-command-00
pin+halui.mdi-command-01
pin+kinstype.is-0
pin+kinstype.is-1
pin+kinstype.is-2

View File

@@ -0,0 +1,12 @@
# switchkins pyvcp connections for:
# xyzac-trt-kins.ini,xyzbc-trt-kins.ini
net :kinstype.is-0 <= kinstype.is-0 => pyvcp.multilabel.0.legend0
net :kinstype.is-1 <= kinstype.is-1 => pyvcp.multilabel.0.legend1
net :kinstype.is-2 <= kinstype.is-2 => pyvcp.multilabel.0.legend2
net :vismach-clear <= pyvcp.vismach-clear => vismach.plotclear
net :type0-button <= pyvcp.type0-button => halui.mdi-command-00
net :type1-button <= pyvcp.type1-button => halui.mdi-command-01
net :type2-button <= pyvcp.type2-button => halui.mdi-command-02

View File

@@ -0,0 +1,182 @@
[APPLICATIONS]
# uncomment to enable:
#APP = halshow --fformat %.5f switchkins.halshow
[EMC]
VERSION = 1.1
MACHINE = sim-xyzac-trt-kins (switchkins)
[DISPLAY]
GEOMETRY = XYZ-A
OPEN_FILE = ./demos/xyzac_switchkins.ngc
PYVCP = ./xyzac-trt.xml
JOG_AXES = XYZC
DISPLAY = axis
MAX_ANGULAR_VELOCITY = 360
MAX_LINEAR_VELOCITY = 1000
POSITION_OFFSET = RELATIVE
POSITION_FEEDBACK = ACTUAL
MAX_FEED_OVERRIDE = 2
PROGRAM_PREFIX = ../../nc_files
INTRO_GRAPHIC = emc2.gif
INTRO_TIME = 1
#EDITOR = geany
TOOL_EDITOR = tooledit z diam
TKPKG = Ngcgui 1.0
NGCGUI_FONT = Helvetica -12 normal
NGCGUI_SUBFILE = xyzac_switchkins_sub.ngc
NGCGUI_SUBFILE = centering.ngc
[RS274NGC]
SUBROUTINE_PATH = ./remap_subs
HAL_PIN_VARS = 1
REMAP = M428 modalgroup=10 ngc=428remap
REMAP = M429 modalgroup=10 ngc=429remap
REMAP = M430 modalgroup=10 ngc=430remap
PARAMETER_FILE = xyzac.var
[KINS]
#NOTE: for backwrds compatibility !!!!!!!!!!!!!!!!!!!
# default switchkins-type == 0 is xyzac-trt-kins
# here switchkins-type == 0 is identity kins
KINEMATICS = xyzac-trt-kins sparm=identityfirst
JOINTS = 5
[HAL]
HALUI = halui
HALFILE = LIB:basic_sim.tcl
POSTGUI_HALFILE = switchkins_postgui.hal
# net for control of motion.switchkins-type
HALCMD = net :kinstype-select <= motion.analog-out-03 => motion.switchkins-type
# vismach xyzac-trt-gui items
HALCMD = loadusr -W xyzac-trt-gui
HALCMD = net :table-x joint.0.pos-fb xyzac-trt-gui.table-x
HALCMD = net :saddle-y joint.1.pos-fb xyzac-trt-gui.saddle-y
HALCMD = net :spindle-z joint.2.pos-fb xyzac-trt-gui.spindle-z
HALCMD = net :tilt-a joint.3.pos-fb xyzac-trt-gui.tilt-a
HALCMD = net :rotate-c joint.4.pos-fb xyzac-trt-gui.rotate-c
HALCMD = net :tool-offset motion.tooloffset.z
HALCMD = net :tool-offset xyzac-trt-kins.tool-offset xyzac-trt-gui.tool-offset
HALCMD = net :y-offset xyzac-trt-kins.y-offset xyzac-trt-gui.y-offset
HALCMD = net :z-offset xyzac-trt-kins.z-offset xyzac-trt-gui.z-offset
HALCMD = sets :y-offset 20
HALCMD = sets :z-offset 10
# not currently supported by xyzac-trt-gui:
HALCMD = setp xyzac-trt-kins.x-rot-point 0
HALCMD = setp xyzac-trt-kins.y-rot-point 0
HALCMD = setp xyzac-trt-kins.z-rot-point 0
HALCMD = setp xyzac-trt-kins.conventional-directions 0
[HALUI]
# NOTE: kinstype==0 is identity kins because sparm=identityfirst
# M429:identity kins (motion.switchkins-type==0 startupDEFAULT)
# M428:xyzac kins (motion.switchkins-type==1)
# M430:userk kins (motion.switchkins-type==2)
MDI_COMMAND = M429
MDI_COMMAND = M428
MDI_COMMAND = M430
[TRAJ]
COORDINATES = XYZAC
LINEAR_UNITS = mm
ANGULAR_UNITS = deg
DEFAULT_LINEAR_VELOCITY = 20
MAX_LINEAR_VELOCITY = 35
MAX_LINEAR_ACCELERATION = 400
DEFAULT_LINEAR_ACCELERATION = 300
[EMCMOT]
EMCMOT = motmod
SERVO_PERIOD = 1000000
COMM_TIMEOUT = 1
[TASK]
TASK = milltask
CYCLE_TIME = 0.010
[EMCIO]
TOOL_TABLE = xyzac-trt.tbl
[AXIS_X]
MIN_LIMIT = -200
MAX_LIMIT = 200
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
[AXIS_Y]
MIN_LIMIT = -100
MAX_LIMIT = 100
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
[AXIS_Z]
MIN_LIMIT = -120
MAX_LIMIT = 120
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
[AXIS_A]
MIN_LIMIT = -100
MAX_LIMIT = 50
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
[AXIS_C]
MIN_LIMIT = -36000
MAX_LIMIT = 36000
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
[JOINT_0]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
MIN_LIMIT = -200
MAX_LIMIT = 200
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_1]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
MIN_LIMIT = -100
MAX_LIMIT = 100
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_2]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
MIN_LIMIT = -120
MAX_LIMIT = 120
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_3]
TYPE = ANGULAR
HOME = 0
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
MIN_LIMIT = -100
MAX_LIMIT = 50
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_4]
TYPE = ANGULAR
HOME = 0
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
MIN_LIMIT = -36000
MAX_LIMIT = 36000
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0

View File

@@ -0,0 +1,10 @@
T1 P1 Z0 D1 ;end mill
T2 P2 Z15 D8 ;end mill
T3 P3 Z0 D4.2 ;#7 tap drill
T4 P4 Z0 D10
T5 P5 Z30 D10
T6 P6 Z30 D10
T7 P7 Z30 D10
T8 P8 Z30 D10
T9 P9 Z30 D10
T10 P10 D0.5

View File

@@ -0,0 +1,37 @@
xyzac-trt-kins (switchkins)
Uses remapped user m codes for kins switch:
M429: Identity Kinematics
M428: XYZAC (TCP)
M430: userk Kinematics
A hal net is required to connect the
analog out pin N, Example (for N=3):
net :kinstype-select <= motion.analog-out-03
net :kinstype-select => motion.switchkins-type
Hal Input pins:
xyzac-trt-kins.y-offset
xyzac-trt-kins.z-offset
Y and Z offsets are the offsets from the center
of rotation of the A axis relative to the center
of rotation of the C axis.
Hal Input pins:
xyzac-trt-kins.x-rot-point
xyzac-trt-kins.y-rot-point
xyzac-trt-kins.z-rot-point
X, Y and Z rot-point pins represent the
offsets of the center of rotation of the C axis
relative to the machine absolute zero
Hal Input pins:
xyzac-trt-kins.conventional-directions
Pin conventional-directions is false by default. If true,
axis directions follow the conventions as defined
at https://linuxcnc.org/docs/html/gcode/machining-center.html#_rotational_axes

View File

@@ -0,0 +1,45 @@
<?xml version='1.0' encoding='UTF-8'?>
<pyvcp>
<vbox>
<relief>"ridge"</relief>
<bd>5</bd>
<label>
<text>"SWITCHKINS"</text>
<relief>RIDGE</relief>
<bd>3</bd>
</label>
<multilabel>
<legends>["0:IDENTITY", "1: XYZAC ", "2: USERK "]</legends>
<font>("Helvetica",16)</font>
<bg>"black"</bg>
<fg>"yellow"</fg>
</multilabel>
<button>
<halpin>"type0-button"</halpin>
<text>"IDENTITY"</text>
<bd>3</bd>
</button>
<button>
<halpin>"type1-button"</halpin>
<text>"TCP:XYZAC"</text>
<bd>3</bd>
</button>
<button>
<halpin>"type2-button"</halpin>
<text>"userk "</text>
<bd>3</bd>
</button>
</vbox>
<vbox>
<relief>"ridge"</relief>
<bd>5</bd>
<button>
<halpin>"vismach-clear"</halpin>
<text>"vismach-clear"</text>
<bd>3</bd>
</button>
</vbox>
</pyvcp>

View File

@@ -0,0 +1,182 @@
[APPLICATIONS]
# uncomment to enable:
#APP = halshow --fformat %.5f switchkins.halshow
[EMC]
VERSION = 1.1
MACHINE = sim-xyzbc-trt-kins (switchkins)
[DISPLAY]
GEOMETRY = XYZB
OPEN_FILE = ./demos/xyzbc_switchkins.ngc
PYVCP = ./xyzbc-trt.xml
JOG_AXES = XYZC
DISPLAY = axis
MAX_ANGULAR_VELOCITY = 360
MAX_LINEAR_VELOCITY = 1000
POSITION_OFFSET = RELATIVE
POSITION_FEEDBACK = ACTUAL
MAX_FEED_OVERRIDE = 2
PROGRAM_PREFIX = ../../nc_files
INTRO_GRAPHIC = emc2.gif
INTRO_TIME = 1
#EDITOR = geany
TOOL_EDITOR = tooledit z diam
TKPKG = Ngcgui 1.0
NGCGUI_FONT = Helvetica -12 normal
NGCGUI_SUBFILE = xyzbc_switchkins_sub.ngc
NGCGUI_SUBFILE = centering.ngc
[RS274NGC]
SUBROUTINE_PATH = ./remap_subs
HAL_PIN_VARS = 1
REMAP = M428 modalgroup=10 ngc=428remap
REMAP = M429 modalgroup=10 ngc=429remap
REMAP = M430 modalgroup=10 ngc=430remap
PARAMETER_FILE = xyzbc.var
[KINS]
#NOTE: for backwrds compatibility !!!!!!!!!!!!!!!!!!!
# default switchkins-type == 0 is xyzbc-trt-kins
# here switchkins-type == 0 is identity kins
KINEMATICS = xyzbc-trt-kins sparm=identityfirst
JOINTS = 5
[HAL]
HALUI = halui
HALFILE = LIB:basic_sim.tcl
POSTGUI_HALFILE = switchkins_postgui.hal
# net for control of motion.switchkins-type
HALCMD = net :kinstype-select <= motion.analog-out-03 => motion.switchkins-type
# vismach xyzbc-trt-gui items
HALCMD = loadusr -W xyzbc-trt-gui
HALCMD = net :table-x joint.0.pos-fb xyzbc-trt-gui.table-x
HALCMD = net :saddle-y joint.1.pos-fb xyzbc-trt-gui.saddle-y
HALCMD = net :spindle-z joint.2.pos-fb xyzbc-trt-gui.spindle-z
HALCMD = net :tilt-b joint.3.pos-fb xyzbc-trt-gui.tilt-b
HALCMD = net :rotate-c joint.4.pos-fb xyzbc-trt-gui.rotate-c
HALCMD = net :tool-offset motion.tooloffset.z
HALCMD = net :tool-offset xyzbc-trt-kins.tool-offset xyzbc-trt-gui.tool-offset
HALCMD = net :x-offset xyzbc-trt-kins.x-offset xyzbc-trt-gui.x-offset
HALCMD = net :z-offset xyzbc-trt-kins.z-offset xyzbc-trt-gui.z-offset
HALCMD = sets :x-offset -20
HALCMD = sets :z-offset -15
# not currently supported by xyzbc-trt-gui:
HALCMD = setp xyzbc-trt-kins.x-rot-point 0
HALCMD = setp xyzbc-trt-kins.y-rot-point 0
HALCMD = setp xyzbc-trt-kins.z-rot-point 0
HALCMD = setp xyzbc-trt-kins.conventional-directions 0
[HALUI]
# NOTE: kinstype==0 is identity kins because sparm=identityfirst
# M429:identity kins (motion.switchkins-type==0 startupDEFAULT)
# M428:xyzbc kins (motion.switchkins-type==1)
# M430:userk kins (motion.switchkins-type==2)
MDI_COMMAND = M429
MDI_COMMAND = M428
MDI_COMMAND = M430
[TRAJ]
COORDINATES = XYZBC
LINEAR_UNITS = mm
ANGULAR_UNITS = deg
DEFAULT_LINEAR_VELOCITY = 20
MAX_LINEAR_VELOCITY = 35
MAX_LINEAR_ACCELERATION = 400
DEFAULT_LINEAR_ACCELERATION = 300
[EMCMOT]
EMCMOT = motmod
SERVO_PERIOD = 1000000
COMM_TIMEOUT = 1
[TASK]
TASK = milltask
CYCLE_TIME = 0.010
[EMCIO]
TOOL_TABLE = xyzbc-trt.tbl
[AXIS_X]
MIN_LIMIT = -200
MAX_LIMIT = 200
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
[AXIS_Y]
MIN_LIMIT = -100
MAX_LIMIT = 100
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
[AXIS_Z]
MIN_LIMIT = -120
MAX_LIMIT = 120
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
[AXIS_B]
MIN_LIMIT = -36000
MAX_LIMIT = 36000
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
[AXIS_C]
MIN_LIMIT = -36000
MAX_LIMIT = 36000
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
[JOINT_0]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
MIN_LIMIT = -200
MAX_LIMIT = 200
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_1]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
MIN_LIMIT = -100
MAX_LIMIT = 100
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_2]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
MIN_LIMIT = -120
MAX_LIMIT = 120
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_3]
TYPE = ANGULAR
HOME = 0
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
MIN_LIMIT = -100
MAX_LIMIT = 50
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_4]
TYPE = ANGULAR
HOME = 0
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
MIN_LIMIT = -36000
MAX_LIMIT = 36000
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0

View File

@@ -0,0 +1,2 @@
T1 P1 D1
T2 P2 Z10 D8

View File

@@ -0,0 +1,37 @@
xyzbc-trt-kins (switchkins)
Uses remapped user m codes for kins switch:
M429: Identity Kinematics
M428: XYZBC (TCP)
M430: userk Kinematics
A hal net is required to connect the
analog out pin N, Example (for N=3):
net :kinstype-select <= motion.analog-out-03
net :kinstype-select => motion.switchkins-type
Hal Input pins:
xyzbc-trt-kins.x-offset
xyzbc-trt-kins.z-offset
X and Z offsets are the offsets from the center
of rotation of the B axis relative to the center
of rotation of the C axis.
Hal Input pins:
xyzbc-trt-kins.x-rot-point
xyzbc-trt-kins.y-rot-point
xyzbc-trt-kins.z-rot-point
X, Y and Z rot-point pins represent the
offsets of the center of rotation of the C axis
relative to the machine absolute zero
Hal Input pins:
xyzbc-trt-kins.conventional-directions
Pin conventional-directions is false by default. If true,
axis directions follow the conventions as defined
at https://linuxcnc.org/docs/html/gcode/machining-center.html#_rotational_axes

View File

@@ -0,0 +1,45 @@
<?xml version='1.0' encoding='UTF-8'?>
<pyvcp>
<vbox>
<relief>"ridge"</relief>
<bd>5</bd>
<label>
<text>"SWITCHKINS"</text>
<relief>RIDGE</relief>
<bd>3</bd>
</label>
<multilabel>
<legends>["0:IDENTITY", "1: XYZBC ", "2: USERK "]</legends>
<font>("Helvetica",16)</font>
<bg>"black"</bg>
<fg>"yellow"</fg>
</multilabel>
<button>
<halpin>"type0-button"</halpin>
<text>"IDENTITY"</text>
<bd>3</bd>
</button>
<button>
<halpin>"type1-button"</halpin>
<text>"TCP:XYZBC"</text>
<bd>3</bd>
</button>
<button>
<halpin>"type2-button"</halpin>
<text>"userk"</text>
<bd>3</bd>
</button>
</vbox>
<vbox>
<relief>"ridge"</relief>
<bd>5</bd>
<button>
<halpin>"vismach-clear"</halpin>
<text>"vismach-clear"</text>
<bd>3</bd>
</button>
</vbox>
</pyvcp>

View File

@@ -0,0 +1,27 @@
This is a simulation configuration for a 6 axis machine with one table rotary and two spindle rotary joints
This simulation also includes a python remap of Gcodes for tilted workplane (TWP) functionality.
Both the kinematic and the twp remap support nutation of the secondary rotary joints (ie A or B ) form 0 to 90°.
Hence this also works for the 'usual' orthogonal spindle rotary-tilt type machines by setting the nutation angle to 90°.
Implemented TWP functionality:
G68.2 : defines twp using euler-angles, pitch-roll-yaw, 2-vectors, 3 points, optionally with offset in XYZ and rotation in XY
G68.3 : defines twp from current tool orientation, optionally with offset in XYZ and rotation in XY
G68.4 : same as G68.2 but as an incremental definition from an active TWP plane
G69 : cancels the current twp (resets all parameters, moves to G54 and sets Identity kinematics)
G53.1 (P) : spindle orientation without tcp, switches to G59 and activates tool kinematics
G53.3 (P XYZ) : same as G53.1 but with simultaneous move the the XYZ coords on the twp plane
G53.6 (P) : same as G53.1 but spindle orientation with tcp
- Spindle is C primary, A secondary or B secondary as defined in the [TWP] section of the ini file
- All G53.x commands will respect axis limits as set in the ini file for the respective primary and secondary spindle joints.
- The P word sets the orientation strategy: 0(default)=shortest distance,
1=positive rotation only,
2=negative rotation only
(this applies to the primary rotary, the secondary moves the shortest distance)
For more:
https://forum.linuxcnc.org/show-your-stuff/49103-kinematic-model-for-a-5axis-mill-with-universal-nutating-head?start=0#271334
Full Documentation can be found at:
https://github.com/Sigma1912/LinuxCNC_Demo_Configs/tree/main/table-rotary_spindle-rotary-nutating/Documentation

View File

@@ -0,0 +1,15 @@
o<circular_pocket>sub
; activate tool radius compensation
g42
; circular pocket
g1 x50 f5000
g2 i-25 z20
g2 i-25 z0
g2 i-25 z-20
g2 i-50 z-20
; deactivate tool radius compensation
g40
g1 x0 y0
g0 z50
o<circular_pocket>endsub
M2

View File

@@ -0,0 +1,17 @@
G69
g10 l2 p0 x1000 y-1000 z-1000
m6 t3 g43 h3
g68.2 q121 i25 j-10
g53.1
o100 REPEAT[100]
g68.4 q131 i35 j35 k0
g53.6
g0 x50y50z100
g0 x-50
g0 y-50
g0 x50
g0 y50
o100 ENDREPEAT
g69
M2

View File

@@ -0,0 +1,23 @@
g69
g10 l2 p0 x1300 y-200 z-1400
m6 t3 g43 h3
g68.2 q121 i0 j5
g53.1
g0 x0y0z100
o100 REPEAT[1000]
g68.4 x50 q232 i45 j0 k0
g53.6
;g52 x100
g0 x0y0z100
o<square> call
g68.4 x-50 q323 i0 j-45 k0
g53.6
;G52 x-100
g0 x0y0z100
o<square> call
o100 ENDREPEAT
g69
M2

View File

@@ -0,0 +1,20 @@
G69
g10 l2 p0 x1000 y-1000 z-1000
m6 t3 g43 h3
g68.2 q121 i25 j-10
g53.1
o100 REPEAT[100]
g68.4 q131 i-35 j-35 k0
;g53.3 p0 x50y50z150
g53.6
x50y50z150
g0 z100
g0 x-50
g0 y-50
g0 x50
g0 y50
g0 x0y0z120
o100 ENDREPEAT
g69
M2

View File

@@ -0,0 +1,12 @@
g69
g10 l2 p0 x1300 y-200 z-1400
m6 t3 g43 h3
g0 x0y0z100
g68.2 x50 y50 z-50 q121 i30 j15
g53.3 x0y0z100
o<square> call
;g69
M2

View File

@@ -0,0 +1,9 @@
o<square>sub
g0 x50y50z100
g0 x-50
g0 y-50
g0 x50
g0 y50
g0 x0y0z120
g52 x0y0z0
o<square>endsub

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,20 @@
# This is a component of LinuxCNC
# Copyright 2011, 2012, 2013 Dewey Garrett <dgarrett@panix.com>,
# Michael Haberler <git@mah.priv.at>
#
# 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.
#
# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
import remap

View File

@@ -0,0 +1,87 @@
#!/usr/bin/env python3
import hal
import linuxcnc
h = hal.component("twp-helper-comp")
# this pin reflects the machine.analog pin used for the
# twp-status
h.newpin("twp-status", hal.HAL_FLOAT, hal.HAL_IN)
# these pins are created here from 'twp-status''
h.newpin("twp-is-redefined", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("twp-is-defined", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("twp-is-active", hal.HAL_BIT, hal.HAL_OUT)
# twp origin vector
h.newpin("twp-ox-in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("twp-oy-in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("twp-oz-in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("twp-ox", hal.HAL_FLOAT, hal.HAL_OUT)
h.newpin("twp-oy", hal.HAL_FLOAT, hal.HAL_OUT)
h.newpin("twp-oz", hal.HAL_FLOAT, hal.HAL_OUT)
# twp x-orientation vector
h.newpin("twp-xx-in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("twp-xy-in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("twp-xz-in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("twp-xx", hal.HAL_FLOAT, hal.HAL_OUT)
h.newpin("twp-xy", hal.HAL_FLOAT, hal.HAL_OUT)
h.newpin("twp-xz", hal.HAL_FLOAT, hal.HAL_OUT)
# twp z-orientation vector
h.newpin("twp-zx-in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("twp-zy-in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("twp-zz-in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("twp-zx", hal.HAL_FLOAT, hal.HAL_OUT)
h.newpin("twp-zy", hal.HAL_FLOAT, hal.HAL_OUT)
h.newpin("twp-zz", hal.HAL_FLOAT, hal.HAL_OUT)
# twp origin vector in machine coordinate system
h.newpin("twp-ox-world-in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("twp-oy-world-in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("twp-oz-world-in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("twp-ox-world", hal.HAL_FLOAT, hal.HAL_OUT)
h.newpin("twp-oy-world", hal.HAL_FLOAT, hal.HAL_OUT)
h.newpin("twp-oz-world", hal.HAL_FLOAT, hal.HAL_OUT)
h.ready()
# create a connection to the status channel
s = linuxcnc.stat()
try:
while 1:
# publish twp-status
if h['twp-status'] == 1:
h['twp-is-defined'] = 1
h['twp-is-active'] = 0
elif h['twp-status'] == 2:
h['twp-is-defined'] = 1
h['twp-is-active'] = 1
else:
h['twp-is-defined'] = 0
h['twp-is-active'] = 0
# passthrough the twp arguments
h['twp-ox'] = h['twp-ox-in']
h['twp-oy'] = h['twp-oy-in']
h['twp-oz'] = h['twp-oz-in']
h['twp-xx'] = h['twp-xx-in']
h['twp-xy'] = h['twp-xy-in']
h['twp-xz'] = h['twp-xz-in']
h['twp-zx'] = h['twp-zx-in']
h['twp-zy'] = h['twp-zy-in']
h['twp-zz'] = h['twp-zz-in']
# we only want to expose offsets when twp is not defined
if not h['twp-is-defined']:
s.poll() # get current values
g5x_offset = s.g5x_offset
h['twp-ox-world'] = g5x_offset[0]
h['twp-oy-world'] = g5x_offset[1]
h['twp-oz-world'] = g5x_offset[2]
else : # use the values from the remap
h['twp-ox-world'] = h['twp-ox-world-in']
h['twp-oy-world'] = h['twp-oy-world-in']
h['twp-oz-world'] = h['twp-oz-world-in']
except KeyboardInterrupt:
raise SystemExit

View File

@@ -0,0 +1,67 @@
# This is a component of LinuxCNC
# Copyright 2011, 2013 Dewey Garrett <dgarrett@panix.com>, Michael
# Haberler <git@mah.priv.at>
#
# 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.
#
# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
import inspect
import emccanon
# O-word procedure to trap into the Pydevd debugger
# start debug server in Eclipse, then
# call as 'O<pydevd> call' from MDI
# example setup for debugging embedded Python code
# see http://pydev.org/manual_adv_remote_debugger.html
# if this points to a valid directory,
def call_pydevd():
""" trap into the pydevd debugger"""
import os,sys
pydevdir= '/home/mah/.eclipse/org.eclipse.platform_3.5.0_155965261/plugins/org.python.pydev.debug_2.0.0.2011040403/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")
pass
def lineno():
""" return line number in the current Python script """
return inspect.currentframe().f_back.f_lineno
def error_stack(self):
""" print the Interpreters error stack (function names) """
print("error stack level=%d" % (self.stack_index))
for s in self.stack():
print("--'%s'" % (s))
def callstack(self):
""" print the O-Word call stack """
for i in range(self.call_level):
c = self.sub_context[i]
print("%d: pos=%d seq=%d filename=%s sub=%s" % (i,c.position, c.sequence_number,c.filename,c.subname))

View File

@@ -0,0 +1,24 @@
;M428 by remap: kinstype==0 (IDENTITY kinematics)
o<428remap>sub
#<kinstype> = 0
#<SWITCHKINS_PIN> = 3 ; set N as required: motion.analog-out-0N
o1 if [exists [#<_hal[motion.switchkins-type]>]]
o1 else
(debug,M428:Missing [RS274NGC]HAL_PIN_VARS=1)
(debug,STOP)
M2
o1 endif
M66 E0 L0 ; force synch
M68 E#<SWITCHKINS_PIN> Q#<kinstype> ; set kinstype value
M66 E0 L0 ; force synch
o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #<kinstype>]]
(debug,M428: Wrong motion.switchkins-type)
(debug,or missing hal net to analog-out-0x)
(debug,STOP)
M2
o2 else
o2 endif
o<428remap>endsub

View File

@@ -0,0 +1,24 @@
;M429 by remap: kinstype==1 TCP kinematics
o<429remap>sub
#<kinstype> = 1
#<SWITCHKINS_PIN> = 3 ; set N as required: motion.analog-out-0N
o1 if [exists [#<_hal[motion.switchkins-type]>]]
o1 else
(debug,M429:Missing [RS274NGC]HAL_PIN_VARS=1)
(debug,STOP)
M2
o1 endif
M66 E0 L0 ; force synch
M68 E#<SWITCHKINS_PIN> Q#<kinstype> ; set kinstype value
M66 E0 L0 ; force synch
o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #<kinstype>]]
(debug,M429:Wrong motion.switchkins-type)
(debug,or missing hal net to analog-out-0x)
(debug,STOP)
M2
o2 else
o2 endif
o<429remap>endsub

View File

@@ -0,0 +1,24 @@
;M430 by remap: kinstype==2 Tool kinematics
o<430remap>sub
#<kinstype> = 2
#<SWITCHKINS_PIN> = 3 ; set N as required: motion.analog-out-0N
o1 if [exists [#<_hal[motion.switchkins-type]>]]
o1 else
(debug,M430:Missing [RS274NGC]HAL_PIN_VARS=1)
(debug,STOP)
M2
o1 endif
M66 E0 L0 ; force synch
M68 E#<SWITCHKINS_PIN> Q#<kinstype> ; set kinstype value
M66 E0 L0 ; force synch
o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #<kinstype>]]
(debug,M430:Wrong motion.switchkins-type)
(debug,or missing hal net to analog-out-0x)
(debug,STOP)
M2
o2 else
o2 endif
o<430remap>endsub

View File

@@ -0,0 +1,14 @@
; this is the wrapper remap to orient the spindle using IDENTITY kinematics G53.1
o<g531remap>sub
M66 L0 E0 ;force sync, stop read ahead
o100 if [EXISTS [#<P>]]
o100 else
#<P> = 0 ;if no P word has been passed we use the default (0)
o100 endif
M68 E3 Q0 ;switch to identity kinematic
M66 L0 E0
M530 P#<P> ;orient the spindle with P word
M66 L0 E0
o<g531remap>endsub
m2

View File

@@ -0,0 +1,20 @@
; this is the wrapper remap to orient the spindle using IDENTITY kinematics G53.3 with simultaneous move to XYZ (in tool coordinates)
o<g533remap>sub
M66 L0 E0 ;force sync, stop read ahead
o100 if [[EXISTS [#<X>]] AND [EXISTS [#<Y>]] AND [EXISTS [#<Z>]]]
M68 E3 Q0 ;switch to identity kinematic
o100 else
(abort, G53.3: X,Y and Z words are required) ;it is an error if X,Y or Z word is missing
o100 endif
o105 if [EXISTS [#<P>]] ;check if a P word has been passed
;(print, P=#<P>)
o105 else
#<P> = 0 ;if no P word has been passed we use the default (0)
o105 endif
M66 L0 E0
;Note we can not pass XYZ words to an m-code so we send coords as ijk and handle it in remap.py
M530 P#<P> I#<X> J#<Y> K#<Z> ;orient the spindle with P word and xyz as ijk
M66 L0 E0
o<g533remap>endsub
m2

View File

@@ -0,0 +1,14 @@
; this is the wrapper remap to orient the spindle using TCP kinematics G53.6
o<g536remap>sub
M66 L0 E0 ;force sync, stop read ahead
o100 if [EXISTS [#<P>]]
o100 else
#<P> = 0 ;if no P word has been passed we use the default (0)
o100 endif
M68 E3 Q1 ;switch to tcp kinematic
M66 L0 E0
M530 P#<P> ;orient the spindle with P word
M66 L0 E0
o<g536remap>endsub
m2

View File

@@ -0,0 +1,11 @@
; this is the wrapper remap to cancel TWP
o<g69remap>sub
M66 L0 E0 ; force sync, stop read ahead
M469 ; call the python G69_core code
M68 E3 Q0 ; switch to identity kins
M68 E2 Q0 ; reset twp-state to 'undefined' (0)
G54 ; switch to G54
M66 L0 E0 ; force sync, stop read ahead
o<g69remap>endsub
m2

View File

@@ -0,0 +1,26 @@
;This is a workaround for a bug that leads to stat.gcodes and parameter[5250]
;to get out of sync after some program aborts
;in [RS274NGC] section of the ini add: ON_ABORT_COMMAND = o <on_abort> call
;save this to a path specified in SUBROUTINE_PATH =
;NOTE: we cannot run remapped codes here only custom Mcodes (ie M100..M199)
o<on_abort_no_twp_reset> sub
;Workaround for
;https://github.com/LinuxCNC/linuxcnc/issues/2745
;https://github.com/LinuxCNC/linuxcnc/issues/2908
;store current offset index
#1 = #5220
; we must switch through at least 3 indexes
G59.3
G59.2
G59.1
; restore the index from above
o101 if [#1 GT 6]
(print, Code [#1-6])
G[59+[#1-6]/10]
o101 else
G[53+#1]
o101 endif
;(msg, on_abort sub executed)
o<on_abort_no_twp_reset> endsub
m2

View File

@@ -0,0 +1,15 @@
;This is a workaround for a bug that leads to stat.gcodes and parameter[5250]
;to get out of sync after some program aborts
;in [RS274NGC] section of the ini add: ON_ABORT_COMMAND = o <on_abort> call
;save this to a path specified in SUBROUTINE_PATH =
;NOTE: we cannot run remapped codes here only custom Mcodes (ie M100..M199)
o<on_abort_with_twp_reset> sub
;(msg, on_abort START)
M68 E2 Q0 ; reset twp-state to 'undefined' (0)
M68 E3 Q0 ; set IDENTITY kins
G64 P0.01 ; reset the toolpath tolerance as this sometimes gets set to zero on estop events
G54 ; switch to G54
(msg, on_abort END)
o<on_abort_with_twp_reset> endsub
M2

View File

@@ -0,0 +1,11 @@
# switchkins pyvcp connections
net :kinstype.is-0 <= kinstype.is-0 => pyvcp.multilabel.0.legend0
net :kinstype.is-1 <= kinstype.is-1 => pyvcp.multilabel.0.legend1
net :kinstype.is-2 <= kinstype.is-2 => pyvcp.multilabel.0.legend2
net :vismach-clear <= pyvcp.vismach-clear => vismach.plotclear
net :type0-button <= pyvcp.type0-button => halui.mdi-command-00
net :type1-button <= pyvcp.type1-button => halui.mdi-command-01
net :type2-button <= pyvcp.type2-button => halui.mdi-command-02

View File

@@ -0,0 +1,566 @@
#!/usr/bin/env python3
# This is a machine simulation for the 'xyzacb-trsrn' simulation config in linuxcnc
# Author: David mueller
# email: mueller_david@hotmail.com
import hal
import math
import sys
import os
from vismach import *
# getting the name of the directory
# where the this file is present.
current = os.path.dirname(os.path.realpath(__file__))
# Getting the parent directory name
# where the current directory is present.
parent = os.path.dirname(current)
# adding the parent directory to
# the sys.path.
sys.path.append(parent)
# now we can import the module in the parent
# directory.
# Machine zero as measured from center surface of the rotary c table
machine_zero_x = -1000
machine_zero_y = 1000
machine_zero_z = 2000
'''
try: # Expect files in working directory
# NOTE to run this file as standalone python script absolute paths might have to be used to find the stl files
# create the work piece from file
work_piece = AsciiSTL(filename="./work_piece_1.stl")
except Exception as detail:
print(detail)
raise SystemExit("gen-xyzacb-trsrn-gui requires stl files in working directory")
'''
for setting in sys.argv[1:]: exec(setting)
c = hal.component("xyzacb-trsrn-gui")
# axis_x
c.newpin("axis_x", hal.HAL_FLOAT, hal.HAL_IN)
# axis_y
c.newpin("axis_y", hal.HAL_FLOAT, hal.HAL_IN)
# head vertical slide
c.newpin("axis_z", hal.HAL_FLOAT, hal.HAL_IN)
# rotary_a
c.newpin("rotary_a", hal.HAL_FLOAT, hal.HAL_IN)
# rotary_b
c.newpin("rotary_b", hal.HAL_FLOAT, hal.HAL_IN)
# rotary_c
c.newpin("rotary_c", hal.HAL_FLOAT, hal.HAL_IN)
# nutation-angle
c.newpin("nutation_angle", hal.HAL_FLOAT, hal.HAL_IN)
# tool offsets
c.newpin("tool_length", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("tool_diameter", hal.HAL_FLOAT, hal.HAL_IN)
# geometric offsets in the spindle-rotary-assembly
c.newpin("pivot_y", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("pivot_z", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("offset_x", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("offset_y", hal.HAL_FLOAT, hal.HAL_IN)
# rot-point offsets distances from pivot point ( spindle AB)
# to rotation axis ( table C)
c.newpin("rot_axis_y", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("rot_axis_z", hal.HAL_FLOAT, hal.HAL_IN)
# selected kinematics
c.newpin("kinstype_select", hal.HAL_FLOAT, hal.HAL_IN)
# work piece show/hide
c.newpin("hide_work_piece_1", hal.HAL_BIT, hal.HAL_IN)
# spindle body show/hide
c.newpin("hide_spindle_body", hal.HAL_BIT, hal.HAL_IN)
# work piece show/hide
c.newpin("hide_somethingelse", hal.HAL_BIT, hal.HAL_IN)
# scale coordinate system indicators
c.newpin("scale_coords", hal.HAL_FLOAT, hal.HAL_IN)
# twp pins
c.newpin("twp_status", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_defined", hal.HAL_BIT, hal.HAL_IN)
c.newpin("twp_active", hal.HAL_BIT, hal.HAL_IN)
# the origin of the twp plane display needs to be independent of the work offsets
# because those offsets change as the kinematic switches between world and tool
c.newpin("twp_ox_world", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_oy_world", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_oz_world", hal.HAL_FLOAT, hal.HAL_IN)
# origin of the twp
c.newpin("twp_ox", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_oy", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_oz", hal.HAL_FLOAT, hal.HAL_IN)
# normal vector defining the temporary work plane as set by user with G68.2
c.newpin("twp_zx", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_zy", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_zz", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_xx", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_xy", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_xz", hal.HAL_FLOAT, hal.HAL_IN)
c.ready()
# give endpoint Z values and radii
# resulting cylinder is on the Z axis
class HalToolCylinder(CylinderZ):
def __init__(self, comp, *args):
CylinderZ.__init__(self, *args)
self.comp = c
def coords(self):
r = 6 # default if hal pin not set
if (c.tool_diameter > 0): r = c.tool_diameter/2
return -c.tool_length, r, 0, r
# used to create the spindle housing as set by the variable 'pivot_z'
class HalSpindleHousingZ(CylinderZ):
def __init__(self, comp, *args):
CylinderZ.__init__(self, *args)
self.comp = c
def coords(self):
r = 140
length = c.pivot_z + 200
# start the spindle housing at height 100 above the spindle nose
return length, r, 100, r
# used to create the spindle rotary as set by the variable 'pivot_y'
class HalSpindleHousingY(CylinderY):
def __init__(self, comp, *args):
CylinderZ.__init__(self, *args)
self.comp = c
def coords(self):
r = 120
length = c.pivot_y + 150
return length, r-30, 0, r
# used to create an indicator for the variable 'pivot_z'
class HalPivotZ(CylinderZ):
def __init__(self, comp, *args):
CylinderZ.__init__(self, *args)
self.comp = c
def coords(self):
r = 2
length = c.pivot_z
# start the spindle housing at height 100 above the spindle nose
return length, 1, 0, r
# used to create an indicator for the variable 'pivot_y'
class HalPivotY(CylinderY):
def __init__(self, comp, *args):
CylinderZ.__init__(self, *args)
self.comp = c
def coords(self):
r = 2
length = -c.pivot_y
return length, r, 0, 1
# used to create an indicator for the variable 'offset_x'
class HalOffsetX(CylinderX):
def __init__(self, comp, *args):
CylinderX.__init__(self, *args)
self.comp = c
def coords(self):
r = 2
length = -c.offset_x
return length, r, 0, 1
# used to create an indicator for the variable 'offset_y'
class HalOffsetY(CylinderY):
def __init__(self, comp, *args):
CylinderZ.__init__(self, *args)
self.comp = c
def coords(self):
r = 2
length = -c.offset_y
return length, r, 0, 1
# used to create a thin tool-offset indicator
class HalToolOffset(CylinderZ):
def __init__(self, comp, *args):
CylinderZ.__init__(self, *args)
self.comp = c
def coords(self):
r = 2
return -c.tool_length, 1, 0, r
class CoordSystem(Collection):
# creates a visual object for a coordinate system
def __init__(self, comp, r=4, l=500):
# set arrow length
al = l/10
self.parts = [Color([1,0,0,1],[CylinderX(0,r,l,r)]),
Color([1,0,0,1],[CylinderX(l,2*r,l+al,1)]),
Color([0,1,0,1],[CylinderY(0,r,l,r)]),
Color([0,1,0,1],[CylinderY(l,2*r,l+al,1)]),
Color([0,0,1,1],[CylinderZ(0,r,l,r)]),
Color([0,0,1,1],[CylinderZ(l,2*r,l+al,1)]),
]
class Point(Collection):
# creates a visual object for a point
def __init__(self, comp, r=1, l=20, color=[1,1,1,1]):
self.parts = [Color(color,[CylinderX(-l,r,l,r)]),
Color(color,[CylinderY(-l,r,l,r)]),
Color(color,[CylinderZ(-l,r,l,r)])
]
# used to rotate parts around the nutation axis
class HalRotateNutation(HalVectorRotate):
def __init__(self, parts, comp, var, th, x, y, z):
HalVectorRotate.__init__(self, parts, comp, var, th, x, y, z)
self.parts = parts
self.comp = c
self.var = var
self.th = th
def get_values(self):
th = self.th
x = 0
y = th*sin(radians(c.nutation_angle))
z = th*cos(radians(c.nutation_angle))
return th, x, y, z
#indicators
# create vismach coordinates to show the origin during construction of the model
vismach_coords = CoordSystem(c,2,5000)
# create absolute coordinates
abs_coords = CoordSystem(c,8,300)
abs_coords = HalScale([abs_coords],c,1,1,1,"scale_coords")
# create work coordinates that represent work_offset offset
work_coords = CoordSystem(c,2,100)
work_coords = HalScale([work_coords],c,1,1,1,"scale_coords")
# work coordinates for identity mode
work_coords_ident = HalShow([work_coords],c,0,"kinstype_select")
# work coordinates for tcp mode
work_coords_tcp = HalShow([work_coords],c,1,"kinstype_select")
# work coordinates for tool mode
work_coords_tool = HalShow([work_coords],c,2,"kinstype_select")
# rotate to match the current tool orientation
work_coords_tool = HalRotateNutation([work_coords_tool],c,"rotary_b",-1,0,0,0)
work_coords_tool = HalRotate([work_coords_tool],c,"rotary_c",1,0,0,1)
# move the coords to the designated (x,y,z)-home position
abs_coords = Translate([abs_coords], machine_zero_x, machine_zero_y, machine_zero_z)
work_coords_ident = Translate([work_coords_ident], machine_zero_x, machine_zero_y, machine_zero_z)
work_coords_tcp = Translate([work_coords_tcp] , machine_zero_x, machine_zero_y, machine_zero_z)
work_coords_tool = Translate([work_coords_tool] , machine_zero_x, machine_zero_y, machine_zero_z)
# move the work offsets by the work_offset
work_coords_ident = HalVectorTranslate([work_coords_ident],c,"twp_ox_world","twp_oy_world","twp_oz_world")
work_coords_tcp = HalVectorTranslate([work_coords_tcp] ,c,"twp_ox_world","twp_oy_world","twp_oz_world")
work_coords_tool = HalVectorTranslate([work_coords_tool] ,c,"twp_ox_world","twp_oy_world","twp_oz_world")
# create a visual indicator for the position of the control point
ctrl_pt = Point(c)
# move the control point indicator to the control-position
#ctrl_pt = HalVectorTranslate([ctrl_pt],c,"abs_pos_x","abs_pos_y","abs_pos_z")
ctrl_pt = HalTranslate([ctrl_pt],c,"tool_length",0,0,-1)
# create an indicator line from the reference point to the work_offset position
line_work_offset = Color([1,1,1,1],[HalLine(c,0,0,0,"twp_ox_world","twp_oy_world","twp_oz_world",1,1)])
line_work_offset = Translate([line_work_offset], machine_zero_x, machine_zero_y, machine_zero_z)
coords = Collection([
abs_coords,
work_coords_ident,
work_coords_tool,
#ctrl_pt,
line_work_offset,
])
# create a visual for the position of the rotational axis of the rotary C table
# as set by the user with the "rot-axis-x" and "rot-axis-y" sliders in the axis gui
rot_axis = Color([1,1,0.3,1],[CylinderX(0,2,-2000,2)])
# move the rot_axis indicator by the designated (x,y)-home offset
rot_axis= Translate([rot_axis], 0, machine_zero_y, machine_zero_z)
# now move it to the position set by the user
rot_axis = HalVectorTranslate([rot_axis],c,0,"rot_axis_y","rot_axis_z")
#/indicators
#tool-side
tooltip = Capture()
tool_cylinder = Collection([
HalToolCylinder(c),
# this indicates the spindle nose when no tool-offset is active
CylinderZ(-0.1, 0, 0.1, 10),
])
tool_cylinder = HalShow([tool_cylinder],c,True,"hide_spindle_body",0,1)
# create an indicator for the tool-offset when spindle-body is hidden
ind_tool_offset = Color([1,0,1,0],[HalToolOffset(c)])
tool = Collection([
HalTranslate([tooltip], c, "tool_length", 0,0,-1),
tool_cylinder,
ind_tool_offset
])
tool = Color([1,0,1,0], [tool] )
# create an indicator for the variable pivot_z
ind_pivot_z = Color([0,0,0.75,1],[HalPivotZ(CylinderZ)])
# create an indicator for the variable pivot_y
ind_pivot_y = Color([0,0.75,0,1],[HalPivotY(CylinderY)])
# move the pivot_y indicator so it extends from the pivot point
ind_pivot_y = HalVectorTranslate([ind_pivot_y],c,0,"pivot_y","pivot_z",1)
# create the spindle housing that contains the spindle
spindle_housing = Collection([
# spindle
Color([0.7,0.7,0,1],[CylinderZ(0,50,50,100)]),
Color([0.7,0.7,0,1],[CylinderZ(50,100,100,100)]),
# spindle housing vertical length as set by 'pivot_z'
Color([0.7,0.7,0,1],[HalSpindleHousingZ(CylinderZ)])
])
spindle_housing = HalShow([spindle_housing],c,True,"hide_spindle_body",0,1)
spindle_housing = Collection([
tool,
spindle_housing,
ind_pivot_z
])
# spindle housing horizontal length as set by 'pivot_y'
spindle_housing_horizontal = Color([0.7,0.7,0,1],[HalSpindleHousingY(c)])
# move up along the spindle housing
spindle_housing_horizontal = Translate([spindle_housing_horizontal],0,0,50)
# move farther up by the pivot_z value
spindle_housing_horizontal = HalVectorTranslate([spindle_housing_horizontal],c,0,0,"pivot_z",1)
# make it hidable
spindle_housing_horizontal = HalShow([spindle_housing_horizontal],c,True,"hide_spindle_body",0,1)
spindle_housing = Collection([
spindle_housing,
spindle_housing_horizontal,
ind_pivot_y
])
# move the spindle and it's vertical housing by the values set for the pivot lengths
# so the vismach origin is in the pivot point
spindle_housing = HalVectorTranslate([spindle_housing],c,0,"pivot_y","pivot_z",-1)
# create a visual for the rotary c axis
ind_axis_c = Color([1,1,0.3,1],[CylinderZ(0,1,400,1)])
ind_pivot_point = Collection([
Color([1,1,1,1],[CylinderX(-200,1,200,1)]),
Color([1,1,1,1],[CylinderY(-200,1,200,1)]),
# arrow indicating the up position
Color([1,1,1,1],[CylinderY(200,5,210,1)]),
# sphere for the actual pivot point
Color([1,1,0.3,1],[Sphere(0,0,0,5)]),
ind_axis_c
])
# create the part of joint b that attaches to the spindle body
spindle_housing_nut = Collection([
Color([0.7,0.7,0,1],[CylinderZ(0,60,150,145)]),
Color([0.7,0.7,0,1],[CylinderZ(150,145,180,145)])
])
# rotate the nutation joint to the nutation angle
spindle_housing_nut = HalRotate([spindle_housing_nut],c,"nutation_angle",-1,1,0,0)
spindle_housing_nut = HalShow([spindle_housing_nut],c,True,"hide_spindle_body",0,1)
# create HAL-link for a-axis rotational joint"
spindle_housing = HalRotateNutation([spindle_housing],c,"rotary_b",-1,0,1,0)
# move the joint using the offset values as set by the user in the gui panel
spindle_housing = HalVectorTranslate([spindle_housing],c,"offset_x","offset_y",0,-1)
spindle_housing = Collection([
spindle_housing,
spindle_housing_nut
])
# create an indicator for x-offset
ind_offset_x = Color([1,0,0,1],[HalOffsetX(c)])
# create an indicator for y-offset
ind_offset_y = Color([0,1,0,1],[HalOffsetY(c)])
ind_offset_y = HalTranslate([ind_offset_y],c,"offset_x", -1,0,0)
# create an indicator for rotational axis B
ind_axis_a = Color([1,1,0.3,1],[CylinderZ(0,1,400,1)])
ind_axis_a = HalRotate([ind_axis_a],c,"nutation_angle",-1,1,0,0)
# move the indicator by the offset values as set by the user in the gui panel
ind_axis_a = HalVectorTranslate([ind_axis_a],c,"offset_x","offset_y",0,-1)
spindle_indicators = Collection([
ind_offset_x,
ind_offset_y,
ind_pivot_point,
ind_axis_a,
])
# create part of joint B that attaches to the body of rotary c
spindle_rotary_nut = Collection([
Color([1,0.5,0,0],[CylinderZ(180,145,300,145)]),
Color([1,0.5,0,0],[CylinderZ(300,145,310,125)]),
])
# rotate the nutation joint to the nutation angle
spindle_rotary_nut = HalRotate([spindle_rotary_nut],c,"nutation_angle",-1,1,0,0)
# create the part that connects the nutation joint to the rotary C
spindle_rotary_arm = Color([1,0.5,0,0],[BoxCenteredXY(300, 600, 100)])
spindle_rotary_arm = Rotate([spindle_rotary_arm],50,-1,0,0)
spindle_rotary_arm = Translate([spindle_rotary_arm],0,120,200)
# create where the plate the arm connects to the xyz-slide
spindle_rotary_plate = Color([1,0.5,0,0],[CylinderZ(0,160,50,180)])
# move the plate up where it connects to the arm
spindle_rotary_plate = Translate([spindle_rotary_plate],0,0,400)
spindle_rotary = Collection([
spindle_rotary_nut,
spindle_rotary_arm,
spindle_rotary_plate
])
# make it hidable
spindle_rotary = HalShow([spindle_rotary],c,True,"hide_spindle_body",0,1)
# join the two parts to a spindle assembly
spindle_assembly = Collection([
spindle_housing,
spindle_rotary,
spindle_indicators
])
# create HAL-link for c-axis rotational joint"
spindle_assembly = HalRotate([spindle_assembly],c,"rotary_c",1,0,0,1)
# add a block for the y-axis to the spindle_assembly
slide_xyz = Color([0.6,0.8,0.3,0], [Box(-250, -200, 0, 250, 3000, 500)])
# move so the spindle assembly attaches to the bottom front
slide_xyz = Translate([slide_xyz],0,0,450)
slide_xyz = HalShow([slide_xyz],c,True,"hide_spindle_body",0,1)
spindle_xyz = Collection([
spindle_assembly,
slide_xyz
])
# move the spindle and it's vertical housing by the values set for the pivot lengths
# so the vismach origin is in the center of the spindle nose
spindle_xyz = HalVectorTranslate([spindle_xyz],c,0,"pivot_y","pivot_z")
spindle_xyz = HalVectorTranslate([spindle_xyz],c,"offset_x","offset_y",0)
# spindle head and y-slide move with x
spindle_xyz = HalTranslate([spindle_xyz],c,"axis_x",1,0,0)
# spindle head and y-slide move with y
spindle_xyz = HalTranslate([spindle_xyz],c,"axis_y",0,1,0)
# spindle head and y-slide move with z
spindle_xyz = HalTranslate([spindle_xyz],c,"axis_z",0,0,1)
# move the spindle_xyz to it's designated home position
spindle_xyz = Translate([spindle_xyz], machine_zero_x, machine_zero_y, machine_zero_z)
#/tool-side
#work-side
work = Capture()
# create a simple cube
work_piece = BoxCenteredXY(600, 600, 600)
# create a more complex work piece from stl
#work_piece = Translate([work_piece],0,0,0)
work_piece = Color([0.5,0.5,0.5,0.9], [work_piece])
# move the workpiece
work_piece = Translate([work_piece],0,300,300)
work_piece = HalShow([work_piece],c,1,"hide_work_piece_1",0,1)
# create a block that holds the rotary a table
rotary_table_housing = Color([0.2,0.2,0.2,0],[BoxCenteredXY(2000, 2000, -1000)])
# move so the surface set below from the current XY plane
rotary_table_housing = Translate([rotary_table_housing],0,0,-20)
# create rotary_table_a
rotary_table_a = Color([0.1,0.7,0.9,0],[CylinderZ(0,920,-800,920)])
# create 'slots' in x and y on the rotary table
table_console = Color([0.5,0.5,0.5,0.9],[BoxCenteredXY(1840, 200, 1200)])
# move so the surface is on the rotation axis
table_console = Translate([table_console],0,-100,0)
slot_z_w = Color([1,1,1,1],[BoxCenteredXY(10, 1840, 0.9)])
# create indicator of at positive end of x slot
slot_pocket = Color([1,1,1,1],[CylinderZ(0,20,1,20)])
slot_pocket = Translate([slot_pocket],900,0,0)
rotary_table_a = Collection([
work,
work_piece,
rotary_table_a,
table_console,
slot_z_w
])
# create HAL-link for a-axis rotational joint"
rotary_table_a = HalRotate([rotary_table_a],c,"rotary_a",-1,0,0,1)
rotary_table_a = Collection([
rotary_table_a,
rotary_table_housing
])
# rotate into the yz plane
rotary_table_a = Rotate([rotary_table_a],90,0,1,0)
# rotate so the table_console is horizontal
rotary_table_a = Rotate([rotary_table_a],90,1,0,0)
rotary_table_a = Translate([rotary_table_a ],-1700,0,0)
# rotate the tcp coords with the rotary table
work_coords_tcp = HalRotate([work_coords_tcp],c,"rotary_a",-1,1,0,0)
# create the work_plane using the origin (as measured from current work offset (world),
# normal vector vz(zx,zy,zz) and x-orientation vector vx(xx,xy,xz)
# these are used to create a transformation matrix
# with y-orientation vector being the cross_product(vz, vx)
work_plane = HalGridFromNormalAndDirection(c,
"twp_ox", "twp_oy", "twp_oz",
"twp_xx", "twp_xy", "twp_xz",
"twp_zx", "twp_zy", "twp_zz"
)
# for twp-defined = true, we show the plane in gray
work_plane_defined = Color([0.7,0.7,0.7,1],[work_plane])
work_plane_defined = HalShow([work_plane_defined],c,0,"twp_active")
# for twp-active = true, we show the plane in pink
work_plane_active = Color([1,0,1,1],[work_plane])
work_plane_active = HalShow([work_plane_active],c,1,"twp_active")
# create a coordinate system for the twp-plane
work_plane_coords = HalCoordsFromNormalAndDirection(c,
"twp_ox", "twp_oy", "twp_oz",
"twp_xx", "twp_xy", "twp_xz",
"twp_zx", "twp_zy", "twp_zz",
10,3
)
work_plane = Collection([work_plane_defined, work_plane_active, work_plane_coords])
# make the work_plane hidable
work_plane = HalShow([work_plane],c,1,"twp_defined")
# move plane by home offset
work_plane = Translate([work_plane], machine_zero_x, machine_zero_y, machine_zero_z)
# move plane to current work offset
work_plane = HalVectorTranslate([work_plane],c,"twp_ox_world","twp_oy_world","twp_oz_world")
table = Collection([
rotary_table_a,
rot_axis,
work_coords_tcp,
coords,
work_plane
])
#/work-side
#base
base = Collection([
# base
Box(-3500, -1000, -1500, 3500, 3000, -1300),
# column back
Box(-2000, 1800, -1500, 2000, 4000, 3500)
])
base = Color([0.2,0.2,0.2,1], [base] )
#/base
model = Collection([table, spindle_xyz, base])
#hud
myhud = Hud()
myhud.show("XYZACB-trsrn")
myhud.show("----------------")
myhud.show("TWP-Status:")
myhud.add_txt("Undefined",0)
myhud.add_txt("Defined",1)
myhud.add_txt("Tool oriented",2)
myhud.add_txt("",[1,2,3])
myhud.add_txt("TWP-Orientation Vector X:",[1,2,3])
myhud.add_pin("Xx: {:8.3f}","xyzacb-trsrn-gui.twp_xx",[1,2,3])
myhud.add_pin("Xy: {:8.3f}","xyzacb-trsrn-gui.twp_xy",[1,2,3])
myhud.add_pin("Xz: {:8.3f}","xyzacb-trsrn-gui.twp_xz",[1,2,3])
myhud.add_txt("",[1,2,3])
myhud.add_txt("TWP-Orientation Vector Z:",[1,2,3])
myhud.add_pin("Zx: {:8.3f}","xyzacb-trsrn-gui.twp_zx",[1,2,3])
myhud.add_pin("Zy: {:8.3f}","xyzacb-trsrn-gui.twp_zy",[1,2,3])
myhud.add_pin("Zz: {:8.3f}","xyzacb-trsrn-gui.twp_zz",[1,2,3])
myhud.add_txt("",[1,2,3])
myhud.show_tags_in_pin("xyzacb-trsrn-gui.twp_status")
#/hud
main(model, tooltip, work, size=4000, hud=myhud, lat=-60, lon=25)

View File

@@ -0,0 +1,560 @@
#!/usr/bin/env python3
# This is a machine simulation for the 'xyzbca-trsrn' simulation config in linuxcnc
# Author: David mueller
# email: mueller_david@hotmail.com
import hal
import math
import sys
import os
from vismach import *
# getting the name of the directory
# where the this file is present.
current = os.path.dirname(os.path.realpath(__file__))
# Getting the parent directory name
# where the current directory is present.
parent = os.path.dirname(current)
# adding the parent directory to
# the sys.path.
sys.path.append(parent)
# now we can import the module in the parent
# directory.
# Machine zero as measured from center surface of the rotary c table
machine_zero_x = -1000
machine_zero_y = 1000
machine_zero_z = 2000
'''
try: # Expect files in working directory
# NOTE to run this file as standalone python script absolute paths might have to be used to find the stl files
# create the work piece from file
work_piece = AsciiSTL(filename="./work_piece_1.stl")
except Exception as detail:
print(detail)
raise SystemExit("xyzbca-trsrn-gui requires stl files in working directory")
'''
for setting in sys.argv[1:]: exec(setting)
c = hal.component("xyzbca-trsrn-gui")
# axis_x
c.newpin("axis_x", hal.HAL_FLOAT, hal.HAL_IN)
# axis_y
c.newpin("axis_y", hal.HAL_FLOAT, hal.HAL_IN)
# head vertical slide
c.newpin("axis_z", hal.HAL_FLOAT, hal.HAL_IN)
# rotary_a
c.newpin("rotary_a", hal.HAL_FLOAT, hal.HAL_IN)
# rotary_b
c.newpin("rotary_b", hal.HAL_FLOAT, hal.HAL_IN)
# rotary_c
c.newpin("rotary_c", hal.HAL_FLOAT, hal.HAL_IN)
# nutation-angle
c.newpin("nutation_angle", hal.HAL_FLOAT, hal.HAL_IN)
# tool offsets
c.newpin("tool_length", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("tool_diameter", hal.HAL_FLOAT, hal.HAL_IN)
# geometric offsets in the spindle-rotary-assembly
c.newpin("pivot_x", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("pivot_z", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("offset_x", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("offset_y", hal.HAL_FLOAT, hal.HAL_IN)
# rot-point offsets distances from pivot point ( spindle AB)
# to rotation axis ( table C)
c.newpin("rot_axis_x", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("rot_axis_z", hal.HAL_FLOAT, hal.HAL_IN)
# selected kinematics
c.newpin("kinstype_select", hal.HAL_FLOAT, hal.HAL_IN)
# work piece show/hide
c.newpin("hide_work_piece_1", hal.HAL_BIT, hal.HAL_IN)
# spindle body show/hide
c.newpin("hide_spindle_body", hal.HAL_BIT, hal.HAL_IN)
# work piece show/hide
c.newpin("hide_somethingelse", hal.HAL_BIT, hal.HAL_IN)
# scale coordinate system indicators
c.newpin("scale_coords", hal.HAL_FLOAT, hal.HAL_IN)
# twp pins
c.newpin("twp_status", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_defined", hal.HAL_BIT, hal.HAL_IN)
c.newpin("twp_active", hal.HAL_BIT, hal.HAL_IN)
# the origin of the twp plane display needs to be independent of the work offsets
# because those offsets change as the kinematic switches between world and tool
c.newpin("twp_ox_world", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_oy_world", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_oz_world", hal.HAL_FLOAT, hal.HAL_IN)
# origin of the twp
c.newpin("twp_ox", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_oy", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_oz", hal.HAL_FLOAT, hal.HAL_IN)
# normal vector defining the temporary work plane as set by user with G68.2
c.newpin("twp_zx", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_zy", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_zz", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_xx", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_xy", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("twp_xz", hal.HAL_FLOAT, hal.HAL_IN)
c.ready()
# give endpoint Z values and radii
# resulting cylinder is on the Z axis
class HalToolCylinder(CylinderZ):
def __init__(self, comp, *args):
CylinderZ.__init__(self, *args)
self.comp = c
def coords(self):
r = 6 # default if hal pin not set
if (c.tool_diameter > 0): r = c.tool_diameter/2
return -c.tool_length, r, 0, r
# used to create the spindle housing as set by the variable 'pivot_z'
class HalSpindleHousingZ(CylinderZ):
def __init__(self, comp, *args):
CylinderZ.__init__(self, *args)
self.comp = c
def coords(self):
r = 140
length = c.pivot_z + 200
# start the spindle housing at height 100 above the spindle nose
return length, r, 100, r
# used to create the spindle rotary as set by the variable 'pivot_x'
class HalSpindleHousingX(CylinderX):
def __init__(self, comp, *args):
CylinderZ.__init__(self, *args)
self.comp = c
def coords(self):
r = 120
length = c.pivot_x + 150
return length, r-30, 0, r
# used to create an indicator for the variable 'pivot_z'
class HalPivotZ(CylinderZ):
def __init__(self, comp, *args):
CylinderZ.__init__(self, *args)
self.comp = c
def coords(self):
r = 2
length = c.pivot_z
# start the spindle housing at height 100 above the spindle nose
return length, 1, 0, r
# used to create an indicator for the variable 'pivot_x'
class HalPivotX(CylinderX):
def __init__(self, comp, *args):
CylinderZ.__init__(self, *args)
self.comp = c
def coords(self):
r = 2
length = -c.pivot_x
return length, r, 0, 1
# used to create an indicator for the variable 'offset_x'
class HalOffsetX(CylinderX):
def __init__(self, comp, *args):
CylinderX.__init__(self, *args)
self.comp = c
def coords(self):
r = 2
length = -c.offset_x
return length, r, 0, 1
# used to create an indicator for the variable 'offset_y'
class HalOffsetY(CylinderY):
def __init__(self, comp, *args):
CylinderZ.__init__(self, *args)
self.comp = c
def coords(self):
r = 2
length = -c.offset_y
return length, r, 0, 1
# used to create a thin tool-offset indicator
class HalToolOffset(CylinderZ):
def __init__(self, comp, *args):
CylinderZ.__init__(self, *args)
self.comp = c
def coords(self):
r = 2
return -c.tool_length, 1, 0, r
class CoordSystem(Collection):
# creates a visual object for a coordinate system
def __init__(self, comp, r=4, l=500):
# set arrow length
al = l/10
self.parts = [Color([1,0,0,1],[CylinderX(0,r,l,r)]),
Color([1,0,0,1],[CylinderX(l,2*r,l+al,1)]),
Color([0,1,0,1],[CylinderY(0,r,l,r)]),
Color([0,1,0,1],[CylinderY(l,2*r,l+al,1)]),
Color([0,0,1,1],[CylinderZ(0,r,l,r)]),
Color([0,0,1,1],[CylinderZ(l,2*r,l+al,1)]),
]
class Point(Collection):
# creates a visual object for a point
def __init__(self, comp, r=1, l=20, color=[1,1,1,1]):
self.parts = [Color(color,[CylinderX(-l,r,l,r)]),
Color(color,[CylinderY(-l,r,l,r)]),
Color(color,[CylinderZ(-l,r,l,r)])
]
# used to rotate parts around the nutation axis
class HalRotateNutation(HalVectorRotate):
def __init__(self, parts, comp, var, th, x, y, z):
HalVectorRotate.__init__(self, parts, comp, var, th, x, y, z)
self.parts = parts
self.comp = c
self.var = var
self.th = th
def get_values(self):
th = self.th
x = th*sin(radians(c.nutation_angle))
y = 0
z = th*cos(radians(c.nutation_angle))
return th, x, y, z
#indicators
# create vismach coordinates to show the origin during construction of the model
vismach_coords = CoordSystem(c,2,5000)
# create absolute coordinates
abs_coords = CoordSystem(c,8,300)
abs_coords = HalScale([abs_coords],c,1,1,1,"scale_coords")
# create work coordinates that represent work_offset offset
work_coords = CoordSystem(c,2,100)
work_coords = HalScale([work_coords],c,1,1,1,"scale_coords")
# work coordinates for identity mode
work_coords_ident = HalShow([work_coords],c,0,"kinstype_select")
# work coordinates for tcp mode
work_coords_tcp = HalShow([work_coords],c,1,"kinstype_select")
# work coordinates for tool mode
work_coords_tool = HalShow([work_coords],c,2,"kinstype_select")
# rotate to match the current tool orientation
work_coords_tool = HalRotateNutation([work_coords_tool],c,"rotary_a",-1,0,0,0)
work_coords_tool = HalRotate([work_coords_tool],c,"rotary_c",1,0,0,1)
# move the coords to the designated (x,y,z)-home position
abs_coords = Translate([abs_coords], machine_zero_x, machine_zero_y, machine_zero_z)
work_coords_ident = Translate([work_coords_ident], machine_zero_x, machine_zero_y, machine_zero_z)
work_coords_tcp = Translate([work_coords_tcp] , machine_zero_x, machine_zero_y, machine_zero_z)
work_coords_tool = Translate([work_coords_tool] , machine_zero_x, machine_zero_y, machine_zero_z)
# move the work offsets by the work_offset
work_coords_ident = HalVectorTranslate([work_coords_ident],c,"twp_ox_world","twp_oy_world","twp_oz_world")
work_coords_tcp = HalVectorTranslate([work_coords_tcp] ,c,"twp_ox_world","twp_oy_world","twp_oz_world")
work_coords_tool = HalVectorTranslate([work_coords_tool] ,c,"twp_ox_world","twp_oy_world","twp_oz_world")
# create a visual indicator for the position of the control point
ctrl_pt = Point(c)
# move the control point indicator to the control-position
#ctrl_pt = HalVectorTranslate([ctrl_pt],c,"abs_pos_x","abs_pos_y","abs_pos_z")
ctrl_pt = HalTranslate([ctrl_pt],c,"tool_length",0,0,-1)
# create an indicator line from the reference point to the work_offset position
line_work_offset = Color([1,1,1,1],[HalLine(c,0,0,0,"twp_ox_world","twp_oy_world","twp_oz_world",1,1)])
line_work_offset = Translate([line_work_offset], machine_zero_x, machine_zero_y, machine_zero_z)
coords = Collection([
abs_coords,
work_coords_ident,
work_coords_tool,
#ctrl_pt,
line_work_offset,
])
# create a visual for the position of the rotational axis of the rotary C table
# as set by the user with the "rot-axis-x" and "rot-axis-y" sliders in the axis gui
rot_axis = Color([1,1,0.3,1],[CylinderY(0,2,2000,2)])
# move the rot_axis indicator by the designated (x,y)-home offset
rot_axis= Translate([rot_axis], machine_zero_x, 0, machine_zero_z)
# now move it to the position set by the user
rot_axis = HalVectorTranslate([rot_axis],c,"rot_axis_x",0,"rot_axis_z")
#/indicators
#tool-side
tooltip = Capture()
tool_cylinder = Collection([
HalToolCylinder(c),
# this indicates the spindle nose when no tool-offset is active
CylinderZ(-0.1, 0, 0.1, 10),
])
tool_cylinder = HalShow([tool_cylinder],c,True,"hide_spindle_body",0,1)
# create an indicator for the tool-offset when spindle-body is hidden
ind_tool_offset = Color([1,0,1,0],[HalToolOffset(c)])
tool = Collection([
HalTranslate([tooltip], c, "tool_length", 0,0,-1),
tool_cylinder,
ind_tool_offset
])
tool = Color([1,0,1,0], [tool] )
# create an indicator for the variable pivot_z
ind_pivot_z = Color([0,0,0.75,1],[HalPivotZ(CylinderZ)])
# create an indicator for the variable pivot_x
ind_pivot_x = Color([0.75,0,0,1],[HalPivotX(CylinderX)])
# move the pivot_x indicator so it extends from the pivot point
ind_pivot_x = HalVectorTranslate([ind_pivot_x],c,"pivot_x",0,"pivot_z",1)
# create the spindle housing that contains the spindle
spindle_housing = Collection([
# spindle
Color([0.7,0.7,0,1],[CylinderZ(0,50,50,100)]),
Color([0.7,0.7,0,1],[CylinderZ(50,100,100,100)]),
# spindle housing vertical length as set by 'pivot_z'
Color([0.7,0.7,0,1],[HalSpindleHousingZ(CylinderZ)])
])
spindle_housing = HalShow([spindle_housing],c,True,"hide_spindle_body",0,1)
spindle_housing = Collection([
tool,
spindle_housing,
ind_pivot_z
])
# spindle housing horizontal length as set by 'pivot_x'
spindle_housing_horizontal = Color([0.7,0.7,0,1],[HalSpindleHousingX(c)])
# move up along the spindle housing
spindle_housing_horizontal = Translate([spindle_housing_horizontal],0,0,50)
# move farther up by the pivot_z value
spindle_housing_horizontal = HalVectorTranslate([spindle_housing_horizontal],c,0,0,"pivot_z",1)
# make it hidable
spindle_housing_horizontal = HalShow([spindle_housing_horizontal],c,True,"hide_spindle_body",0,1)
spindle_housing = Collection([
spindle_housing,
spindle_housing_horizontal,
ind_pivot_x
])
# move the spindle and it's vertical housing by the values set for the pivot lengths
# so the vismach origin is in the pivot point
spindle_housing = HalVectorTranslate([spindle_housing],c,"pivot_x",0,"pivot_z",-1)
# create a visual for the rotary c axis
ind_axis_c = Color([1,1,0.3,1],[CylinderZ(0,1,400,1)])
ind_pivot_point = Collection([
Color([1,1,1,1],[CylinderX(-200,1,200,1)]),
Color([1,1,1,1],[CylinderY(-200,1,200,1)]),
# arrow indicating the up position
Color([1,1,1,1],[CylinderY(200,5,210,1)]),
# sphere for the actual pivot point
Color([1,1,0.3,1],[Sphere(0,0,0,5)]),
ind_axis_c
])
# create the part of joint A that attaches to the spindle body
spindle_housing_nut = Collection([
Color([0.7,0.7,0,1],[CylinderZ(0,60,150,145)]),
Color([0.7,0.7,0,1],[CylinderZ(150,145,180,145)])
])
# rotate the nutation joint to the nutation angle
spindle_housing_nut = HalRotate([spindle_housing_nut],c,"nutation_angle",1,0,1,0)
spindle_housing_nut = HalShow([spindle_housing_nut],c,True,"hide_spindle_body",0,1)
# create HAL-link for a-axis rotational joint"
spindle_housing = HalRotateNutation([spindle_housing],c,"rotary_a",-1,0,0,0)
# move the joint using the offset values as set by the user in the gui panel
spindle_housing = HalVectorTranslate([spindle_housing],c,"offset_x","offset_y",0,-1)
spindle_housing = Collection([
spindle_housing,
spindle_housing_nut
])
# create an indicator for x-offset
ind_offset_x = Color([1,0,0,1],[HalOffsetX(c)])
# create an indicator for y-offset
ind_offset_y = Color([0,1,0,1],[HalOffsetY(c)])
ind_offset_y = HalTranslate([ind_offset_y],c,"offset_x", -1,0,0)
# create an indicator for rotational axis A
ind_axis_a = Color([1,1,0.3,1],[CylinderZ(0,1,400,1)])
ind_axis_a = HalRotate([ind_axis_a],c,"nutation_angle",1,0,1,0)
# move the indicator by the offset values as set by the user in the gui panel
ind_axis_a = HalVectorTranslate([ind_axis_a],c,"offset_x","offset_y",0,-1)
spindle_indicators = Collection([
ind_offset_x,
ind_offset_y,
ind_pivot_point,
ind_axis_a,
])
# create part of joint A that attaches to the body of rotary c
spindle_rotary_nut = Collection([
Color([1,0.5,0,0],[CylinderZ(180,145,300,145)]),
Color([1,0.5,0,0],[CylinderZ(300,145,310,125)]),
])
# rotate the nutation joint to the nutation angle
spindle_rotary_nut = HalRotate([spindle_rotary_nut],c,"nutation_angle",1,0,1,0)
# create the part that connects the nutation joint to the rotary C
spindle_rotary_arm = Color([1,0.5,0,0],[BoxCenteredXY(300, 600, 100)])
spindle_rotary_arm = Rotate([spindle_rotary_arm],50,-1,0,0)
spindle_rotary_arm = Translate([spindle_rotary_arm],0,120,200)
# rotate so it slants in the machine-x direction
spindle_rotary_arm = Rotate([spindle_rotary_arm],90,0,0,-1)
# create where the plate the arm connects to the xyz-slide
spindle_rotary_plate = Color([1,0.5,0,0],[CylinderZ(0,160,50,180)])
# move the plate up where it connects to the arm
spindle_rotary_plate = Translate([spindle_rotary_plate],0,0,400)
spindle_rotary = Collection([
spindle_rotary_nut,
spindle_rotary_arm,
spindle_rotary_plate
])
# make it hidable
spindle_rotary = HalShow([spindle_rotary],c,True,"hide_spindle_body",0,1)
# join the two parts to a spindle assembly
spindle_assembly = Collection([
spindle_housing,
spindle_rotary,
spindle_indicators
])
# create HAL-link for c-axis rotational joint"
spindle_assembly = HalRotate([spindle_assembly],c,"rotary_c",1,0,0,1)
# add a block for the y-axis to the spindle_assembly
slide_xyz = Color([0.6,0.8,0.3,0], [Box(-250, -200, 0, 250, 3000, 500)])
# move so the spindle assembly attaches to the bottom front
slide_xyz = Translate([slide_xyz],0,0,450)
slide_xyz = HalShow([slide_xyz],c,True,"hide_spindle_body",0,1)
spindle_xyz = Collection([
spindle_assembly,
slide_xyz
])
# move the spindle and it's vertical housing by the values set for the pivot lengths
# so the vismach origin is in the center of the spindle nose
spindle_xyz = HalVectorTranslate([spindle_xyz],c,"pivot_x",0,"pivot_z")
spindle_xyz = HalVectorTranslate([spindle_xyz],c,"offset_x","offset_y",0)
# spindle head and y-slide move with x
spindle_xyz = HalTranslate([spindle_xyz],c,"axis_x",1,0,0)
# spindle head and y-slide move with y
spindle_xyz = HalTranslate([spindle_xyz],c,"axis_y",0,1,0)
# spindle head and y-slide move with z
spindle_xyz = HalTranslate([spindle_xyz],c,"axis_z",0,0,1)
# move the spindle_xyz to it's designated home position
spindle_xyz = Translate([spindle_xyz], machine_zero_x, machine_zero_y, machine_zero_z)
#/tool-side
#work-side
work = Capture()
# create a simple cube
work_piece = BoxCenteredXY(600, 600, 600)
# create a more complex work piece from stl
#work_piece = Translate([work_piece],0,0,0)
work_piece = Color([0.5,0.5,0.5,0.9], [work_piece])
# move the workpiece
work_piece = Translate([work_piece],0,300,300)
work_piece = HalShow([work_piece],c,1,"hide_work_piece_1",0,1)
# create rotary_table_c
rotary_table_b = Color([0.1,0.7,0.9,0],[CylinderZ(0,920,-800,920)])
# create 'slots' in x and y on the rotary table
table_console = Color([0.5,0.5,0.5,0.9],[BoxCenteredXY(1840, 200, 1200)])
# move so the surface is on the rotation axis
table_console = Translate([table_console],0,-100,0)
slot_z_w = Color([1,1,1,1],[BoxCenteredXY(10, 1840, 0.9)])
# create indicator of at positive end of x slot
slot_pocket = Color([1,1,1,1],[CylinderZ(0,20,1,20)])
slot_pocket = Translate([slot_pocket],900,0,0)
rotary_table_b = Collection([
work,
work_piece,
rotary_table_b,
table_console,
slot_z_w,
])
# rotate into the xz plane
rotary_table_b = Rotate([rotary_table_b],90,1,0,0)
# create HAL-link for rotary table
rotary_table_b = HalRotate([rotary_table_b],c,"rotary_b",-1,0,1,0)
rotary_table_b = Translate([rotary_table_b ],0,1700,0)
# rotate the tcp coords with the rotary table
work_coords_tcp = HalRotate([work_coords_tcp],c,"rotary_b",-1,0,1,0)
# create the work_plane using the origin (as measured from current work offset (world),
# normal vector vz(zx,zy,zz) and x-orientation vector vx(xx,xy,xz)
# these are used to create a transformation matrix
# with y-orientation vector being the cross_product(vz, vx)
work_plane = HalGridFromNormalAndDirection(c,
"twp_ox", "twp_oy", "twp_oz",
"twp_xx", "twp_xy", "twp_xz",
"twp_zx", "twp_zy", "twp_zz"
)
# for twp-defined = true, we show the plane in gray
work_plane_defined = Color([0.7,0.7,0.7,1],[work_plane])
work_plane_defined = HalShow([work_plane_defined],c,0,"twp_active")
# for twp-active = true, we show the plane in pink
work_plane_active = Color([1,0,1,1],[work_plane])
work_plane_active = HalShow([work_plane_active],c,1,"twp_active")
# create a coordinate system for the twp-plane
work_plane_coords = HalCoordsFromNormalAndDirection(c,
"twp_ox", "twp_oy", "twp_oz",
"twp_xx", "twp_xy", "twp_xz",
"twp_zx", "twp_zy", "twp_zz",
10,3
)
work_plane = Collection([work_plane_defined, work_plane_active, work_plane_coords])
# make the work_plane hidable
work_plane = HalShow([work_plane],c,1,"twp_defined")
# move plane by home offset
work_plane = Translate([work_plane], machine_zero_x, machine_zero_y, machine_zero_z)
# move plane to current work offset
work_plane = HalVectorTranslate([work_plane],c,"twp_ox_world","twp_oy_world","twp_oz_world")
table = Collection([
rotary_table_b,
rot_axis,
work_coords_tcp,
coords,
work_plane,
])
#/work-side
#base
base = Collection([
# base
Box(-3500, -1000, -1500, 3500, 3000, -1300),
# column back
Box(-2000, 1800, -1500, 2000, 4000, 3500)
])
base = Color([0.2,0.2,0.2,1], [base] )
#/base
model = Collection([table, spindle_xyz, base,])
#hud
myhud = Hud()
myhud.show("XYZBCA-trsrn")
myhud.show("----------------")
myhud.show("TWP-Status:")
myhud.add_txt("Undefined",0)
myhud.add_txt("Defined",1)
myhud.add_txt("Tool oriented",2)
myhud.add_txt("",[1,2,3])
myhud.add_txt("TWP-Orientation Vector X:",[1,2,3])
myhud.add_pin("Xx: {:8.3f}","xyzbca-trsrn-gui.twp_xx",[1,2,3])
myhud.add_pin("Xy: {:8.3f}","xyzbca-trsrn-gui.twp_xy",[1,2,3])
myhud.add_pin("Xz: {:8.3f}","xyzbca-trsrn-gui.twp_xz",[1,2,3])
myhud.add_txt("",[1,2,3])
myhud.add_txt("TWP-Orientation Vector Z:",[1,2,3])
myhud.add_pin("Zx: {:8.3f}","xyzbca-trsrn-gui.twp_zx",[1,2,3])
myhud.add_pin("Zy: {:8.3f}","xyzbca-trsrn-gui.twp_zy",[1,2,3])
myhud.add_pin("Zz: {:8.3f}","xyzbca-trsrn-gui.twp_zz",[1,2,3])
myhud.add_txt("",[1,2,3])
myhud.show_tags_in_pin("xyzbca-trsrn-gui.twp_status")
#/hud
main(model, tooltip, work, size=4000, hud=myhud, lat=-60, lon=25)

View File

@@ -0,0 +1,16 @@
This is a simulation configuration for a 6 axis machine with the following kinematic:
XYZ - linear cartesian
A - table rotary
C - spindle rotary
B - spindle nutating
The spindle rotary assembly is fully configurable using sliders in the side panel of the gui
The kinematic component includes the following modes:
IDENTITY: Trivial kinematics with a one-to-one mapping of joints to axes
TCP: Coordinated xyz motion with rotation around the tool center point
TOOL: Coordinated xyz motion in the current tool coordinate system
Also see the README in the parent directory.

View File

@@ -0,0 +1,102 @@
<?xml version='1.0' encoding='UTF-8'?>
<pyvcp>
<vbox>
<vbox>
<labelframe text="A Rotation Axis Offset">
<font>("Helvetica",14)</font>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>" "</text>
</label>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>"Physical location of rotation-axis in the model\n in absolute machine coordinates:"</text>
</label>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>" y: -1000\n z: -2000"</text>
</label>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>" "</text>
</label>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>"these are also the correct 'rot-axis' settings\n for this model"</text>
</label>
</hbox>
<hbox>
<label>
<text>"y-rot-axis: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"y-rot-axis"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>-1000</initval>
<min_>-1900</min_>
<max_>1000</max_>
</scale>
</hbox>
<hbox>
<label>
<text>"z-rot-axis: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"z-rot-axis"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>-2000</initval>
<min_>-2900</min_>
<max_>1100</max_>
</scale>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>" "</text>
</label>
</hbox>
<hbox>
<label>
<text>"Use hover + mouse wheel to change values"</text>
<font>("Helvetica",6)</font>
</label>
</hbox>
</labelframe>
</vbox>
<!-- create a space to the next element -->
<vbox>
<hbox>
<label>
<text>" "</text>
<font>("Helvetica",4)</font>
</label>
</hbox>
</vbox>
<vbox>
<hbox>
<label>
<text>" To test change values above\n reload and restart\n the demo gcode "</text>
<font>("Helvetica",10)</font>
</label>
</hbox>
</vbox>
</vbox>
</pyvcp>

View File

@@ -0,0 +1,632 @@
solid Part2
facet normal -1.000000e+00 0.000000e+00 0.000000e+00
outer loop
vertex -2.500000e+02 -2.500000e+02 3.000000e+02
vertex -2.500000e+02 2.500000e+02 0.000000e+00
vertex -2.500000e+02 -2.500000e+02 0.000000e+00
endloop
endfacet
facet normal -0.000000e+00 -1.000000e+00 0.000000e+00
outer loop
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
vertex -2.500000e+02 -2.500000e+02 3.000000e+02
vertex -2.500000e+02 -2.500000e+02 0.000000e+00
endloop
endfacet
facet normal 0.000000e+00 -1.000000e+00 0.000000e+00
outer loop
vertex 2.500000e+02 -2.500000e+02 0.000000e+00
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
vertex -2.500000e+02 -2.500000e+02 0.000000e+00
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 -1.000000e+00
outer loop
vertex -2.500000e+02 2.500000e+02 0.000000e+00
vertex 2.500000e+02 -2.500000e+02 0.000000e+00
vertex -2.500000e+02 -2.500000e+02 0.000000e+00
endloop
endfacet
facet normal 1.000000e+00 0.000000e+00 0.000000e+00
outer loop
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
vertex 2.500000e+02 -2.500000e+02 0.000000e+00
endloop
endfacet
facet normal 1.000000e+00 0.000000e+00 -0.000000e+00
outer loop
vertex 2.500000e+02 2.500000e+02 0.000000e+00
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 2.500000e+02 -2.500000e+02 0.000000e+00
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 -1.000000e+00
outer loop
vertex -2.500000e+02 2.500000e+02 0.000000e+00
vertex 2.500000e+02 2.500000e+02 0.000000e+00
vertex 2.500000e+02 -2.500000e+02 0.000000e+00
endloop
endfacet
facet normal -1.000000e+00 -0.000000e+00 -0.000000e+00
outer loop
vertex -2.500000e+02 2.500000e+02 3.000000e+02
vertex -2.500000e+02 2.500000e+02 0.000000e+00
vertex -2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 0.000000e+00 -7.071068e-01 7.071068e-01
outer loop
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
vertex -5.000000e+01 -5.000000e+01 5.000000e+02
vertex -2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 0.000000e+00 -7.071068e-01 7.071068e-01
outer loop
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
vertex -2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal -7.071068e-01 0.000000e+00 7.071068e-01
outer loop
vertex -5.000000e+01 -5.000000e+01 5.000000e+02
vertex -2.500000e+02 2.500000e+02 3.000000e+02
vertex -2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 7.071067e-01 0.000000e+00 7.071069e-01
outer loop
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 2.032670e+02 -6.905210e-16 3.467330e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 7.071067e-01 1.745782e-08 7.071068e-01
outer loop
vertex 2.032670e+02 -6.905210e-16 3.467330e+02
vertex 2.006929e+02 -1.947439e+01 3.493071e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 7.071067e-01 3.070633e-08 7.071068e-01
outer loop
vertex 2.006929e+02 -1.947439e+01 3.493071e+02
vertex 1.933181e+02 -3.631866e+01 3.566819e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 7.071068e-01 3.842491e-08 7.071068e-01
outer loop
vertex 1.933181e+02 -3.631866e+01 3.566819e+02
vertex 1.821387e+02 -4.825789e+01 3.678613e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 7.071068e-01 4.600219e-08 7.071068e-01
outer loop
vertex 1.821387e+02 -4.825789e+01 3.678613e+02
vertex 1.686644e+02 -5.367963e+01 3.813356e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 7.071068e-01 5.675223e-08 7.071068e-01
outer loop
vertex 1.686644e+02 -5.367963e+01 3.813356e+02
vertex 1.547152e+02 -5.185163e+01 3.952848e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 7.071068e-01 6.583240e-08 7.071068e-01
outer loop
vertex 1.547152e+02 -5.185163e+01 3.952848e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 6.524362e-02 9.957342e-01 -6.524364e-02
outer loop
vertex 1.193599e+02 -5.185163e+01 3.599295e+02
vertex 1.547152e+02 -5.185163e+01 3.952848e+02
vertex 1.333091e+02 -5.367963e+01 3.459802e+02
endloop
endfacet
facet normal 6.524360e-02 9.957342e-01 -6.524363e-02
outer loop
vertex 1.547152e+02 -5.185163e+01 3.952848e+02
vertex 1.686644e+02 -5.367963e+01 3.813356e+02
vertex 1.333091e+02 -5.367963e+01 3.459802e+02
endloop
endfacet
facet normal -1.935088e-01 9.618257e-01 1.935089e-01
outer loop
vertex 1.686644e+02 -5.367963e+01 3.813356e+02
vertex 1.467833e+02 -4.825789e+01 3.325060e+02
vertex 1.333091e+02 -5.367963e+01 3.459802e+02
endloop
endfacet
facet normal 7.071067e-01 1.912466e-07 7.071068e-01
outer loop
vertex 1.467833e+02 -4.825789e+01 3.325060e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 1.333091e+02 -5.367963e+01 3.459802e+02
endloop
endfacet
facet normal 7.071070e-01 2.229500e-07 7.071066e-01
outer loop
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 1.193599e+02 -5.185163e+01 3.599295e+02
vertex 1.333091e+02 -5.367963e+01 3.459802e+02
endloop
endfacet
facet normal -1.935088e-01 9.618257e-01 1.935089e-01
outer loop
vertex 1.821387e+02 -4.825789e+01 3.678613e+02
vertex 1.467833e+02 -4.825789e+01 3.325060e+02
vertex 1.686644e+02 -5.367963e+01 3.813356e+02
endloop
endfacet
facet normal 3.151846e-01 8.951633e-01 -3.151847e-01
outer loop
vertex 1.068195e+02 -4.302078e+01 3.724698e+02
vertex 1.421749e+02 -4.302078e+01 4.078251e+02
vertex 1.193599e+02 -5.185163e+01 3.599295e+02
endloop
endfacet
facet normal 3.151847e-01 8.951632e-01 -3.151848e-01
outer loop
vertex 1.421749e+02 -4.302078e+01 4.078251e+02
vertex 1.547152e+02 -5.185163e+01 3.952848e+02
vertex 1.193599e+02 -5.185163e+01 3.599295e+02
endloop
endfacet
facet normal 7.071067e-01 3.410209e-07 7.071069e-01
outer loop
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 1.068195e+02 -4.302078e+01 3.724698e+02
vertex 1.193599e+02 -5.185163e+01 3.599295e+02
endloop
endfacet
facet normal 7.071068e-01 3.664266e-08 7.071068e-01
outer loop
vertex 1.421749e+02 -4.302078e+01 4.078251e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
vertex 1.547152e+02 -5.185163e+01 3.952848e+02
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 1.000000e+00
outer loop
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
vertex -5.000000e+01 2.500000e+02 5.000000e+02
vertex -5.000000e+01 -5.000000e+01 5.000000e+02
endloop
endfacet
facet normal -7.071068e-01 0.000000e+00 7.071068e-01
outer loop
vertex -5.000000e+01 2.500000e+02 5.000000e+02
vertex -2.500000e+02 2.500000e+02 3.000000e+02
vertex -5.000000e+01 -5.000000e+01 5.000000e+02
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 1.000000e+00
outer loop
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex -5.000000e+01 2.500000e+02 5.000000e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
endloop
endfacet
facet normal 7.071068e-01 7.037430e-07 7.071068e-01
outer loop
vertex 1.421749e+02 -4.302078e+01 4.078251e+02
vertex 1.327370e+02 -2.837975e+01 4.172629e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
endloop
endfacet
facet normal 7.071069e-01 -4.915623e-07 7.071066e-01
outer loop
vertex 1.327370e+02 -2.837975e+01 4.172629e+02
vertex 1.276764e+02 -9.905863e+00 4.223236e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
endloop
endfacet
facet normal 7.071068e-01 -0.000000e+00 7.071068e-01
outer loop
vertex 1.276764e+02 -9.905863e+00 4.223236e+02
vertex 1.276764e+02 9.905863e+00 4.223236e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
endloop
endfacet
facet normal 7.071068e-01 0.000000e+00 7.071068e-01
outer loop
vertex 1.276764e+02 9.905863e+00 4.223236e+02
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
endloop
endfacet
facet normal -4.261270e-01 7.980172e-01 4.261272e-01
outer loop
vertex 1.821387e+02 -4.825789e+01 3.678613e+02
vertex 1.579628e+02 -3.631866e+01 3.213266e+02
vertex 1.467833e+02 -4.825789e+01 3.325060e+02
endloop
endfacet
facet normal 7.071064e-01 -8.249345e-08 7.071072e-01
outer loop
vertex 1.579628e+02 -3.631866e+01 3.213266e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 1.467833e+02 -4.825789e+01 3.325060e+02
endloop
endfacet
facet normal -4.261273e-01 7.980170e-01 4.261273e-01
outer loop
vertex 1.933181e+02 -3.631866e+01 3.566819e+02
vertex 1.579628e+02 -3.631866e+01 3.213266e+02
vertex 1.821387e+02 -4.825789e+01 3.678613e+02
endloop
endfacet
facet normal 5.225582e-01 6.736956e-01 -5.225583e-01
outer loop
vertex 9.738170e+01 -2.837975e+01 3.819076e+02
vertex 1.327370e+02 -2.837975e+01 4.172629e+02
vertex 1.068195e+02 -4.302078e+01 3.724698e+02
endloop
endfacet
facet normal 5.225580e-01 6.736957e-01 -5.225583e-01
outer loop
vertex 1.327370e+02 -2.837975e+01 4.172629e+02
vertex 1.421749e+02 -4.302078e+01 4.078251e+02
vertex 1.068195e+02 -4.302078e+01 3.724698e+02
endloop
endfacet
facet normal 7.071067e-01 2.969849e-07 7.071068e-01
outer loop
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 9.738170e+01 -2.837975e+01 3.819076e+02
vertex 1.068195e+02 -4.302078e+01 3.724698e+02
endloop
endfacet
facet normal -6.011944e-01 5.264319e-01 6.011944e-01
outer loop
vertex 1.933181e+02 -3.631866e+01 3.566819e+02
vertex 1.653375e+02 -1.947439e+01 3.139518e+02
vertex 1.579628e+02 -3.631866e+01 3.213266e+02
endloop
endfacet
facet normal 7.071068e-01 6.091928e-07 7.071068e-01
outer loop
vertex 1.653375e+02 -1.947439e+01 3.139518e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 1.579628e+02 -3.631866e+01 3.213266e+02
endloop
endfacet
facet normal -6.011941e-01 5.264323e-01 6.011944e-01
outer loop
vertex 2.006929e+02 -1.947439e+01 3.493071e+02
vertex 1.653375e+02 -1.947439e+01 3.139518e+02
vertex 1.933181e+02 -3.631866e+01 3.566819e+02
endloop
endfacet
facet normal 6.593572e-01 3.612418e-01 -6.593575e-01
outer loop
vertex 9.232107e+01 -9.905863e+00 3.869683e+02
vertex 1.276764e+02 -9.905863e+00 4.223236e+02
vertex 9.738170e+01 -2.837975e+01 3.819076e+02
endloop
endfacet
facet normal 6.593574e-01 3.612416e-01 -6.593575e-01
outer loop
vertex 1.276764e+02 -9.905863e+00 4.223236e+02
vertex 1.327370e+02 -2.837975e+01 4.172629e+02
vertex 9.738170e+01 -2.837975e+01 3.819076e+02
endloop
endfacet
facet normal 7.071069e-01 -1.940928e-07 7.071066e-01
outer loop
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 9.232107e+01 -9.905863e+00 3.869683e+02
vertex 9.738170e+01 -2.837975e+01 3.819076e+02
endloop
endfacet
facet normal -6.950667e-01 1.837499e-01 6.950670e-01
outer loop
vertex 2.006929e+02 -1.947439e+01 3.493071e+02
vertex 1.679117e+02 -1.781979e-14 3.113776e+02
vertex 1.653375e+02 -1.947439e+01 3.139518e+02
endloop
endfacet
facet normal 7.071065e-01 -4.679821e-07 7.071071e-01
outer loop
vertex 1.679117e+02 -1.781979e-14 3.113776e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 1.653375e+02 -1.947439e+01 3.139518e+02
endloop
endfacet
facet normal -6.950670e-01 1.837494e-01 6.950670e-01
outer loop
vertex 2.032670e+02 -6.905210e-16 3.467330e+02
vertex 1.679117e+02 -1.781979e-14 3.113776e+02
vertex 2.006929e+02 -1.947439e+01 3.493071e+02
endloop
endfacet
facet normal 7.071066e-01 0.000000e+00 -7.071069e-01
outer loop
vertex 9.232107e+01 9.905863e+00 3.869683e+02
vertex 1.276764e+02 9.905863e+00 4.223236e+02
vertex 9.232107e+01 -9.905863e+00 3.869683e+02
endloop
endfacet
facet normal 7.071066e-01 0.000000e+00 -7.071069e-01
outer loop
vertex 1.276764e+02 9.905863e+00 4.223236e+02
vertex 1.276764e+02 -9.905863e+00 4.223236e+02
vertex 9.232107e+01 -9.905863e+00 3.869683e+02
endloop
endfacet
facet normal 7.071069e-01 0.000000e+00 7.071066e-01
outer loop
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 9.232107e+01 9.905863e+00 3.869683e+02
vertex 9.232107e+01 -9.905863e+00 3.869683e+02
endloop
endfacet
facet normal -6.950669e-01 -1.837499e-01 6.950669e-01
outer loop
vertex 2.032670e+02 -6.905210e-16 3.467330e+02
vertex 1.653375e+02 1.947439e+01 3.139518e+02
vertex 1.679117e+02 -1.781979e-14 3.113776e+02
endloop
endfacet
facet normal 7.071065e-01 4.679821e-07 7.071071e-01
outer loop
vertex 1.653375e+02 1.947439e+01 3.139518e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 1.679117e+02 -1.781979e-14 3.113776e+02
endloop
endfacet
facet normal -6.950668e-01 -1.837494e-01 6.950671e-01
outer loop
vertex 2.006929e+02 1.947439e+01 3.493071e+02
vertex 1.653375e+02 1.947439e+01 3.139518e+02
vertex 2.032670e+02 -6.905210e-16 3.467330e+02
endloop
endfacet
facet normal 7.071069e-01 1.940928e-07 7.071066e-01
outer loop
vertex 9.738170e+01 2.837975e+01 3.819076e+02
vertex 9.232107e+01 9.905863e+00 3.869683e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
endloop
endfacet
facet normal 7.071070e-01 -2.229500e-07 7.071066e-01
outer loop
vertex 1.333091e+02 5.367963e+01 3.459802e+02
vertex 1.193599e+02 5.185163e+01 3.599295e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
endloop
endfacet
facet normal 7.071067e-01 -3.410209e-07 7.071069e-01
outer loop
vertex 1.193599e+02 5.185163e+01 3.599295e+02
vertex 1.068195e+02 4.302078e+01 3.724698e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
endloop
endfacet
facet normal 7.071067e-01 -2.969849e-07 7.071068e-01
outer loop
vertex 1.068195e+02 4.302078e+01 3.724698e+02
vertex 9.738170e+01 2.837975e+01 3.819076e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
endloop
endfacet
facet normal 7.071068e-01 -6.091928e-07 7.071068e-01
outer loop
vertex 1.653375e+02 1.947439e+01 3.139518e+02
vertex 1.579628e+02 3.631866e+01 3.213266e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
endloop
endfacet
facet normal 7.071064e-01 8.249345e-08 7.071072e-01
outer loop
vertex 1.579628e+02 3.631866e+01 3.213266e+02
vertex 1.467833e+02 4.825789e+01 3.325060e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
endloop
endfacet
facet normal 7.071067e-01 -1.912466e-07 7.071068e-01
outer loop
vertex 1.467833e+02 4.825789e+01 3.325060e+02
vertex 1.333091e+02 5.367963e+01 3.459802e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
endloop
endfacet
facet normal 7.071067e-01 -1.745782e-08 7.071068e-01
outer loop
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 2.006929e+02 1.947439e+01 3.493071e+02
vertex 2.032670e+02 -6.905210e-16 3.467330e+02
endloop
endfacet
facet normal 6.593573e-01 -3.612418e-01 -6.593575e-01
outer loop
vertex 9.738170e+01 2.837975e+01 3.819076e+02
vertex 1.327370e+02 2.837975e+01 4.172629e+02
vertex 9.232107e+01 9.905863e+00 3.869683e+02
endloop
endfacet
facet normal 6.593573e-01 -3.612416e-01 -6.593576e-01
outer loop
vertex 1.327370e+02 2.837975e+01 4.172629e+02
vertex 1.276764e+02 9.905863e+00 4.223236e+02
vertex 9.232107e+01 9.905863e+00 3.869683e+02
endloop
endfacet
facet normal 7.071073e-01 3.038186e-07 7.071063e-01
outer loop
vertex 1.327370e+02 2.837975e+01 4.172629e+02
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex 1.276764e+02 9.905863e+00 4.223236e+02
endloop
endfacet
facet normal -6.011943e-01 -5.264319e-01 6.011945e-01
outer loop
vertex 2.006929e+02 1.947439e+01 3.493071e+02
vertex 1.579628e+02 3.631866e+01 3.213266e+02
vertex 1.653375e+02 1.947439e+01 3.139518e+02
endloop
endfacet
facet normal 7.071067e-01 -3.070633e-08 7.071068e-01
outer loop
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 1.933181e+02 3.631866e+01 3.566819e+02
vertex 2.006929e+02 1.947439e+01 3.493071e+02
endloop
endfacet
facet normal -6.011942e-01 -5.264323e-01 6.011942e-01
outer loop
vertex 1.933181e+02 3.631866e+01 3.566819e+02
vertex 1.579628e+02 3.631866e+01 3.213266e+02
vertex 2.006929e+02 1.947439e+01 3.493071e+02
endloop
endfacet
facet normal 5.225581e-01 -6.736956e-01 -5.225584e-01
outer loop
vertex 1.068195e+02 4.302078e+01 3.724698e+02
vertex 1.421749e+02 4.302078e+01 4.078251e+02
vertex 9.738170e+01 2.837975e+01 3.819076e+02
endloop
endfacet
facet normal 5.225581e-01 -6.736957e-01 -5.225582e-01
outer loop
vertex 1.421749e+02 4.302078e+01 4.078251e+02
vertex 1.327370e+02 2.837975e+01 4.172629e+02
vertex 9.738170e+01 2.837975e+01 3.819076e+02
endloop
endfacet
facet normal 7.071065e-01 -3.015717e-07 7.071071e-01
outer loop
vertex 1.421749e+02 4.302078e+01 4.078251e+02
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex 1.327370e+02 2.837975e+01 4.172629e+02
endloop
endfacet
facet normal -4.261271e-01 -7.980172e-01 4.261271e-01
outer loop
vertex 1.933181e+02 3.631866e+01 3.566819e+02
vertex 1.467833e+02 4.825789e+01 3.325060e+02
vertex 1.579628e+02 3.631866e+01 3.213266e+02
endloop
endfacet
facet normal 7.071068e-01 -3.842491e-08 7.071068e-01
outer loop
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 1.821387e+02 4.825789e+01 3.678613e+02
vertex 1.933181e+02 3.631866e+01 3.566819e+02
endloop
endfacet
facet normal -4.261272e-01 -7.980170e-01 4.261274e-01
outer loop
vertex 1.821387e+02 4.825789e+01 3.678613e+02
vertex 1.467833e+02 4.825789e+01 3.325060e+02
vertex 1.933181e+02 3.631866e+01 3.566819e+02
endloop
endfacet
facet normal 3.151846e-01 -8.951633e-01 -3.151847e-01
outer loop
vertex 1.193599e+02 5.185163e+01 3.599295e+02
vertex 1.547152e+02 5.185163e+01 3.952848e+02
vertex 1.068195e+02 4.302078e+01 3.724698e+02
endloop
endfacet
facet normal 3.151847e-01 -8.951632e-01 -3.151848e-01
outer loop
vertex 1.547152e+02 5.185163e+01 3.952848e+02
vertex 1.421749e+02 4.302078e+01 4.078251e+02
vertex 1.068195e+02 4.302078e+01 3.724698e+02
endloop
endfacet
facet normal 7.071068e-01 -9.688457e-09 7.071068e-01
outer loop
vertex 1.547152e+02 5.185163e+01 3.952848e+02
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex 1.421749e+02 4.302078e+01 4.078251e+02
endloop
endfacet
facet normal -1.935088e-01 -9.618257e-01 1.935089e-01
outer loop
vertex 1.821387e+02 4.825789e+01 3.678613e+02
vertex 1.333091e+02 5.367963e+01 3.459802e+02
vertex 1.467833e+02 4.825789e+01 3.325060e+02
endloop
endfacet
facet normal 7.071068e-01 -4.600219e-08 7.071068e-01
outer loop
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 1.686644e+02 5.367963e+01 3.813356e+02
vertex 1.821387e+02 4.825789e+01 3.678613e+02
endloop
endfacet
facet normal -1.935088e-01 -9.618257e-01 1.935089e-01
outer loop
vertex 1.686644e+02 5.367963e+01 3.813356e+02
vertex 1.333091e+02 5.367963e+01 3.459802e+02
vertex 1.821387e+02 4.825789e+01 3.678613e+02
endloop
endfacet
facet normal 6.524362e-02 -9.957342e-01 -6.524364e-02
outer loop
vertex 1.333091e+02 5.367963e+01 3.459802e+02
vertex 1.686644e+02 5.367963e+01 3.813356e+02
vertex 1.193599e+02 5.185163e+01 3.599295e+02
endloop
endfacet
facet normal 6.524361e-02 -9.957342e-01 -6.524362e-02
outer loop
vertex 1.686644e+02 5.367963e+01 3.813356e+02
vertex 1.547152e+02 5.185163e+01 3.952848e+02
vertex 1.193599e+02 5.185163e+01 3.599295e+02
endloop
endfacet
facet normal 7.071068e-01 -3.417517e-08 7.071068e-01
outer loop
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex 1.547152e+02 5.185163e+01 3.952848e+02
endloop
endfacet
facet normal 7.071068e-01 -5.675223e-08 7.071068e-01
outer loop
vertex 1.686644e+02 5.367963e+01 3.813356e+02
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 1.547152e+02 5.185163e+01 3.952848e+02
endloop
endfacet
facet normal 0.000000e+00 1.000000e+00 0.000000e+00
outer loop
vertex -2.500000e+02 2.500000e+02 3.000000e+02
vertex 2.500000e+02 2.500000e+02 0.000000e+00
vertex -2.500000e+02 2.500000e+02 0.000000e+00
endloop
endfacet
facet normal -0.000000e+00 1.000000e+00 0.000000e+00
outer loop
vertex -2.500000e+02 2.500000e+02 3.000000e+02
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 2.500000e+02 2.500000e+02 0.000000e+00
endloop
endfacet
facet normal -0.000000e+00 1.000000e+00 0.000000e+00
outer loop
vertex -5.000000e+01 2.500000e+02 5.000000e+02
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex -2.500000e+02 2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 0.000000e+00 1.000000e+00 0.000000e+00
outer loop
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex -2.500000e+02 2.500000e+02 3.000000e+02
endloop
endfacet
endsolid

View File

@@ -0,0 +1,290 @@
[EMC]
VERSION = 1.1
MACHINE = xyzacb-trsrn (switchkins)
DEBUG = 0
[DISPLAY]
EMBED_TAB_NAME = TCP
EMBED_TAB_COMMAND = pyvcp pyvcp_embed_tab_tcp.xml
GEOMETRY = XYZABC
OPEN_FILE = ../demos/incremental_repetition.ngc
PYVCP = ./xyzacb-trsrn.xml
JOG_AXES = XYZABC
DISPLAY = axis
MAX_ANGULAR_VELOCITY = 360
MAX_LINEAR_VELOCITY = 1500
POSITION_OFFSET = RELATIVE
POSITION_FEEDBACK = ACTUAL
MAX_FEED_OVERRIDE = 2
PROGRAM_PREFIX = ../demos
INTRO_GRAPHIC = emc2.gif
INTRO_TIME = 1
#EDITOR = gedit
TOOL_EDITOR = tooledit z diam
TKPKG = Ngcgui 1.0
NGCGUI_FONT = Helvetica -12 normal
[RS274NGC]
RS274NGC_STARTUP_CODE = G17 G21 G40 G49 G54 G64 P0.001 G80 G90 G92.1 G94 G97 G98
ON_ABORT_COMMAND = o <on_abort_no_twp_reset> call
#ON_ABORT_COMMAND = o <on_abort_with_twp_reset> call
SUBROUTINE_PATH = ../remap_subs:../demos
HAL_PIN_VARS = 1
REMAP = M428 modalgroup=10 ngc=428remap
REMAP = M429 modalgroup=10 ngc=429remap
REMAP = M430 modalgroup=10 ngc=430remap
REMAP = G53.1 modalgroup=1 argspec=p ngc=g531remap
REMAP = G53.3 modalgroup=1 argspec=pxyz ngc=g533remap
REMAP = G53.6 modalgroup=1 argspec=p ngc=g536remap
REMAP = M530 modalgroup=10 python=g53x_core
REMAP = G68.2 modalgroup=1 argspec=pqxyzijkr python=g682
REMAP = G68.3 modalgroup=1 argspec=xyzr python=g683
REMAP = G68.4 modalgroup=1 argspec=pqxyzijkr python=g684
REMAP = G69 modalgroup=1 ngc=g69remap
REMAP = M469 modalgroup=10 python=g69_core
PARAMETER_FILE = xyzacb-trsrn.var
[PYTHON]
# where to find the Python code:
# code specific for this configuration
PATH_APPEND = ../python
# import the following Python module
TOPLEVEL = ../python/toplevel.py
# the higher the more verbose tracing of the Python plugin
LOG_LEVEL = 3
[KINS]
KINEMATICS = xyzacb_trsrn
JOINTS = 6
[TWP]
# this defines the primary spindle rotation
PRIMARY = C
# this defines the secnodary spindle rotation (ie the one closest to the tool)
SECONDARY = B
[HAL]
HALUI = halui
HALFILE = LIB:basic_sim.tcl
POSTGUI_HALFILE = xyzacb-trsrn_postgui.hal
#HALCMD = loadusr ../python/feed_zero.py
# signal reflecting twp states (0=undefined, 1=defined, 2=active)
HALCMD = net twp-status <= motion.analog-out-02
# connection required for control of motion.switchkins-type
HALCMD = net :kinstype-select <= motion.analog-out-03 => motion.switchkins-type
# connections required for the kinematics component
HALCMD = net :tool-offset motion.tooloffset.z xyzacb_trsrn_kins.tool-offset-z
HALCMD = net :rot-axis-y xyzacb_trsrn_kins.y-rot-axis
HALCMD = net :rot-axis-z xyzacb_trsrn_kins.z-rot-axis
HALCMD = net :nutation-angle xyzacb_trsrn_kins.nut-angle
HALCMD = net :pivot-y xyzacb_trsrn_kins.y-pivot
HALCMD = net :pivot-z xyzacb_trsrn_kins.z-pivot
HALCMD = net :offset-x xyzacb_trsrn_kins.x-offset
HALCMD = net :offset-y xyzacb_trsrn_kins.y-offset
# load the required twp-helper component and its hal connections
HALCMD = loadusr -W ../python/twp-helper-comp.py
#twp-status
HALCMD = net twp-status => twp-helper-comp.twp-status
HALCMD = net twp-is-defined <= twp-helper-comp.twp-is-defined
HALCMD = net twp-is-active <= twp-helper-comp.twp-is-active
# current twp parameters
HALCMD = net twp-ox-world <= twp-helper-comp.twp-ox-world
HALCMD = net twp-oy-world <= twp-helper-comp.twp-oy-world
HALCMD = net twp-oz-world <= twp-helper-comp.twp-oz-world
HALCMD = net twp-ox <= twp-helper-comp.twp-ox
HALCMD = net twp-oy <= twp-helper-comp.twp-oy
HALCMD = net twp-oz <= twp-helper-comp.twp-oz
HALCMD = net twp-zx <= twp-helper-comp.twp-zx
HALCMD = net twp-zy <= twp-helper-comp.twp-zy
HALCMD = net twp-zz <= twp-helper-comp.twp-zz
HALCMD = net twp-xx <= twp-helper-comp.twp-xx
HALCMD = net twp-xy <= twp-helper-comp.twp-xy
HALCMD = net twp-xz <= twp-helper-comp.twp-xz
# load the optional vismach-gui and its hal connections
HALCMD = loadusr -W ../vismach/xyzacb-trsrn-gui.py
# vismach machine signals
HALCMD = net :axis-x joint.0.pos-fb xyzacb-trsrn-gui.axis_x
HALCMD = net :axis-y joint.1.pos-fb xyzacb-trsrn-gui.axis_y
HALCMD = net :axis-z joint.2.pos-fb xyzacb-trsrn-gui.axis_z
HALCMD = net :rotary-a joint.3.pos-fb xyzacb-trsrn-gui.rotary_a
HALCMD = net :rotary-b joint.4.pos-fb xyzacb-trsrn-gui.rotary_b
HALCMD = net :rotary-c joint.5.pos-fb xyzacb-trsrn-gui.rotary_c
HALCMD = net :tool-diam halui.tool.diameter xyzacb-trsrn-gui.tool_diameter
HALCMD = net :tool-offset xyzacb-trsrn-gui.tool_length
HALCMD = net :kinstype-select xyzacb-trsrn-gui.kinstype_select
HALCMD = net :nutation-angle xyzacb-trsrn-gui.nutation_angle
HALCMD = net :pivot-y xyzacb-trsrn-gui.pivot_y
HALCMD = net :pivot-z xyzacb-trsrn-gui.pivot_z
HALCMD = net :offset-x xyzacb-trsrn-gui.offset_x
HALCMD = net :offset-y xyzacb-trsrn-gui.offset_y
HALCMD = net :rot-axis-y xyzacb-trsrn-gui.rot_axis_y
HALCMD = net :rot-axis-z xyzacb-trsrn-gui.rot_axis_z
HALCMD = net :hide-work-piece-1 xyzacb-trsrn-gui.hide_work_piece_1
HALCMD = net :hide-spindle-body xyzacb-trsrn-gui.hide_spindle_body
HALCMD = net :scale-coords xyzacb-trsrn-gui.scale_coords
# vismach twp signals
HALCMD = net twp-ox-world xyzacb-trsrn-gui.twp_ox_world
HALCMD = net twp-oy-world xyzacb-trsrn-gui.twp_oy_world
HALCMD = net twp-oz-world xyzacb-trsrn-gui.twp_oz_world
HALCMD = net twp-ox xyzacb-trsrn-gui.twp_ox
HALCMD = net twp-oy xyzacb-trsrn-gui.twp_oy
HALCMD = net twp-oz xyzacb-trsrn-gui.twp_oz
HALCMD = net twp-zx xyzacb-trsrn-gui.twp_zx
HALCMD = net twp-zy xyzacb-trsrn-gui.twp_zy
HALCMD = net twp-zz xyzacb-trsrn-gui.twp_zz
HALCMD = net twp-xx xyzacb-trsrn-gui.twp_xx
HALCMD = net twp-xy xyzacb-trsrn-gui.twp_xy
HALCMD = net twp-xz xyzacb-trsrn-gui.twp_xz
HALCMD = net twp-status xyzacb-trsrn-gui.twp_status
HALCMD = net twp-is-defined xyzacb-trsrn-gui.twp_defined
HALCMD = net twp-is-active xyzacb-trsrn-gui.twp_active
[HALUI]
# NOTE: kinstype==0 is identity kins because sparm=identityfirst
# M428:identity kins (motion.switchkins-type==0 startupDEFAULT)
# M429: tcp kins (motion.switchkins-type==1)
# M430: tool kins (motion.switchkins-type==2)
MDI_COMMAND = M428
MDI_COMMAND = M429
MDI_COMMAND = M430
[TRAJ]
COORDINATES = XYZABC
LINEAR_UNITS = mm
ANGULAR_UNITS = deg
DEFAULT_LINEAR_VELOCITY = 100
MAX_LINEAR_VELOCITY = 120
MAX_LINEAR_ACCELERATION = 700
DEFAULT_LINEAR_ACCELERATION = 300
[EMCMOT]
EMCMOT = motmod
SERVO_PERIOD = 1000000
COMM_TIMEOUT = 1
[TASK]
TASK = milltask
CYCLE_TIME = 0.010
[EMCIO]
TOOL_TABLE = xyzacb-trsrn.tbl
[AXIS_X]
MIN_LIMIT = -5000
MAX_LIMIT = 5000
MAX_VELOCITY = 200
MAX_ACCELERATION = 700
[AXIS_Y]
MIN_LIMIT = -5000
MAX_LIMIT = 5000
MAX_VELOCITY = 200
MAX_ACCELERATION = 700
[AXIS_Z]
MIN_LIMIT = -5000
MAX_LIMIT = 5000
MAX_VELOCITY = 200
MAX_ACCELERATION = 700
# table rotary axis
[AXIS_A]
MIN_LIMIT = -360
MAX_LIMIT = 360
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
# spindle secondary axis
[AXIS_B]
MIN_LIMIT = -185
MAX_LIMIT = 185
MAX_VELOCITY = 30
MAX_ACCELERATION = 302
# spindle primary axis
[AXIS_C]
MIN_LIMIT = -320
MAX_LIMIT = 320
MAX_VELOCITY = 30
MAX_ACCELERATION = 301
[JOINT_0]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 200
MAX_ACCELERATION = 700
MIN_LIMIT = -5000
MAX_LIMIT = 5000
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_1]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 200
MAX_ACCELERATION = 700
MIN_LIMIT = -5000
MAX_LIMIT = 5000
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_2]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 200
MAX_ACCELERATION = 700
MIN_LIMIT = -5000
MAX_LIMIT = 5000
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
#table rotary
[JOINT_3]
TYPE = ANGULAR
HOME = 0
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
MIN_LIMIT = -360
MAX_LIMIT = 360
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
# spindle secondary axis
[JOINT_4]
TYPE = ANGULAR
HOME = 0
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
MIN_LIMIT = -185
MAX_LIMIT = 185
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
# spindle primary axis
[JOINT_5]
TYPE = ANGULAR
HOME = 0
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
MIN_LIMIT = -320
MAX_LIMIT = 320
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0

View File

@@ -0,0 +1,4 @@
T1 P1 D1
T2 P2 Z50 D8
T3 P3 Z100 D20
T4 P4 Z120 D40

View File

@@ -0,0 +1,301 @@
<?xml version='1.0' encoding='UTF-8'?>
<pyvcp>
<relief>"ridge"</relief>
<bd>5</bd>
<label>
<text>"SWITCHKINS"</text>
<relief>RIDGE</relief>
<bd>3</bd>
</label>
<multilabel>
<legends>["0: IDENTITY", "1: TCP ", "2: TOOL "]</legends>
<font>("Helvetica",16)</font>
<bg>"black"</bg>
<fg>"yellow"</fg>
</multilabel>
<button>
<halpin>"type0-button"</halpin>
<text>" IDENTITY "</text>
<bd>3</bd>
</button>
<button>
<halpin>"type1-button"</halpin>
<text>" TCP "</text>
<bd>3</bd>
</button>
<button>
<halpin>"type2-button"</halpin>
<text>" TOOL "</text>
<bd>3</bd>
</button>
<!-- create a space to the next element -->
<vbox>
<hbox>
<label>
<text>" "</text>
<font>("Helvetica",4)</font>
</label>
</hbox>
</vbox>
<vbox>
<labelframe text="Joint position">
<font>("Helvetica",14)</font>
<hbox>
<vbox>
<hbox>
<label>
<text>"0: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint0"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"1: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint1"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"2: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint2"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
</vbox>
<vbox>
<label>
<text>" "</text>
<font>("Helvetica",10)</font>
</label>
</vbox>
<vbox>
<hbox>
<label>
<text>"3: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint3"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"4: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint4"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"5: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint5"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
</vbox>
</hbox>
</labelframe>
</vbox>
<!-- create a space to the next element -->
<vbox>
<hbox>
<label>
<text>" "</text>
<font>("Helvetica",4)</font>
</label>
</hbox>
</vbox>
<vbox>
<relief>"ridge"</relief>
<bd>5</bd>
<button>
<halpin>"vismach-clear"</halpin>
<text>"vismach-clear"</text>
<bd>3</bd>
</button>
</vbox>
<vbox>
<checkbutton>
<halpin>"hide-work-piece-1"</halpin>
<text>"Hide work piece 1"</text>
</checkbutton>
<checkbutton>
<halpin>"hide-spindle-body"</halpin>
<text>"Hide spindle body"</text>
</checkbutton>
</vbox>
<!-- create a space to the next element -->
<vbox>
<hbox>
<label>
<text>" "</text>
<font>("Helvetica",4)</font>
</label>
</hbox>
</vbox>
<!-- create another vertical panel -->
<vbox>
<relief>"ridge"</relief>
<bd>5</bd>
<vbox>
<labelframe text="Spindle Offsets">
<font>("Helvetica",14)</font>
<hbox>
<label>
<text>"nutation-angle: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"nut-angle"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>55</initval>
<min_>0</min_>
<max_>90</max_>
</scale>
</hbox>
<hbox>
<label>
<text>"y-pivot-length: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"y-pivot"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>50</initval>
<min_>0</min_>
<max_>300</max_>
</scale>
</hbox>
<hbox>
<label>
<text>"z-pivot-length: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"z-pivot"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>120</initval>
<min_>0</min_>
<max_>300</max_>
</scale>
</hbox>
<hbox>
<label>
<text>"x-offset: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"x-offset"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>0</initval>
<min_>-20</min_>
<max_>20</max_>
</scale>
</hbox>
<hbox>
<label>
<text>"y-offset: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"y-offset"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>0</initval>
<min_>-20</min_>
<max_>40</max_>
</scale>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>" "</text>
</label>
</hbox>
<hbox>
<label>
<text>"Scale Coords: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"scale-coords"</halpin>
<resolution>0.05</resolution>
<orient>HORIZONTAL</orient>
<initval>1</initval>
<min_>0</min_>
<max_>2</max_>
</scale>
</hbox>
<hbox>
<label>
<text>"Use hover + mouse wheel to change values"</text>
<font>("Helvetica",6)</font>
</label>
</hbox>
</labelframe>
</vbox>
<!-- create a space to the next element -->
<vbox>
<hbox>
<label>
<text>" "</text>
<font>("Helvetica",4)</font>
</label>
</hbox>
</vbox>
<vbox>
<hbox>
<label>
<text>" To test change values above\n reload and restart\n the demo gcode "</text>
<font>("Helvetica",10)</font>
</label>
</hbox>
</vbox>
</vbox>
</pyvcp>

View File

@@ -0,0 +1,32 @@
# switchkins pyvcp connections for:
# xyzbca-trsrn.ini
net :kinstype.is-0 <= kinstype.is-0 => pyvcp.multilabel.0.legend0
net :kinstype.is-1 <= kinstype.is-1 => pyvcp.multilabel.0.legend1
net :kinstype.is-2 <= kinstype.is-2 => pyvcp.multilabel.0.legend2
net :vismach-clear <= pyvcp.vismach-clear => vismach.plotclear
net :type0-button <= pyvcp.type0-button => halui.mdi-command-00
net :type1-button <= pyvcp.type1-button => halui.mdi-command-01
net :type2-button <= pyvcp.type2-button => halui.mdi-command-02
net :axis-x => pyvcp.joint0
net :axis-y => pyvcp.joint1
net :axis-z => pyvcp.joint2
net :rotary-a => pyvcp.joint3
net :rotary-b => pyvcp.joint4
net :hide-work-piece-1 <= pyvcp.hide-work-piece-1
net :hide-spindle-body <= pyvcp.hide-spindle-body
net :nutation-angle <= pyvcp.nut-angle-f
net :pivot-y <= pyvcp.y-pivot-f
net :pivot-z <= pyvcp.z-pivot-f
net :offset-x <= pyvcp.x-offset-f
net :offset-y <= pyvcp.y-offset-f
net :rot-axis-y <= tcp.y-rot-axis-f
net :rot-axis-z <= tcp.z-rot-axis-f
net :scale-coords <= pyvcp.scale-coords-f

View File

@@ -0,0 +1,16 @@
This is a simulation configuration for a 6 axis machine with the following kinematic:
XYZ - linear cartesian
B - table rotary
C - spindle rotary
A - spindle nutating
The spindle rotary assembly is fully configurable using sliders in the side panel of the gui
The kinematic component includes the following modes:
IDENTITY: Trivial kinematics with a one-to-one mapping of joints to axes
TCP: Coordinated xyz motion with rotation around the tool center point
TOOL: Coordinated xyz motion in the current tool coordinate system
Also see the README in the parent directory.

View File

@@ -0,0 +1,102 @@
<?xml version='1.0' encoding='UTF-8'?>
<pyvcp>
<vbox>
<vbox>
<labelframe text="C Rotation Axis Offset">
<font>("Helvetica",14)</font>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>" "</text>
</label>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>"Physical location of rotation-axis in the model\n in absolute machine coordinates:"</text>
</label>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>" x: 1000\n z: -1000"</text>
</label>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>" "</text>
</label>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>"these are also the correct 'rot-axis' settings\n for this model"</text>
</label>
</hbox>
<hbox>
<label>
<text>"x-rot-axis: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"x-rot-axis"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>1000</initval>
<min_>-1900</min_>
<max_>1900</max_>
</scale>
</hbox>
<hbox>
<label>
<text>"z-rot-axis: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"z-rot-axis"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>-2000</initval>
<min_>-2900</min_>
<max_>1100</max_>
</scale>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>" "</text>
</label>
</hbox>
<hbox>
<label>
<text>"Use hover + mouse wheel to change values"</text>
<font>("Helvetica",6)</font>
</label>
</hbox>
</labelframe>
</vbox>
<!-- create a space to the next element -->
<vbox>
<hbox>
<label>
<text>" "</text>
<font>("Helvetica",4)</font>
</label>
</hbox>
</vbox>
<vbox>
<hbox>
<label>
<text>" To test change values above\n reload and restart\n the demo gcode "</text>
<font>("Helvetica",10)</font>
</label>
</hbox>
</vbox>
</vbox>
</pyvcp>

View File

@@ -0,0 +1,632 @@
solid Part2
facet normal -1.000000e+00 0.000000e+00 0.000000e+00
outer loop
vertex -2.500000e+02 -2.500000e+02 3.000000e+02
vertex -2.500000e+02 2.500000e+02 0.000000e+00
vertex -2.500000e+02 -2.500000e+02 0.000000e+00
endloop
endfacet
facet normal -0.000000e+00 -1.000000e+00 0.000000e+00
outer loop
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
vertex -2.500000e+02 -2.500000e+02 3.000000e+02
vertex -2.500000e+02 -2.500000e+02 0.000000e+00
endloop
endfacet
facet normal 0.000000e+00 -1.000000e+00 0.000000e+00
outer loop
vertex 2.500000e+02 -2.500000e+02 0.000000e+00
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
vertex -2.500000e+02 -2.500000e+02 0.000000e+00
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 -1.000000e+00
outer loop
vertex -2.500000e+02 2.500000e+02 0.000000e+00
vertex 2.500000e+02 -2.500000e+02 0.000000e+00
vertex -2.500000e+02 -2.500000e+02 0.000000e+00
endloop
endfacet
facet normal 1.000000e+00 0.000000e+00 0.000000e+00
outer loop
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
vertex 2.500000e+02 -2.500000e+02 0.000000e+00
endloop
endfacet
facet normal 1.000000e+00 0.000000e+00 -0.000000e+00
outer loop
vertex 2.500000e+02 2.500000e+02 0.000000e+00
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 2.500000e+02 -2.500000e+02 0.000000e+00
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 -1.000000e+00
outer loop
vertex -2.500000e+02 2.500000e+02 0.000000e+00
vertex 2.500000e+02 2.500000e+02 0.000000e+00
vertex 2.500000e+02 -2.500000e+02 0.000000e+00
endloop
endfacet
facet normal -1.000000e+00 -0.000000e+00 -0.000000e+00
outer loop
vertex -2.500000e+02 2.500000e+02 3.000000e+02
vertex -2.500000e+02 2.500000e+02 0.000000e+00
vertex -2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 0.000000e+00 -7.071068e-01 7.071068e-01
outer loop
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
vertex -5.000000e+01 -5.000000e+01 5.000000e+02
vertex -2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 0.000000e+00 -7.071068e-01 7.071068e-01
outer loop
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
vertex -2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal -7.071068e-01 0.000000e+00 7.071068e-01
outer loop
vertex -5.000000e+01 -5.000000e+01 5.000000e+02
vertex -2.500000e+02 2.500000e+02 3.000000e+02
vertex -2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 7.071067e-01 0.000000e+00 7.071069e-01
outer loop
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 2.032670e+02 -6.905210e-16 3.467330e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 7.071067e-01 1.745782e-08 7.071068e-01
outer loop
vertex 2.032670e+02 -6.905210e-16 3.467330e+02
vertex 2.006929e+02 -1.947439e+01 3.493071e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 7.071067e-01 3.070633e-08 7.071068e-01
outer loop
vertex 2.006929e+02 -1.947439e+01 3.493071e+02
vertex 1.933181e+02 -3.631866e+01 3.566819e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 7.071068e-01 3.842491e-08 7.071068e-01
outer loop
vertex 1.933181e+02 -3.631866e+01 3.566819e+02
vertex 1.821387e+02 -4.825789e+01 3.678613e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 7.071068e-01 4.600219e-08 7.071068e-01
outer loop
vertex 1.821387e+02 -4.825789e+01 3.678613e+02
vertex 1.686644e+02 -5.367963e+01 3.813356e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 7.071068e-01 5.675223e-08 7.071068e-01
outer loop
vertex 1.686644e+02 -5.367963e+01 3.813356e+02
vertex 1.547152e+02 -5.185163e+01 3.952848e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 7.071068e-01 6.583240e-08 7.071068e-01
outer loop
vertex 1.547152e+02 -5.185163e+01 3.952848e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
vertex 2.500000e+02 -2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 6.524362e-02 9.957342e-01 -6.524364e-02
outer loop
vertex 1.193599e+02 -5.185163e+01 3.599295e+02
vertex 1.547152e+02 -5.185163e+01 3.952848e+02
vertex 1.333091e+02 -5.367963e+01 3.459802e+02
endloop
endfacet
facet normal 6.524360e-02 9.957342e-01 -6.524363e-02
outer loop
vertex 1.547152e+02 -5.185163e+01 3.952848e+02
vertex 1.686644e+02 -5.367963e+01 3.813356e+02
vertex 1.333091e+02 -5.367963e+01 3.459802e+02
endloop
endfacet
facet normal -1.935088e-01 9.618257e-01 1.935089e-01
outer loop
vertex 1.686644e+02 -5.367963e+01 3.813356e+02
vertex 1.467833e+02 -4.825789e+01 3.325060e+02
vertex 1.333091e+02 -5.367963e+01 3.459802e+02
endloop
endfacet
facet normal 7.071067e-01 1.912466e-07 7.071068e-01
outer loop
vertex 1.467833e+02 -4.825789e+01 3.325060e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 1.333091e+02 -5.367963e+01 3.459802e+02
endloop
endfacet
facet normal 7.071070e-01 2.229500e-07 7.071066e-01
outer loop
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 1.193599e+02 -5.185163e+01 3.599295e+02
vertex 1.333091e+02 -5.367963e+01 3.459802e+02
endloop
endfacet
facet normal -1.935088e-01 9.618257e-01 1.935089e-01
outer loop
vertex 1.821387e+02 -4.825789e+01 3.678613e+02
vertex 1.467833e+02 -4.825789e+01 3.325060e+02
vertex 1.686644e+02 -5.367963e+01 3.813356e+02
endloop
endfacet
facet normal 3.151846e-01 8.951633e-01 -3.151847e-01
outer loop
vertex 1.068195e+02 -4.302078e+01 3.724698e+02
vertex 1.421749e+02 -4.302078e+01 4.078251e+02
vertex 1.193599e+02 -5.185163e+01 3.599295e+02
endloop
endfacet
facet normal 3.151847e-01 8.951632e-01 -3.151848e-01
outer loop
vertex 1.421749e+02 -4.302078e+01 4.078251e+02
vertex 1.547152e+02 -5.185163e+01 3.952848e+02
vertex 1.193599e+02 -5.185163e+01 3.599295e+02
endloop
endfacet
facet normal 7.071067e-01 3.410209e-07 7.071069e-01
outer loop
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 1.068195e+02 -4.302078e+01 3.724698e+02
vertex 1.193599e+02 -5.185163e+01 3.599295e+02
endloop
endfacet
facet normal 7.071068e-01 3.664266e-08 7.071068e-01
outer loop
vertex 1.421749e+02 -4.302078e+01 4.078251e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
vertex 1.547152e+02 -5.185163e+01 3.952848e+02
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 1.000000e+00
outer loop
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
vertex -5.000000e+01 2.500000e+02 5.000000e+02
vertex -5.000000e+01 -5.000000e+01 5.000000e+02
endloop
endfacet
facet normal -7.071068e-01 0.000000e+00 7.071068e-01
outer loop
vertex -5.000000e+01 2.500000e+02 5.000000e+02
vertex -2.500000e+02 2.500000e+02 3.000000e+02
vertex -5.000000e+01 -5.000000e+01 5.000000e+02
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 1.000000e+00
outer loop
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex -5.000000e+01 2.500000e+02 5.000000e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
endloop
endfacet
facet normal 7.071068e-01 7.037430e-07 7.071068e-01
outer loop
vertex 1.421749e+02 -4.302078e+01 4.078251e+02
vertex 1.327370e+02 -2.837975e+01 4.172629e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
endloop
endfacet
facet normal 7.071069e-01 -4.915623e-07 7.071066e-01
outer loop
vertex 1.327370e+02 -2.837975e+01 4.172629e+02
vertex 1.276764e+02 -9.905863e+00 4.223236e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
endloop
endfacet
facet normal 7.071068e-01 -0.000000e+00 7.071068e-01
outer loop
vertex 1.276764e+02 -9.905863e+00 4.223236e+02
vertex 1.276764e+02 9.905863e+00 4.223236e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
endloop
endfacet
facet normal 7.071068e-01 0.000000e+00 7.071068e-01
outer loop
vertex 1.276764e+02 9.905863e+00 4.223236e+02
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex 5.000000e+01 -5.000000e+01 5.000000e+02
endloop
endfacet
facet normal -4.261270e-01 7.980172e-01 4.261272e-01
outer loop
vertex 1.821387e+02 -4.825789e+01 3.678613e+02
vertex 1.579628e+02 -3.631866e+01 3.213266e+02
vertex 1.467833e+02 -4.825789e+01 3.325060e+02
endloop
endfacet
facet normal 7.071064e-01 -8.249345e-08 7.071072e-01
outer loop
vertex 1.579628e+02 -3.631866e+01 3.213266e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 1.467833e+02 -4.825789e+01 3.325060e+02
endloop
endfacet
facet normal -4.261273e-01 7.980170e-01 4.261273e-01
outer loop
vertex 1.933181e+02 -3.631866e+01 3.566819e+02
vertex 1.579628e+02 -3.631866e+01 3.213266e+02
vertex 1.821387e+02 -4.825789e+01 3.678613e+02
endloop
endfacet
facet normal 5.225582e-01 6.736956e-01 -5.225583e-01
outer loop
vertex 9.738170e+01 -2.837975e+01 3.819076e+02
vertex 1.327370e+02 -2.837975e+01 4.172629e+02
vertex 1.068195e+02 -4.302078e+01 3.724698e+02
endloop
endfacet
facet normal 5.225580e-01 6.736957e-01 -5.225583e-01
outer loop
vertex 1.327370e+02 -2.837975e+01 4.172629e+02
vertex 1.421749e+02 -4.302078e+01 4.078251e+02
vertex 1.068195e+02 -4.302078e+01 3.724698e+02
endloop
endfacet
facet normal 7.071067e-01 2.969849e-07 7.071068e-01
outer loop
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 9.738170e+01 -2.837975e+01 3.819076e+02
vertex 1.068195e+02 -4.302078e+01 3.724698e+02
endloop
endfacet
facet normal -6.011944e-01 5.264319e-01 6.011944e-01
outer loop
vertex 1.933181e+02 -3.631866e+01 3.566819e+02
vertex 1.653375e+02 -1.947439e+01 3.139518e+02
vertex 1.579628e+02 -3.631866e+01 3.213266e+02
endloop
endfacet
facet normal 7.071068e-01 6.091928e-07 7.071068e-01
outer loop
vertex 1.653375e+02 -1.947439e+01 3.139518e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 1.579628e+02 -3.631866e+01 3.213266e+02
endloop
endfacet
facet normal -6.011941e-01 5.264323e-01 6.011944e-01
outer loop
vertex 2.006929e+02 -1.947439e+01 3.493071e+02
vertex 1.653375e+02 -1.947439e+01 3.139518e+02
vertex 1.933181e+02 -3.631866e+01 3.566819e+02
endloop
endfacet
facet normal 6.593572e-01 3.612418e-01 -6.593575e-01
outer loop
vertex 9.232107e+01 -9.905863e+00 3.869683e+02
vertex 1.276764e+02 -9.905863e+00 4.223236e+02
vertex 9.738170e+01 -2.837975e+01 3.819076e+02
endloop
endfacet
facet normal 6.593574e-01 3.612416e-01 -6.593575e-01
outer loop
vertex 1.276764e+02 -9.905863e+00 4.223236e+02
vertex 1.327370e+02 -2.837975e+01 4.172629e+02
vertex 9.738170e+01 -2.837975e+01 3.819076e+02
endloop
endfacet
facet normal 7.071069e-01 -1.940928e-07 7.071066e-01
outer loop
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 9.232107e+01 -9.905863e+00 3.869683e+02
vertex 9.738170e+01 -2.837975e+01 3.819076e+02
endloop
endfacet
facet normal -6.950667e-01 1.837499e-01 6.950670e-01
outer loop
vertex 2.006929e+02 -1.947439e+01 3.493071e+02
vertex 1.679117e+02 -1.781979e-14 3.113776e+02
vertex 1.653375e+02 -1.947439e+01 3.139518e+02
endloop
endfacet
facet normal 7.071065e-01 -4.679821e-07 7.071071e-01
outer loop
vertex 1.679117e+02 -1.781979e-14 3.113776e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 1.653375e+02 -1.947439e+01 3.139518e+02
endloop
endfacet
facet normal -6.950670e-01 1.837494e-01 6.950670e-01
outer loop
vertex 2.032670e+02 -6.905210e-16 3.467330e+02
vertex 1.679117e+02 -1.781979e-14 3.113776e+02
vertex 2.006929e+02 -1.947439e+01 3.493071e+02
endloop
endfacet
facet normal 7.071066e-01 0.000000e+00 -7.071069e-01
outer loop
vertex 9.232107e+01 9.905863e+00 3.869683e+02
vertex 1.276764e+02 9.905863e+00 4.223236e+02
vertex 9.232107e+01 -9.905863e+00 3.869683e+02
endloop
endfacet
facet normal 7.071066e-01 0.000000e+00 -7.071069e-01
outer loop
vertex 1.276764e+02 9.905863e+00 4.223236e+02
vertex 1.276764e+02 -9.905863e+00 4.223236e+02
vertex 9.232107e+01 -9.905863e+00 3.869683e+02
endloop
endfacet
facet normal 7.071069e-01 0.000000e+00 7.071066e-01
outer loop
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 9.232107e+01 9.905863e+00 3.869683e+02
vertex 9.232107e+01 -9.905863e+00 3.869683e+02
endloop
endfacet
facet normal -6.950669e-01 -1.837499e-01 6.950669e-01
outer loop
vertex 2.032670e+02 -6.905210e-16 3.467330e+02
vertex 1.653375e+02 1.947439e+01 3.139518e+02
vertex 1.679117e+02 -1.781979e-14 3.113776e+02
endloop
endfacet
facet normal 7.071065e-01 4.679821e-07 7.071071e-01
outer loop
vertex 1.653375e+02 1.947439e+01 3.139518e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
vertex 1.679117e+02 -1.781979e-14 3.113776e+02
endloop
endfacet
facet normal -6.950668e-01 -1.837494e-01 6.950671e-01
outer loop
vertex 2.006929e+02 1.947439e+01 3.493071e+02
vertex 1.653375e+02 1.947439e+01 3.139518e+02
vertex 2.032670e+02 -6.905210e-16 3.467330e+02
endloop
endfacet
facet normal 7.071069e-01 1.940928e-07 7.071066e-01
outer loop
vertex 9.738170e+01 2.837975e+01 3.819076e+02
vertex 9.232107e+01 9.905863e+00 3.869683e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
endloop
endfacet
facet normal 7.071070e-01 -2.229500e-07 7.071066e-01
outer loop
vertex 1.333091e+02 5.367963e+01 3.459802e+02
vertex 1.193599e+02 5.185163e+01 3.599295e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
endloop
endfacet
facet normal 7.071067e-01 -3.410209e-07 7.071069e-01
outer loop
vertex 1.193599e+02 5.185163e+01 3.599295e+02
vertex 1.068195e+02 4.302078e+01 3.724698e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
endloop
endfacet
facet normal 7.071067e-01 -2.969849e-07 7.071068e-01
outer loop
vertex 1.068195e+02 4.302078e+01 3.724698e+02
vertex 9.738170e+01 2.837975e+01 3.819076e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
endloop
endfacet
facet normal 7.071068e-01 -6.091928e-07 7.071068e-01
outer loop
vertex 1.653375e+02 1.947439e+01 3.139518e+02
vertex 1.579628e+02 3.631866e+01 3.213266e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
endloop
endfacet
facet normal 7.071064e-01 8.249345e-08 7.071072e-01
outer loop
vertex 1.579628e+02 3.631866e+01 3.213266e+02
vertex 1.467833e+02 4.825789e+01 3.325060e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
endloop
endfacet
facet normal 7.071067e-01 -1.912466e-07 7.071068e-01
outer loop
vertex 1.467833e+02 4.825789e+01 3.325060e+02
vertex 1.333091e+02 5.367963e+01 3.459802e+02
vertex 1.297918e+02 -4.615752e-15 3.494975e+02
endloop
endfacet
facet normal 7.071067e-01 -1.745782e-08 7.071068e-01
outer loop
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 2.006929e+02 1.947439e+01 3.493071e+02
vertex 2.032670e+02 -6.905210e-16 3.467330e+02
endloop
endfacet
facet normal 6.593573e-01 -3.612418e-01 -6.593575e-01
outer loop
vertex 9.738170e+01 2.837975e+01 3.819076e+02
vertex 1.327370e+02 2.837975e+01 4.172629e+02
vertex 9.232107e+01 9.905863e+00 3.869683e+02
endloop
endfacet
facet normal 6.593573e-01 -3.612416e-01 -6.593576e-01
outer loop
vertex 1.327370e+02 2.837975e+01 4.172629e+02
vertex 1.276764e+02 9.905863e+00 4.223236e+02
vertex 9.232107e+01 9.905863e+00 3.869683e+02
endloop
endfacet
facet normal 7.071073e-01 3.038186e-07 7.071063e-01
outer loop
vertex 1.327370e+02 2.837975e+01 4.172629e+02
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex 1.276764e+02 9.905863e+00 4.223236e+02
endloop
endfacet
facet normal -6.011943e-01 -5.264319e-01 6.011945e-01
outer loop
vertex 2.006929e+02 1.947439e+01 3.493071e+02
vertex 1.579628e+02 3.631866e+01 3.213266e+02
vertex 1.653375e+02 1.947439e+01 3.139518e+02
endloop
endfacet
facet normal 7.071067e-01 -3.070633e-08 7.071068e-01
outer loop
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 1.933181e+02 3.631866e+01 3.566819e+02
vertex 2.006929e+02 1.947439e+01 3.493071e+02
endloop
endfacet
facet normal -6.011942e-01 -5.264323e-01 6.011942e-01
outer loop
vertex 1.933181e+02 3.631866e+01 3.566819e+02
vertex 1.579628e+02 3.631866e+01 3.213266e+02
vertex 2.006929e+02 1.947439e+01 3.493071e+02
endloop
endfacet
facet normal 5.225581e-01 -6.736956e-01 -5.225584e-01
outer loop
vertex 1.068195e+02 4.302078e+01 3.724698e+02
vertex 1.421749e+02 4.302078e+01 4.078251e+02
vertex 9.738170e+01 2.837975e+01 3.819076e+02
endloop
endfacet
facet normal 5.225581e-01 -6.736957e-01 -5.225582e-01
outer loop
vertex 1.421749e+02 4.302078e+01 4.078251e+02
vertex 1.327370e+02 2.837975e+01 4.172629e+02
vertex 9.738170e+01 2.837975e+01 3.819076e+02
endloop
endfacet
facet normal 7.071065e-01 -3.015717e-07 7.071071e-01
outer loop
vertex 1.421749e+02 4.302078e+01 4.078251e+02
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex 1.327370e+02 2.837975e+01 4.172629e+02
endloop
endfacet
facet normal -4.261271e-01 -7.980172e-01 4.261271e-01
outer loop
vertex 1.933181e+02 3.631866e+01 3.566819e+02
vertex 1.467833e+02 4.825789e+01 3.325060e+02
vertex 1.579628e+02 3.631866e+01 3.213266e+02
endloop
endfacet
facet normal 7.071068e-01 -3.842491e-08 7.071068e-01
outer loop
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 1.821387e+02 4.825789e+01 3.678613e+02
vertex 1.933181e+02 3.631866e+01 3.566819e+02
endloop
endfacet
facet normal -4.261272e-01 -7.980170e-01 4.261274e-01
outer loop
vertex 1.821387e+02 4.825789e+01 3.678613e+02
vertex 1.467833e+02 4.825789e+01 3.325060e+02
vertex 1.933181e+02 3.631866e+01 3.566819e+02
endloop
endfacet
facet normal 3.151846e-01 -8.951633e-01 -3.151847e-01
outer loop
vertex 1.193599e+02 5.185163e+01 3.599295e+02
vertex 1.547152e+02 5.185163e+01 3.952848e+02
vertex 1.068195e+02 4.302078e+01 3.724698e+02
endloop
endfacet
facet normal 3.151847e-01 -8.951632e-01 -3.151848e-01
outer loop
vertex 1.547152e+02 5.185163e+01 3.952848e+02
vertex 1.421749e+02 4.302078e+01 4.078251e+02
vertex 1.068195e+02 4.302078e+01 3.724698e+02
endloop
endfacet
facet normal 7.071068e-01 -9.688457e-09 7.071068e-01
outer loop
vertex 1.547152e+02 5.185163e+01 3.952848e+02
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex 1.421749e+02 4.302078e+01 4.078251e+02
endloop
endfacet
facet normal -1.935088e-01 -9.618257e-01 1.935089e-01
outer loop
vertex 1.821387e+02 4.825789e+01 3.678613e+02
vertex 1.333091e+02 5.367963e+01 3.459802e+02
vertex 1.467833e+02 4.825789e+01 3.325060e+02
endloop
endfacet
facet normal 7.071068e-01 -4.600219e-08 7.071068e-01
outer loop
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 1.686644e+02 5.367963e+01 3.813356e+02
vertex 1.821387e+02 4.825789e+01 3.678613e+02
endloop
endfacet
facet normal -1.935088e-01 -9.618257e-01 1.935089e-01
outer loop
vertex 1.686644e+02 5.367963e+01 3.813356e+02
vertex 1.333091e+02 5.367963e+01 3.459802e+02
vertex 1.821387e+02 4.825789e+01 3.678613e+02
endloop
endfacet
facet normal 6.524362e-02 -9.957342e-01 -6.524364e-02
outer loop
vertex 1.333091e+02 5.367963e+01 3.459802e+02
vertex 1.686644e+02 5.367963e+01 3.813356e+02
vertex 1.193599e+02 5.185163e+01 3.599295e+02
endloop
endfacet
facet normal 6.524361e-02 -9.957342e-01 -6.524362e-02
outer loop
vertex 1.686644e+02 5.367963e+01 3.813356e+02
vertex 1.547152e+02 5.185163e+01 3.952848e+02
vertex 1.193599e+02 5.185163e+01 3.599295e+02
endloop
endfacet
facet normal 7.071068e-01 -3.417517e-08 7.071068e-01
outer loop
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex 1.547152e+02 5.185163e+01 3.952848e+02
endloop
endfacet
facet normal 7.071068e-01 -5.675223e-08 7.071068e-01
outer loop
vertex 1.686644e+02 5.367963e+01 3.813356e+02
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 1.547152e+02 5.185163e+01 3.952848e+02
endloop
endfacet
facet normal 0.000000e+00 1.000000e+00 0.000000e+00
outer loop
vertex -2.500000e+02 2.500000e+02 3.000000e+02
vertex 2.500000e+02 2.500000e+02 0.000000e+00
vertex -2.500000e+02 2.500000e+02 0.000000e+00
endloop
endfacet
facet normal -0.000000e+00 1.000000e+00 0.000000e+00
outer loop
vertex -2.500000e+02 2.500000e+02 3.000000e+02
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex 2.500000e+02 2.500000e+02 0.000000e+00
endloop
endfacet
facet normal -0.000000e+00 1.000000e+00 0.000000e+00
outer loop
vertex -5.000000e+01 2.500000e+02 5.000000e+02
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex -2.500000e+02 2.500000e+02 3.000000e+02
endloop
endfacet
facet normal 0.000000e+00 1.000000e+00 0.000000e+00
outer loop
vertex 5.000000e+01 2.500000e+02 5.000000e+02
vertex 2.500000e+02 2.500000e+02 3.000000e+02
vertex -2.500000e+02 2.500000e+02 3.000000e+02
endloop
endfacet
endsolid

View File

@@ -0,0 +1,287 @@
[EMC]
VERSION = 1.1
MACHINE = xyzbca-trsrn (switchkins)
DEBUG = 0
[DISPLAY]
EMBED_TAB_NAME = TCP
EMBED_TAB_COMMAND = pyvcp pyvcp_embed_tab_tcp.xml
GEOMETRY = XYZABC
OPEN_FILE = ../demos/incremental_repetition.ngc
PYVCP = ./xyzbca-trsrn.xml
JOG_AXES = XYZABC
DISPLAY = axis
MAX_ANGULAR_VELOCITY = 360
MAX_LINEAR_VELOCITY = 1500
POSITION_OFFSET = RELATIVE
POSITION_FEEDBACK = ACTUAL
MAX_FEED_OVERRIDE = 2
PROGRAM_PREFIX = ../demos
INTRO_GRAPHIC = emc2.gif
INTRO_TIME = 1
#EDITOR = gedit
TOOL_EDITOR = tooledit z diam
TKPKG = Ngcgui 1.0
NGCGUI_FONT = Helvetica -12 normal
[RS274NGC]
RS274NGC_STARTUP_CODE = G17 G21 G40 G49 G54 G64 P0.001 G80 G90 G92.1 G94 G97 G98
#ON_ABORT_COMMAND = o <on_abort_no_twp_reset> call
ON_ABORT_COMMAND = o <on_abort_with_twp_reset> call
SUBROUTINE_PATH = ../remap_subs:../demos
HAL_PIN_VARS = 1
REMAP = M428 modalgroup=10 ngc=428remap
REMAP = M429 modalgroup=10 ngc=429remap
REMAP = M430 modalgroup=10 ngc=430remap
REMAP = G53.1 modalgroup=1 argspec=p ngc=g531remap
REMAP = G53.3 modalgroup=1 argspec=pxyz ngc=g533remap
REMAP = G53.6 modalgroup=1 argspec=p ngc=g536remap
REMAP = M530 modalgroup=10 python=g53x_core
REMAP = G68.2 modalgroup=1 argspec=pqxyzijkr python=g682
REMAP = G68.3 modalgroup=1 argspec=xyzr python=g683
REMAP = G68.4 modalgroup=1 argspec=pqxyzijkr python=g684
REMAP = G69 modalgroup=1 ngc=g69remap
REMAP = M469 modalgroup=10 python=g69_core
PARAMETER_FILE = xyzbca-trsrn.var
[PYTHON]
# where to find the Python code:
# code specific for this configuration
PATH_APPEND = ../python
# import the following Python module
TOPLEVEL = ../python/toplevel.py
# the higher the more verbose tracing of the Python plugin
LOG_LEVEL = 3
[KINS]
KINEMATICS = xyzbca_trsrn
JOINTS = 6
[TWP]
# this defines the primary spindle rotation
PRIMARY = C
# this defines the secnodary spindle rotation (ie the one closest to the tool)
SECONDARY = A
[HAL]
HALUI = halui
HALFILE = LIB:basic_sim.tcl
POSTGUI_HALFILE = xyzbca-trsrn_postgui.hal
# signal reflecting twp states (0=undefined, 1=defined, 2=active)
HALCMD = net twp-status <= motion.analog-out-02
# connection required for control of motion.switchkins-type
HALCMD = net :kinstype-select <= motion.analog-out-03 => motion.switchkins-type
# connections required for the kinematics component
HALCMD = net :tool-offset motion.tooloffset.z xyzbca_trsrn_kins.tool-offset-z
HALCMD = net :rot-axis-x xyzbca_trsrn_kins.x-rot-axis
HALCMD = net :rot-axis-z xyzbca_trsrn_kins.z-rot-axis
HALCMD = net :nutation-angle xyzbca_trsrn_kins.nut-angle
HALCMD = net :pivot-x xyzbca_trsrn_kins.x-pivot
HALCMD = net :pivot-z xyzbca_trsrn_kins.z-pivot
HALCMD = net :offset-x xyzbca_trsrn_kins.x-offset
HALCMD = net :offset-y xyzbca_trsrn_kins.y-offset
# load the required twp-helper component and its hal connections
HALCMD = loadusr -W ../python/twp-helper-comp.py
#twp-status
HALCMD = net twp-status => twp-helper-comp.twp-status
HALCMD = net twp-is-defined <= twp-helper-comp.twp-is-defined
HALCMD = net twp-is-active <= twp-helper-comp.twp-is-active
# current twp parameters
HALCMD = net twp-ox-world <= twp-helper-comp.twp-ox-world
HALCMD = net twp-oy-world <= twp-helper-comp.twp-oy-world
HALCMD = net twp-oz-world <= twp-helper-comp.twp-oz-world
HALCMD = net twp-ox <= twp-helper-comp.twp-ox
HALCMD = net twp-oy <= twp-helper-comp.twp-oy
HALCMD = net twp-oz <= twp-helper-comp.twp-oz
HALCMD = net twp-zx <= twp-helper-comp.twp-zx
HALCMD = net twp-zy <= twp-helper-comp.twp-zy
HALCMD = net twp-zz <= twp-helper-comp.twp-zz
HALCMD = net twp-xx <= twp-helper-comp.twp-xx
HALCMD = net twp-xy <= twp-helper-comp.twp-xy
HALCMD = net twp-xz <= twp-helper-comp.twp-xz
# load the optional vismach-gui and its hal connections
HALCMD = loadusr -W ../vismach/xyzbca-trsrn-gui.py
HALCMD = net :axis-x joint.0.pos-fb xyzbca-trsrn-gui.axis_x
HALCMD = net :axis-y joint.1.pos-fb xyzbca-trsrn-gui.axis_y
HALCMD = net :axis-z joint.2.pos-fb xyzbca-trsrn-gui.axis_z
HALCMD = net :rotary-a joint.3.pos-fb xyzbca-trsrn-gui.rotary_a
HALCMD = net :rotary-b joint.4.pos-fb xyzbca-trsrn-gui.rotary_b
HALCMD = net :rotary-c joint.5.pos-fb xyzbca-trsrn-gui.rotary_c
HALCMD = net :tool-diam halui.tool.diameter xyzbca-trsrn-gui.tool_diameter
HALCMD = net :tool-offset xyzbca-trsrn-gui.tool_length
HALCMD = net :kinstype-select xyzbca-trsrn-gui.kinstype_select
HALCMD = net :nutation-angle xyzbca-trsrn-gui.nutation_angle
HALCMD = net :pivot-x xyzbca-trsrn-gui.pivot_x
HALCMD = net :pivot-z xyzbca-trsrn-gui.pivot_z
HALCMD = net :offset-x xyzbca-trsrn-gui.offset_x
HALCMD = net :offset-y xyzbca-trsrn-gui.offset_y
HALCMD = net :rot-axis-x xyzbca-trsrn-gui.rot_axis_x
HALCMD = net :rot-axis-z xyzbca-trsrn-gui.rot_axis_z
HALCMD = net :hide-work-piece-1 xyzbca-trsrn-gui.hide_work_piece_1
HALCMD = net :hide-spindle-body xyzbca-trsrn-gui.hide_spindle_body
HALCMD = net :scale-coords xyzbca-trsrn-gui.scale_coords
HALCMD = net twp-ox-world xyzbca-trsrn-gui.twp_ox_world
HALCMD = net twp-oy-world xyzbca-trsrn-gui.twp_oy_world
HALCMD = net twp-oz-world xyzbca-trsrn-gui.twp_oz_world
HALCMD = net twp-ox xyzbca-trsrn-gui.twp_ox
HALCMD = net twp-oy xyzbca-trsrn-gui.twp_oy
HALCMD = net twp-oz xyzbca-trsrn-gui.twp_oz
HALCMD = net twp-zx xyzbca-trsrn-gui.twp_zx
HALCMD = net twp-zy xyzbca-trsrn-gui.twp_zy
HALCMD = net twp-zz xyzbca-trsrn-gui.twp_zz
HALCMD = net twp-xx xyzbca-trsrn-gui.twp_xx
HALCMD = net twp-xy xyzbca-trsrn-gui.twp_xy
HALCMD = net twp-xz xyzbca-trsrn-gui.twp_xz
HALCMD = net twp-status xyzbca-trsrn-gui.twp_status
HALCMD = net twp-is-defined xyzbca-trsrn-gui.twp_defined
HALCMD = net twp-is-active xyzbca-trsrn-gui.twp_active
[HALUI]
# NOTE: kinstype==0 is identity kins because sparm=identityfirst
# M428:identity kins (motion.switchkins-type==0 startupDEFAULT)
# M429: tcp kins (motion.switchkins-type==1)
# M430: tool kins (motion.switchkins-type==2)
MDI_COMMAND = M428
MDI_COMMAND = M429
MDI_COMMAND = M430
[TRAJ]
COORDINATES = XYZABC
LINEAR_UNITS = mm
ANGULAR_UNITS = deg
DEFAULT_LINEAR_VELOCITY = 100
MAX_LINEAR_VELOCITY = 120
MAX_LINEAR_ACCELERATION = 700
DEFAULT_LINEAR_ACCELERATION = 300
[EMCMOT]
EMCMOT = motmod
SERVO_PERIOD = 1000000
COMM_TIMEOUT = 1
[TASK]
TASK = milltask
CYCLE_TIME = 0.010
[EMCIO]
TOOL_TABLE = xyzbca-trsrn.tbl
[AXIS_X]
MIN_LIMIT = -5000
MAX_LIMIT = 5000
MAX_VELOCITY = 200
MAX_ACCELERATION = 700
[AXIS_Y]
MIN_LIMIT = -5000
MAX_LIMIT = 5000
MAX_VELOCITY = 200
MAX_ACCELERATION = 700
[AXIS_Z]
MIN_LIMIT = -5000
MAX_LIMIT = 5000
MAX_VELOCITY = 200
MAX_ACCELERATION = 700
# spindle secondary axis
[AXIS_A]
MIN_LIMIT = -185
MAX_LIMIT = 185
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
# table rotary axis
[AXIS_B]
MIN_LIMIT = -360
MAX_LIMIT = 360
MAX_VELOCITY = 30
MAX_ACCELERATION = 302
# spindle primary rotating axis
[AXIS_C]
MIN_LIMIT = -320
MAX_LIMIT = 320
MAX_VELOCITY = 30
MAX_ACCELERATION = 301
[JOINT_0]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 200
MAX_ACCELERATION = 700
MIN_LIMIT = -5000
MAX_LIMIT = 5000
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_1]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 200
MAX_ACCELERATION = 700
MIN_LIMIT = -5000
MAX_LIMIT = 5000
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_2]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 200
MAX_ACCELERATION = 700
MIN_LIMIT = -5000
MAX_LIMIT = 5000
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
# spindle secondary joint
[JOINT_3]
TYPE = ANGULAR
HOME = 0
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
MIN_LIMIT = -185
MAX_LIMIT = 185
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
# table rotating joint
[JOINT_4]
TYPE = ANGULAR
HOME = 0
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
MIN_LIMIT = -360
MAX_LIMIT = 360
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
# spindle primary joint
[JOINT_5]
TYPE = ANGULAR
HOME = 0
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
MIN_LIMIT = -320
MAX_LIMIT = 320
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0

View File

@@ -0,0 +1,4 @@
T1 P1 D1
T2 P2 Z50 D8
T3 P3 Z100 D20
T4 P4 Z120 D40

View File

@@ -0,0 +1,301 @@
<?xml version='1.0' encoding='UTF-8'?>
<pyvcp>
<relief>"ridge"</relief>
<bd>5</bd>
<label>
<text>"SWITCHKINS"</text>
<relief>RIDGE</relief>
<bd>3</bd>
</label>
<multilabel>
<legends>["0: IDENTITY", "1: TCP ", "2: TOOL "]</legends>
<font>("Helvetica",16)</font>
<bg>"black"</bg>
<fg>"yellow"</fg>
</multilabel>
<button>
<halpin>"type0-button"</halpin>
<text>" IDENTITY "</text>
<bd>3</bd>
</button>
<button>
<halpin>"type1-button"</halpin>
<text>" TCP "</text>
<bd>3</bd>
</button>
<button>
<halpin>"type2-button"</halpin>
<text>" TOOL "</text>
<bd>3</bd>
</button>
<!-- create a space to the next element -->
<vbox>
<hbox>
<label>
<text>" "</text>
<font>("Helvetica",4)</font>
</label>
</hbox>
</vbox>
<vbox>
<labelframe text="Joint position">
<font>("Helvetica",14)</font>
<hbox>
<vbox>
<hbox>
<label>
<text>"0: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint0"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"1: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint1"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"2: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint2"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
</vbox>
<vbox>
<label>
<text>" "</text>
<font>("Helvetica",10)</font>
</label>
</vbox>
<vbox>
<hbox>
<label>
<text>"3: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint3"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"4: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint4"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
<hbox>
<label>
<text>"5: "</text>
<font>("Helvetica",10)</font>
</label>
<number>
<halpin>"joint5"</halpin>
<font>("Helvetica",10)</font>
<format>"4.4f"</format>
</number>
</hbox>
</vbox>
</hbox>
</labelframe>
</vbox>
<!-- create a space to the next element -->
<vbox>
<hbox>
<label>
<text>" "</text>
<font>("Helvetica",4)</font>
</label>
</hbox>
</vbox>
<vbox>
<relief>"ridge"</relief>
<bd>5</bd>
<button>
<halpin>"vismach-clear"</halpin>
<text>"vismach-clear"</text>
<bd>3</bd>
</button>
</vbox>
<vbox>
<checkbutton>
<halpin>"hide-work-piece-1"</halpin>
<text>"Hide work piece 1"</text>
</checkbutton>
<checkbutton>
<halpin>"hide-spindle-body"</halpin>
<text>"Hide spindle body"</text>
</checkbutton>
</vbox>
<!-- create a space to the next element -->
<vbox>
<hbox>
<label>
<text>" "</text>
<font>("Helvetica",4)</font>
</label>
</hbox>
</vbox>
<!-- create another vertical panel -->
<vbox>
<relief>"ridge"</relief>
<bd>5</bd>
<vbox>
<labelframe text="Spindle Offsets">
<font>("Helvetica",14)</font>
<hbox>
<label>
<text>"nutation-angle: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"nut-angle"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>55</initval>
<min_>0</min_>
<max_>90</max_>
</scale>
</hbox>
<hbox>
<label>
<text>"x-pivot-length: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"x-pivot"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>50</initval>
<min_>0</min_>
<max_>300</max_>
</scale>
</hbox>
<hbox>
<label>
<text>"z-pivot-length: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"z-pivot"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>120</initval>
<min_>0</min_>
<max_>300</max_>
</scale>
</hbox>
<hbox>
<label>
<text>"x-offset: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"x-offset"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>0</initval>
<min_>-20</min_>
<max_>20</max_>
</scale>
</hbox>
<hbox>
<label>
<text>"y-offset: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"y-offset"</halpin>
<resolution>1</resolution>
<orient>HORIZONTAL</orient>
<initval>0</initval>
<min_>-20</min_>
<max_>40</max_>
</scale>
</hbox>
<hbox>
<label>
<font>("Helvetica",8)</font>
<text>" "</text>
</label>
</hbox>
<hbox>
<label>
<text>"Scale Coords: "</text>
<font>("Helvetica",10)</font>
</label>
<scale>
<font>("Helvetica",10)</font>
<width>"12"</width>
<halpin>"scale-coords"</halpin>
<resolution>0.05</resolution>
<orient>HORIZONTAL</orient>
<initval>1</initval>
<min_>0</min_>
<max_>2</max_>
</scale>
</hbox>
<hbox>
<label>
<text>"Use hover + mouse wheel to change values"</text>
<font>("Helvetica",6)</font>
</label>
</hbox>
</labelframe>
</vbox>
<!-- create a space to the next element -->
<vbox>
<hbox>
<label>
<text>" "</text>
<font>("Helvetica",4)</font>
</label>
</hbox>
</vbox>
<vbox>
<hbox>
<label>
<text>" To test change values above\n reload and restart\n the demo gcode "</text>
<font>("Helvetica",10)</font>
</label>
</hbox>
</vbox>
</vbox>
</pyvcp>

View File

@@ -0,0 +1,32 @@
# switchkins pyvcp connections for:
# xyzbca-trsrn.ini
net :kinstype.is-0 <= kinstype.is-0 => pyvcp.multilabel.0.legend0
net :kinstype.is-1 <= kinstype.is-1 => pyvcp.multilabel.0.legend1
net :kinstype.is-2 <= kinstype.is-2 => pyvcp.multilabel.0.legend2
net :vismach-clear <= pyvcp.vismach-clear => vismach.plotclear
net :type0-button <= pyvcp.type0-button => halui.mdi-command-00
net :type1-button <= pyvcp.type1-button => halui.mdi-command-01
net :type2-button <= pyvcp.type2-button => halui.mdi-command-02
net :axis-x => pyvcp.joint0
net :axis-y => pyvcp.joint1
net :axis-z => pyvcp.joint2
net :rotary-a => pyvcp.joint3
net :rotary-b => pyvcp.joint4
net :hide-work-piece-1 <= pyvcp.hide-work-piece-1
net :hide-spindle-body <= pyvcp.hide-spindle-body
net :nutation-angle <= pyvcp.nut-angle-f
net :pivot-x <= pyvcp.x-pivot-f
net :pivot-z <= pyvcp.z-pivot-f
net :offset-x <= pyvcp.x-offset-f
net :offset-y <= pyvcp.y-offset-f
net :rot-axis-x <= tcp.x-rot-axis-f
net :rot-axis-z <= tcp.z-rot-axis-f
net :scale-coords <= pyvcp.scale-coords-f

View File

@@ -0,0 +1,7 @@
The 'vismach' directory contains a number of configurations that display a 3D model of the simulated machine.
These simulations are mostly intended for testing of complex kinematics code by people who don't have those somewhat exotic machines.
All of these configurations work without realtime and without hardware or drivers.
All of the simulations use the Axis GUI.

View File

@@ -0,0 +1,55 @@
This is a Vismach simulator config intended for testing out tool-changer configurations
The Vismach model combined with the sim_vmc.hal file features three axes
with home and limit switches, a carousel with both gray-code and pulse/index outputs,
a locking bar and a power drawbar.
There are two alternative configs, one demonstrating gray-code carousel coding and the other demonstrating
pulse/index.
Note that the carousel component also supports straight-binary and individual sensors.
The "virtual" VMC is created by the sim_vmc.hal file and defines the following signals
that my be used in the other HAL files
Axis positions
x-pos
y-pos
z-pos
Axis limits
x-pos-lim
x-neg-lim
y-pos-lim
y-neg-llm
z-pos-lim
z-neg-lim
Simulated Spindle
spindle-cmd - set spindle speed in rpm, negative for reverse
spindle-pos - the simulated spindle position (revs)
spindle-vel - the simulated spindle speed out
Toolchanger arm
arm-act - actuate the arm
arm-in - arm in limit switch
arm-out - arm out limit switch
Carousel lock
car-lock - activate the lock
car-locked
car-unlocked - limit switches
Drawbar
tool-release
tool-released
tool-locked
Carousel
car-fwd rotate clockwise
car-rev rotate anticlockwise
bit0
bit1
bit2
bit3
bit4 - Gray-coded carousel position

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,772 @@
solid ascii
facet normal -5.102026e-001 -1.367084e-001 8.491196e-001
outer loop
vertex -1.065900e+000 9.891434e+000 1.242000e+002
vertex -1.195804e+000 9.816434e+000 1.241099e+002
vertex -1.045804e+000 9.816434e+000 1.242000e+002
endloop
endfacet
facet normal -3.734942e-001 -3.734942e-001 8.491196e-001
outer loop
vertex -1.065900e+000 9.891434e+000 1.242000e+002
vertex -1.120804e+000 9.946337e+000 1.242000e+002
vertex -1.195804e+000 9.816434e+000 1.241099e+002
endloop
endfacet
facet normal -1.367084e-001 -5.102026e-001 8.491196e-001
outer loop
vertex -1.120804e+000 9.946337e+000 1.242000e+002
vertex -1.195804e+000 9.966434e+000 1.242000e+002
vertex -1.195804e+000 9.816434e+000 1.241099e+002
endloop
endfacet
facet normal 1.367084e-001 -5.102026e-001 8.491196e-001
outer loop
vertex -1.195804e+000 9.966434e+000 1.242000e+002
vertex -1.270804e+000 9.946337e+000 1.242000e+002
vertex -1.195804e+000 9.816434e+000 1.241099e+002
endloop
endfacet
facet normal 3.734942e-001 -3.734942e-001 8.491196e-001
outer loop
vertex -1.270804e+000 9.946337e+000 1.242000e+002
vertex -1.325708e+000 9.891434e+000 1.242000e+002
vertex -1.195804e+000 9.816434e+000 1.241099e+002
endloop
endfacet
facet normal 5.102026e-001 -1.367084e-001 8.491196e-001
outer loop
vertex -1.325708e+000 9.891434e+000 1.242000e+002
vertex -1.345804e+000 9.816434e+000 1.242000e+002
vertex -1.195804e+000 9.816434e+000 1.241099e+002
endloop
endfacet
facet normal 5.102026e-001 1.367084e-001 8.491196e-001
outer loop
vertex -1.345804e+000 9.816434e+000 1.242000e+002
vertex -1.325708e+000 9.741434e+000 1.242000e+002
vertex -1.195804e+000 9.816434e+000 1.241099e+002
endloop
endfacet
facet normal 3.734942e-001 3.734942e-001 8.491196e-001
outer loop
vertex -1.325708e+000 9.741434e+000 1.242000e+002
vertex -1.270804e+000 9.686530e+000 1.242000e+002
vertex -1.195804e+000 9.816434e+000 1.241099e+002
endloop
endfacet
facet normal 1.367084e-001 5.102026e-001 8.491196e-001
outer loop
vertex -1.270804e+000 9.686530e+000 1.242000e+002
vertex -1.195804e+000 9.666434e+000 1.242000e+002
vertex -1.195804e+000 9.816434e+000 1.241099e+002
endloop
endfacet
facet normal -1.367084e-001 5.102026e-001 8.491196e-001
outer loop
vertex -1.195804e+000 9.666434e+000 1.242000e+002
vertex -1.120804e+000 9.686530e+000 1.242000e+002
vertex -1.195804e+000 9.816434e+000 1.241099e+002
endloop
endfacet
facet normal -3.734942e-001 3.734942e-001 8.491196e-001
outer loop
vertex -1.120804e+000 9.686530e+000 1.242000e+002
vertex -1.065900e+000 9.741434e+000 1.242000e+002
vertex -1.195804e+000 9.816434e+000 1.241099e+002
endloop
endfacet
facet normal -5.102026e-001 1.367084e-001 8.491196e-001
outer loop
vertex -1.065900e+000 9.741434e+000 1.242000e+002
vertex -1.045804e+000 9.816434e+000 1.242000e+002
vertex -1.195804e+000 9.816434e+000 1.241099e+002
endloop
endfacet
facet normal -9.659258e-001 -2.588190e-001 -0.000000e+000
outer loop
vertex -1.065900e+000 9.891434e+000 1.250000e+002
vertex -1.065900e+000 9.891434e+000 1.242000e+002
vertex -1.045804e+000 9.816434e+000 1.250000e+002
endloop
endfacet
facet normal -7.071068e-001 -7.071068e-001 0.000000e+000
outer loop
vertex -1.065900e+000 9.891434e+000 1.250000e+002
vertex -1.120804e+000 9.946337e+000 1.242000e+002
vertex -1.065900e+000 9.891434e+000 1.242000e+002
endloop
endfacet
facet normal -7.071068e-001 -7.071068e-001 -0.000000e+000
outer loop
vertex -1.065900e+000 9.891434e+000 1.250000e+002
vertex -1.120804e+000 9.946337e+000 1.250000e+002
vertex -1.120804e+000 9.946337e+000 1.242000e+002
endloop
endfacet
facet normal -2.588190e-001 -9.659258e-001 0.000000e+000
outer loop
vertex -1.120804e+000 9.946337e+000 1.242000e+002
vertex -1.120804e+000 9.946337e+000 1.250000e+002
vertex -1.195804e+000 9.966434e+000 1.242000e+002
endloop
endfacet
facet normal -2.588190e-001 -9.659258e-001 0.000000e+000
outer loop
vertex -1.195804e+000 9.966434e+000 1.242000e+002
vertex -1.120804e+000 9.946337e+000 1.250000e+002
vertex -1.195804e+000 9.966434e+000 1.250000e+002
endloop
endfacet
facet normal 2.588190e-001 -9.659258e-001 7.330812e-017
outer loop
vertex -1.270804e+000 9.946337e+000 1.242000e+002
vertex -1.195804e+000 9.966434e+000 1.250000e+002
vertex -1.270804e+000 9.946337e+000 1.250000e+002
endloop
endfacet
facet normal 7.071068e-001 -7.071068e-001 0.000000e+000
outer loop
vertex -1.325708e+000 9.891434e+000 1.242000e+002
vertex -1.270804e+000 9.946337e+000 1.250000e+002
vertex -1.325708e+000 9.891434e+000 1.250000e+002
endloop
endfacet
facet normal 9.659258e-001 -2.588190e-001 0.000000e+000
outer loop
vertex -1.345804e+000 9.816434e+000 1.242000e+002
vertex -1.325708e+000 9.891434e+000 1.250000e+002
vertex -1.345804e+000 9.816434e+000 1.250000e+002
endloop
endfacet
facet normal 9.659258e-001 2.588190e-001 0.000000e+000
outer loop
vertex -1.325708e+000 9.741434e+000 1.242000e+002
vertex -1.345804e+000 9.816434e+000 1.250000e+002
vertex -1.325708e+000 9.741434e+000 1.250000e+002
endloop
endfacet
facet normal 7.071068e-001 7.071068e-001 -1.954883e-016
outer loop
vertex -1.270804e+000 9.686530e+000 1.242000e+002
vertex -1.325708e+000 9.741434e+000 1.250000e+002
vertex -1.270804e+000 9.686530e+000 1.250000e+002
endloop
endfacet
facet normal 2.588190e-001 9.659258e-001 0.000000e+000
outer loop
vertex -1.195804e+000 9.666434e+000 1.242000e+002
vertex -1.270804e+000 9.686530e+000 1.250000e+002
vertex -1.195804e+000 9.666434e+000 1.250000e+002
endloop
endfacet
facet normal -2.588190e-001 9.659258e-001 0.000000e+000
outer loop
vertex -1.120804e+000 9.686530e+000 1.242000e+002
vertex -1.195804e+000 9.666434e+000 1.250000e+002
vertex -1.120804e+000 9.686530e+000 1.250000e+002
endloop
endfacet
facet normal -7.071068e-001 7.071068e-001 0.000000e+000
outer loop
vertex -1.065900e+000 9.741434e+000 1.242000e+002
vertex -1.120804e+000 9.686530e+000 1.250000e+002
vertex -1.065900e+000 9.741434e+000 1.250000e+002
endloop
endfacet
facet normal -9.659258e-001 2.588190e-001 0.000000e+000
outer loop
vertex -1.045804e+000 9.816434e+000 1.242000e+002
vertex -1.065900e+000 9.741434e+000 1.250000e+002
vertex -1.045804e+000 9.816434e+000 1.250000e+002
endloop
endfacet
facet normal -9.659258e-001 -2.588190e-001 0.000000e+000
outer loop
vertex -1.065900e+000 9.891434e+000 1.242000e+002
vertex -1.045804e+000 9.816434e+000 1.242000e+002
vertex -1.045804e+000 9.816434e+000 1.250000e+002
endloop
endfacet
facet normal 2.588190e-001 -9.659258e-001 0.000000e+000
outer loop
vertex -1.195804e+000 9.966434e+000 1.242000e+002
vertex -1.195804e+000 9.966434e+000 1.250000e+002
vertex -1.270804e+000 9.946337e+000 1.242000e+002
endloop
endfacet
facet normal 7.071068e-001 -7.071068e-001 1.962616e-016
outer loop
vertex -1.270804e+000 9.946337e+000 1.242000e+002
vertex -1.270804e+000 9.946337e+000 1.250000e+002
vertex -1.325708e+000 9.891434e+000 1.242000e+002
endloop
endfacet
facet normal 9.659258e-001 -2.588190e-001 0.000000e+000
outer loop
vertex -1.325708e+000 9.891434e+000 1.242000e+002
vertex -1.325708e+000 9.891434e+000 1.250000e+002
vertex -1.345804e+000 9.816434e+000 1.242000e+002
endloop
endfacet
facet normal 9.659258e-001 2.588190e-001 -0.000000e+000
outer loop
vertex -1.345804e+000 9.816434e+000 1.242000e+002
vertex -1.345804e+000 9.816434e+000 1.250000e+002
vertex -1.325708e+000 9.741434e+000 1.242000e+002
endloop
endfacet
facet normal 7.071068e-001 7.071068e-001 -0.000000e+000
outer loop
vertex -1.325708e+000 9.741434e+000 1.242000e+002
vertex -1.325708e+000 9.741434e+000 1.250000e+002
vertex -1.270804e+000 9.686530e+000 1.242000e+002
endloop
endfacet
facet normal 2.588190e-001 9.659258e-001 -7.183672e-017
outer loop
vertex -1.270804e+000 9.686530e+000 1.242000e+002
vertex -1.270804e+000 9.686530e+000 1.250000e+002
vertex -1.195804e+000 9.666434e+000 1.242000e+002
endloop
endfacet
facet normal -2.588190e-001 9.659258e-001 0.000000e+000
outer loop
vertex -1.195804e+000 9.666434e+000 1.242000e+002
vertex -1.195804e+000 9.666434e+000 1.250000e+002
vertex -1.120804e+000 9.686530e+000 1.242000e+002
endloop
endfacet
facet normal -7.071068e-001 7.071068e-001 0.000000e+000
outer loop
vertex -1.120804e+000 9.686530e+000 1.242000e+002
vertex -1.120804e+000 9.686530e+000 1.250000e+002
vertex -1.065900e+000 9.741434e+000 1.242000e+002
endloop
endfacet
facet normal -9.659258e-001 2.588190e-001 0.000000e+000
outer loop
vertex -1.065900e+000 9.741434e+000 1.242000e+002
vertex -1.065900e+000 9.741434e+000 1.250000e+002
vertex -1.045804e+000 9.816434e+000 1.242000e+002
endloop
endfacet
facet normal -7.071068e-001 0.000000e+000 -7.071068e-001
outer loop
vertex -6.195804e+000 2.406643e+001 2.150000e+001
vertex -9.695804e+000 2.406643e+001 2.500000e+001
vertex -6.195804e+000 7.406643e+001 2.150000e+001
endloop
endfacet
facet normal -7.071068e-001 0.000000e+000 -7.071068e-001
outer loop
vertex -6.195804e+000 7.406643e+001 2.150000e+001
vertex -9.695804e+000 2.406643e+001 2.500000e+001
vertex -9.695804e+000 7.406643e+001 2.500000e+001
endloop
endfacet
facet normal 0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex -1.369580e+001 2.406643e+001 2.150000e+001
vertex -6.195804e+000 2.406643e+001 2.150000e+001
vertex -1.369580e+001 7.406643e+001 2.150000e+001
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -1.369580e+001 7.406643e+001 2.150000e+001
vertex -6.195804e+000 2.406643e+001 2.150000e+001
vertex -6.195804e+000 7.406643e+001 2.150000e+001
endloop
endfacet
facet normal 0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex 3.804196e+000 2.406643e+001 2.150000e+001
vertex 1.130420e+001 2.406643e+001 2.150000e+001
vertex 3.804196e+000 7.406643e+001 2.150000e+001
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex 3.804196e+000 7.406643e+001 2.150000e+001
vertex 1.130420e+001 2.406643e+001 2.150000e+001
vertex 1.130420e+001 7.406643e+001 2.150000e+001
endloop
endfacet
facet normal 7.071068e-001 0.000000e+000 -7.071068e-001
outer loop
vertex 7.304196e+000 2.406643e+001 2.500000e+001
vertex 3.804196e+000 2.406643e+001 2.150000e+001
vertex 7.304196e+000 7.406643e+001 2.500000e+001
endloop
endfacet
facet normal 7.071068e-001 0.000000e+000 -7.071068e-001
outer loop
vertex 7.304196e+000 7.406643e+001 2.500000e+001
vertex 3.804196e+000 2.406643e+001 2.150000e+001
vertex 3.804196e+000 7.406643e+001 2.150000e+001
endloop
endfacet
facet normal 0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex -9.695804e+000 2.406643e+001 2.500000e+001
vertex 7.304196e+000 2.406643e+001 2.500000e+001
vertex -9.695804e+000 7.406643e+001 2.500000e+001
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -9.695804e+000 7.406643e+001 2.500000e+001
vertex 7.304196e+000 2.406643e+001 2.500000e+001
vertex 7.304196e+000 7.406643e+001 2.500000e+001
endloop
endfacet
facet normal 1.000000e+000 0.000000e+000 0.000000e+000
outer loop
vertex 1.130420e+001 7.406643e+001 2.150000e+001
vertex 1.130420e+001 2.406643e+001 2.150000e+001
vertex 1.130420e+001 7.406643e+001 0.000000e+000
endloop
endfacet
facet normal 1.000000e+000 0.000000e+000 0.000000e+000
outer loop
vertex 1.130420e+001 7.406643e+001 0.000000e+000
vertex 1.130420e+001 2.406643e+001 2.150000e+001
vertex 1.130420e+001 -9.335665e-001 0.000000e+000
endloop
endfacet
facet normal 1.000000e+000 0.000000e+000 -0.000000e+000
outer loop
vertex 1.130420e+001 -9.335665e-001 0.000000e+000
vertex 1.130420e+001 2.406643e+001 2.150000e+001
vertex 1.130420e+001 2.056643e+001 3.500000e+001
endloop
endfacet
facet normal 1.000000e+000 -0.000000e+000 -0.000000e+000
outer loop
vertex 1.130420e+001 -9.335665e-001 1.250000e+002
vertex 1.130420e+001 2.056643e+001 3.500000e+001
vertex 1.130420e+001 2.056643e+001 1.250000e+002
endloop
endfacet
facet normal 1.000000e+000 -0.000000e+000 0.000000e+000
outer loop
vertex 1.130420e+001 -9.335665e-001 1.250000e+002
vertex 1.130420e+001 -9.335665e-001 0.000000e+000
vertex 1.130420e+001 2.056643e+001 3.500000e+001
endloop
endfacet
facet normal 1.000000e+000 0.000000e+000 -0.000000e+000
outer loop
vertex 1.130420e+001 2.406643e+001 2.150000e+001
vertex 1.130420e+001 2.406643e+001 3.500000e+001
vertex 1.130420e+001 2.056643e+001 3.500000e+001
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 5.526444e-016
outer loop
vertex -1.369580e+001 2.056643e+001 3.500000e+001
vertex -1.369580e+001 2.056643e+001 1.250000e+002
vertex -6.195804e+000 2.056643e+001 3.500000e+001
endloop
endfacet
facet normal -0.000000e+000 1.000000e+000 5.526444e-016
outer loop
vertex -6.195804e+000 2.056643e+001 3.500000e+001
vertex -1.369580e+001 2.056643e+001 1.250000e+002
vertex -6.195804e+000 2.056643e+001 1.250000e+002
endloop
endfacet
facet normal -7.071068e-001 -7.071068e-001 -3.907786e-016
outer loop
vertex -6.195804e+000 2.056643e+001 3.500000e+001
vertex -6.195804e+000 2.056643e+001 1.250000e+002
vertex -9.695804e+000 2.406643e+001 3.500000e+001
endloop
endfacet
facet normal -7.071068e-001 -7.071068e-001 -3.907786e-016
outer loop
vertex -9.695804e+000 2.406643e+001 3.500000e+001
vertex -6.195804e+000 2.056643e+001 1.250000e+002
vertex -9.695804e+000 2.406643e+001 1.250000e+002
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -6.195804e+000 2.056643e+001 3.500000e+001
vertex -9.695804e+000 2.406643e+001 3.500000e+001
vertex -1.369580e+001 2.056643e+001 3.500000e+001
endloop
endfacet
facet normal 0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex -1.369580e+001 2.056643e+001 3.500000e+001
vertex -9.695804e+000 2.406643e+001 3.500000e+001
vertex -1.369580e+001 2.406643e+001 3.500000e+001
endloop
endfacet
facet normal 7.071068e-001 -7.071068e-001 -3.907786e-016
outer loop
vertex 7.304196e+000 2.406643e+001 3.500000e+001
vertex 7.304196e+000 2.406643e+001 1.250000e+002
vertex 3.804196e+000 2.056643e+001 3.500000e+001
endloop
endfacet
facet normal 7.071068e-001 -7.071068e-001 -3.907786e-016
outer loop
vertex 3.804196e+000 2.056643e+001 3.500000e+001
vertex 7.304196e+000 2.406643e+001 1.250000e+002
vertex 3.804196e+000 2.056643e+001 1.250000e+002
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 5.526444e-016
outer loop
vertex 3.804196e+000 2.056643e+001 3.500000e+001
vertex 3.804196e+000 2.056643e+001 1.250000e+002
vertex 1.130420e+001 2.056643e+001 3.500000e+001
endloop
endfacet
facet normal -0.000000e+000 1.000000e+000 5.526444e-016
outer loop
vertex 1.130420e+001 2.056643e+001 3.500000e+001
vertex 3.804196e+000 2.056643e+001 1.250000e+002
vertex 1.130420e+001 2.056643e+001 1.250000e+002
endloop
endfacet
facet normal 0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex 3.804196e+000 2.056643e+001 3.500000e+001
vertex 1.130420e+001 2.056643e+001 3.500000e+001
vertex 7.304196e+000 2.406643e+001 3.500000e+001
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex 7.304196e+000 2.406643e+001 3.500000e+001
vertex 1.130420e+001 2.056643e+001 3.500000e+001
vertex 1.130420e+001 2.406643e+001 3.500000e+001
endloop
endfacet
facet normal -1.000000e+000 -0.000000e+000 -0.000000e+000
outer loop
vertex -1.369580e+001 7.406643e+001 2.150000e+001
vertex -1.369580e+001 7.406643e+001 0.000000e+000
vertex -1.369580e+001 2.406643e+001 2.150000e+001
endloop
endfacet
facet normal -1.000000e+000 -0.000000e+000 -0.000000e+000
outer loop
vertex -1.369580e+001 2.406643e+001 2.150000e+001
vertex -1.369580e+001 7.406643e+001 0.000000e+000
vertex -1.369580e+001 -9.335665e-001 0.000000e+000
endloop
endfacet
facet normal -1.000000e+000 -0.000000e+000 0.000000e+000
outer loop
vertex -1.369580e+001 2.056643e+001 3.500000e+001
vertex -1.369580e+001 -9.335665e-001 0.000000e+000
vertex -1.369580e+001 -9.335665e-001 1.250000e+002
endloop
endfacet
facet normal -1.000000e+000 -0.000000e+000 -0.000000e+000
outer loop
vertex -1.369580e+001 2.056643e+001 1.250000e+002
vertex -1.369580e+001 2.056643e+001 3.500000e+001
vertex -1.369580e+001 -9.335665e-001 1.250000e+002
endloop
endfacet
facet normal -1.000000e+000 -0.000000e+000 0.000000e+000
outer loop
vertex -1.369580e+001 2.406643e+001 2.150000e+001
vertex -1.369580e+001 -9.335665e-001 0.000000e+000
vertex -1.369580e+001 2.056643e+001 3.500000e+001
endloop
endfacet
facet normal -1.000000e+000 -0.000000e+000 0.000000e+000
outer loop
vertex -1.369580e+001 2.406643e+001 3.500000e+001
vertex -1.369580e+001 2.406643e+001 2.150000e+001
vertex -1.369580e+001 2.056643e+001 3.500000e+001
endloop
endfacet
facet normal -1.328049e-013 -1.538931e-013 1.000000e+000
outer loop
vertex -1.065900e+000 9.741434e+000 1.250000e+002
vertex 1.130420e+001 -9.335665e-001 1.250000e+002
vertex -1.045804e+000 9.816434e+000 1.250000e+002
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -1.065900e+000 9.741434e+000 1.250000e+002
vertex -1.120804e+000 9.686530e+000 1.250000e+002
vertex 1.130420e+001 -9.335665e-001 1.250000e+002
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex 1.130420e+001 -9.335665e-001 1.250000e+002
vertex -1.120804e+000 9.686530e+000 1.250000e+002
vertex -1.195804e+000 9.666434e+000 1.250000e+002
endloop
endfacet
facet normal 0.000000e+000 -0.000000e+000 1.000000e+000
outer loop
vertex -1.369580e+001 -9.335665e-001 1.250000e+002
vertex -1.195804e+000 9.666434e+000 1.250000e+002
vertex -1.270804e+000 9.686530e+000 1.250000e+002
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -1.325708e+000 9.741434e+000 1.250000e+002
vertex -1.369580e+001 -9.335665e-001 1.250000e+002
vertex -1.270804e+000 9.686530e+000 1.250000e+002
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex -1.325708e+000 9.741434e+000 1.250000e+002
vertex -1.345804e+000 9.816434e+000 1.250000e+002
vertex -1.369580e+001 -9.335665e-001 1.250000e+002
endloop
endfacet
facet normal 5.753382e-016 -6.609700e-016 1.000000e+000
outer loop
vertex -1.369580e+001 -9.335665e-001 1.250000e+002
vertex -1.345804e+000 9.816434e+000 1.250000e+002
vertex -1.369580e+001 2.056643e+001 1.250000e+002
endloop
endfacet
facet normal 9.330552e-016 -2.500114e-016 1.000000e+000
outer loop
vertex -1.369580e+001 2.056643e+001 1.250000e+002
vertex -1.345804e+000 9.816434e+000 1.250000e+002
vertex -1.325708e+000 9.891434e+000 1.250000e+002
endloop
endfacet
facet normal 9.141696e-016 -9.141696e-016 1.000000e+000
outer loop
vertex -6.195804e+000 2.056643e+001 1.250000e+002
vertex -1.325708e+000 9.891434e+000 1.250000e+002
vertex -1.270804e+000 9.946337e+000 1.250000e+002
endloop
endfacet
facet normal 3.189169e-016 -1.190214e-015 1.000000e+000
outer loop
vertex -1.195804e+000 9.966434e+000 1.250000e+002
vertex -6.195804e+000 2.056643e+001 1.250000e+002
vertex -1.270804e+000 9.946337e+000 1.250000e+002
endloop
endfacet
facet normal 0.000000e+000 -1.340647e-015 1.000000e+000
outer loop
vertex -1.195804e+000 9.966434e+000 1.250000e+002
vertex 3.804196e+000 2.056643e+001 1.250000e+002
vertex -6.195804e+000 2.056643e+001 1.250000e+002
endloop
endfacet
facet normal -3.189169e-016 -1.190214e-015 1.000000e+000
outer loop
vertex -1.195804e+000 9.966434e+000 1.250000e+002
vertex -1.120804e+000 9.946337e+000 1.250000e+002
vertex 3.804196e+000 2.056643e+001 1.250000e+002
endloop
endfacet
facet normal -9.141696e-016 -9.141696e-016 1.000000e+000
outer loop
vertex 3.804196e+000 2.056643e+001 1.250000e+002
vertex -1.120804e+000 9.946337e+000 1.250000e+002
vertex -1.065900e+000 9.891434e+000 1.250000e+002
endloop
endfacet
facet normal -1.337379e-013 1.536431e-013 1.000000e+000
outer loop
vertex 1.130420e+001 2.056643e+001 1.250000e+002
vertex -1.065900e+000 9.891434e+000 1.250000e+002
vertex -1.045804e+000 9.816434e+000 1.250000e+002
endloop
endfacet
facet normal 5.753382e-016 -6.609700e-016 1.000000e+000
outer loop
vertex 1.130420e+001 -9.335665e-001 1.250000e+002
vertex 1.130420e+001 2.056643e+001 1.250000e+002
vertex -1.045804e+000 9.816434e+000 1.250000e+002
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex 1.130420e+001 -9.335665e-001 1.250000e+002
vertex -1.195804e+000 9.666434e+000 1.250000e+002
vertex -1.369580e+001 -9.335665e-001 1.250000e+002
endloop
endfacet
facet normal 0.000000e+000 -1.331228e-015 1.000000e+000
outer loop
vertex -1.369580e+001 2.056643e+001 1.250000e+002
vertex -1.325708e+000 9.891434e+000 1.250000e+002
vertex -6.195804e+000 2.056643e+001 1.250000e+002
endloop
endfacet
facet normal 0.000000e+000 -1.331228e-015 1.000000e+000
outer loop
vertex 3.804196e+000 2.056643e+001 1.250000e+002
vertex -1.065900e+000 9.891434e+000 1.250000e+002
vertex 1.130420e+001 2.056643e+001 1.250000e+002
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex 7.304196e+000 2.406643e+001 1.250000e+002
vertex -9.695804e+000 2.406643e+001 1.250000e+002
vertex 3.804196e+000 2.056643e+001 1.250000e+002
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 1.000000e+000
outer loop
vertex 3.804196e+000 2.056643e+001 1.250000e+002
vertex -9.695804e+000 2.406643e+001 1.250000e+002
vertex -6.195804e+000 2.056643e+001 1.250000e+002
endloop
endfacet
facet normal 0.000000e+000 -1.000000e+000 -3.099743e-016
outer loop
vertex 1.130420e+001 -9.335665e-001 0.000000e+000
vertex 1.130420e+001 -9.335665e-001 1.250000e+002
vertex -1.369580e+001 -9.335665e-001 0.000000e+000
endloop
endfacet
facet normal -0.000000e+000 -1.000000e+000 -3.099743e-016
outer loop
vertex -1.369580e+001 -9.335665e-001 0.000000e+000
vertex 1.130420e+001 -9.335665e-001 1.250000e+002
vertex -1.369580e+001 -9.335665e-001 1.250000e+002
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 5.526444e-016
outer loop
vertex -9.695804e+000 2.406643e+001 1.250000e+002
vertex 7.304196e+000 2.406643e+001 3.500000e+001
vertex -9.695804e+000 2.406643e+001 3.500000e+001
endloop
endfacet
facet normal -0.000000e+000 1.000000e+000 5.526444e-016
outer loop
vertex -9.695804e+000 2.406643e+001 1.250000e+002
vertex 7.304196e+000 2.406643e+001 1.250000e+002
vertex 7.304196e+000 2.406643e+001 3.500000e+001
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 -4.973799e-015
outer loop
vertex -9.695804e+000 2.406643e+001 3.500000e+001
vertex 7.304196e+000 2.406643e+001 3.500000e+001
vertex 7.304196e+000 2.406643e+001 2.500000e+001
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 -4.973799e-015
outer loop
vertex -9.695804e+000 2.406643e+001 2.500000e+001
vertex -9.695804e+000 2.406643e+001 3.500000e+001
vertex 7.304196e+000 2.406643e+001 2.500000e+001
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 -4.973799e-015
outer loop
vertex -9.695804e+000 2.406643e+001 2.500000e+001
vertex -1.369580e+001 2.406643e+001 3.500000e+001
vertex -9.695804e+000 2.406643e+001 3.500000e+001
endloop
endfacet
facet normal 3.223759e-015 1.000000e+000 -3.684296e-015
outer loop
vertex -9.695804e+000 2.406643e+001 2.500000e+001
vertex -1.369580e+001 2.406643e+001 2.150000e+001
vertex -1.369580e+001 2.406643e+001 3.500000e+001
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 0.000000e+000
outer loop
vertex -9.695804e+000 2.406643e+001 2.500000e+001
vertex -6.195804e+000 2.406643e+001 2.150000e+001
vertex -1.369580e+001 2.406643e+001 2.150000e+001
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 -4.973799e-015
outer loop
vertex 7.304196e+000 2.406643e+001 3.500000e+001
vertex 1.130420e+001 2.406643e+001 3.500000e+001
vertex 7.304196e+000 2.406643e+001 2.500000e+001
endloop
endfacet
facet normal -3.223759e-015 1.000000e+000 -3.684296e-015
outer loop
vertex 7.304196e+000 2.406643e+001 2.500000e+001
vertex 1.130420e+001 2.406643e+001 3.500000e+001
vertex 1.130420e+001 2.406643e+001 2.150000e+001
endloop
endfacet
facet normal -0.000000e+000 1.000000e+000 0.000000e+000
outer loop
vertex 3.804196e+000 2.406643e+001 2.150000e+001
vertex 7.304196e+000 2.406643e+001 2.500000e+001
vertex 1.130420e+001 2.406643e+001 2.150000e+001
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 0.000000e+000
outer loop
vertex -9.695804e+000 7.406643e+001 2.500000e+001
vertex 3.804196e+000 7.406643e+001 2.150000e+001
vertex -6.195804e+000 7.406643e+001 2.150000e+001
endloop
endfacet
facet normal -0.000000e+000 1.000000e+000 0.000000e+000
outer loop
vertex -9.695804e+000 7.406643e+001 2.500000e+001
vertex 7.304196e+000 7.406643e+001 2.500000e+001
vertex 3.804196e+000 7.406643e+001 2.150000e+001
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 0.000000e+000
outer loop
vertex 1.130420e+001 7.406643e+001 2.150000e+001
vertex 1.130420e+001 7.406643e+001 0.000000e+000
vertex 3.804196e+000 7.406643e+001 2.150000e+001
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 0.000000e+000
outer loop
vertex 3.804196e+000 7.406643e+001 2.150000e+001
vertex 1.130420e+001 7.406643e+001 0.000000e+000
vertex -1.369580e+001 7.406643e+001 0.000000e+000
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 -0.000000e+000
outer loop
vertex -6.195804e+000 7.406643e+001 2.150000e+001
vertex -1.369580e+001 7.406643e+001 0.000000e+000
vertex -1.369580e+001 7.406643e+001 2.150000e+001
endloop
endfacet
facet normal 0.000000e+000 1.000000e+000 0.000000e+000
outer loop
vertex -6.195804e+000 7.406643e+001 2.150000e+001
vertex 3.804196e+000 7.406643e+001 2.150000e+001
vertex -1.369580e+001 7.406643e+001 0.000000e+000
endloop
endfacet
facet normal 0.000000e+000 0.000000e+000 -1.000000e+000
outer loop
vertex 1.130420e+001 -9.335665e-001 0.000000e+000
vertex -1.369580e+001 -9.335665e-001 0.000000e+000
vertex 1.130420e+001 7.406643e+001 0.000000e+000
endloop
endfacet
facet normal -0.000000e+000 0.000000e+000 -1.000000e+000
outer loop
vertex 1.130420e+001 7.406643e+001 0.000000e+000
vertex -1.369580e+001 -9.335665e-001 0.000000e+000
vertex -1.369580e+001 7.406643e+001 0.000000e+000
endloop
endfacet
endsolid

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More