在电子设计自动化(EDA)和机械设计领域,物料清单(Bill of Materials,简称 BOM)是连接设计、采购、生产和装配的核心文件。一个完整的 BOM 不仅需要列出所有元器件的详细信息,更需要清晰地展示这些元器件在最终产品中的物理装配关系。这就是“装配视图”的价值所在。很多工程师在导出基础 BOM 后,面对如何将原理图或 PCB 布局中的逻辑连接,转化为指导实际生产的装配层级结构时,常常感到无从下手。他们可能得到了一个包含位号、型号、数量的扁平列表,却不知道哪个部件属于哪个子板,或者多个相同型号的器件该如何区分安装位置。
本文将以一个典型的电子硬件开发流程为背景,深入讲解如何从设计文件(如 Cadence Allegro、Altium Designer 或 SolidWorks)出发,创建出结构清晰、信息准确的装配视图 BOM。我们将重点关注“创建”这一动作背后的逻辑、数据提取方法、层级构建规则以及最终输出的验证,而不仅仅是某个软件的点击操作。无论你是硬件工程师、PCB 设计师还是负责生产导入的工程师,都能通过本文理解从设计数据到可指导生产的装配 BOM 的全链路实践。
1. 理解 BOM 表与装配视图的核心关系
在深入操作之前,必须厘清几个核心概念,这是避免后续数据混乱的基础。
1.1 什么是 BOM 表?
BOM 表是构成一个产品所需的所有物料项目的结构化清单。一份基础的 BOM 通常包含以下关键字段:
- 位号 (Reference Designator): 如 R1, C2, U3,在电路板或装配图上唯一标识一个元器件的位置。
- 物料编码 (Part Number): 公司内部或供应商提供的唯一标识符,用于采购和库存管理。
- 描述 (Description): 物料的名称、规格说明,如 “10kΩ, 1%, 0805 Resistor”。
- 数量 (Quantity): 在该产品或装配层级中所需的数量。
- 封装 (Package/Footprint): 物料的物理外形和焊盘尺寸,如 0805, SOIC-8。
一个简单的 BOM 表示例(CSV 格式):
Reference, Part Number, Description, Quantity, Package R1, R-10K-0805, RES 10K OHM 1% 1/8W 0805, 1, 0805 C1, C-10uF-0805, CAP CER 10UF 10V X5R 0805, 1, 0805 U1, IC-MCU-STM32F103, MCU 32BIT ARM CORTEX-M3, 1, LQFP-48这种 BOM 是“扁平化”的,它列出了所有物料,但没有体现它们之间的组装关系。
1.2 为什么需要装配视图?
装配视图(有时也称为“层级化 BOM”或“制造 BOM”)在扁平 BOM 的基础上,引入了产品结构树的概念。它按照产品的实际物理组装顺序来组织物料。
核心价值在于:
- 指导生产装配: 明确告诉生产线先装子板 A,再将子板 A 装到主板 B 上。避免了物料混装和工序错误。
- 精确成本核算: 可以分别计算子装配体(如电源模块、显示模块)的成本,便于模块化定价和成本分析。
- 清晰的物料归属: 在多板卡(主板+子板)或包含外购模块(如 WiFi 模组)的产品中,能明确区分哪些物料属于哪个部件。
- 支持模块化设计与复用: 一个成熟的子装配体(如标准电源模块)可以被多个产品引用,只需在顶层 BOM 中引用该模块即可,无需重复列出其所有下级物料。
一个装配视图 BOM 的简化结构示例:
产品:智能网关 (P-1000) ├── 装配:主板 (ASSY-MAIN-01) │ ├── PCB: 主板裸板 (PCB-MAIN-REV1.2) │ ├── 物料: U1, MCU, ... (属于主板) │ ├── 物料: R1, R2, C1, C2, ... (属于主板) │ └── 装配: 电源子板 (ASSY-PWR-01) (作为一个整体被引用) │ ├── PCB: 电源板裸板 (PCB-PWR-REV1.0) │ ├── 物料: U10, PWM IC, ... (属于电源子板) │ └── 物料: L1, D1, ... (属于电源子板) ├── 装配: 外壳组件 (ASSY-ENCL-01) │ ├── 物料: 上盖 (PLASTIC-TOP) │ └── 物料: 下盖 (PLASTIC-BOTTOM) └── 物料: 螺丝 (SCREW-M3x5), 4个 (属于顶层)1.3 设计数据如何映射到装配视图?
这是创建装配视图的技术关键。映射关系依赖于设计工具中的信息:
- 原理图层次化设计: 在 Altium Designer 或 OrCAD 中,你可以用“子图”或“层次化框图”来表示一个功能模块(如电源)。这些子图会对应装配视图中的一个子装配体。
- PCB 中的器件层与装配层: 如 Allegro 中的
ASSEMBLY_TOP和ASSEMBLY_BOTTOM层定义了顶面和底面的装配图形。导出 BOM 时包含器件层信息,可以帮助区分顶贴和底贴器件,这对于生成面向 SMT 贴片的装配工位图至关重要。 - 机械装配体: 在 SolidWorks 中,装配体文件(
.sldasm)天然就是一棵结构树。其中的子装配体和零件直接对应 BOM 的层级。 - 位号前缀约定: 虽然不是绝对可靠,但常见的位号前缀有时用于暗示器件类型或所属模块(如
U代表 IC,J代表连接器,P代表插头等),可作为辅助判断信息。
注意: 设计工具的层级并不总是与制造装配层级完全一致。例如,原理图中为了绘图方便可能将多个模块画在一张图上,但生产时它们是独立的板卡。创建装配视图时,需要以实际物理组装方式为准,对设计数据进行重新组织和归并。
2. 环境准备与数据源梳理
创建装配视图 BOM 不是一个孤立的任务,它严重依赖于上游设计数据的完整性和规范性。在开始操作前,请完成以下准备工作。
2.1 设计文件与工具确认
首先,明确你的数据来源和所需工具:
| 设计领域 | 可能的设计工具 | 关键输出文件(用于 BOM) | 备注 |
|---|---|---|---|
| 电子电路 (ECAD) | Cadence Allegro/OrCAD, Altium Designer, KiCad, Mentor PADS | 原理图文件(.dsn,.SchDoc), PCB文件(.brd,.PcbDoc), 网表 | 核心数据源,提供位号、参数、封装、网络连接。 |
| 机械结构 (MCAD) | SolidWorks, AutoCAD, Fusion 360, Creo | 3D 装配体文件(.sldasm,.iam), 2D 工程图 | 提供外壳、支架、螺丝等非电子物料,以及装配关系。 |
| BOM 管理/ERP | Arena, Oracle Agile, SAP, 或自研系统 | 物料主数据、已有组件库、替代料信息 | 提供标准的物料编码、描述、供应商信息,确保 BOM 与公司物料系统一致。 |
行动清单:
- 定位最新版本: 确保你使用的是已发布或基线化的设计文件版本(如
PCB_Main_V1.2和SCH_Main_V1.2)。 - 检查设计完整性: 确保所有器件都有正确的位号、封装和必要的参数(如阻值、容值、芯片型号)。
- 统一命名规范: 检查原理图符号库、PCB 封装库、3D 模型库的命名是否一致且符合公司规范。
2.2 建立物料编码映射库
这是将设计参数转化为可采购物料的关键一步。你需要一个映射表(通常是一个 Excel 文件或数据库查询),将设计中的“描述”或“型号”映射到公司的“物料编码”。
示例映射表 (part_mapping.csv):
Designator_Prefix, Schematic_Part, Value/Model, Manufacturer, Internal_Part_Number, Description RES, RESISTOR, 10k, Yageo, R-10K-0805-1%-YAG, RES 10K OHM 1% 1/8W 0805 CAP, CAPACITOR, 10uF, Murata, C-10UF-10V-X5R-0805-MUR, CAP CER 10UF 10V X5R 0805 IC, MICROCONTROLLER, STM32F103C8T6, ST, IC-MCU-STM32F103-LQFP48-ST, MCU 32BIT ARM CORTEX-M3 64KB FLASH ...为什么需要这个?因为设计中的“10k”可能对应多个不同精度、功率、封装的电阻,采购必须依据唯一的物料编码。在创建 BOM 时,脚本或工具可以依据此映射表自动填充Part Number和标准Description。
2.3 定义装配层级规则
在开始导出数据前,必须和结构工程师、生产工程师共同确定产品的装配层级。例如:
- 层级 0 (产品): 最终可销售的完整产品。
- 层级 1 (主要装配体): 如主板总成、外壳总成、线束总成。
- 层级 2 (子装配体): 如主板上的电源模块(可能是一块独立的子板)、显示模块、射频模块。
- 层级 3 (PCB/裸板): 每一块需要贴片的印刷电路板本身也是一个“物料”。
- 层级 4 (元器件): 最底层的电阻、电容、芯片等。
将这套规则文档化,它将指导你如何对导出的原始数据进行分类和聚合。
3. 从设计工具导出原始 BOM 数据
现在,我们从设计工具中提取第一手数据。以Altium Designer和SolidWorks为例,这是两种最常见的数据源。
3.1 从 Altium Designer 导出包含层级信息的 BOM
Altium 的 BOM 导出功能非常强大,关键在于配置。
- 打开装配体项目: 确保你的
.PrjPcb项目文件已打开,并且所有原理图文档都已正确编译,无错误。 - 执行 BOM 导出: 菜单
Reports->Bill of Materials。 - 关键列配置: 在 BOM 对话框中,你需要将以下字段拖到“Grouped Columns”(用于创建层级)或“All Columns”(用于显示)区域:
Document: 原理图文档名。如果使用了层次化设计,不同子图的器件会归属不同文档,这是构建装配层级最重要的依据之一。Description,Designator,Footprint,QuantityPart Number: 如果已在原理图符号中填写了公司物料编码,则直接使用。Comment: 通常存放型号或参数值。Layer: 器件所在 PCB 层(Top/Bottom),用于区分贴装面。
- 分组与层级化: 将
Document字段拖入“Grouped Columns”的顶部。这样,BOM 会首先按原理图文档(即逻辑模块)进行分组,每个分组下再列出该模块的所有器件。这已经初步形成了基于设计逻辑的层级视图。 - 导出数据: 选择导出格式为
Excel或CSV,保存文件,例如BOM_Raw_From_Altium.csv。
导出的分组 BOM 片段可能如下:
Grouped By: [Document] - Document: Power_Supply.SchDoc Designator | Comment | Description | Footprint | Quantity U10 | LM2675 | SIMPLE SWITCHER... | SOIC-8 | 1 L1 | 22uH | Inductor | 1210 | 1 D1 | SS34 | Schottky Diode | SMA | 1 - Document: MCU_Board.SchDoc Designator | Comment | Description | Footprint | Quantity U1 | STM32F103| MCU | LQFP-48 | 1 R1, R2 | 10k | Resistor | 0805 | 23.2 从 SolidWorks 导出结构化 BOM
对于机械部件,SolidWorks 能直接生成带有装配层级的 BOM。
- 打开顶级装配体文件: 打开代表最终产品的
.sldasm文件。 - 插入表格: 在工程图环境或装配体环境中,选择
插入->表格->材料明细表。 - 配置 BOM 类型: 在材料明细表属性中,选择“仅限顶层”、“仅限零件”或“缩进”。创建装配视图必须选择“缩进”。这将生成一个树状结构的 BOM,清晰显示装配体、子装配体和零件的关系。
- 自定义列: 确保表格包含以下列:
项目号、数量、零件号(对应物料编码)、说明(描述)、材料等。 - 导出表格: 将材料明细表另存为
Excel文件,例如BOM_Raw_From_SW.xlsx。
导出的缩进 BOM 结构在 Excel 中看起来像这样:
项目号 | 零件号 | 说明 | 数量 1 | ASSY-TOP | 产品总成 | 1 1.1 | PCB-MAIN | 主板组件 | 1 1.1.1 | PCB-MAIN-REV1 | 主板裸板 | 1 1.1.2 | IC-MCU | 主控芯片 | 1 1.1.3 | R-10K | 10K电阻 | 5 1.2 | ENCLOSURE | 外壳组件 | 1 1.2.1 | PLASTIC-TOP| 塑料上盖 | 1 1.2.2 | PLASTIC-BOT| 塑料下盖 | 1 1.2.3 | SCREW-M3 | M3螺丝 | 43.3 处理 Allegro 等工具的导出
对于 Allegro,通常通过Tools->Reports功能导出 BOM。关键是要在报告设置中,勾选输出Ref Des、Comp Value、Part Number(来自元件属性)以及ASSEMBLY_TOP/ASSEMBLY_BOTTOM层的器件信息。这能帮助后续区分贴片面。导出的通常是文本文件,需要进一步用脚本或 Excel 进行解析和格式化。
4. 整合与构建装配视图 BOM
现在,我们有了来自 ECAD 和 MCAD 的原始数据。下一步是将它们整合,并按照第 2.3 节定义的物理装配规则进行重构。
4.1 数据清洗与标准化
将导出的 CSV/Excel 文件在 Excel 或 Python(使用 pandas 库)中进行处理。
常见清洗任务:
- 统一列名: 将
Designator、Ref Des、位号统一为Reference。将Part Number、零件号、物料编码统一为Part_Number。 - 处理多值单元格: ECAD 导出的 BOM 中,相同物料的设计位号可能合并为一个单元格,如
R1, R2, R3。为了后续处理,有时需要将其拆分为多行(每行一个位号),但保留相同的物料信息。这取决于下游 ERP 系统的要求。 - 应用物料映射: 使用 VLOOKUP 函数或 pandas 的
merge操作,根据Comment(型号)或Description(描述)去匹配part_mapping.csv,为每一行数据填充标准的Part_Number和Description。 - 标记数据来源: 新增一列
Source,标记该行数据来自Altium、SolidWorks还是Manual(手动添加的物料,如润滑脂、硅胶垫)。
4.2 构建装配结构树
这是核心步骤。你需要创建一个新的工作表或数据结构来代表装配视图。
手动构建(适用于简单产品):
- 新建一个 Excel 工作表,命名为
Assembly_BOM。 - 按照层级规则,从顶层产品开始,逐级创建“装配项”。
- 对于每个“装配项”,它包含两类内容:
- 子装配体: 引用另一个装配项(如“电源模块”)。
- 物料: 具体的元器件、标准件、原材料。
- 为每一行数据定义关键字段:
Level: 层级编号(如 1, 1.1, 1.1.1)Type: 类型(Assembly,Part,PCB)Item_Number: 项目号(如100,110,111)Part_Number: 物料编码(对于装配体,可以自定义一个编码如ASSY-PWR-01)Description: 描述Quantity: 数量(注意:此数量是相对于其父项的数量)Reference: 位号(仅对Part类型有效,且属于该装配体)Source_Assembly: 该物料所属的装配体(用于数据关联和校验)
示例Assembly_BOM工作表结构:
Level, Type, Item_Number, Part_Number, Description, Quantity, Reference, Source_Assembly 1, Assembly, 100, P-1000, 智能网关, 1, , 1.1, Assembly, 110, ASSY-MAIN-01, 主板总成, 1, , 100 1.1.1, PCB, 111, PCB-MAIN-REV1.2, 主板裸板, 1, , 110 1.1.2, Part, 112, IC-MCU-STM32F103, 主控芯片, 1, U1, 110 1.1.3, Part, 113, R-10K-0805, 10K电阻, 5, R1,R2,R3,R4,R5, 110 1.2, Assembly, 120, ASSY-ENCL-01, 外壳组件, 1, , 100 1.2.1, Part, 121, PLASTIC-TOP, 塑料上盖, 1, , 120 1.2.2, Part, 122, PLASTIC-BOT, 塑料下盖, 1, , 120 1.2.3, Part, 123, SCREW-M3x5, M3x5螺丝, 4, , 1204.3 使用脚本半自动化整合(进阶)
对于复杂产品或频繁更新的项目,建议使用 Python 脚本自动化此过程。
脚本工作流思路:
- 读取: 用
pandas读取清洗后的 ECAD BOM (df_ecad) 和 MCAD BOM (df_mcad)。 - 定义映射规则: 创建一个配置文件 (
rules.yaml),定义如何将原理图文档名(或位号前缀)映射到装配体。assembly_mapping: - source: “Power_Supply.SchDoc” # Altium 文档名 assembly_part_number: “ASSY-PWR-01” assembly_description: “DC-DC 电源模块” level: “1.1.4” # 在主板的层级下 - source_prefix: “J” # 位号以 J 开头 assembly_part_number: “ASSY-CONN-01” assembly_description: “连接器组件” level: “1.1.5” - 处理与归并: 脚本遍历
df_ecad的每一行,根据映射规则,将其Reference和Part_Number分配到对应的装配体下。同时,将df_mcad的数据作为独立的装配体或顶层物料插入。 - 生成结构树: 脚本按照层级顺序,输出最终的
Assembly_BOM.csv。
这种方法确保了数据的一致性和可追溯性,当设计变更时,只需重新运行脚本即可更新 BOM。
5. 验证、输出与导入 ERP
创建好的装配视图 BOM 必须经过严格校验才能投入使用。
5.1 完整性校验清单
在发布前,请逐项核对:
- [ ]数量守恒: 所有底层元器件的数量总和,是否等于各层级装配体数量乘以其内部用量的总和?可以用 Excel 公式验证。
- [ ]位号无遗漏: 从原始 ECAD BOM 导出的所有位号,是否都分配到了某个装配体中?是否存在“孤儿”位号?
- [ ]物料编码有效: 所有
Part_Number是否都能在公司的物料管理系统中找到?描述、规格是否匹配? - [ ]层级逻辑正确: 装配关系是否符合实际生产工艺?例如,螺丝是否确实用于固定对应的外壳?
- [ ]关键属性完整: 对于采购和生产,以下信息是否齐全?
- 制造商/供应商
- 封装/规格
- 是否有替代料
- 是否属于客户指定物料
5.2 生成最终交付物
根据下游用户的需求,生成不同格式的 BOM:
- 面向采购的扁平 BOM: 将装配视图 BOM “压平”,汇总所有唯一
Part_Number的总需求数量。这可以通过数据透视表轻松实现。 - 面向生产的装配指引 BOM: 保留完整层级,并可以附加更多信息,如每道工序的站位号、贴片坐标文件链接、装配示意图编号。
- 可视化装配图: 结合 Altium 的装配图输出或 SolidWorks 的爆炸视图,在 BOM 中引用相关图纸编号,实现图文关联。
5.3 导入 ERP/PLM 系统
这是最后一步,也是 BOM 数据“落地”的一步。通常需要将最终的Assembly_BOM.csv转换为 ERP 系统要求的特定模板格式。
关键注意事项:
- 字段映射: 确保你的 CSV 列名与 ERP 导入模板的列名完全一致。
- 数据格式: 注意数字、日期的格式,避免前导零丢失(如物料编码
00123变成123)。 - 父子关系字段: ERP 系统通常有
Parent_Item和Child_Item或Level字段来维护 BOM 结构。按照系统手册正确填写。 - 试导入: 先在测试环境进行导入,检查结构树是否正确建立,物料是否成功关联。
- 版本控制: 在 ERP 中,任何 BOM 变更都应生成新版本,并与设计文件版本号关联,确保可追溯。
6. 常见问题与排查路径
在实际操作中,你可能会遇到以下典型问题。
6.1 问题:导出的 BOM 中器件描述或参数缺失
- 现象: BOM 中
Description列为空,或Value值不正确。 - 可能原因:
- 原理图符号的属性未正确填写。例如,电阻的
Value属性未设置。 - 原理图库符号中,用于映射到 BOM 的字段名与 BOM 输出配置中的字段名不匹配。
- 器件属性被隐藏或未导出。
- 原理图符号的属性未正确填写。例如,电阻的
- 排查步骤:
- 在原理图中双击有问题的器件,检查其属性对话框,确认
Value、Description、Part Number等关键属性已填写。 - 检查原理图库中该符号的定义,确保相关属性存在且命名规范。
- 在 BOM 导出配置中,检查“All Columns”列表,确保包含了所需的属性字段(如
Parameter:Value)。
- 在原理图中双击有问题的器件,检查其属性对话框,确认
6.2 问题:装配视图中的数量计算错误
- 现象: 顶层产品所需物料总数,与各子装配体需求汇总数对不上。
- 可能原因:
- 重复计算: 同一个物料在多个子装配体中被错误地重复列出,且未考虑顶层数量。
- 层级数量因子错误: 子装配体 A 需要 2 个,其内部的电阻 R1 数量为 1。那么顶层对电阻 R1 的总需求应该是 2 * 1 = 2 个。计算脚本或公式错误。
- 虚拟件/外协件处理不当: 将实际需要采购的物料误标为“虚拟件”,导致未计入采购需求。
- 排查步骤:
- 使用 Excel 数据透视表,分别按扁平化和层级化方式汇总各
Part_Number的数量,对比差异。 - 逐级检查装配体数量。从最底层零件开始,向上逐级乘法计算,验证总数。
- 审查
Type字段,确认所有Part类型的项目都是真实物料,所有Assembly类型都不直接参与采购汇总。
- 使用 Excel 数据透视表,分别按扁平化和层级化方式汇总各
6.3 问题:位号无法归属到正确的装配体
- 现象: 在整合后的 BOM 中,某些器件的
Source_Assembly为空或错误。 - 可能原因:
- 映射规则 (
rules.yaml) 不完整,未能覆盖所有原理图文档或位号前缀。 - 设计变更后,新增了原理图文档或位号,但映射规则未更新。
- 位号命名不规范,导致基于前缀的规则失效(例如,连接器用了
CN而不是J)。
- 映射规则 (
- 排查步骤:
- 找出所有
Source_Assembly为空的记录。 - 回溯到原始 ECAD BOM,查看这些位号所在的原理图文档名。
- 更新映射规则文件,补充新的映射关系。
- 考虑在原理图设计规范中,明确位号前缀与功能模块的对应关系,从源头减少歧义。
- 找出所有
7. 最佳实践与扩展方向
7.1 设计阶段的前置规范
- 统一库管理: 建立公司统一的原理图符号库、PCB 封装库和 3D 模型库,并在符号中预定义好 BOM 相关属性(如
MPN、Manufacturer)。 - 推行层次化设计: 在原理图阶段就使用层次化图纸,使设计逻辑与装配逻辑尽可能对齐。
- 属性填写检查: 将关键属性(如
Value、MPN)的填写纳入设计评审环节。
7.2 BOM 管理流程自动化
- CI/CD 集成: 将 BOM 生成脚本集成到 Git 提交钩子或 CI 流水线中。每次设计文件更新,自动触发 BOM 生成、校验并发布到内部站点。
- 与 PLM 系统联动: 通过 API 将自动生成的 BOM 直接推送至 PLM 系统,创建变更单,减少人工录入错误。
- 差异对比报告: 脚本自动对比新旧版本 BOM,生成增、删、改的差异报告,便于快速评审。
7.3 扩展:面向不同角色的 BOM 视图
一个主 BOM 数据源,可以衍生出多种视图:
- 采购 BOM: 包含供应商、采购周期、单价、替代料信息。
- 制造 BOM: 包含工艺路线、工时、站位号、测试要求。
- 维修 BOM: 包含故障率、维修备件建议、关键物料标识。
- 成本 BOM: 关联最新采购价,实时计算产品材料成本。
创建装配视图 BOM 不是一次性的数据转换任务,而是一个需要设计、物料、生产等多部门协同的持续过程。其核心在于建立从设计数据到生产指令的准确、自动化的信息流。通过规范设计源头、利用工具脚本、严格执行校验,你可以将这项繁琐的工作转化为稳定可靠的工程实践,显著减少生产错误和沟通成本,为产品的顺利制造打下坚实基础。下一步,你可以尝试将本文的手动或脚本流程,封装成团队内部的一个标准化工具或模板,让每一位工程师都能更轻松地生成高质量的装配 BOM。