19 KiB
xyzbc-trt 当前运行配置文件说明
本文档记录当前运行的 LinuxCNC RTCP/TCP 五轴示例:
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
它是一个 XYZBC table rotary/tilting 五轴仿真配置,使用 AXIS 主界面、PyVCP 面板、Vismach 三维机床模型,以及 switchkins 方式在不同运动学模式之间切换。
当前对标的 run-in-place 根目录:
/home/mes123456/cnc_wams/linuxcnc
当前启动命令:
/home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment linuxcnc \
/home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
当前进程
当前目标配置运行时的关键进程如下:
/bin/bash /home/mes123456/cnc_wams/linuxcnc/scripts/linuxcnc /home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
linuxcncsvr -ini /home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
/home/mes123456/cnc_wams/linuxcnc/bin/rtapi_app load tpmod
milltask -ini /home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
halui -ini /home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
/usr/bin/python3.13 /home/mes123456/cnc_wams/linuxcnc/bin/hal_manualtoolchange
/usr/bin/python3.13 /home/mes123456/cnc_wams/linuxcnc/bin/xyzbc-trt-gui
/usr/bin/python3.13 /home/mes123456/cnc_wams/linuxcnc/bin/axis -ini /home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
当前目标配置的进程均来自 /home/mes123456/cnc_wams/linuxcnc,并使用 configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini。
当前 LinuxCNC Python API 状态检查:
file = ./demos/xyzbc_switchkins.ngc
axis_mask = 55
position = [0.0, 0.0, 0.0, 0.0, 0.0]
task_state = 1
interp_state = 1
启动入口
快捷方式:
/home/mes123456/cnc_wams/linuxcnc/linuxcnc-rtcp-5axis-shortcuts/table-rotary-tilting/xyzbc-trt.desktop
快捷方式执行命令:
/home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment linuxcnc \
/home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
rip-environment 负责设置 run-in-place 环境,包括 PATH、LD_LIBRARY_PATH、PYTHONPATH、TCLLIBPATH 等,使本地编译出来的 LinuxCNC 程序、库、Python 模块可被找到。
文件关系总览
主配置文件:
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
它引用或触发以下文件:
[DISPLAY] DISPLAY = axis
-> bin/axis
-> src/emc/usr_intf/axis/scripts/axis.py
[DISPLAY] PYVCP = ./xyzbc-trt.xml
-> configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml
[DISPLAY] OPEN_FILE = ./demos/xyzbc_switchkins.ngc
-> configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc
[HAL] HALFILE = LIB:basic_sim.tcl
-> lib/hallib/basic_sim.tcl
-> 运行后生成 configs/.../xyzbc-trt_cmds.hal
[HAL] POSTGUI_HALFILE = switchkins_postgui.hal
-> configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal
[HAL] HALCMD = loadusr -W xyzbc-trt-gui
-> bin/xyzbc-trt-gui
-> src/hal/user_comps/vismach/xyzbc-trt-gui.py
[RS274NGC] SUBROUTINE_PATH = ./remap_subs
-> remap_subs/428remap.ngc
-> remap_subs/429remap.ngc
-> remap_subs/430remap.ngc
-> remap_subs/xyzbc_switchkins_sub.ngc
-> remap_subs/centering.ngc
-> remap_subs/helix_bc.ngc
[EMCIO] TOOL_TABLE = xyzbc-trt.tbl
-> configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.tbl
[RS274NGC] PARAMETER_FILE = xyzbc.var
-> configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc.var
主 INI 文件
路径:
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
关键内容:
[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
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]
# 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
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]
# kinstype==0 is identity kins because sparm=identityfirst
# M429: identity kins
# M428: xyzbc kins / TCP mode
# M430: userk kins
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
轴和关节部分定义 XYZBC 五轴:
[AXIS_X] [AXIS_Y] [AXIS_Z]
LINEAR axes, limits in mm.
[AXIS_B] [AXIS_C]
ANGULAR axes, limits in degrees.
[JOINT_0] X linear
[JOINT_1] Y linear
[JOINT_2] Z linear
[JOINT_3] B angular, MIN_LIMIT=-100, MAX_LIMIT=50
[JOINT_4] C angular, MIN_LIMIT=-36000, MAX_LIMIT=36000
PyVCP 界面文件
路径:
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml
这个 XML 文件由 AXIS 读取 [DISPLAY]PYVCP 后加载,显示在 AXIS 窗口右侧。它提供:
- 当前运动学模式显示:
0:IDENTITY、1: XYZBC、2: USERK - 三个按钮:
IDENTITY、TCP:XYZBC、userk - 一个
vismach-clear按钮,用于清除 Vismach 轨迹显示
完整内容:
<?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>
POSTGUI HAL 文件
路径:
configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal
这个文件在 AXIS/PyVCP 界面创建完成后加载,所以它可以连接 pyvcp.* 引脚。
完整内容:
# 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
作用:
kinstype.is-*驱动 PyVCP 的multilabel,显示当前 kinematics 类型。- PyVCP 三个按钮连接到
halui.mdi-command-00/01/02。 [HALUI] MDI_COMMAND定义这三个命令分别执行M429、M428、M430。vismach-clear连接到vismach.plotclear,清除 Vismach 显示轨迹。
Vismach Python 界面文件
运行入口:
/home/mes123456/cnc_wams/linuxcnc/bin/xyzbc-trt-gui
源码路径:
src/hal/user_comps/vismach/xyzbc-trt-gui.py
该 Python 文件创建名为 xyzbc-trt-gui 的 HAL 用户组件,并建立 Vismach 三维机床模型。INI 中的以下 HALCMD 启动并连接它:
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 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
HAL 引脚
xyzbc-trt-gui.py 创建这些输入引脚:
c = hal.component("xyzbc-trt-gui")
c.newpin("table-x", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("saddle-y", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("spindle-z", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("tilt-b", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("rotate-c", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("z-offset", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("x-offset", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("tool-offset", hal.HAL_FLOAT, hal.HAL_IN)
c.ready()
模型结构
该脚本使用 vismach 的 Collection、Box、CylinderZ、HalTranslate、HalRotate 等构造机床模型:
tool: 刀具和刀尖捕获点,受tool-offset影响。spindle: 主轴和刀柄。head: 主轴头,受spindle-z影响。ctable: C 轴旋转台,受rotate-c影响。arotary: B 轴倾斜组件,受tilt-b影响。table: X 方向工作台,受table-x影响。saddle: Y 方向滑鞍,受saddle-y影响。base: 机床底座和立柱。
最终调用:
model = Collection([yslide, base])
myhud = Hud()
myhud.show("XYZBC")
main(model, tooltip, work, size=500, hud=myhud, lat=-60, lon=25)
这会打开 Vismach 窗口,显示 XYZBC 五轴仿真模型。
AXIS 主界面 Python 文件
运行入口:
/home/mes123456/cnc_wams/linuxcnc/bin/axis
对应源码:
src/emc/usr_intf/axis/scripts/axis.py
bin/axis 是构建后的可执行 Python 脚本,当前进程为:
/usr/bin/python3.13 /home/mes123456/cnc_wams/linuxcnc/bin/axis -ini /home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
这个文件很大,当前源码约 4308 行。与本配置直接相关的加载点如下。
读取 INI:
if sys.argv[1] != "-ini":
raise SystemExit("-ini must be first argument")
inifile = linuxcnc.ini(sys.argv[2])
读取 POSTGUI HAL、几何、坐标等配置:
vars.emcini.set(sys.argv[2])
jointcount = inifile.getint("KINS", "JOINTS", fallback=0)
open_directory = inifile.getstring("DISPLAY", "PROGRAM_PREFIX", fallback=open_directory)
vars.machine.set(inifile.getstring("EMC", "MACHINE", fallback="<unknown>"))
postgui_halfile = inifile.findall("HAL", "POSTGUI_HALFILE") or None
postgui_halcmds = inifile.findall("HAL", "POSTGUI_HALCMD") or None
geometry = inifile.getstring("DISPLAY", "GEOMETRY", fallback="XYZABCUVW")
读取 PyVCP:
vcp = inifile.find("DISPLAY", "PYVCP")
创建 PyVCP 面板:
if vcp:
import vcpparse
f = Tkinter.Frame(root_window)
if inifile.find("DISPLAY", "PYVCP_POSITION") == "BOTTOM":
f.grid(row=4, column=0, columnspan=6, sticky="nw", padx=4, pady=4)
else:
f.grid(row=0, column=4, rowspan=6, sticky="nw", padx=4, pady=4)
vcpparse.filename = vcp
vcpcomp = hal.component("pyvcp")
vcpparse.create_vcp(f, vcpcomp)
vcpcomp.ready()
vcp_frame = f
这些代码解释了为什么 [DISPLAY]PYVCP = ./xyzbc-trt.xml 会在 AXIS 中生成右侧的 SWITCHKINS 面板。
基础仿真 HAL/Tcl 文件
路径:
lib/hallib/basic_sim.tcl
INI 中:
[HAL]
HALFILE = LIB:basic_sim.tcl
作用:
- 加载通用仿真组件。
- 根据
[TRAJ]COORDINATES和[KINS]JOINTS创建基础运动仿真。 - 创建
ddt、模拟回零、手动换刀和模拟主轴。 - 运行后生成等效 HAL 文件:
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt_cmds.hal
关键逻辑:
source [file join $::env(HALLIB_DIR) sim_lib.tcl]
set axes [get_traj_coordinates]
set number_of_joints $::KINS(JOINTS)
core_sim $axes \
$number_of_joints \
$::EMCMOT(SERVO_PERIOD) \
$base_period \
$::EMCMOT(EMCMOT)
make_ddts $number_of_joints
simulated_home $number_of_joints
use_hal_manualtoolchange
sim_spindle
save_hal_cmds $savefilename $save_options
switchkins / RTCP 切换逻辑
本配置使用 motion.switchkins-type 选择不同运动学模式。
关键 HAL 连接:
net :kinstype-select <= motion.analog-out-03 => motion.switchkins-type
关键 MDI 命令:
[HALUI]
MDI_COMMAND = M429
MDI_COMMAND = M428
MDI_COMMAND = M430
三个 remap 子程序:
remap_subs/429remap.ngc -> kinstype = 0 -> IDENTITY
remap_subs/428remap.ngc -> kinstype = 1 -> XYZBC / TCP
remap_subs/430remap.ngc -> kinstype = 2 -> USERK
M428 的核心逻辑:
;M428 by remap: kinstype==1 (xyzac,xyzbc)
o<428remap>sub
#<kinstype> = 1
#<SWITCHKINS_PIN> = 3
M68 E#<SWITCHKINS_PIN> Q#<kinstype>
M66 E0 L0
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
M429 类似,但设置 kinstype = 0;M430 设置 kinstype = 2。
演示 G-code
启动时自动打开:
configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc
内容:
; zmax zmin r frate n a b c dist
o<xyzbc_switchkins_sub> call [10] [5] [10][1000][3][0][20][45][20]
m2
它调用:
remap_subs/xyzbc_switchkins_sub.ngc
该子程序会在四个象限中:
- 先用
M429切到 Identity kinematics。 - 设置机器坐标和 G54。
- 调用
helix_bc,用 B/C 角度演示 TCP/五轴联动轨迹。 - 最后回到 Identity kinematics。
工具表
路径:
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.tbl
内容:
T1 P1 D1
T2 P2 Z10 D8
工具表会影响 motion.tooloffset.z,并通过 HAL 连接到:
xyzbc-trt-kins.tool-offset
xyzbc-trt-gui.tool-offset
所以工具长度会同时影响运动学计算和 Vismach 显示。
运动学组件
运行时加载:
rtlib/xyzbc-trt-kins.so
源码:
src/emc/kinematics/xyzbc-trt-kins.c
相关说明文件:
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.txt
说明文件中的核心语义:
M429: Identity Kinematics
M428: XYZBC (TCP)
M430: userk Kinematics
net :kinstype-select <= motion.analog-out-03
net :kinstype-select => motion.switchkins-type
xyzbc-trt-kins 提供这些和配置相关的 HAL 输入:
xyzbc-trt-kins.x-offset
xyzbc-trt-kins.z-offset
xyzbc-trt-kins.x-rot-point
xyzbc-trt-kins.y-rot-point
xyzbc-trt-kins.z-rot-point
xyzbc-trt-kins.conventional-directions
xyzbc-trt-kins.tool-offset
加载顺序
简化后的启动流程:
.desktop执行rip-environment linuxcnc xyzbc-trt.ini。scripts/linuxcnc读取 INI,启动linuxcncsvr、rtapi_app、milltask、halui。[HAL] HALFILE = LIB:basic_sim.tcl加载基础仿真 HAL。[KINS] KINEMATICS = xyzbc-trt-kins sparm=identityfirst加载运动学组件。[HAL] HALCMD = loadusr -W xyzbc-trt-gui启动 Vismach Python 模型。[DISPLAY] DISPLAY = axis启动 AXIS。- AXIS 读取
[DISPLAY] PYVCP = ./xyzbc-trt.xml,创建 PyVCP 面板。 - AXIS 界面创建后加载
POSTGUI_HALFILE = switchkins_postgui.hal,连接 PyVCP 引脚和 HALUI MDI 命令。 [DISPLAY] OPEN_FILE = ./demos/xyzbc_switchkins.ngc自动载入演示 G-code。
重要文件清单
主配置:
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
AXIS 主界面:
bin/axis
src/emc/usr_intf/axis/scripts/axis.py
PyVCP 面板:
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml
POSTGUI HAL:
configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal
Vismach Python 机床模型:
bin/xyzbc-trt-gui
src/hal/user_comps/vismach/xyzbc-trt-gui.py
基础仿真 HAL/Tcl:
lib/hallib/basic_sim.tcl
运行后生成的等效 HAL:
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt_cmds.hal
运动学组件:
rtlib/xyzbc-trt-kins.so
src/emc/kinematics/xyzbc-trt-kins.c
remap 子程序:
configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc
configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc
configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc
configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzbc_switchkins_sub.ngc
configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/centering.ngc
configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_bc.ngc
演示程序:
configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc
configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc
工具表和参数:
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.tbl
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc.var