逝去丶年华 发表于 7 天前

【经验分享】NX 后处理防错模块:转速/刀号都好查,最阴的是“G54 同名但 MCS 原点不

最近现场连吃几次亏:

[*]工序忘给转速,S=0 直接下刀
[*]两把不同刀,用了同一个 T 号
[*]A序 B序都挂 G54,但 MCS 原点根本不是同一个位置,机床不报错,件直接废
后处理不是“能把刀轨转成 G 代码”就行,
更重要的是:别把错程序“顺利”生成出来。
于是我写了套 Start of Operation 的 TCL 防错模块,特点:

[*]有总开关:ASK 弹窗询问 / LOG 批量静默写日志 / OFF 关闭
[*]不靠猜变量,全部 info exists 兜底,避免后处理崩
[*]坐标系不只比 G54/G55 号码,而是比:

[*]MCS 原点 XYZ
[*]旋转矩阵
[*]MCS 名称(原点读不到时兜底)
[*]刀号、转速、Z 偏置、LOCAL 坐标系、余量都做工序级体检
[*]批量出程序时,警告写成 NC 注释 (### WARNING ...),事后检索即可
不是多牛的东西,但现场比“花哨循环输出”管用。
先发核心思路:
很多人后处理里只比 mom_fixture_offset_value
但 G54 只是“偏置号”,真正加工位置是 MCS 原点。
两个工序都写 G54,MCS 一个在 X0Y0Z0,一个在 X-150Y20Z0,
机床端 G54 只有一组设定值 → 第二道工序直接偏。
所以我用数组存每个 G 代码号的“指纹”:
原点 XYZ / 旋转矩阵 / MCS 名 / 首用工序名
再次遇到同号就比对,差 0.01 以上直接 MOM_abort。
MCS 相关变量不同 NX 版本/挂载位置能读到的不一样,
我实测过 mom_msys_origin / mom_mcsname_attach_opr / mom_oper_geom 这几种思路。

1. 挂在哪里

内容
挂载事件

防错总模块
Start of Operation

重置跨工序变量
Start of Program

日志汇总
End of Program

想读 MCS 原点更稳
也可放 Start of Path 试


2. 总开关(Program Start 里加)

tcl

set ::CHECK_MODE "ASK"   ;# ASK=弹窗LOG=写日志OFF=关set ::last_fixture ""set ::CHK_WARN_COUNT 0catch { unset ::fixt_fp }
批量出程序时把第一行改成:

tcl

set ::CHECK_MODE "LOG"
3. 防了哪些事
[*]主轴转速 S=0
[*]刀号不在 1~999
[*]刀具 Z 偏置非零
[*]坐标系号超范围
[*]程序内坐标系切换
[*]G54 同名但 MCS 原点/名称不同​
[*]LOCAL 局部坐标系
[*]点加工 / 铣削刀型注释自动输出
4. 输出效果

nc

(T01_D10R0.8 D=10. R=0.8 H=01 ce=0.30 di=0.10)(CSYS: G54 MCS=MCS_A ORG=0.0 0.0 0.0)(T02_D12   D=12. R=0.H=02 ce=0.30 di=0.10)(### WARNING 坐标系有疑 : 坐标系发生切换! 上道工序=G54 当前工序=G54 MCS=MCS_B)
说明:下面这段挂 Start of Operation​
Program Start 里按 2 楼加重置行

tcl

# ========== NX 后处理 工序级防错模块 ==========if {!} { set ::CHECK_MODE "ASK" }if {!}{ set ::FIXT_MIN 0 }if {!}{ set ::FIXT_MAX 5 }if {!} { set ::FIXT_BASE 54 }if {] == 0} {    proc PB_CHK_ALERT {level title msg} {      if {!} { set ::CHECK_MODE "ASK" }      switch -- $::CHECK_MODE {            "ASK" {                set ret                 if {$ret == 2} { MOM_abort "用户中止:$title" }            }            "LOG" {                MOM_output_literal "(### WARNING [$level] $title : $msg])"                if {!} { set ::CHK_WARN_COUNT 0 }                incr ::CHK_WARN_COUNT            }      }    }}global mom_operation_name mom_spindle_speedglobal mom_tool_number mom_tool_name mom_tool_z_offsetglobal mom_fixture_offset_value mom_kin_coordinate_system_typeglobal mom_msys_origin mom_oper_geomif {!}{ set mom_operation_name "UNKNOWN" }if {!}   { set mom_spindle_speed 0 }if {!}   { set mom_tool_number 0 }if {!}   { set mom_tool_z_offset 0 }if {!} { set mom_fixture_offset_value "" }# ① 转速if {$mom_spindle_speed == 0} {    PB_CHK_ALERT "W" "工序有疑" "忘记给主轴转速!\n工序:$mom_operation_name"}# ② 刀号if {! && $mom_tool_number>=1 && $mom_tool_number<=999}]} {    PB_CHK_ALERT "E" "刀具有疑" "刀号异常:T=$mom_tool_number"}# ③ Z偏置if {$mom_tool_z_offset != 0} {    PB_CHK_ALERT "W" "刀具有疑" "Z偏置非零:$mom_tool_z_offset"}# ④ 坐标系切换 / 同名不同位if {!} { set ::last_fixture "" }if {!} { array set ::fixt_fp {} }set cur_mcs "unknown"if {} { set cur_mcs $mom_oper_geom }set cur_org "0.0 0.0 0.0"if { && >=3} {    set cur_org "] ] ]"}if {$::last_fixture eq ""} {    set ::last_fixture $mom_fixture_offset_value}set key $mom_fixture_offset_valueif {} {    set old $::fixt_fp($key)    # 同名不同 MCS    if { ne $cur_mcs} {      PB_CHK_ALERT "W" "坐标系有疑" "G 代码号相同但 MCS 不同!\n当前:$cur_mcs\n之前:"    }    # 同名不同原点    if { ne $cur_org} {      PB_CHK_ALERT "W" "坐标系有疑" "G 代码号相同但 MCS 原点不同!\n当前:$cur_org\n之前:"    }} else {    set ::fixt_fp($key) }MOM_output_literal "(CSYS: G MCS=$cur_mcs ORG=$cur_org)"
以上内容都可以自行使用------后处理已放入附件自己下载使用不收费


逝去丶年华 发表于 7 天前

此后处理已经上机使用----目前没出过任何问题。

洢泩洧沵 发表于 7 天前

感谢分享

荣班长 发表于 7 天前

:lol感谢分享

lihuzhing 发表于 7 天前

感谢兄弟

lengxue 发表于 6 天前

谢谢分享

WXGCQ1982 发表于 6 天前

谢谢分享,,,

liupandeng1996 发表于 6 天前

博主思路很清晰,膜拜大佬

LMZ189 发表于 5 天前

荣班长 发表于 2026-9-26 20:23
感谢分享

感谢兄弟分享

CYP080 发表于 5 天前

感谢分享
页: [1] 2
查看完整版本: 【经验分享】NX 后处理防错模块:转速/刀号都好查,最阴的是“G54 同名但 MCS 原点不