量産・品質・認証

BOM(部品表)

製品に必要な部品の一覧リスト。

概要

BOM(Bill of Materials:部品表)とは、製品を構成するすべての部品・材料・コンポーネントを階層的にリストアップした文書のことである。組み込み機器の開発において、BOMは設計・調達・製造・コスト管理のすべての基盤となる最重要文書の一つである。

BOMには以下の情報が記載される。

項目説明
RefDes(参照番号)回路図上の部品識別子(R1、C3、U5など)
部品名称部品の一般名称(抵抗、コンデンサ、MCUなど)
MPN(Manufacturer Part Number)メーカー型番(品質保証の基準)
メーカー名部品メーカー名
数量1台あたりの使用数量
実装指定実装(Mount)/ 非実装(DNP/DNI)の別
代替品代替可能な他社品の型番
調達先承認済みサプライヤー
単価量産ロット時の単価(見積ベース)

歴史・背景

BOM(部品表)の概念自体は製造業全般に古くから存在するが、電子機器分野でのBOMが重要性を増したのは、1970〜80年代に電子部品の種類と数量が爆発的に増加してからである。

当初はExcelスプレッドシートによる管理が主流であったが、製品の複雑化とともにPDM(Product Data Management)やPLM(Product Lifecycle Management)ツールが登場し、BOMのバージョン管理・変更管理・承認フローが体系化された。

組み込み機器向けには、KiCadやAltium Designerなどの回路CADツールから直接BOMを出力する機能が標準化されており、設計データとBOMの整合性が保たれるようになっている。

近年はRoHS規制(有害物質使用制限)、REACH規制(化学物質管理)、紛争鉱物規制(Dodd-Frank法)などへの対応として、BOMに環境・法規制情報を統合管理する動きが広まっている。


技術仕様

BOMの階層構造

複雑な組み込み機器では、BOMが階層構造を持つ。

製品BOM(トップレベル)
├── PCB ASSY(基板アセンブリ)
│   ├── 電子部品(R/C/L/IC)
│   ├── コネクタ類
│   └── 機構部品(スペーサー、ネジ)
├── 筐体ASSY(ケースアセンブリ)
│   ├── 上ケース(射出成型品)
│   ├── 下ケース(射出成型品)
│   └── ガスケット(防水部品)
├── ケーブルハーネス
└── 付属品(ACアダプタ、取説)

BOMフォーマットの例

実際のBOMはCSV/Excelで管理されることが多い。

RefDes,Value,MPN,Manufacturer,Qty,Package,Mount,Alt_MPN,Supplier,Unit_Price
U1,STM32F405RGT6,STM32F405RGT6,ST,1,LQFP64,Y,,DigiKey,620
U2,ESP32-WROOM-32E,ESP32-WROOM-32E,Espressif,1,SMD,Y,,Mouser,380
C1,100nF 50V X5R,GRM188R61H104KA93D,Murata,1,0603,Y,GRM188R61H104KA93J,DigiKey,12
C2,100nF 50V X5R,GRM188R61H104KA93D,Murata,1,0603,Y,,DigiKey,12
R1,10k 1% 1/10W,RC0603FR-0710KL,Yageo,1,0603,Y,RK73H1ETTP1002F,DigiKey,5
R2,DNP,,,1,0603,N,,,0
L1,10uH 1A,LQH32CN100K23L,Murata,1,1210,Y,,DigiKey,85
J1,USB Type-C,USB4125-GF-A,GCT,1,SMD,Y,,DigiKey,120

EBOM vs MBOM

BOMには目的によって2種類がある。

種類名称目的管理者
EBOMEngineering BOM設計・電気的仕様の管理設計エンジニア
MBOMManufacturing BOM製造工程・実装の管理製造エンジニア

EBOMは回路CADから出力され、MBOMは製造工程の観点(実装順序、工程分割など)で再構成される。


動作原理

BOM生成の自動化

KiCadなどの回路CADツールでは、回路図からBOMを自動生成できる。

# KiCad BOM生成スクリプトの例(bom_csv_grouped.py)
import csv
import sys
from pathlib import Path

def generate_bom(netlist_file, output_file):
    """
    KiCadネットリストからBOMを生成する
    同一MPN部品をグループ化してRefDesをまとめる
    """
    # コンポーネント一覧の読み込み
    components = parse_kicad_netlist(netlist_file)
    
    # MPN単位でグループ化
    grouped = {}
    for comp in components:
        mpn = comp.get('MPN', comp['value'])
        if mpn not in grouped:
            grouped[mpn] = {
                'MPN': mpn,
                'Value': comp['value'],
                'Manufacturer': comp.get('Manufacturer', ''),
                'Package': comp['footprint'],
                'RefDes': [],
                'Qty': 0,
                'DNP': comp.get('DNP', 'N') == 'Y'
            }
        grouped[mpn]['RefDes'].append(comp['ref'])
        grouped[mpn]['Qty'] += 1
    
    # CSV出力
    with open(output_file, 'w', newline='') as f:
        writer = csv.DictWriter(f, fieldnames=[
            'RefDes', 'Qty', 'Value', 'MPN', 'Manufacturer', 'Package', 'Mount'
        ])
        writer.writeheader()
        for mpn, data in sorted(grouped.items()):
            writer.writerow({
                'RefDes': ', '.join(sorted(data['RefDes'])),
                'Qty': data['Qty'],
                'Value': data['Value'],
                'MPN': data['MPN'],
                'Manufacturer': data['Manufacturer'],
                'Package': data['Package'],
                'Mount': 'N' if data['DNP'] else 'Y'
            })
    
    print(f"BOM generated: {len(grouped)} line items")

コスト計算

BOMを基にした原価計算(BOM Costing)は量産採算性の評価に使われる。

def calculate_bom_cost(bom_csv, quantity=1000):
    """
    量産ロット数に応じたBOM原価計算
    部品は数量が多いほど単価が下がる(スケールメリット)
    """
    total_cost = 0
    cost_breakdown = []
    
    with open(bom_csv) as f:
        reader = csv.DictReader(f)
        for row in reader:
            if row['Mount'] == 'N':  # DNP部品は除外
                continue
            
            # 数量割引を考慮した単価取得
            unit_price = get_quantity_price(row['MPN'], quantity)
            line_cost = unit_price * int(row['Qty'])
            total_cost += line_cost
            
            cost_breakdown.append({
                'RefDes': row['RefDes'],
                'MPN': row['MPN'],
                'Qty': row['Qty'],
                'Unit': unit_price,
                'Total': line_cost
            })
    
    print(f"BOM Cost at {quantity} units: ¥{total_cost:.0f}/unit")
    print(f"Total for {quantity} units: ¥{total_cost * quantity:.0f}")
    return total_cost, cost_breakdown

用途・ユースケース

量産時の部品調達管理

量産時にはBOMをベースに全部品の調達を管理する。特に以下の観点でBOM管理が重要となる。

調達管理における BOM 活用:
1. 長納期部品の早期発注
   - リードタイム52週以上: MCU・FPGAなど半導体
   - リードタイム26週以上: 特殊コンデンサ・コイル
   
2. EOL(製品寿命終了)部品の代替品確保
   - 設計段階で代替品をBOMに記載しておく
   
3. ロット管理・入荷検査
   - 部品ロット番号のトレーサビリティ管理

4. 在庫管理
   - 最低在庫水準(安全在庫)の設定

コストダウン活動

BOMはコストダウン活動(VE:Value Engineering)の出発点でもある。

コストダウン検討項目:
- 高コスト部品の代替品探索
- 部品の統合(複数部品を1部品に統合)
- DNP部品の削除(不要機能の廃止)
- 別機種との部品共通化
- 海外調達品への切り替え

RoHS/REACHコンプライアンス対応

欧州向け輸出には有害物質に関する規制への対応が必要であり、BOM上でコンプライアンス情報を管理する。

環境規制BOM管理項目:
- RoHS対応可否(鉛/水銀/カドミウムなど6物質)
- REACH SVHC(高懸念物質)含有確認
- 紛争鉱物(タンタル/スズ/タングステン/金)の原産地確認
- 梱包材のハロゲンフリー対応

実装・開発のポイント

BOMのバージョン管理

BOMはGit等でバージョン管理するか、PLMツールで変更履歴を管理する。設計変更(ECO:Engineering Change Order)発行のたびにBOMを更新し、過去バージョンを保持することが重要である。

BOMバージョン管理のベストプラクティス:
- バージョン番号をファイル名に含める(bom_v1.2.3.csv)
- 変更箇所をチェンジログに記録する
- EBOM → MBOM の変換ルールを文書化する
- リリースBOMにはフリーズ(変更禁止)処理を行う

共通部品ライブラリの構築

設計チームで共通の部品ライブラリを構築することで、BOMの品質と調達効率が向上する。

# 部品ライブラリの管理構造例(JSON)
component_library = {
    "R_0603_10K": {
        "description": "チップ抵抗 10kΩ 1% 1/10W 0603",
        "primary_mpn": "RC0603FR-0710KL",
        "primary_maker": "Yageo",
        "alternate_mpn": ["RK73H1ETTP1002F"],  # KOA Speer
        "package": "0603",
        "rohs": True,
        "approved": True,
        "stock_min": 5000  # 安全在庫数量
    },
    "C_0603_100NF_50V": {
        "description": "積層セラミックコンデンサ 100nF 50V X5R 0603",
        "primary_mpn": "GRM188R61H104KA93D",
        "primary_maker": "Murata",
        "alternate_mpn": ["CL10B104KA8NNNC"],  # Samsung
        "package": "0603",
        "rohs": True,
        "approved": True,
        "stock_min": 10000
    }
}

設計段階での調達性確認

設計段階でOctopart・DigiKey・Mouserなどの在庫APIを活用し、部品の調達可能性をリアルタイムで確認する。

import requests

def check_availability(mpn, quantity_needed):
    """
    Octopart APIで部品の在庫・価格を確認
    """
    url = "https://octopart.com/api/v4/rest/parts/search"
    params = {
        "apikey": "YOUR_API_KEY",
        "q": mpn,
        "include[]": "offers"
    }
    
    response = requests.get(url, params=params)
    data = response.json()
    
    if not data['results']:
        return {"available": False, "reason": "Not found"}
    
    part = data['results'][0]['item']
    total_stock = sum(
        offer['inventory_level'] 
        for seller in part.get('sellers', [])
        for offer in seller.get('offers', [])
    )
    
    return {
        "available": total_stock >= quantity_needed,
        "total_stock": total_stock,
        "needed": quantity_needed,
        "surplus": total_stock - quantity_needed
    }

他技術との比較

観点BOMCAD部品ライブラリERP部品マスタ
対象製品単位の部品一覧設計用部品定義購買・在庫管理
管理者設計/製造エンジニア設計エンジニア購買/生産管理
ツールExcel/PLM/CADKiCad/AltiumSAP/Oracle
変更頻度製品ライフサイクル中設計時都度更新
主な用途調達・製造・コスト管理回路設計購買・在庫

BOMはEMSへ量産を委託する際に最初に提出する基礎資料であり、BOMの品質が量産の成否を大きく左右する。また試作段階から正確なBOMを維持管理することが、スムーズな量産移行につながる重要な実践である。

関連用語

参考リンク