1. 为什么硬件工程师的BOM总在量产前夜翻车
做硬件这行十来年,我见过太多项目在原理图阶段顺风顺水,一到采购备料就炸锅。采购拿着BOM去询价,回来告诉你某个物料停产了、某个封装对不上、某个位号重复了,然后你打开Mentor Xpedition Designer一看,导出的BOM里Part Number一栏全是空白,或者同一颗料出现了三种不同的描述方式。这不是工具的问题,是流程和配置的问题。
Mentor Xpedition Designer(现在归入Siemens EDA体系)在原理图输入和PCB协同方面做得相当扎实,但它的BOM生成逻辑跟Altium Designer那种“一键出表”的思路不太一样。Xpedition更强调数据源头的一致性——也就是说,BOM的质量取决于你在原理图阶段对元件属性的填写规范程度。如果你只是画完图直接点“Export BOM”,大概率拿到的是一个需要手工整理半天的半成品。
这篇文章面向的是已经上手Xpedition Designer、但在BOM输出环节反复踩坑的硬件工程师。我会把我在多个量产项目中总结的5个核心技巧拆开讲清楚,每个技巧都附带具体的操作路径、参数配置逻辑,以及我实际踩过的坑。读完你至少能做到:导出的BOM直接发给采购不用返工,版本对比时能快速定位差异,封装信息自动带出不需要手工补。
先说一个基本认知:Xpedition的BOM不是“生成”出来的,而是“提取”出来的。你的原理图数据库里有什么,BOM里就有什么。所以所有技巧的核心都指向同一个方向——让数据在录入阶段就结构化、规范化。
2. 技巧一:从元件库源头锁定BOM字段映射关系
2.1 Xpedition的BOM字段到底从哪里来
很多人以为BOM的列是在导出时选择的,其实Xpedition的BOM字段映射在元件库(Central Library)阶段就已经决定了。每个Part在库中定义了一组属性(Properties),这些属性在原理图实例化时被继承到Design数据库里。导出BOM时,工具读取的是Design数据库中每个Component实例的属性值。
关键属性包括但不限于:
| 属性名 | 作用 | 是否必须 |
|---|---|---|
| Part Number | 采购料号 | 必须 |
| Description | 物料描述 | 必须 |
| Manufacturer | 制造商 | 推荐 |
| MPN | 制造商料号 | 推荐 |
| Value | 参数值(阻容感) | 必须 |
| Tolerance | 精度 | 推荐 |
| Package | 封装类型 | 必须 |
| RoHS | 环保标识 | 推荐 |
如果你在库里面没有定义这些属性,或者属性名拼写不一致(比如有的写“PartNumber”有的写“Part_Number”),导出BOM时就会出现列错位或者空值。我遇到过最离谱的情况是:同一个项目中两个工程师用了不同版本的库,导致同一颗电容在BOM里出现了两条记录,一条有料号一条没有。
2.2 在Central Library中批量规范属性的操作路径
打开Xpedition Library Manager,找到你的目标Part,进入Properties页签。这里有个技巧:不要一个一个Part去改,用Library Services里的“Update Properties”批量操作。具体步骤:
- 在Library Manager中筛选出所有需要修改的Part(可以按Part Type或Part Family筛选)
- 右键选择“Batch Edit Properties”
- 在弹出的表格中,将Part Number列映射到你的ERP料号字段
- 确认Package属性与PCB Footprint的对应关系
注意:批量修改前务必备份库文件。Xpedition的库修改是不可逆的,一旦写错属性映射,所有引用该Part的原理图都会受影响。
我通常会在库中额外定义一个“BOM_Group”属性,用来控制同一颗料在不同项目中的分组方式。比如一颗0欧姆电阻,在A项目中作为跳线使用,在B项目中作为配置电阻使用,通过BOM_Group属性可以控制它在BOM中是否合并显示。这个技巧在物料种类多、用量大的项目中特别管用。
2.3 属性映射的验证方法
改完库之后,不要急着导BOM。先在原理图中随便选一个元件,打开Properties对话框,确认你定义的属性都正确显示出来了。然后做一个测试导出:File → Export → BOM,选择CSV格式,打开看看列名和值是否对应。
如果发现某个属性没有带出来,检查两个地方:一是库中该属性的“Visible”选项是否勾选(有些属性默认隐藏,导出时会被忽略);二是Design的Setup中是否启用了“Include Library Properties”选项。这个选项在Setup → Project Settings → BOM选项卡里,默认是关闭的,需要手动打开。
3. 技巧二:用Variant Manager管理多版本BOM而不出错
3.1 为什么你的版本对比总是对不上
硬件项目经常需要出多个版本的BOM:基础版、高配版、客户定制版。很多人的做法是复制一份原理图然后手动改,结果改着改着就乱了——哪个版本改了哪个电阻、哪个版本删了哪个电容,全靠记忆。Xpedition内置的Variant Manager就是专门解决这个问题的,但用不好反而更乱。
Variant Manager的核心逻辑是:所有版本共享同一份原理图数据库,每个Variant只记录“与基础版本的差异”。比如基础版有100个元件,高配版增加了10个、删除了2个、修改了5个参数,Variant Manager只存储这17处差异。导出BOM时,工具会自动合并基础数据+差异数据。
3.2 创建和配置Variant的完整流程
在Xpedition Designer中打开你的项目,进入Setup → Variant Manager。首次使用需要先创建一个Base Variant(基础版本),然后基于它派生其他版本。
具体操作:
- 点击“New Variant”,命名为“Base”
- 确认所有元件都处于“Fitted”状态(默认状态)
- 再点击“New Variant”,命名为“High_End”,选择“Copy from Base”
- 在High_End Variant中,找到需要删除的元件,将其状态改为“Not Fitted”
- 对于需要修改参数的元件,在Variant列中覆盖Value值
这里有个容易忽略的细节:Variant Manager中的“Not Fitted”和“Deleted”是两种不同状态。Not Fitted表示PCB上不焊接但位号保留,Deleted表示从BOM中完全移除。如果你只是不想焊某颗料但想保留位号方便调试,用Not Fitted;如果是客户定制版确实不需要这颗料,用Deleted。
3.3 导出指定Variant的BOM
配置好Variant之后,导出BOM时需要在Export对话框中选择目标Variant。默认导出的是Base Variant,如果你不手动切换,导出的就是基础版BOM。这个坑我踩过——给客户发了高配版的原理图,结果BOM是基础版的,采购按基础版备料,产线按高配版焊接,缺了十几颗料。
导出路径:File → Export → BOM → 在Variant下拉框中选择目标版本 → 勾选“Include Variant Differences” → 导出。
提示:建议在BOM文件名中强制包含Variant名称,比如“ProjectX_High_End_BOM_20250101.csv”。Xpedition默认不会自动加Variant后缀,需要手动命名或者在Export脚本中配置。
3.4 版本对比的实用技巧
当两个Variant的差异较多时,肉眼对比BOM很容易漏。我通常用Excel的VLOOKUP做交叉验证:把两个Variant的BOM分别导出,以Part Number为关键列,用VLOOKUP查找另一个表中是否存在,再对比Quantity列是否一致。
更高效的方式是使用Xpedition自带的“Variant Comparison”功能:在Variant Manager中选中两个Variant,点击“Compare”,工具会生成一份差异报告,列出所有状态不同、参数不同、数量不同的元件。这份报告可以直接作为ECN(工程变更通知)的附件。
4. 技巧三:封装信息自动带入BOM的配置方法
4.1 封装信息为什么总是缺失
BOM里没有封装信息,采购就没法确认物料能不能贴片。Xpedition中封装信息(Package)的传递链路是:Library中的Part定义 → Schematic中的Component实例 → BOM导出。这条链路上任何一环断了,封装信息就丢了。
最常见的情况是:工程师在画原理图时直接从“Place Component”里选了一个通用符号,没有关联具体的Part Number,导致这个元件在BOM中只有Symbol信息没有Package信息。另一种情况是Part定义了Package属性,但属性值为空或者写的是“TBD”。
4.2 在原理图阶段强制关联封装的检查方法
画完原理图后,不要直接导BOM。先运行一次“Design Rule Check”(DRC),在检查规则中启用“Missing Package”检查项。具体路径:Setup → Design Rules → 勾选“Component Package Check”。
DRC跑完后,在Output窗口中会列出所有Package为空的元件。逐个双击定位到原理图中的位置,打开Properties,在Package栏中填入正确的封装名称。封装名称必须与PCB库中的Footprint名称完全一致,大小写敏感。
我习惯在项目初期就建立一个“封装对照表”,把常用元件的封装名称固定下来。比如:
| 元件类型 | 封装名称 | 备注 |
|---|---|---|
| 0402电阻 | RESC0402 | 统一用RESC前缀 |
| 0603电容 | CAPC0603 | 统一用CAPC前缀 |
| SOT-23 | SOT23 | 不带后缀 |
| QFN-32 | QFN32_5X5 | 带尺寸信息 |
这张表贴在工位上,画图时随时对照,比事后补要省事得多。
4.3 用Export Script自动填充封装字段
如果项目已经画完了才发现封装信息缺失,手动补太慢。Xpedition支持用脚本批量处理。在Design中打开Script Editor,写一段简单的脚本遍历所有Component,检查Package属性是否为空,如果为空则根据Part Number从库中反查并填充。
脚本逻辑大致如下(伪代码):
foreach component in design: if component.Package is empty: part = library.find(component.PartNumber) if part is not null: component.Package = part.Package else: log warning "Part not found in library"Xpedition的脚本语言基于VBScript或Python(取决于版本),具体API参考安装目录下的Scripting Guide。这个脚本我用了好几年,每次接手别人画了一半的项目时特别管用。
5. 技巧四:BOM分组与合并规则的精细控制
5.1 默认分组逻辑的局限性
Xpedition默认的BOM分组逻辑是按Part Number合并,相同Part Number的元件合并成一行,Quantity累加。这个逻辑在大多数情况下没问题,但遇到以下场景就会出问题:
- 同一颗料在不同位置需要不同的描述(比如一颗电阻在电源部分和在信号部分的功能描述不同)
- 同一颗料需要按Tolerance分组(比如1%精度的和5%精度的分开采购)
- 同一颗料在不同Variant中状态不同(有的焊接有的不焊接)
默认逻辑处理不了这些场景,需要手动配置分组规则。
5.2 自定义BOM Group属性的配置步骤
在Library中为每个Part定义一个“BOM_Group”属性,属性值可以自由定义。比如:
- 电阻:BOM_Group = “RES_” + Tolerance + “_” + Package
- 电容:BOM_Group = “CAP_” + Dielectric + “_” + Voltage
然后在BOM导出配置中,将分组依据从“Part Number”改为“BOM_Group”。这样导出的BOM就会按照你定义的规则分组,而不是简单按料号合并。
配置路径:Setup → Project Settings → BOM → Grouping → 选择“Custom Grouping” → 在Group By栏中选择“BOM_Group”属性。
5.3 处理“同一料号不同描述”的实战案例
我曾经做过一个项目,用到了一颗双向TVS管,在USB接口处作为ESD保护,在电源入口处作为浪涌保护。同一颗料,但采购需要知道两个位置的不同用途,因为失效模式不同。
解决方案:在原理图中为这两个元件实例分别填写“Function”属性,USB处的填“ESD_Protection”,电源处的填“Surge_Protection”。然后在BOM导出时,将“Function”列加入输出字段,分组依据设为“Part Number + Function”。这样BOM中会出现两行,料号相同但Function不同,采购一看就明白。
注意:这种分组方式会导致同一颗料的采购总量被拆分成两行,采购下单时需要手动合并。建议在BOM备注栏中注明“Total Quantity = Sum of both rows”,避免采购漏单。
5.4 不焊接元件的BOM处理策略
调试阶段经常有一些“预留但不焊接”的元件。这些元件在BOM中如何处理?我的做法是:
- 在原理图中将这些元件的“Fitted”属性设为“No”
- 在BOM导出配置中,勾选“Include Not Fitted Components”但将其Quantity设为0
- 在BOM中单独用一列“Fitted”标记Yes/No
这样采购看到Quantity=0就知道不需要备料,但BOM中保留了位号和料号信息,方便后续调试时补焊。
6. 技巧五:BOM导出后的自动化校验与版本对比
6.1 导出BOM时必须检查的五个字段
BOM导出为CSV后,不要直接发给采购。先做一轮快速校验,重点检查以下五个字段:
- Part Number:是否有空值?是否有重复?
- Quantity:总和是否与原理图中的元件总数一致?
- Package:是否有“TBD”或空值?
- Description:是否有乱码或截断?
- Manufacturer/MPN:是否完整?
我通常用Excel的条件格式快速标记异常值:选中Part Number列,设置“空值”高亮;选中Quantity列,设置“小于1”高亮。两分钟就能扫一遍。
6.2 用Excel做BOM版本对比的实用公式
当项目迭代时,需要对比新旧BOM的差异。把两个版本的BOM分别放在Sheet1和Sheet2中,在Sheet3中用以下公式做对比:
- 查找新增元件:
=IF(ISNA(VLOOKUP(A2,Sheet1!A:A,1,FALSE)),"新增","") - 查找删除元件:
=IF(ISNA(VLOOKUP(Sheet1!A2,Sheet2!A:A,1,FALSE)),"删除","") - 查找数量变化:
=IF(VLOOKUP(A2,Sheet1!A:B,2,FALSE)<>B2,"数量变化","")
这三个公式组合起来,五分钟就能生成一份完整的差异报告。比人工对比快得多,而且不会漏。
6.3 建立BOM模板减少重复劳动
每次导出BOM都要手动调整列顺序、添加表头、设置格式,太浪费时间。我的做法是做一个BOM模板文件(.xlsx),里面预设好:
- 列顺序:Item、Part Number、Description、Package、Quantity、Manufacturer、MPN、Fitted、Notes
- 表头格式:加粗、冻结首行、自动筛选
- 条件格式:Quantity=0时整行变灰,Part Number为空时变红
导出CSV后,直接用“数据 → 从文本导入”把CSV数据导入模板的指定区域,格式自动套用。这个模板我用了五年,每次导BOM能省至少十分钟。
6.4 与采购和产线协同的注意事项
BOM最终是给采购和产线用的,所以导出格式要考虑他们的使用习惯。我总结了几条经验:
- 采购喜欢按Manufacturer分组,方便询价。可以在BOM中增加一个“Manufacturer”排序,或者单独导出一份按制造商分组的版本。
- 产线喜欢按位号排序,方便贴片机编程。Xpedition支持导出“位号列表”格式的BOM,每个位号单独一行,适合产线使用。
- 如果公司有ERP系统,确认BOM的列名与ERP导入模板一致。不一致的话,在Excel中做一次列名映射,保存为ERP专用的BOM模板。
提示:Xpedition的BOM导出支持“Report”格式,可以自定义输出模板(.rpt文件)。如果公司有固定的BOM格式要求,建议花时间配置一个Report模板,以后一键导出就是最终格式,不需要再手工调整。
7. 我在实际项目中踩过的三个坑
第一个坑是关于属性名大小写的。Xpedition的属性名是大小写敏感的,我在库中定义的是“PartNumber”,但在原理图中手动添加属性时写成了“Partnumber”,导出BOM时工具认不出这是同一个属性,结果BOM里出现了两列,一列有值一列空。后来我养成了一个习惯:所有属性名统一用驼峰命名法,并且在库中定义好之后,原理图中只从下拉列表选择,不手动输入。
第二个坑是关于Variant的继承关系。我创建了一个Variant叫“Customer_A”,基于Base修改了若干元件。后来Base更新了,增加了几个新元件,但Customer_A没有自动继承这些新增元件。原因是Variant Manager中的继承是“快照式”的,创建时的状态被锁定,后续Base的修改不会自动同步。解决办法是:Base更新后,手动在Variant中执行“Sync with Base”操作,把新增元件同步过来。
第三个坑是关于BOM中的中文描述。Xpedition默认的CSV导出编码是ANSI,如果Description中有中文,用Excel打开会乱码。解决方法是在Export设置中将编码改为UTF-8,或者在Excel中用“数据 → 从文本导入”时手动选择UTF-8编码。这个坑看起来小,但每次新同事都会踩一遍。
8. 把这五个技巧串成一条流水线
单独用某一个技巧能解决特定问题,但真正高效的做法是把它们串成一条标准流水线。我的项目流程是这样的:
项目启动时,先在Central Library中规范所有Part的BOM相关属性(技巧一)。画原理图过程中,同步创建Variant(技巧二),每增加一个版本就配置一次。画完后跑DRC检查封装完整性(技巧三),用脚本批量修复缺失的Package。导出BOM前,配置好分组规则(技巧四),确保同一料号按功能或参数正确分组。导出后,用Excel模板做校验和版本对比(技巧五),确认无误再发给采购。
这条流水线跑顺了之后,一个中等规模的项目(500-1000个元件)从画完原理图到发出BOM,大概只需要半天时间。相比之前手工整理需要两三天,效率提升是实实在在的。
最后分享一个小习惯:我会在项目文件夹中保留一份“BOM_History”子文件夹,每次导出的BOM都按日期命名存档。这样当采购说“上次那个版本的BOM里有个料号写错了”时,我能快速翻出历史版本对比,而不是靠记忆去猜。这个习惯看起来不起眼,但在项目复盘和问题追溯时特别有用。