# 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 根目录: ```text /home/mes123456/cnc_wams/linuxcnc ``` 当前启动命令: ```bash /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 ``` ## 当前进程 当前目标配置运行时的关键进程如下: ```text /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 状态检查: ```text 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 ``` ## 启动入口 快捷方式: ```text /home/mes123456/cnc_wams/linuxcnc/linuxcnc-rtcp-5axis-shortcuts/table-rotary-tilting/xyzbc-trt.desktop ``` 快捷方式执行命令: ```bash /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 模块可被找到。 ## 文件关系总览 主配置文件: ```text configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini ``` 它引用或触发以下文件: ```text [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 文件 路径: ```text configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini ``` 关键内容: ```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` 五轴: ```ini [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 界面文件 路径: ```text 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 "ridge" 5 ["0:IDENTITY", "1: XYZBC ", "2: USERK "] ("Helvetica",16) "black" "yellow" "ridge" 5 ``` ## POSTGUI HAL 文件 路径: ```text configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal ``` 这个文件在 AXIS/PyVCP 界面创建完成后加载,所以它可以连接 `pyvcp.*` 引脚。 完整内容: ```hal # 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 界面文件 运行入口: ```text /home/mes123456/cnc_wams/linuxcnc/bin/xyzbc-trt-gui ``` 源码路径: ```text src/hal/user_comps/vismach/xyzbc-trt-gui.py ``` 该 Python 文件创建名为 `xyzbc-trt-gui` 的 HAL 用户组件,并建立 Vismach 三维机床模型。INI 中的以下 HALCMD 启动并连接它: ```hal 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` 创建这些输入引脚: ```python 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`: 机床底座和立柱。 最终调用: ```python 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 文件 运行入口: ```text /home/mes123456/cnc_wams/linuxcnc/bin/axis ``` 对应源码: ```text src/emc/usr_intf/axis/scripts/axis.py ``` `bin/axis` 是构建后的可执行 Python 脚本,当前进程为: ```text /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: ```python if sys.argv[1] != "-ini": raise SystemExit("-ini must be first argument") inifile = linuxcnc.ini(sys.argv[2]) ``` 读取 POSTGUI HAL、几何、坐标等配置: ```python 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="")) 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: ```python vcp = inifile.find("DISPLAY", "PYVCP") ``` 创建 PyVCP 面板: ```python 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 文件 路径: ```text lib/hallib/basic_sim.tcl ``` INI 中: ```ini [HAL] HALFILE = LIB:basic_sim.tcl ``` 作用: - 加载通用仿真组件。 - 根据 `[TRAJ]COORDINATES` 和 `[KINS]JOINTS` 创建基础运动仿真。 - 创建 `ddt`、模拟回零、手动换刀和模拟主轴。 - 运行后生成等效 HAL 文件: ```text configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt_cmds.hal ``` 关键逻辑: ```tcl 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 连接: ```hal net :kinstype-select <= motion.analog-out-03 => motion.switchkins-type ``` 关键 MDI 命令: ```ini [HALUI] MDI_COMMAND = M429 MDI_COMMAND = M428 MDI_COMMAND = M430 ``` 三个 remap 子程序: ```text remap_subs/429remap.ngc -> kinstype = 0 -> IDENTITY remap_subs/428remap.ngc -> kinstype = 1 -> XYZBC / TCP remap_subs/430remap.ngc -> kinstype = 2 -> USERK ``` `M428` 的核心逻辑: ```ngc ;M428 by remap: kinstype==1 (xyzac,xyzbc) o<428remap>sub # = 1 # = 3 M68 E# Q# M66 E0 L0 o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #]] (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 启动时自动打开: ```text configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc ``` 内容: ```ngc ; zmax zmin r frate n a b c dist o call [10] [5] [10][1000][3][0][20][45][20] m2 ``` 它调用: ```text remap_subs/xyzbc_switchkins_sub.ngc ``` 该子程序会在四个象限中: - 先用 `M429` 切到 Identity kinematics。 - 设置机器坐标和 G54。 - 调用 `helix_bc`,用 B/C 角度演示 TCP/五轴联动轨迹。 - 最后回到 Identity kinematics。 ## 工具表 路径: ```text configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.tbl ``` 内容: ```text T1 P1 D1 T2 P2 Z10 D8 ``` 工具表会影响 `motion.tooloffset.z`,并通过 HAL 连接到: ```hal xyzbc-trt-kins.tool-offset xyzbc-trt-gui.tool-offset ``` 所以工具长度会同时影响运动学计算和 Vismach 显示。 ## 运动学组件 运行时加载: ```text rtlib/xyzbc-trt-kins.so ``` 源码: ```text src/emc/kinematics/xyzbc-trt-kins.c ``` 相关说明文件: ```text configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.txt ``` 说明文件中的核心语义: ```text 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 输入: ```text 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 ``` ## 加载顺序 简化后的启动流程: 1. `.desktop` 执行 `rip-environment linuxcnc xyzbc-trt.ini`。 2. `scripts/linuxcnc` 读取 INI,启动 `linuxcncsvr`、`rtapi_app`、`milltask`、`halui`。 3. `[HAL] HALFILE = LIB:basic_sim.tcl` 加载基础仿真 HAL。 4. `[KINS] KINEMATICS = xyzbc-trt-kins sparm=identityfirst` 加载运动学组件。 5. `[HAL] HALCMD = loadusr -W xyzbc-trt-gui` 启动 Vismach Python 模型。 6. `[DISPLAY] DISPLAY = axis` 启动 AXIS。 7. AXIS 读取 `[DISPLAY] PYVCP = ./xyzbc-trt.xml`,创建 PyVCP 面板。 8. AXIS 界面创建后加载 `POSTGUI_HALFILE = switchkins_postgui.hal`,连接 PyVCP 引脚和 HALUI MDI 命令。 9. `[DISPLAY] OPEN_FILE = ./demos/xyzbc_switchkins.ngc` 自动载入演示 G-code。 ## 重要文件清单 ```text 主配置: 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 ```