恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
OrCAD位号混乱根源:Instance与Occurrence属性不一致及统一方法
首页
资讯中心
/
OrCAD位号混乱根源:Instance与Occurrence属性不一致及统一方法
OrCAD位号混乱根源:Instance与Occurrence属性不一致及统一方法
发布时间:2026/9/28 1:40:25
做硬件设计这行跟 OrCAD Capture 打交道久了几乎都遇到过位号对不上的事。明明原理图上 U12、R34 标得清清楚楚导进 Allegro 一看PCB 上位号乱七八糟要么变成 U12A、U12B 这种带后缀的怪样子要么干脆查不到这个 Reference 对应的封装更头疼的是板子做回来丝印位号和 BOM 对不上贴片厂打电话来问“你这几个位号到底是不是 R31”那一刻真想直接把电脑砸了。这种问题大部分根源就一个OrCAD 原理图里的 Instance 属性和 Occurrence 属性不一致。很多人被这两个词绕得晕头转向改位号时只改了一层另一层原地不动结果网表导出去就带出了两套信息后面的 PCB 设计、生成 BOM、回贴流程全跟着遭殃。我这些年经手过电源板、工控板、高速信号板踩过的坑加起来能写一本书。今天就把 Instance 和 Occurrence 这件事从头到尾讲透从产生原因到统一操作再到批量处理和日常规避一次说清楚。1. 位号不一致到底是怎么坑人的1.1 先还原一个现场我自己第一次被这个问题坑是在一个 6 层主控板上。原始设计是从公司老项目改过来的工程师为了省事直接把原来的原理图整个另存然后改动一部分电路新增几页模块。当时我还没重视 Instance 和 Occurrence 这档子事改完位号后跑了 DRC没报什么大错然后生成网表、导入 Allegro看着板框和器件摆好就交给 Layout 同事了。三天后 Layout 同事找过来屏幕上一堆位号显示为 R1A、R1B、C3A 这样的形式而原理图里明明标的是 R1、R2、C3。他问我“你这张图是不是做过复用模块Instance 和 Occurrence 全乱了我在 PCB 上按位号找器件根本对不上。” 我过去一看每次在原理图里改动一个电容位号PCB 里的同一颗料就冒出新旧两个名字。那一刻我才意识到位号这件事不是“编号有没有对上”那么简单而是 OrCAD 内部两套属性体系必须同时正确。1.2 位号不一致会影响多少环节很多人以为位号只是“丝印上的名字”。实际上位号贯穿整个硬件设计链条第一网表导出会失败或产生警告。OrCAD Capture 导出网表时如果 Instance 和 Occurrence 想的位号不一致Allegro 会收到两套 Reference 信息。有时明明原理图检查了没有问题PCB Editor 却始终提示找不到 foot print 或者位号重复。第二PCB 后处理阶段会出现混乱。在 Allegro 里进行元件替换、Room 分配、标注丝印时软件会优先读取其中一套属性但用户看到的界面显示可能又是另一套这种情况下你改了一个位号另一处没变再次同步网表就把刚改好的东西又冲掉。第三BOM 输出和贴片生产极容易踩雷。OrCAD 输出 BOM 默认按 Reference 排序汇总如果同一元件在 Instance 层和 Occurrence 层位号不同BOM 里可能会出现一行 U12另一行 U12A明明是一颗料被拆成了两项采购和生产看到这种 BOM 直接头大。第四设计审查时会被人揪出来。我在内部评审时就见过不少人其他方面画得挺好结果位号属性一检查几十个元件 Instance 与 Occurrence 对不上这种低级问题被领导看到整个设计的可靠性都跟着被打问号。1.3 为什么偏偏是你遇到我总结了一下容易触发 Instance 与 Occurrence 不一致的操作基本集中在这么几种场景直接复制粘贴旧的原理图页而不是用正式的 Design Reuse 或 Hierarchical Block。在同一个 .dsn 设计里反复 CtrlC、CtrlV 复制、移动模块。对同一个多 gate 元件如 74LVC04、排阻做 Slot 或 gate swap 操作。多人协同通过网络盘传工程版本合并时位号信息错位。使用 Capture CIS 库里的旧器件库属性本身就带了两层不同的 Reference 信息。说白了只要不是老老实实从新建原理图开始一步步用软件推荐的 Annotate 方式编号这套双属性机制就有机会出岔子。好在OrCAD 本身提供了完整的工具和逻辑来统一它们问题是很多人根本没有系统学过正确的处理步骤。2. 先搞懂 Instance 和 Occurrence 这对双胞胎2.1 两个属性层的本质区别OrCAD Capture 里的每一个元件在设计数据库中其实存了两种“身份”Instance 属性可以理解成元件的“元件实例身份”。它代表这个元件在原理图符号库里的物理存在跟你把它放在哪一页、复制了几次没有关系。Instance 是设计中最稳定的一层PCB 网表通常优先以 Instance 为主。Occurrence 属性更贴近“在图纸上出现的次数和位置”。同一个符号被放到电路图里 5 个不同地方就有 5 个 Occurrence。OrCAD 在高层设计、多通道设计和模块化复用中需要通过 Occurrence 来区分同一器件在每一路里的具体编号。说得再直白一点Instance 相当于“这个人是王建国”Occurrence 相当于“王建国出现在今天上午 10 点的会议室”。你可以让王建国出现在多个会议室它们都是同一个人在不同位置的“出现”。原理图里的元件如果复制多次Instance 可能还是同一个原型Occurrence 却是各自独立的编号。大部分简单项目里Capture 在自动编号时会同时维护两层让它们保持一致所以平时根本感觉不到。一旦有人手动改位号、复制粘贴模块或者从老工程拿图来改两层属性就开始各说各话。2.2 为什么会出现一层改了另一层没改这就要说到 OrCAD 的历史包袱了。Capture 从早年 Schema 时代就带了一套 Occurrence 属性机制后来为了兼容各种历史项目和第三方工具又增加了 Instance 体系。两个体系的更新逻辑不完全同步尤其当你用“不标准”的方式编辑原理图时比如你在属性编辑器里直接改了 Reference 列的某个单元格。默认情况下Capture 显示的是 Instance 属性还是 Occurrence 属性取决于你在首选项里勾选了哪一层。如果你不小心关掉了“Display Occurrence Properties”界面里改的可能只是 Instance 层。再比如你复制了一个模块Capture 会给复制出来的元件重新生成 Occurrence 位号但 Instance 位号还是继承原始的此时两层自然就分叉了。更典型的是多层图纸设计里顶层模块框图里调用同一个底层模块如果设计复用关系没建好Capture 会以为每个 Occurrence 都是独立元件于是自动生成 U1A、U1B 这种位号但 Instance 层还留在原来的 U1、U2。2.3 网表和 PCB 关联时到底读哪一层这里有一个所有 OrCAD 工程师都必须记住的关键点Allegro 导入网表时通常以 Instance 属性为最终参考。但 Capture 原理图界面上你看到的显示却经常是 Occurrence 属性。结果就是——原理图显示的是 U12A你觉得没问题Allegro 里却用 U12 去找封装找不到或者找到之后位号和原理图显示不一致整板就是乱套的。所以统一 Instance 和 Occurrence 的意义不仅是“让软件不报警”更重要的是确保从原理图到 PCB 再到 BOM所有环节拿到的位号完全一致。理顺这套关系之后后面 90% 的位号相关怪问题都会自动消失。3. 位号统一的标准操作流程3.1 动手之前先备份和检查执行任何 Annotate 之前我习惯先做三件事第一整个工程文件夹复制一份。Annotate 这种全量操作一旦做错几百个位号说变就变没有备份的话只能哭。第二打开原理图在菜单 Tools - Annotate 之前先做一次 Design Rules Check也就是 DRC。DRC 能提前暴露位号重复、位号缺失这些问题。DRC 报出来的位号错误很多其实就是 Instance 和 Occurrence 不一致引起的先记录下来统一完再跑一遍看是否消除。第三确认当前打开的是顶层设计。如果是分层式设计多个模块图同时存在Annotate 的操作范围会影响不同层级的编号逻辑必须确保你要处理的是整张设计图而不是单独某一个 block。这些准备工作大概花 5 分钟但能避免后面数不清的返工。我见过太多人上来就点 Annotate结果位号是“统一”了但所有元件的位号全部被打乱比之前更惨。3.2 Annotate 对话框里的核心选项怎么选打开 Tools - Annotate 后你会看到一个打包了四个页签的对话框里面最关键的就是 Packaging 页签。很多人只知道点确定完全没搞懂每个选项的作用这里我逐个拆开讲。最上面是 Scope也就是操作范围。我建议选择 Process Entire Design除非你只想处理选中的部分电路。整个设计统一时一定要选全部否则选了局部反而会制造新的不一致。中间是 Action有五个选项Incremental Reference Update增量更新。只给新增的元件分配位号已有位号一律不动。如果你只是加了几颗料不想影响现有位号选这个没问题。Unconditional Reference Update无条件更新。这句翻译有点绕其实就是“按当前状态全量重排”。这个选项会重新扫描所有元件并按照你设定的原则重新编号。Reset Part References to “?”把所有元件的位号清成问号。这是最彻底的操作配合 Unconditional Reference Update就能实现“先全部清空再全部重来”的强制统一。Add Intersheet References增加跨页引用。给位号加上页码信息比如 R1_A3 这种表示第 3 页。一般不需要。Delete Intersheet References删除跨页引用。把之前加进去的页码信息去掉。再往下是 Mode这里就是处理 Instance 和 Occurrence 的关键Update InstancesPreferred只更新 Instance 属性这是官方推荐的模式。简单项目里Instance 层更新好网表就能正确进入 Allegro。Update Occurrences只更新 Occurrence 属性。老式流程爱用这个但对新设计来说光改这一层容易造成两面不一致。Update Both同时更新 Instance 和 Occurrence。我们做位号统一就是要让两层保持一致所以正常都应该选这个模式。有些版本的 OrCAD 里Update Both 需要勾选 “Update Instance and Occurrence Properties” 这两个复选框而不是一个下拉选项。不管界面长什么样目标明确让 Instance 和 Occurrence 同步更新。3.3 位号统一必须做对的顺序标准操作我建议分两步走尤其是那些已经出现不一致的设计。第一步先 Reset 掉所有位号。在 Annotate 对话框里Action 选 Reset Part References to “?”Mode 选 Update Both。点确定所有元件的 RefDes 会变成 R?、C?、U? 这种形式。这一步看着吓人其实只是为了把两个属性层从旧数据里彻底清干净。这就好比电脑卡死时先重启所有乱七八糟的进程全部清掉才能有个干净环境。第二步重新编号。再次打开 AnnotateAction 选择 Unconditional Reference UpdateMode 同样选 Update Both。这里还可以设置位号起始值和命名规则。起始值一般默认 1也可以根据板卡类型设定比如电源板统一从 100 开始只是团队习惯问题不影响统一逻辑。点确定后Capture 会按从上到下、从左到右的扫描顺序给所有元件重新编号。执行完两步之后务必再检查一次。在原理图里右键任意元件选择 Edit Properties查看属性列表里的 Reference 和 Instance Reference 这两个值。如果它们一致说明这次统一成功了。如果还看到不同的值说明刚才 Mode 并没有选到 Update Both需要再重复一次。我个人的操作习惯是把这两步做成一个固定组合每次新项目画完原理图或者大改一次后都会先 Reset 再 Unconditional 重新编号把 Instance 和 Occurrence 彻底对齐。别嫌麻烦这套流程一旦形成习惯后面省的时间远比你想象的要多。3.4 统一之后网表和 PCB 端如何验证位号统一做完不要急着导网表先在 Capture 里做一遍完整的 DRC确认没有位号相关的报错。然后导出网表Allegro 导入之后再检查一遍。在 Allegro 里可以用 Logic - Net Logic 或者 Place - Update Symbols 的方式看元件是否全部匹配。我更常用的验证方法是直接打开 Allegro 的元件列表对照原理图的 PDF 抽查几十颗关键器件看位号是否一一对应。如果发现某颗料在 PCB 上位号带后缀立刻回 Capture 查它的 Instance 属性这类问题的根源基本都出在这里。4. 整板和复杂项目的批量位号调整技巧4.1 多通道设计和复用模块的位号策略做电源板的人应该深有体会一块板上 8 路一模一样的 DC-DC 电路新手往往是把第一路画好后复制 7 次然后手动改位号。这种方式最容易引爆 Instance 和 Occurrence 的不一致。OrCAD 里真正适合这种情况的做法是用 Capture 的 Multi-Channel 功能也就是多通道设计。在项目管理器里把单路电路做成一个 Module然后在新设计里多次调用这个 ModuleCapture 会自动为每一路生成单独的 Occurrence 位号同时保持 Instance 属性的继承关系。用 Multi-Channel位号会自然生成 U1A、U1B、U1C 这种形式但这里的后缀是设计上有意为之Instance 和 Occurrence 是同步的不会产生错误报警。如果你已经用粗暴复制粘贴的方式画好了而且复制出来的元件位号已经乱掉也别慌。先把整个设计的 Instance 和 Occurrence 统一一次然后看一看是否被自动赋予了带后缀的名字。如果带后缀是预期的结构比如确实要区分同一封装里的多 gate那后续就按这个思路维护如果不是预期的比如你只想让它们像 R1、R2、R3 一样独立编号那就先把这些同源元件全部替换成独立放置的元件再重新 Annotate。4.2 分组编号和区域编号的实践有些公司要求位号按功能区划分比如电源部分用 U1xxFPGA 部分用 U2xx接口保护部分用 U3xx。OrCAD 的 Annotate 并不直接支持“按页或按框自动分段编号”这种高级玩法但可以通过两种方式实现一种是在每一页原理图里把该页器件统一前缀后再执行 Incremental Reference Update。缺点是稍微麻烦每页都要单独操作。另一种是给元件添加自定义属性比如 Group 属性值写成 PWR、FPGA、IF然后在 Annotate 对话框里用 Combined Property String 配合分组排序。Combined Property String 这个字段很多人没用过它允许你定义编号时的排序关键字。比如填写 {Group}{Reference}系统会先按 Group 排序再按 Reference 排序。这样多组器件就能按你的分组顺序依次编号比我早期一个个手动改位号快多了。当然分组编号属于锦上添花。如果你项目阶段对位号格式没有硬性要求最稳妥的做法就是让它自动按顺序编号不做花活减少操作步骤就等于减少出错概率。4.3 位号原则能用自动就别手动我见过不少硬件工程师非常喜欢在属性编辑器里手动输入位号改完也不刷 Instance 和 Occurrence。这种做法我只能说短期没事长期全是雷。手动改 Reference 时Capture 往往改的是当前显示的属性层。如果你在首选项里打开的是 Occurrence 属性改完后 Instance 还是旧值下次网表一出PCB 端就炸了。所以我有两个原则第一能用 Annotate 自动编号的绝不手动输入。 第二必须手动修改时改完马上用 Annotate 里的 Update Both 刷新一次把另一层同步过来。这两个原则看起来简单但真的能拦住 90% 的位号灾难。5. 用 TCL 脚本批量检查 Instance 和 Occurrence5.1 为什么需要脚本当设计规模大了一个工程几百上千个元件靠人工去检查哪颗元件 Instance 和 Occurrence 不一样根本不现实。OrCAD Capture 自带 TCL/TK 脚本接口可以让我们在工具里直接跑脚本批量扫描整个设计把不一致的元件全部列出来。这个功能很多工程师不知道但在复杂项目中作用巨大。使用脚本之前先确认你的 Capture 版本支持 TCL。一般在 16.6 之后的版本都内置了 TCL/TK 解释器不需要额外安装环境。在 Capture 命令窗口直接输入命令或者通过 File - Open - Script 加载 .tcl 文件都可以。5.2 一个实用的位号一致性检查脚本下面是我常用的一个脚本模板负责把当前设计里 Instance 和 Occurrence 的位号不一致的元件找出来并输出到一个文本文件里。API 名称在不同版本里可能略有差异但整体思路是一样的。# capture_refdes_check.tcl # 遍历设计中所有元件比较 Instance 和 Occurrence 位号 proc CheckRefDesConsistency {} { set prj [dbGetCurrentProject] if {$prj } { puts 没有打开的设计 return } set design [dbOpenDesign $prj] if {$design } { puts 无法打开当前设计 return } set outputFile [open refdes_check_result.txt w] set partList [dbGetParts $design] set mismatchCount 0 foreach part $partList { set instRef [dbGetPartInstanceReference $part] set occRef [dbGetPartOccurrenceReference $part] if {$instRef ! $occRef} { puts $outputFile 不一致: $occRef - $instRef incr mismatchCount } } close $outputFile puts 检查完成共发现 $mismatchCount 个不一致位号结果已写入 refdes_check_result.txt dbCloseDesign $design } CheckRefDesConsistency画重点这个脚本里最容易出错的地方是 dbGetPartInstanceReference 和 dbGetPartOccurrenceReference 这两个 API不同版本名字可能有区别。像 16.6 里可能是 dbGetPartInstRef19.1 里又可能是另一套。拿到一个新版本环境先用 help 命令查接口列表确认 API 名再跑。脚本输出的是纯文本报告打开后就能看到所有不一致的位号再回到原理图里统一修改效率直接翻倍。5.3 脚本的统一修复思路检查脚本能查出问题但修复动作我更推荐用标准的 Annotate 操作而不是写脚本去批量改数据库。原因很简单Annotate 是 Capture 官方支持的位号统一机制它对数据库的大小写、格式、跨页引用等处理都很全面。脚本改位号一旦漏掉某些字段反而可能制造新的错误。所以我的经验是脚本只负责“发现问题”修复交给 Annotate。先跑脚本拿到清单确认不一致范围再按第 3 节里的两步流程走一遍。如果有些元件是有意保留的特殊位号比如已经定型的接口板不想被 Annotate 打乱那就在执行 Unconditional 之前把这些元件排除掉或者先记下原值结束后再手动改回来并再次同步。6. 常见问题与排查实录6.1 DRC 报位号错误但原理图看着没问题很多人在 Capture 里跑 DRC看到 “Duplicate Reference” 或者 “Reference has no value” 这类错误第一反应是某个元件的位号没填。实际上如果原理图界面上每个位号都很正常那问题大概率出在 Instance 和 Occurrence 不一致上。遇到这种 DRC 报错先打开报错元件的属性编辑器把列头拉出来比对 Reference、Instance Reference、Occurrence Reference 这几个字段。我遇到过一个案例界面上显示 C101Instance 里是 C100Occurrence 里是 C101DRC 就认为 C100 和 C101 同时存在于是报重复位号。这种问题执行一遍 Reset 再 Unconditional 编号就消失了不需要一个一个手动改。6.2 Allegro 导入网表时提示找不到 Footprint这个问题的本质和位号也有一定关联。Allegro 导入网表时会按照元件封装名去库路径下寻找 .dra/.psm 文件。如果同一个元件在 Instance 和 Occurrence 下封装信息也不一致比如 Instance 层封装是 C0402Occurrence 层是 C0603Allegro 就会取其中一层去找很可能找不到。排查思路打开该元件的属性编辑器检查 Inst 和 Occ 两个层级下的 PCB Footprint 字段是否一致。不一致的话去掉其中一层保留正确封装然后同步两层。部分情况下问题不在位号而在封装但处理逻辑完全一样——先统一属性层再导网表。养成同步两层属性的习惯后这类问题基本可以避免。6.3 更新网表后 PCB 上位号被覆盖还有一种高频场景原理图位号在 Capture 里看着是好的Allegro 里也调好了但更新一次网表后PCB 上位号突然变了或者器件变成未放置状态。这多半是因为你只在 Instance 层做了修改而在 Allegro 导入网表时网表数据携带的恰好是 Instance 位号导致 PCB 里已经按 Occurrence 摆放好的位号被覆盖。要避免这个问题电路图更新后第一时间做 Instance 与 Occurrence 的统一再导网表确保被覆盖后的结果和原来保持一致。另外在 Allegro 里执行 Design Sync 之前最好留意一下 Capture 和 Allegro 的关联设置。如果安装后 OrCAD 和 Allegro 不能正常联动通常是版本不匹配或者未设置默认工具可以在 Capture 的 Options - Preferences 里指定 PCB 编辑工具路径重新关联后再同步能减少很多莫名其妙的问题。6.4 导出的 PDF 和 BOM 位号对不上有人在 Capture 里出 PDF打印出来看着位号整整齐齐结果 BOM 导出来又是另一种排序或名字。这个和 PDF 导出机制有关原理图页面上显示的是当前视图激活的那一层属性。如果你把显示层换成了 Instance就会看到一套位号换成 Occurrence又看到另一套。导 PDF 的时候显示层取决于你的设置。BOM 则不同它默认按数据库层读取有时读 Instance 有时读 Occurrence。两边数据源一不一致PDF 和 BOM 就会打架。解决办法还是同一个先把 Instance 和 Occurrence 统一。只要两层一致不管 PDF 显示层怎么切、BOM 读哪一层结果都一样就再也不会出现“打印一套、表格一套”的诡异情况。7. 一些个人习惯和收尾建议我自己现在新开项目不管原理图规模大小都遵循一套固定的位号管理习惯第一所有元件必须通过正规库放置禁止从其他项目直接复制没有处理过的原理图页。 第二每次大规模修改原理图后先 Reset 再 Unconditional 重新编号Mode 永远选 Update Both。 第三导网表之前跑一次 DRC导完后立刻在 Allegro 里抽查位号不等 Layout 有反馈才处理。 第四遇到老项目、第三方原理图先全盘检查 Inst/Occ 一致性再往下走绝不拿旧图直接改。最后分享一个小技巧在 Annotate 执行重排之前Allegro 的板子上如果已经有了布局布线你最好在 Capture 里把位号变化生成报告也就是在 Annotate 对话框里勾选 “Generate Annotate Report” 或类似选项保留一份位号映射表。这样重排后你是知道哪个旧位号变成了哪个新位号不至于在 Allegro 里满板子找不到器件。位号管理看着是小事但它就像房子的门牌号门牌号都乱了后面装修得再好也没用。把这些操作固化成肌肉记忆之后你会发现 OrCAD 这套双属性机制没那么可怕反而是保护设计完整性的重要一环。