|
|
最近现场连吃几次亏:
- 工序忘给转速,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 [W] 坐标系有疑 : 坐标系发生切换! 上道工序=G54 当前工序=G54 MCS=MCS_B)
说明:下面这段挂 Start of Operation
Program Start 里按 2 楼加重置行
tcl
# ========== NX 后处理 工序级防错模块 ==========if {![info exists ::CHECK_MODE]} { set ::CHECK_MODE "ASK" }if {![info exists ::FIXT_MIN]} { set ::FIXT_MIN 0 }if {![info exists ::FIXT_MAX]} { set ::FIXT_MAX 5 }if {![info exists ::FIXT_BASE]} { set ::FIXT_BASE 54 }if {[llength [info procs PB_CHK_ALERT]] == 0} { proc PB_CHK_ALERT {level title msg} { if {![info exists ::CHECK_MODE]} { set ::CHECK_MODE "ASK" } switch -- $::CHECK_MODE { "ASK" { set ret [MOM_display_message $msg $title $level "继续" "停止"] if {$ret == 2} { MOM_abort "用户中止:$title" } } "LOG" { MOM_output_literal "(### WARNING [$level] $title : [string map [list "\n" "; "] $msg])" if {![info exists ::CHK_WARN_COUNT]} { 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 {![info exists mom_operation_name]} { set mom_operation_name "UNKNOWN" }if {![info exists mom_spindle_speed]} { set mom_spindle_speed 0 }if {![info exists mom_tool_number]} { set mom_tool_number 0 }if {![info exists mom_tool_z_offset]} { set mom_tool_z_offset 0 }if {![info exists mom_fixture_offset_value]} { set mom_fixture_offset_value "" }# ① 转速if {$mom_spindle_speed == 0} { PB_CHK_ALERT "W" "工序有疑" "忘记给主轴转速!\n工序:$mom_operation_name"}# ② 刀号if {![expr {[string is integer -strict $mom_tool_number] && $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 {![info exists ::last_fixture]} { set ::last_fixture "" }if {![info exists ::fixt_fp]} { array set ::fixt_fp {} }set cur_mcs "unknown"if {[info exists mom_oper_geom]} { set cur_mcs $mom_oper_geom }set cur_org "0.0 0.0 0.0"if {[info exists mom_msys_origin] && [llength $mom_msys_origin]>=3} { set cur_org "[format %.3f [lindex $mom_msys_origin 0]] [format %.3f [lindex $mom_msys_origin 1]] [format %.3f [lindex $mom_msys_origin 2]]"}if {$::last_fixture eq ""} { set ::last_fixture $mom_fixture_offset_value}set key $mom_fixture_offset_valueif {[info exists ::fixt_fp($key)]} { set old $::fixt_fp($key) # 同名不同 MCS if {[lindex $old 0] ne $cur_mcs} { PB_CHK_ALERT "W" "坐标系有疑" "G 代码号相同但 MCS 不同!\n当前:$cur_mcs\n之前:[lindex $old 0]" } # 同名不同原点 if {[lindex $old 1] ne $cur_org} { PB_CHK_ALERT "W" "坐标系有疑" "G 代码号相同但 MCS 原点不同!\n当前:$cur_org\n之前:[lindex $old 1]" }} else { set ::fixt_fp($key) [list $cur_mcs $cur_org $mom_operation_name]}MOM_output_literal "(CSYS: G[expr {$mom_fixture_offset_value+$::FIXT_BASE}] MCS=$cur_mcs ORG=$cur_org)"
以上内容都可以自行使用------后处理已放入附件自己下载使用不收费
|
|