0小刚/tp 发表于 4 天前

UG新建坐标系默认是局部,忘了改成主要就会出现严重错误。


>前提:后处理【使用局部命名、使用局部值】=打开;新建MCS默认用途=局部(Local)

### 1)特殊输出 = 无(None)
> 你理解:不影响程序正确性
✅三轴:没问题。
⚠️**五轴联动有大坑**
如果这个Local MCS直接丢在几何视图顶层(没有父Main MCS),上层基准落到ACS。
虽然不会报旋转报错、G代码正常输出;但是刀轴矢量变换基准是ACS,**五轴姿态会悄悄偏移,软件不报警,上机才发现错**。
👉只有Local挂在真正Main MCS下面,特殊输出=无,程序才是完全正确。

>小结:不是绝对“不影响正确性”,**三轴安全,五轴裸奔顶层属于静默隐患**。

### 2)特殊输出 = CSYS Rotation(CSYS旋转)
>你理解:没到后处理,UG内部预处理就报错,阻止错误程序输出
✅完全正确。
只要开启这个模式,NX CL预处理阶段就要做4/5轴逆解算;
- 顶层没有Main MCS→ACS充当主MCS →直接报`unable to determine valid rotary positions`;
- **Tcl后处理根本不运行,不会吐出G代码**,属于NX内核保护。
>注意:这个保护只针对CSYS Rotation模式,其它模式不会触发这个报错。

### 3)特殊输出 = 使用主MCS(Use Main MCS)
>你理解:可能出错,找不到主要就用系统默认ACS
✅理解正确。
含义:丢弃当前局部MCS,强制向上找Main MCS作为计算基准。
- 如果树上有真实Main MCS:一切正常;
- 如果树上**没有Main MCS**,向上查找失败,回退到ACS自动坐标系作为基准。
👉现象:程序能输出,**无报警,但五轴联动变换基准变成ACS,姿态偏移,静默错误**。

### 4)特殊输出 = Fixture Offset(夹具偏置,也就是你说的“使用继承的MCS”)
>你理解:输出程序也不会错
⚠️要加前提条件
Fixture Offset输出G54/G55工件偏移。
1. Local MCS挂在Main MCS子节点:✅正确,输出正确偏置,程序没问题;
2. Local MCS直接放在顶层,没有Main MCS:依然可以输出G54。
>三轴没问题;**五轴RTCP场景部分机床会有风险**,因为NX内部变换基准还是ACS。

---

# 整理成精炼版本(方便记忆)
后处理【使用局部命名+使用局部值】开启,MCS用途=局部:
1. **特殊输出=无**
三轴正常;**五轴如果Local直接放顶层,静默姿态偏移,无报错**。
2. **特殊输出=CSYS旋转**
NX预处理直接报错终止,不输出G代码,强拦截。
3. **特殊输出=使用主MCS**
向上检索Main MCS;找不到就回退ACS,程序正常输出,**五轴存在静默偏移风险**。
4. **特殊输出=Fixture Offset夹具偏置**
输出G54/G55;Local挂Main下面才100%安全;裸奔顶层三轴能用,五轴RTCP有隐患。

## 最重要一句话总结
> CSYS Rotation是**显性报错**,直接拦住坏程序;
> 其余三种模式(无 / 使用主MCS / Fixture Offset)**不会报旋转错误**,允许输出NC,但是Local裸奔顶层时,五轴会出现**无报警的隐形姿态错误**。
> 后处理开关只能控制坐标怎么输出,**修复不了MCS层级缺失Main MCS这个底层问题**。

0小刚/tp 发表于 3 天前

本帖最后由 0小刚/tp 于 2026-8-15 14:21 编辑

pmjxc 发表于 2026-8-15 12:07
我让他读取的是这框起来的这里,0是局部,1是主坐标系,只是简单的防错,没有去深度研究 ...


感谢    搞定了   

0小刚/tp 发表于 4 天前

# 核心结论
**后处理Tcl拿不到MCS的Purpose(主要/局部)属性,也无法直接检测“有没有Main MCS、是不是Local直接放在顶层”**。
> 缺失Main MCS、ACS充当主机床MCS这件事,发生在**CL预处理阶段**,很多场景预处理不报错,直接进入后处理,属于**静默隐患**;MOM运行时没有开放这个状态给Tcl读取。

> 分4种手段,优先级从高到低:**CAM模板(最有效) > NXOpen脚本检查(编程前拦截) > 后处理仅能做有限预警 > 工艺规范**。
> ❗:**单靠修改后处理,不能彻底杜绝这个错误**。

## 方案1:CAM模板从根源锁死(企业最推荐,零成本)
新版本NX插入MCS默认用途=局部,**软件没有开关可以把新建MCS默认用途改成Main**,但是模板可以规避人为忘记改的问题。

1. 修改你的cam模板(`.prt`模板文件)
    - 加工几何视图,**保留系统自带MCS_MILL,把它用途改成【主要(Main)】**,放到GEOMETRY根节点,**不要删除它**。
    - 不要新建MCS当顶层主坐标系。
    - 需要工件坐标系:**复制这个Main MCS,粘贴出来,复制出来自动变成Local局部**,拖拽到MCS_MAIN下面做子节点。
> 工作流:新建零件调用模板 → 顶层已经有一个Main MCS;所有工件MCS全部复制生成,天然是子局部MCS,不会有人把Local直接扔顶层。

> 禁止:编程人员自己点【插入MCS几何体】去做顶层坐标系,插入出来默认是Local,很容易犯错。

## 方案2:NXOpen(NX二次开发,编程前检查,最理想拦截)
用NXOpen C#/Journal脚本,打开零件,扫描几何视图:
1. 检查整个setup中是否存在**Purpose=Main的MCS**;
2. 检查是否有Purpose=Local的MCS直接挂在GEOMETRY根节点;
3. 如果违规直接弹窗警告,**后处理之前就拦住,不让出刀轨/不让后处理**。

> 缺点:需要二次开发环境,Post‑builder的Tcl做不到这件事,Tcl运行时已经是刀轨输出阶段,拿不到Purpose属性。

## 方案3:后处理Tcl能做什么(只能做**有限预警,不能拦截静默偏移**)
### ① 可以检测 `mom_cs_rotation_active ==1`
只要开启CSYS Rotation模式,如果是钻孔工序,弹窗提示,这个是有效的。
> 但是!**Local裸奔顶层、特殊输出=无 / Fixture Offset,五轴静默偏移,Tcl没有任何变量可以识别这个状态**,只能眼睁睁输出NC。

示例代码(放到`MOM_start_of_program`程序开头)
```tcl
proc MOM_start_of_program {} {
    global mom_cs_rotation_active

    if {$mom_cs_rotation_active == 1} {
      MOM_display_message "⚠️警告:当前MCS开启CSYS Rotation局部旋转模式,钻孔工序禁止使用!确认顶层有Main MCS" 1
    }
}
```
> 局限:
> - 只针对CSYS‑Rotation;
> - Local裸奔顶层,但特殊输出不是CSYS‑Rotation → 不会触发任何报警,五轴姿态偷偷偏移。

### ②后处理没有任何变量可以判断:
1. 是否存在有效的Main MCS;
2. 是否Local MCS直接在根节点;
3. 当前是否ACS充当主机床MCS。

> 这些是NX CAM内核对象属性,**不暴露给MOM后处理接口**。

## 方案4:NX自带MCS验证工具(编程侧自检)
菜单:`工具 → 加工验证 → MCS验证(MCS Verify)`
它会检查MCS层级、Purpose、CSYS‑Rotation冲突,会标红异常MCS。
> 缺点:需要编程人手动点,不能自动弹窗。

# 梳理你关心的两种风险
1. **显性报错:`unable to determine valid rotary positions`**
触发条件:MCS特殊输出=CSYS Rotation,顶层没有Main MCS。
> 这个是NX预处理直接终止,**Tcl脚本根本跑不到,后处理无能为力**。

2. **隐形风险:Local直接放顶层,特殊输出=无 / Fixture Offset**
> 预处理不报任何错,后处理完整输出G代码;三轴看着没问题,**五轴联动刀轴变换基准落到ACS,姿态偏移,重大安全隐患**。
> ✘后处理Tcl完全识别不出这个状态,无法告警。

# 现实工作落地最佳实践(精简)
1. **模板强制顶层预置Purpose=Main的MCS_MILL,禁止新建MCS当顶层**,工件坐标系全部复制Main得到Local子MCS。(第一防线,最重要)
2. 规定:**钻孔工序MCS特殊输出绝对不能选CSYS Rotation**。
3. 后处理增加`mom_cs_rotation_active`的弹窗预警,针对CSYS‑Rotation场景做提醒。
4. 五轴上机前,手动运行MCS验证工具快速扫一遍。

# 一句话总结
> 后处理**无法检测“忘记设置Main MCS,Local直接放顶层”这个隐形错误**。
> 显性CSYS‑Rotation报错是NX内核拦截;而最危险的是**不报错的静默偏移,后处理看不到,只能靠模板+编程规范去堵**。

张思颖 发表于 4 天前

看的一脸懵逼啊;P;P;P;P

白小灰 发表于 4 天前

感谢分享,有的设置需要后处理支持才行。

0小刚/tp 发表于 4 天前

本帖最后由 0小刚/tp 于 2026-8-14 17:29 编辑

张思颖 发表于 2026-8-14 17:25
看的一脸懵逼啊
那是你没吃过新建默认是局部的亏;P    自己新建的坐标系默认用途是局部    一个工件多个方位去编程   局部会出问题   正常后处理就是坐标偏移了。

0小刚/tp 发表于 4 天前

白小灰 发表于 2026-8-14 17:27
感谢分享,有的设置需要后处理支持才行。

后处理不管支不支持局部坐标系,只要新建了坐标系默认都是局部,手动改成主要就不会错,忘了改就出问题,体现在一个工件正反两个面,反面新建坐标系是默认局部,我碰到过反面局部不输出G43的,还有坐标点不对的。今天研究一天想在后处理里面加个判断坐标系如果是局部就报错的功能,研究半天发现UG坐标系是主要还是局部这个变量根本不会传送给后处理。

Bridge_︻︻︻︻ 发表于 3 天前

本帖最后由 Bridge_︻︻︻︻ 于 2026-8-15 10:17 编辑

0小刚/tp 发表于 2026-8-14 17:13
# 核心结论
**后处理Tcl拿不到MCS的Purpose(主要/局部)属性,也无法直接检测“有没有Main MCS、是不是Local ...
这个文章挺好的,但是楼主不应该用英文,比如CSYS‑Rotation如果你用 “特殊输出”--坐标系旋转,人家一下就看明白了。必要时可以配一个图片呀?还有你说的这个问题能不能通过VT或者CIMCO Edit 查出来,如果能轻松查出来也问题不大呀,最怕是偏移1MM以内,或者法向偏移1度以内等问题。

pmjxc 发表于 3 天前

本帖最后由 pmjxc 于 2026-8-15 10:20 编辑

0小刚/tp 发表于 2026-8-14 18:17
后处理不管支不支持局部坐标系,只要新建了坐标系默认都是局部,手动改成主要就不会错,忘了改就出问题, ...
后处理加个判断就可以了,我平时有时用,有时不用,所以我就直接没让他报警,直接让他显示在程序开头日志里面,有时程序太多显示的太麻烦,所以就直接关闭了

0小刚/tp 发表于 3 天前

本帖最后由 0小刚/tp 于 2026-8-15 11:54 编辑

pmjxc 发表于 2026-8-15 10:13
后处理加个判断就可以了,我平时有时用,有时不用,所以我就直接没让他报警,直接让他显示在程序开头日志 ...

重点先说破误区

标准MOM、原生TCL并没有直接变量读取MCS的【Purpose=主要/局部】属性
军哥这类商用后处理弹窗提示:“工序使用的局部坐标系,非主坐标系!”并不是直接读取Purpose字段,它用的是一套间接判定逻辑,并不是100%精准,是经验式告警,不是NX内核原生判断。

它的判定原理(两种实现路线)

路线A(绝大多数市面四轴/五轴定制后处理采用,军哥属于这类)

逻辑:遍历所有工序对应的MCS,查找整个文件有没有一个真正有效的Main MCS;如果某工序绑定的MCS不是那个唯一的Main MCS,就判定它为“局部坐标系”弹出警告。

执行流程:

1. 后处理启动,遍历全部工序,收集所有被工序调用过的MCS;
2. 在所有MCS里,尝试寻找主机床基准MCS( mom_main_mcs 这套基准变换矩阵);
3. 如果当前工序所依附的MCS ≠ 后处理识别出来的那个Main基准MCS
→直接弹窗提示:【该工序使用局部坐标系,非主坐标系!】

⚠️重大缺陷:

1. 如果你一个Main MCS都没有,全部MCS都是Local并且直接放在顶层;
NX内部自动拿ACS充当主基准,此时后处理会把第一个遇到的MCS强行当成“伪Main”,其余全部判定为局部,大量误报。
2. 它读不到NX里那个“用途:主要 / 局部”的勾选框;它只看:这个MCS是不是NX变换所使用的顶层基准MCS,不是读取MCS对象本身Purpose属性。

通俗:它判断的是「这个坐标系有没有充当整个文件的顶层变换基准」,不是读取你双击MCS对话框里面那个【用途】单选按钮。

路线B(更加精准,但需要编程者手动给MCS增加对象属性)

在NX编程界面,选中MCS对象 →【对象属性】,新建一个自定义文本标记,例如

- Main MCS:自定义属性  MCS_TYPE = MAIN 
- Local MCS:自定义属性  MCS_TYPE = LOCAL 

后处理通过  mom_attr_GEOM_XXXX  读取这个自定义属性做判断。
✅优点:精准;❌缺点:必须编程人每一个MCS手动加属性标记,漏加就失效,车间很难落地,所以商用后处理几乎不用这个方案。

非常重要:这个告警≠致命错误,只是安全提醒

看截图弹窗文字:

程序处理共发现2项警告,请仔细核对:工序XXX使用的【局部坐标系】,非【主坐标系】!

👉它不会停止后处理,你点继续就可以输出NC;
和NX预处理阶段那个  unable to determine valid rotary positions  硬报错完全两码事:

- NX预处理报错:CL引擎直接终止,不出程序,强拦截;
- 这个后处理弹窗:TCL脚本自定义的友好提醒,可以选择继续。

现实的几个坑点,你一定要知道

1. ❗这个后处理告警不能分辨“Local MCS是正确挂在Main下面”还是“Local裸奔在根节点”
一个正常结构:顶层Main‑MCS,工件MCS作为子节点Local;
此时工件MCS≠顶层基准MCS →后处理一样弹窗警告。
→正常合规结构也会报这个提示!只是提醒你当前工序没有直接使用顶层主机床MCS,不等于你做错了坐标系层级。
很多人被这个弹窗搞得很焦虑,以为自己程序一定错了。
2. 它无法杜绝我们最担心的那个隐患:Local MCS直接放在根节点,ACS充当主基准,五轴静默偏移。
当所有MCS全部裸奔顶层、没有任何Purpose=Main的坐标系;NX用ACS做基准,后处理随便抓一个MCS当做伪Main,其余全部判定局部,大量误报警告。

总结对照表

项目 NX原生内核 军哥这类后处理弹窗
能否直接读取MCS对话框【用途:主要/局部】 ❌MOM接口不开放 ❌不能直接读取
判断依据 MCS对象Purpose属性、层级父子树 是否等于NX当前变换所用顶层基准MCS(mom_main_mcs)
是否会误报 不会(内核原生逻辑) ✅会误报,合规子Local也会报警
能否阻止程序输出 CSYS‑Rotation场景可以硬终止 仅弹窗提醒,可以点继续输出程序

给你的建议

1. 不要指望靠这个后处理告警来完全判断坐标系是否搭建错误;它只是一个辅助提醒。
2. 最稳妥方案依然是CAM模板预置Purpose=Main的顶层MCS,所有工件MCS复制出来作为子Local。
3. 如果你想自己在后处理做同款弹窗:只能按照路线A,比对  mom_main_mcs  的基准矩阵,间接判断,要接受存在误报的情况。

pmjxc 发表于 3 天前

0小刚/tp 发表于 2026-8-15 11:18
重点先说破误区

标准MOM、原生TCL并没有直接变量读取MCS的【Purpose=主要/局部】属性


我让他读取的是这框起来的这里,0是局部,1是主坐标系,只是简单的防错,没有去深度研究
页: [1] 2
查看完整版本: UG新建坐标系默认是局部,忘了改成主要就会出现严重错误。