做硬件的人十有八九都遇到过这种诡异现象:原理图里明明把R12改成了R47,导出网表、更新PCB之后,板子上印的还是R12;或者Allegro导入网表时直接报found in pcb footprint for component instance,死活关联不上。折腾半天,最后发现根子都在OrCAD Capture的Instance和Occurrence属性上——同一个元件的位号居然有两套,一套是逻辑实例的,一套是物理出现的,你只改了其中一套,另一套还在背地里捣乱。
这篇文章就说清楚一件事:怎么一次性把Instance和Occurrence的元件位号彻底统一,并且从设计习惯上杜绝它俩再次分家。全程干货,没有虚的,照着操作就行。
1. 先搞明白Instance和Occurrence到底是什么
1.1 同一个元件为什么会有两套属性
OrCAD Capture从很早的版本开始,就给每个放置到原理图上的元件同时维护了两层属性数据。一层叫Instance,直译过来是“实例”;另一层叫Occurrence,直译是“出现”。这俩词听着绕,用大白话解释就清楚了:
- Instance层的属性,描述的是这个元件“本身是谁”。比如这是一个10kΩ电阻,它的本质标识是R?,在原理图库里它的唯一身份就是R12。
- Occurrence层的属性,描述的是这个元件“在图纸上出现时的状态”。比如同一个R12,在原理图第3页出现过一次,在多通道设计的第2通道里又出现一次,每次出现就对应一个Occurrence。
在绝大多数简单项目里,这两层属性是一样的:R12的Instance是R12,Occurrence也是R12。这也是为什么很多工程师用了几年OrCAD都没注意过这个机制。但一旦发生复制粘贴、模块复用、重新标注、多通道设计,或者从旧版本迁移工程,这两层属性就可能悄悄分道扬镳。
我习惯用“户口本名字”和“小区里大家叫你的名字”来类比。户口本上是张伟,小区里大伙儿都喊你小王。平时没事儿,一旦办证、收快递、对账,麻烦就来了。Instance和Occurrence就是同一个元件在OrCAD里的“户口本名”和“小区叫法”。
1.2 位号不一致是怎么产生的
很多人以为位号不一致是大问题才会出现,实际上日常操作里踩一下就有了。我整理了几个最容易触发分家的场景:
- 复制粘贴原理图页面或局部电路后,直接手动改了几个位号,另一层属性没跟着变。
- 用Annotate做重新标注时,只勾了Instance的更新,没管Occurrence。
- 从OrCAD 16.x老工程迁到17.x新版本,旧工程里本身就有一层属性是脏的。
- 多通道设计里,同一个子图被复用多次,子图里的元件天然会产生Instance与Occurrence位号不同的情况。
- 元件位号在属性编辑器里改了Part Reference列,但底部当前激活的是Instance标签页,Occurrence标签页里的位号还是旧值。
有些工程师一遇到位号不对,就把所有元件全选,在属性编辑器里把Part Reference列的值手动改一遍。这个操作其实只改了当时显示的属性层。如果不小心切到了Instance页,改完一看Occurrence页还是老样子,等于白干。更麻烦的是,这种操作还可能把原本正确的Occurrence也覆盖掉,造成更大范围的错乱。
1.3 为什么只用其中一层属性不行
既然有两套属性,那干脆永远只认Instance或者永远只认Occurrence,不就行了吗?问题是OrCAD的各个下游工具,读取的属性层并不一致。
- 原理图页面直接显示在画布上的位号,默认取自Instance层。
- 生成网表(Create Netlist)时,大部分情况下用的是Instance层的属性,但如果你在Annotate里勾选了某些选项,或者使用了旧版本兼容模式,网表里可能混入Occurrence层的数据。
- Allegro导入网表时,比对元件的时候会同时看Instance和Occurrence信息。
- 生成BOM时,很多模板默认取的是Occurrence层,因为Occurrence才反映了元件在物理上“出现”了几次。
- DRC检查时,如果两层属性不一致,可能出现位号重复、位号缺失的误报或漏报。
换句话说,在整个设计流程里,Instance和Occurrence都有被用到。想要所有环节都顺畅,唯一办法就是让它们保持一致。别想着只靠某一层走天下,这不是省事,是埋雷。
2. 位号不统一会在全流程引发哪些连锁反应
2.1 网表导出与PCB导入的报错
位号不一致最直接的后果,就是网表导出后,PCB端不认账。最常见的是Allegro导入网表时报:
found in pcb footprint for component instance
这个报错的含义是:PCB里已经有一个元件实例,网表里又来了一个Instance信息对不上的同名元件。Allegro拿着原理图网表里的Instance位号去PCB里找,找不到对应的,或者找到了但Occurrence对不上,就直接罢工。表面看是PCB导入问题,根源却在Capture的原理图属性层上。
还有一种情况更隐蔽:导入不报错,但PCB里元件的位号和原理图显示的不一样。你原理图上是C105,PCB里却是C102。这种错位最怕发生在板子已经投出去之后,排查起来特别耗时间。
2.2 Capture与Allegro的关联失败
“orcad和allegro不能关联”这个关键词在论坛里一直很热。很多人以为是软件安装问题、license问题、版本匹配问题,其实有一部分案例的根因就是位号不一致。
Capture和Allegro联动时,工具会通过位号来建立原理图元件和PCB封装的映射关系。这个映射既看Instance也看Occurrence。一旦两边对不上,Cadence的工程管理器里就会出现一会儿能关联、一会儿不能关联的灵异现象。我自己就见过一个项目,原理图里某个电容的Occurrence位号还是旧版本,导致PCB端始终无法高亮对应元件。
2.3 DRC检查和BOM输出的错位
DRC报错也是一大重灾区。位号重复、位号悬空、元件缺少位号,这一类检查项在Instance和Occurrence不一致时会给出互相矛盾的结果。比如DRC明明没报错,但PCB上焊盘丝印位号和BOM却对应不上,贴片厂打来电话问“到底按哪个位号贴”。
BOM的问题更扎心。BOM里位号这一列通常引用的是Occurrence层属性,因为Occurrence才代表了实际会焊到板子上的元件。如果你在Instance层把R12改成了R47,BOM里可能还是R12。采购和贴片厂拿着BOM去找R47,找遍了板子也找不到。这种低级错误一旦流入产线,返工成本不是几百块钱能打住的。
3. 位号统一的完整实操流程
3.1 先检查一下你的工程到底有没有问题
在动手统一之前,先确认你的工程是否存在Instance与Occurrence不一致。操作很简单:
- 在原理图页里框选所有元件,或者直接Ctrl+A全选。
- 右键选择Edit Properties,打开属性编辑器。
- 属性编辑器底部有Instance和Occurrence两个标签页,来回切换一下。
- 对比Part Reference列的值。
如果发现同一个元件在两页显示不同的位号,恭喜你,中招了。如果两边完全一样,说明当前工程是干净的,不需要处理。不过就算这次是干净的,也建议往下看,因为你迟早会用到统一方法。
需要注意的是,属性编辑器默认可能只显示Instance页,Occurrence页需要通过左下角的标签手动切换。有些版本里Occurrence标签还不容易察觉,藏在一排小标签里,不仔细看根本发现不了。
3.2 最简单的全局统一法:Annotate一键搞定
当我确认工程里位号不一致时,优先使用Tools > Annotate来做全局统一。这是最省事、也最不容易出错的方式。
具体操作如下:
- 打开原理图工程,进入任意一页图纸。
- 菜单栏选择Tools > Annotate。
- 在Annotate对话框里,Scope选择Update Entire Design,确保所有图纸页都被处理。
- Action选择Unconditional Reference Update。这个选项的意思是忽略当前已有的位号,全部重新按规则标注一遍。
- 关键步骤:在Options区域,务必勾选Update Occurrence Properties。这个选项决定了重新标注时,Occurrence层的属性是否会跟着一起更新。不勾的话,结果就是Instance全换了新位号,Occurrence还停留在旧位号,你只是把坑换了个位置而已。
- 点击OK,等待处理完成。
处理完成后,Cadence的命令窗口(Session Log)会列出重命名了多少个元件。这时候再打开属性编辑器,切换Instance和Occurrence标签,两边位号就应该完全一致了。
这里有个细节要提醒:Unconditional Reference Update会把所有被修改过的位号都重置一遍,包括你已经精心排好的位号。如果项目的位号有特殊约定(比如电源部分必须用P开头、测试点必须用TP开头),跑完这个命令后可能被打乱。所以我建议,如果项目里已经有了一套成体系的位号规则,先别急着用Unconditional,看看下面的增量更新方式。
3.3 保留已有位号的增量统一方式
如果你的工程只是极少数几个元件的Instance和Occurrence不一致,不想惊动所有位号,可以尝试Incremental Reference Update。
操作还是Tools > Annotate,Action选择Incremental Reference Update。这个命令只处理那些“当前位号缺失或位号冲突”的元件,其余元件不动。
但我要泼一盆冷水:Incremental在修复Instance与Occurrence不一致这件事上,效果很不稳定。因为它本身不会主动去对比两层属性,只会按当前可见的位号状态去做增量补充。如果某个元件的Instance位号合法但Occurrence位号还是旧的,Incremental不见得能识别出来。
所以我的经验是:在需要保留位号规则时,先手动把出问题的元件挑出来,在属性编辑器里把Instance和Occurrence两个标签页的Part Reference改一致,再用Incremental做一次兜底。如果整个工程已经乱成一锅粥,别犹豫,直接Unconditional。
3.4 属性编辑器里的手动修正技巧
有时候你只是想快速改某个元件的位号,并且保证两层同步。这时可以用属性编辑器手动操作:
- 选中要改的元件,右键Edit Properties。
- 在属性编辑器底部,先切到Instance标签页,找到Part Reference列,把位号改成新值。
- 再切到Occurrence标签页,同样找到Part Reference列,改成一样的值。
- 确认两个标签页的值一致后,再检查其他需要改的元件。
这个操作看着简单,但很容易漏掉第二步。很多人改完Instance标签页,直接关掉编辑器,以为完事了。结果Occurrence还是旧位号,后面导出BOM又出问题。
有一种更保险的做法:改完Instance层之后,不要手动去改Occurrence层,而是用Design > Update Occurrences命令。这个命令会用当前Instance层的属性去刷新Occurrence层,让Occurrence与Instance保持同步。我第一次用这个命令还是在老版本里,位置在菜单栏的Design下拉菜单里,现在17.x版本依然保留。
Update Occurrences这条命令非常好用,但要注意一个前提:它默认刷新的是所有Occurrence属性,如果Occurrence层里有你手动改过的其他属性,也会被覆盖回Instance层的值。所以用之前先确认一下,Occurrence里有没有你自己加的特殊属性。
3.5 多通道设计的特殊情况
多通道设计是Instance与Occurrence天然不同的典型场景。比如一个电源模块画成了一张子图,在主图里复用了4次,每个通道都引用这张子图。此时子图里的元件在Instance层只有一个身份,但Occurrence层会有4个对应的物理位号。
这种情况下,你不能简单用Unconditional Reference Update把所有位号强制统一,因为多通道设计要求Occurrence层必须区分通道。你要做的,是让Instance与Occurrence的映射关系正确,而不是让它们完全相同。
处理多通道位号时,在Annotate对话框里需要关注Mode设置。Mode通常有Occurrence和Instance两个选项,默认是Occurrence。选择不同的Mode,Annotate会根据通道Suffix生成不同的位号格式。比如通道1的电阻可能是R1_1、R1_2,通道2则是R2_1、R2_2,具体取决于Suffix Value的设置。
如果多通道设计跑完Annotate后,发现通道内位号还是乱的,重点检查两个地方:一是Suffix Value是否为空白或设置合理;二是是否勾选了Update Occurrence Properties。这两个选项不搞定,多通道的位号大概率还是会出问题。
4. 从源头避免位号再次分家
4.1 规范设计操作流程
统一位号只是补救措施,更值钱的是建立一套让Instance和Occurrence不再分家的设计规范。我在团队里推行过几条规则,效果很好:
- 所有位号修改统一走Tools > Annotate,不直接在原理图里手动改位号字符。
- 每次做完整理、重排位号后,必须跑一次Design > Update Occurrences。
- 复制粘贴任何电路之前,先确认目标页的位号规则,粘贴后立刻重新标注,不要拖。
- 每次导出网表之前,抽查几个元件,对比Instance和Occurrence标签页的Part Reference是否一致。
- 多通道设计里,每一位工程师必须明确自己用的位号Suffix规则,并在团队文档里记录清楚。
这些规则看起来繁琐,但养成习惯后,能省掉大量后期排查时间。尤其是多人协作的项目,别人乱改位号造成的Instance和Occurrence分家,你在合图阶段简直防不胜防。
4.2 善用模板与默认配置
OrCAD Capture支持通过设计模板(.otp)来预设新建工程的属性配置。你可以把Annotate的选项、Update Occurrences相关的参数固化到模板里,团队里所有人新建工程时都从同一套模板出发,能少踩很多坑。
具体做法不复杂:先手动打开一个配置好Annotate和Update选项的工程,另存为模板文件。然后让大家在新建工程时以这个模板为起点。这样至少保证了初始状态的一致性,不会有人一上来就把Annotate的设置改得乱七八糟。
另外,Capture的Preferences里有些选项会影响位号行为,比如自动编号、自动重复检查等。建议在Options > Preferences里把与Reference相关的自动检查选项打开,让工具在设计过程中就帮你盯着位号问题。
4.3 给复制粘贴爱好者的忠告
我看到很多工程师特别喜欢用复制粘贴来复用电路,从别的工程里复制一整个模块过来,然后手动改几个关键位号就算完事。这种做法是Instance和Occurrence分家的头号来源。
我的建议是:如果你要复用一段电路,优先使用Capture的“剪切/粘贴”或“模块复用”功能,并且在粘贴后立刻对粘贴进来的元件执行一次Annotate(范围选Update Selection,Action选Unconditional)。不要等整页画完了再统一处理,那时候哪些元件是哪来的、位号对不对,早就记不清楚了。
5. 常见问题与排查技巧实录
5.1 位号问题速查表
这里整理了一张我自己踩坑总结出来的速查表,遇到位号相关问题可以直接对照排查:
| 症状 | 可能原因 | 解决动作 |
|---|---|---|
| PCB端位号和原理图显示不一致 | 只改了Instance层,Occurrence层没同步 | 属性编辑器对比两层,跑Update Occurrences |
| Allegro导入网表报found in pcb footprint for component instance | PCB已有旧位号元件且网表Instance信息对不上 | 确认Capture位号统一后重新导出网表,必要时清理PCB旧元件 |
| 复制粘贴后DRC报位号重复 | 新粘贴的元件没有重新标注 | 选中新元件,Annotate的Update Selection + Unconditional |
| 多通道设计通道内位号乱 | Suffix设置不对或Update Occurrence未勾选 | 检查Annotate里的Suffix Value和Update Occurrence Properties |
| BOM导出的位号与PCB不一致 | BOM模板引用的是Occurrence层,而Occurrence是旧值 | 统一两层属性后再导出BOM |
5.2 排错时最容易被忽略的细节
排查位号问题时,有几个细节特别容易忽略,单独拎出来说一下。
首先是属性编辑器里“显示列”的问题。属性编辑器可以动态调整列显示,有时候你觉得看到的是Part Reference列,实际上看到的是其他列,比如Name或Value。别光看列头,要确认你改的是Part Reference。
其次是Session Log。OrCAD的运行日志里会记录Annotate的详细过程,包括哪些位号被重置、哪些被跳过。如果Annotate跑完但位号没变,第一反应应该是去看Session Log有没有报错或警告。
还有一个我吃过亏的地方:Update Occurrences命令在某些版本里对“平坦式设计”无效。如果你的工程是纯平坦的,没有层次结构,也没有多通道,Update Occurrences可能不响应。这时候别慌,用属性编辑器切到Occurrence标签页手动改,或者直接Annotate勾上Update Occurrence Properties硬刷一遍。
5.3 一个不为人知但很实用的验证技巧
统一完位号之后,很多人不知道该怎么验证是否彻底干净。其实有一个很简单的办法:生成PDF。
把原理图导出成PDF,然后在PDF里搜几个关键位号,和PCB端BOM对比一下。这个办法虽然土,但特别直观。我经常用这个方法在出图前做最终确认,效果比盯着属性编辑器看可靠多了。
另一个技巧:把原理图和PCB的元件位号列表都导出成Excel,然后用Excel的VLOOKUP功能交叉比对。如果两边有任何一个位号对不上,立刻就能查出来。这个招数在项目交付前非常管用,尤其是面对严格审图的客户时,能帮你提前挡掉很多麻烦。
5.4 我的实战心得
最后说点掏心窝的话。位号统一这件事,看起来是个小操作,但能不能做好,直接体现了一个硬件工程师对设计工具的理解深度。我刚用OrCAD那会儿,也曾经被Instance和Occurrence坑过,当时不懂原理,只能靠一个个手动改硬刚,改完心里还没底。后来弄明白这两层属性的机制之后,再看位号问题,感觉就像打开了新世界的大门。
我自己现在的习惯是:每次原理图改版完成、准备发网表给PCB之前,固定花两分钟做一次位号体检。体检内容就是打开属性编辑器,快速过一遍Instance和Occurrence标签页的Part Reference,跑一次Annotate的Unconditional Reference Update(如果项目允许),再顺手Update Occurrences。这两分钟看着不起眼,但帮我躲过了至少三次产线事故。
如果你现在手头就有一个被位号问题困扰的工程,不用多想了,按上面第3节的流程去操作,先把Instance和Occurrence拉齐,然后再去排查PCB端的问题。很多时候,PCB端看起来莫名其妙的问题,回到原理图里一查,就是位号没统一而已。搞定这个,后面整个流程都会顺很多。