1. 为什么原理图导出BOM这件事值得单独写一篇
画完原理图只是完成了硬件设计的一半,真正把设计交到采购和焊接环节手里的是那份BOM表。我见过太多项目卡在"原理图没问题,但BOM导出来一堆乱码、缺料、封装对不上"这种低级环节上。Cadence作为主流EDA工具,它的BOM导出逻辑和Altium Designer、KiCad完全不是一回事——它默认走的是Report机制而不是直接生成Excel,很多人第一次用Cadence Capture CIS导出BOM时,面对那个"Bill of Materials"对话框里的各种选项,基本是懵的。
这篇内容面向的是已经能用Cadence画原理图、但每次导BOM都要折腾半天的硬件工程师,以及刚接手Cadence项目、需要快速产出规范BOM的嵌入式开发者。我会把从原理图属性配置到最终Excel落地的完整链路拆开讲,包括那些官方文档里一笔带过、但实际会卡住你半小时的细节。核心关键词覆盖:Cadence、BOM、原理图、Excel、PCB Footprint,以及导出过程中涉及的属性映射、分组规则、常见报错处理。
先说一个反直觉的结论:Cadence导BOM出问题,八成不是导出那一步的问题,而是原理图里器件属性从一开始就没填规范。导出操作本身只需要点几下,但属性字段的命名、PCB Footprint的填写方式、Value和Part Number的对应关系,这些在画图阶段埋下的雷,会在导BOM时集中爆发。所以这篇教程的顺序是:先讲清楚BOM需要哪些字段、这些字段在原理图里对应什么属性,再讲导出配置,最后集中处理那些高频报错。
2. 导出之前必须搞清楚的BOM字段与原理图属性映射
2.1 一份能直接给采购的BOM到底需要哪些列
很多人导出的BOM只有Item、Quantity、Reference、Value、Part Number这几列,拿去采购那边直接被退回来——因为没有封装信息、没有描述、没有制造商料号。一份合格的BOM至少应该包含以下字段:
| 字段名 | 含义 | 原理图对应属性 | 是否必需 |
|---|---|---|---|
| Item | 序号 | 自动生成 | 是 |
| Quantity | 单板用量 | 自动统计 | 是 |
| Reference | 位号 | Reference | 是 |
| Value | 参数值 | Value | 是 |
| PCB Footprint | PCB封装 | PCB Footprint | 是 |
| Part Number | 物料编号 | Part Number | 是 |
| Description | 器件描述 | Description | 建议 |
| Manufacturer | 制造商 | Manufacturer | 建议 |
| Manufacturer Part Number | 制造商料号 | MPN | 建议 |
这张表不是随便列的。Quantity和Reference是Cadence自动从原理图里抓的,你不需要手动填;但Value、PCB Footprint、Part Number这三个字段,必须在画原理图时就写进器件的属性里,否则导出时那一列就是空的。我见过最离谱的情况是有人把封装信息写在Description里,导出后采购拿着Description去猜封装,直接导致贴片厂上错料。
2.2 属性字段的命名必须统一,大小写都不能错
Cadence Capture CIS的属性系统是大小写敏感的。如果你在原理图里写的是"PCB Footprint",导出配置里也必须写"PCB Footprint",写成"PCB footprint"或者"pcb_footprint"都抓不到数据。这一点和Altium的宽容度完全不同,AD里属性名差不多就能匹配,Cadence不行。
实际操作中,我建议在项目开始前就定好一套属性模板。具体做法是:在Capture CIS里打开一个空白原理图页,放置一个器件,右键Edit Properties,把上面表格里那些字段全部手动添加一遍,确认命名规范后,把这个器件存成模板或者直接复制到其他页。更稳妥的方式是用Capture的Part Manager或者CIS数据库来统一管理,但如果你只是做小项目,手动统一命名也够用。
注意:Value字段和Part Number字段不要混用。Value是给硬件工程师看的参数(比如10k、100nF),Part Number是给采购看的物料编号。有些团队图省事只填Value,结果采购拿到"10k"根本不知道买哪个封装的电阻。
2.3 PCB Footprint的填写规范直接决定后续能不能导入PCB
PCB Footprint这个字段是连接原理图和PCB的桥梁。在Cadence流程里,原理图里的PCB Footprint值必须和Allegro里实际存在的封装名完全一致,否则导入网表时会报"footprint not found"。导出BOM时虽然不校验封装是否存在,但如果这个字段填得乱七八糟,BOM到了PCB工程师手里就是一场灾难。
常见的填写错误包括:把封装名写成"0603"但实际Allegro里叫"R0603";多个器件共用一个封装但写法不统一(有的写"SOIC-8"有的写"SOIC8");还有人在这个字段里写中文描述。我的建议是建立一个封装命名对照表,所有器件的PCB Footprint值都从表里复制,不要手打。如果项目里用了CIS数据库,封装名应该由数据库统一推送,从源头上杜绝不一致。
3. Cadence Capture CIS导出BOM的完整操作链路
3.1 从原理图工程到BOM Report的入口在哪
打开你的DSN工程,在项目管理器里选中最顶层的设计文件(通常是.dsn文件),然后走菜单Tools → Bill of Materials。注意,如果你选中的是某个子图页而不是顶层设计,这个菜单项可能是灰的。这是第一个容易卡住的地方——很多人选中了某个page就去找Bill of Materials,找不到就以为软件有问题。
点击之后会弹出Bill of Materials对话框,这个对话框分几个区域:Header区域填表头信息,Line Item Definition区域定义每一行输出什么内容,Combined Property String区域是核心中的核心,它决定了每个器件的属性怎么拼成一行文本。
3.2 Combined Property String的写法与分组逻辑
Combined Property String的默认值通常是"{Item}\t{Quantity}\t{Reference}\t{Value}\t{PCB Footprint}\t{Part Number}",其中\t是制表符,用来分列。你可以根据需要增删字段,但要注意字段名必须和原理图属性名完全一致。
这里有个关键机制:Cadence会根据你选择的"Group By"字段来合并相同器件。默认是按Value和PCB Footprint分组,也就是说两个10k 0603的电阻会被合并成一行,Quantity显示2,Reference显示R1,R2。如果你希望按Part Number分组(同一物料号的不同值也合并),就把Group By改成Part Number。但要注意,如果Part Number字段有空值,这些空值器件会被分到同一组,导致BOM出现一行Quantity巨大但Reference混乱的记录。
我的经验是:Group By用"Value + PCB Footprint + Part Number"三个字段组合,这样既能合并相同物料,又不会把不同物料误合并。具体在对话框里就是把这些字段都勾上Group By。
3.3 输出格式选择:Excel、CSV还是HTML
Bill of Materials对话框底部有Output Format选项,常见的有Excel、CSV、HTML、PDF。如果你要直接给采购发Excel,选Excel格式最省事,Cadence会调用本地Excel生成.xls文件。但这里有个坑:如果你的机器上没装Excel或者装的版本和Cadence不兼容,导出会直接失败或者生成一个空文件。
更稳妥的做法是先导出CSV,然后用Excel打开另存为.xlsx。CSV是纯文本格式,不依赖Excel组件,导出成功率接近100%。导出CSV后,用Excel打开时注意选择正确的编码(通常选UTF-8或者GB2312,取决于你的系统区域设置),否则中文描述会变乱码。
| 输出格式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Excel | 直接可用,格式保留好 | 依赖本地Excel,可能失败 | 本机有Excel且版本匹配 |
| CSV | 稳定,不依赖外部组件 | 需手动转Excel,编码需注意 | 推荐首选 |
| HTML | 浏览器可直接看 | 不方便编辑 | 快速预览 |
| 适合归档 | 无法编辑 | 正式发布存档 |
3.4 导出后的Excel整理:从原始数据到可交付BOM
Cadence导出的CSV或Excel通常带有一些不需要的列,比如"Item"编号可能不连续,或者表头有多余的空行。拿到原始文件后,我一般做这几步整理:
第一步,删除空行和空列。Cadence有时会在末尾生成几个空行,直接删掉。第二步,检查Quantity列是否有异常值,比如某个器件的Quantity是0或者负数,这通常意味着原理图里有器件的属性没填完整。第三步,把Reference列按位号排序,方便焊接时核对。第四步,补充采购需要的列,比如"采购状态""替代料"等,这些Cadence不管,需要手动加。
如果你经常做这个整理动作,可以用Excel的Power Query或者写一个简单的Python脚本自动化。Python的pandas库读CSV、清洗、输出xlsx只需要十几行代码,比手动操作快得多,而且不会出错。
import pandas as pd # 读取Cadence导出的CSV df = pd.read_csv('bom_raw.csv', encoding='gb2312') # 删除全空行 df.dropna(how='all', inplace=True) # 按位号排序 df.sort_values(by='Reference', inplace=True) # 重置Item编号 df.reset_index(drop=True, inplace=True) df['Item'] = df.index + 1 # 输出整理后的Excel df.to_excel('bom_final.xlsx', index=False)这段代码解决的是最基础的清洗需求。如果你的BOM字段更多、分组逻辑更复杂,可以在此基础上扩展。
4. 那些让BOM导出失败的常见问题与排查路径
4.1 导出后Quantity全是1,分组完全失效
这是最高频的问题。原因通常是Group By字段没选对,或者选中的字段在原理图里全是空值。比如你选了按Part Number分组,但所有器件的Part Number都没填,Cadence无法判断哪些器件相同,就只能每个器件单独一行。
排查路径:先打开原理图,随便选几个应该合并的器件(比如两个10k电阻),右键Edit Properties,确认它们的Value和PCB Footprint是否完全一致。如果一致但导出还是不合并,检查Bill of Materials对话框里的Group By设置,确保勾选的字段就是你想用来分组的字段。另外注意,Group By字段的值如果有前后空格,也会导致分组失败——"10k"和"10k "会被当成不同的值。
4.2 中文描述导出后变成乱码
这个问题出在编码上。Cadence默认用系统区域编码导出CSV,如果你的系统是中文Windows,默认可能是GB2312,但Excel打开时可能按UTF-8解析,就乱码了。解决办法有两个:一是导出时在Output Format旁边找Encoding选项,手动选UTF-8;二是导出后用记事本打开CSV,另存为时选UTF-8编码,再用Excel打开。
如果原理图里的Description字段有中文,我建议在导出前统一检查一遍,确保没有特殊字符(比如全角空格、中文引号),这些字符在某些Excel版本里会引发解析错误。
4.3 报错"Unable to find property"或导出文件为空
这个报错通常意味着Combined Property String里引用了原理图中不存在的属性名。比如你写了{MPN}但原理图里属性名是{Manufacturer Part Number},Cadence找不到就报错。解决方法是把Combined Property String里的字段名逐个和原理图属性对照,确保完全一致。
另一个可能是你选中的设计对象不对。Bill of Materials只能对顶层设计导出,如果你选中了某个Part或者某个Page,导出会失败。回到项目管理器,选中.dsn文件再试。
4.4 导出的BOM里混入了电源符号和测试点
电源符号(VCC、GND)和测试点(TP)在原理图里也是器件,默认会被导出到BOM里。但采购不需要买"GND",焊接厂也不需要焊"VCC"。解决办法是在这些符号的属性里加一个字段,比如"BOM_Ignore",值设为"YES",然后在Bill of Materials对话框的Filter选项里设置排除条件。
具体操作:在Combined Property String旁边有Filter按钮,点击后输入过滤条件,比如"BOM_Ignore != YES"。这样导出时就会自动跳过这些非实体器件。如果你用的是Cadence自带的电源符号库,可能需要手动给每个符号加这个属性,建议在项目初期就统一处理。
5. 让BOM导出一次成功的几个前置习惯
5.1 画原理图时就按BOM需求填属性
我现在的习惯是:放置任何一个器件时,第一时间把Value、PCB Footprint、Part Number、Description四个字段填完,再继续连线。这样虽然画图时多花几分钟,但导出BOM时零折腾。具体操作是放置器件后按Ctrl+E打开属性编辑器,或者直接在Place菜单里勾选"Place with Properties"。
对于电阻电容这类数量多的器件,可以用Capture的"Copy Properties"功能批量刷属性。先填好一个器件的属性,然后选中其他同类器件,右键Copy Properties,选择源器件,属性就批量复制过去了。这个功能比逐个手填快十倍。
5.2 用CIS数据库从源头保证属性一致性
如果你的团队有CIS(Component Information System)数据库,强烈建议所有器件都从数据库调用,而不是从自带库随便放。CIS数据库的好处是:每个物料的Part Number、Manufacturer、MPN、PCB Footprint都是预先审核过的,原理图工程师只能选不能改,从源头杜绝了属性填错的可能。
配置CIS需要IT和采购配合,把物料信息导入数据库,然后在Capture里配置ODBC连接。虽然前期投入大,但对于每年有多个项目的团队来说,这个投入很快就能通过减少BOM错误收回成本。
5.3 导出前跑一遍DRC和属性完整性检查
Cadence Capture有Design Rules Check功能,可以在Tools → Design Rules Check里运行。虽然DRC主要检查电气连接,但你可以在规则里勾选"Check Properties",让它顺便检查属性缺失。更直接的方式是导出BOM后,用Excel筛选空值:如果Part Number列有空单元格,说明有器件没填物料号;如果PCB Footprint列有空值,说明有器件没填封装。
我一般会在导出BOM后做三个筛选检查:Part Number为空的行、PCB Footprint为空的行、Quantity为0或空的行。这三个检查做完,BOM基本就是干净的。
6. 从BOM到采购与焊接的衔接细节
6.1 位号排序与焊接核对
Cadence导出的Reference列默认可能是按原理图放置顺序排列的,比如R1, R10, R100, R2这样。焊接厂核对位号时,这种排序很不友好。我通常会在Excel里把Reference列按自定义排序,让R1, R2, R3...R10这样顺序排列。具体操作是:选中Reference列,数据 → 分列 → 按逗号分隔,然后用Excel的排序功能按数值排序,最后再用TEXTJOIN合并回去。
如果位号数量多,手动操作太慢,可以用Python脚本处理:
def sort_refs(ref_str): refs = ref_str.split(',') # 提取字母前缀和数字 refs_sorted = sorted(refs, key=lambda x: (''.join(filter(str.isalpha, x)), int(''.join(filter(str.isdigit, x))) if any(c.isdigit() for c in x) else 0)) return ','.join(refs_sorted) df['Reference'] = df['Reference'].apply(sort_refs)这段代码把"R10,R2,R1"整理成"R1,R2,R10",焊接厂拿到后核对效率明显提升。
6.2 替代料与多来源物料的标注
采购经常需要替代料信息。Cadence的BOM默认不包含替代料字段,但你可以自己在原理图属性里加一个"Alternative"字段,或者在导出的Excel里手动补充。我的做法是在BOM最终版里加两列:"替代料1"和"替代料2",由硬件工程师在导出后填写。这样采购在缺料时可以直接参考,不需要反复找工程师确认。
6.3 版本管理与变更记录
BOM不是导出一次就完事了。原理图每次改动,BOM都要重新导出并记录变更。我建议在BOM文件名里带上版本号和日期,比如"ProjectA_BOM_V1.2_20250115.xlsx"。同时在Excel里加一个"Change Log"工作表,记录每次变更的内容:哪个位号、改了什么、为什么改、谁改的。这个习惯在项目后期排查物料问题时特别有用。
7. 一些零散但实用的经验补充
关于Cadence版本差异:16.6和17.4的Bill of Materials对话框布局略有不同,但核心逻辑一样。17.4在Output Format里多了直接导出xlsx的选项,但底层还是调Excel组件,稳定性问题依旧。如果你用的是17.4,建议还是走CSV中转。
关于Allegro侧的BOM:有些团队习惯在Allegro里导BOM而不是在Capture里导。Allegro的BOM是基于PCB上的器件生成的,好处是能反映实际布局后的位号,坏处是如果PCB还没布局完,BOM就不完整。我的建议是:设计阶段用Capture导BOM给采购备料,生产前用Allegro导一次做最终核对。
关于Excel模板:如果你经常做BOM,可以做一个Excel模板,把表头、格式、公式都预设好,每次导出CSV后直接粘贴到模板里,省去重复排版的时间。模板里可以预设好筛选、排序、条件格式(比如Part Number为空时标红),打开就能用。
最后说一个我踩过的坑:有一次导出的BOM里,某个电容的Value显示为"0.1uF/16V",但Part Number字段是空的。采购拿着这个BOM去询价,供应商问"你要哪个品牌的0.1uF/16V",采购答不上来,因为BOM里没有制造商信息。后来发现是原理图里这个器件的Manufacturer字段没填。从那以后,我在导出BOM前一定会检查Manufacturer和MPN这两列,确保没有空值。这个检查只需要在Excel里筛选一下空单元格,花不了十秒钟,但能避免后面几天的来回沟通。