
1. 站位表与BOM的“翻译关系”先弄明白我们到底在校验什么上个月我一个做SMT工艺的朋友碰到一起批量错料事故一批2000位号的双面板准备转批量工程师排好站位表下到产线夜班操作员按表装料结果主芯片I2C上拉电阻的10K被贴成了100K200多片板子过了回流焊直到AOI报警才停下来。查根因的时候发现特别讽刺——设计改版后BOM里已经把10K改成了100K但排站位的人手里拿的还是旧版BOM手动改表时改错了一个单元格整个流程里没有任何一道关卡能把这个问题拦下来。这年头谈智能制造大家都盯着设备联网、看板大屏、MES工单但站位表这种把设计BOM翻译成产线上料指令的关键环节很多厂还在用Excel手搓加肉眼核对。站位表出了问题什么数字化工单都救不回来因为贴片机本身完全不知道自己吸的是错料它会很听话地把错料贴到每一块板子上。说到底站位表是设计数据到制造执行之间的一次翻译。BOM是设计意图的“原文”贴片机程序是交给机器的“指令”站位表是给操作员看的“上料地图”。翻译出错的本质是原文、指令、地图三者之间没有任何一条自动对账的线。我这两年在几个工厂推站位表自动生成和自动与BOM校验最深的体会是这个问题的难点从来不是Excel公式会不会写而是愿不愿意承认“人肉翻译设计数据”这件事已经超出了人的可靠性边界。这篇文章就把这件事完整拆开站位表该怎么自动生成自动与BOM校验的规则要怎么设计以及落地过程中那些文档里不会写的坑。2. 站位表不是“排顺序”那么简单先理解数据从哪来、到哪里去2.1 位置SMT产线的装料地图到底是什么在SMT领域站位表通常叫Feeder Setup Table或者上料表核心内容是一张二维映射飞达槽位号站位号对应什么物料。一台贴片机少的几十个站位多的两三百个整条线通常还是高速机加泛用机组合物料被分散在多台机上。操作员换线时手里拿着站位表把对应盘料装到指定飞达上再插到机台对应槽位。这一步如果出错机器不会报警它只会按照程序设定去吸那颗料然后贴到板上。所以站位表在工厂里其实承担着双重角色对操作员来说它是装料作业指导书对工艺工程师来说它是物料齐套、损耗核算、改版追溯的基础依据。很多厂只把它当一张“给产线看的纸”忽略了它作为数据资产的属性这是后面所有混乱的根源。2.2 手工排站位表为什么必然会出错手工排站位的典型流程是工艺员把BOM从设计软件导出来按封装、料号、规格分组再对着贴片机当前的空闲站位表一个个填进去。这个过程有四个长期存在的失控点我一个个说。第一个是BOM格式不统一。客户发来的BOM可能是Excel也可能是PDF、TXT位号可能写成“R1,R2,R3”也可能写成“R1-R100”甚至一行里混着电阻电容。每位工程师手工整理一遍结果千差万别后面所有自动化的第一步工作其实都是在填这个坑。第二个是版本管理靠文件名。收到“BOM_V1.2”“BOM_Final”“BOM_Final2”之后到底哪一版和生产通知单一致全凭记忆。改版后某个位号的规格变了站位表没同步更新这是工厂里最常见的批量事故源头。每次出了事翻聊天记录查邮件查到天亮。第三个是替代料和共用料。同一颗物料可能有多个供应商料号BOM里写主料加替代料但站位表只列主料。主料库存不够仓库按替代料发料操作员在站位表上找不到料号一着急就“灵活处理”错误就此埋下。还有多个位号共用同一卷料带的情况例如整板上几十个100nF 0402电容共用一盘料到底够不够贴完这批板子不经过数量汇总根本估不出来。第四个是校验靠肉眼。站位表做出来之后工艺员打印出来拿一支笔对着BOM一栏一栏划。2000位号的板子划下来一两个小时人早就麻了。更关键的是这种核对在本质上是一种抽样检查它只能发现你能想到要查的问题发现不了逻辑层面的系统性错误比如某一列整体错位、某段位号被静默删除。3. 自动生成站位表的第一步把三份数据源整理成可计算的表格3.1 BOM、坐标文件、机台配置三份数据一个都不能少自动生成站位表的输入不是只有BOM。我通常明确要求工艺员准备三份数据缺一份后面都会卡壳。第一份是设计BOM。最理想的是从Altium Designer、Cadence、KiCad等EDA工具直接导出的标准格式字段至少包含位号、料号MPN、规格值、封装、数量双面板还要有顶底层信息。需要注意的是不同EDA工具导出的字段名不一样AD里叫DesignatorAllegro里叫RefDes拿到手第一件事是统一字段名我习惯统一成“位号”“料号”“规格”“封装”“数量”五列。第二份是坐标文件CPL也叫取放文件。坐标文件里有每个位号的X/Y坐标、旋转角度、所在层、封装名。生成站位表为什么需要坐标文件因为站位表不只是“把料分组”它还要决定供料方式和贴装次序。同一个规格的料分散在顶底两层可能需要分别配站坐标文件还能反过来校验BOM的完整性——BOM里列了但坐标文件里找不到的位号多半是BOM垃圾数据或者改版漏删了。第三份是机台配置和飞达库存。每台贴片机支持的飞达类型不一样8mm、12mm、16mm、24mm每种能装的料带宽度和供料步距不同。同时还要知道当前线体有多少空闲站位哪个站位被某款固定共用料长期占用。这份表在Excel里可以很简单两列站位号、可用状态。但如果没有这份表自动排出来的站位很可能落到一个已经被占用的槽位上。提示三份数据建议都放进同一个Excel工作簿表名固定为“源_BOM”“源_CPL”“源_机台配置”后面所有公式和宏都按固定表名引用。这样每次换新板子只需要覆盖源数据结果表自动重算不会因为行数变化导致引用断裂。3.2 位号展开与唯一键设计自动化遇到的第一道算术题拿到原始BOM之后最脏的活是把位号展开。我见过的位号写法有七八种逗号分隔、空格分隔、连字符区间、换行分隔还有“R1,R2 R5-R10”这种混写的。自动化的第一步就是把这些写法统一展开成“一料一行”。拆完之后每行就是“位号料号规格封装”的一条完整记录。接下来以“料号规格封装”三个字段作为唯一键做聚合把相同物料的位号合并回一个单元格这样后面排站位时才能知道哪些位号共用同一盘料。关键点在于唯一键必须同时包含三个字段不能只用料号。很多BOM里主料号一样但规格值大小写不一致或者产品代码相同而封装一个写0402一个写0402后面带空格光比对料号会漏掉这些差异而这三者的组合能挡住绝大多数分组错误。3.3 分组排位的逻辑为什么先按封装分再按料号排排站位的核心规则是先按封装确定飞达类型再按料号确定具体物料最后按贴装量决定用几盘料。原因在于机器上料靠的是飞达飞达宽度必须和料带宽度匹配。封装0402的电阻料带宽度通常是8mmSOP16的IC可能是12mm或16mm个别QFP甚至要24mm飞达。先按封装分组排飞达型号后续换不同供应商料号时运动机构和吸嘴配置基本不用大动。具体分配顺序我一般这样做先把所有物料按料带宽度分组组内按每板用量从大到小排序然后从低到高依次分配空闲站位如果同一种料要在多台机上贴装比如高速机贴CHIP件、泛用机贴IC预留双站位最后在输出里附带每板用量、库存数量、预计可贴片数方便物料员备料。这一步在Excel里可以用辅助列和IF公式实现但板子超过500个位号之后公式会卡到怀疑人生。我的经验是500位号以上的板子直接上VBA用字典做聚合和排序运行时间在几秒到十几秒之间体验完全不一样。4. 用Excel/VBA搭一套能跑的自动生成流程附核心代码思路4.1 工作簿结构源数据区和结果区必须分开一个合格的站位表自动生成工作簿至少要分五个工作表“源_BOM”“源_CPL”“源_机台配置”“站位表结果”“校验报告”。源数据区只负责接收原始数据所有公式和宏都只从这里读结果区是自动生成的站位表带着公式和校验状态校验报告单独留一张表专门输出异常明细不跟主表混在一起。这样设计的好处是后期排查方便。站位表结果出了问题先看校验报告里哪一类异常最多再回到对应源数据去定位不要在一个乱七八糟的混合表里翻来翻去。4.2 位号展开的VBA函数处理R1-R100这种区间写法位号展开是整个流程的地基。下面这段VBA函数是我在多个厂实际用过的版本能处理“R1,R2,R5-R8”这类常见写法把区间展开成完整列表Function ExpandRefs(ByVal refStr As String) As String Dim parts As Variant Dim i As Long, j As Long Dim seg As String, prefix As String Dim startNum As String, endNum As String Dim dashPos As Long, k As Long Dim result As String result parts Split(refStr, ,) For i LBound(parts) To UBound(parts) seg Trim(parts(i)) If seg Then dashPos InStr(seg, -) If dashPos 0 Then prefix startNum Left(seg, dashPos - 1) endNum Mid(seg, dashPos 1) For k 1 To Len(startNum) If IsNumeric(Mid(startNum, k, 1)) Then prefix Left(startNum, k - 1) startNum Mid(startNum, k) Exit For End If Next k For j CLng(startNum) To CLng(endNum) result result , prefix j Next j Else result result , seg End If End If Next i ExpandRefs Mid(result, 2) End Function这个函数的核心逻辑是先按逗号切段再对每一段判断是否包含连字符如果包含就拆出字母前缀和起止数字循环展开。实际生产环境中还会遇到RN1-RN8这种带复合前缀的位号处理思路一样只是要按正则把前缀分组后再展开。展开完成后把这个函数作为自定义公式放进BOM明细表就能得到一料一行的标准明细。4.3 聚合去重、排位与输出用字典把几千位号压到几十行明细表准备好之后下一步是用字典做聚合。遍历明细表的每一行把“料号|规格|封装”拼接成字典的Key位号列表累加到Value里同一类物料就自动合并成一个条目。等所有行处理完再按料带宽度分组、按用量排序最后把站位号按顺序写到结果区。Sub GenerateStationTable() Dim dict As Object Set dict CreateObject(Scripting.Dictionary) Dim lastRow As Long, i As Long Dim key As String lastRow Sheets(BOM明细).Cells(Rows.Count, 1).End(xlUp).Row For i 2 To lastRow key Sheets(BOM明细).Cells(i, 2).Value | _ Sheets(BOM明细).Cells(i, 3).Value | _ Sheets(BOM明细).Cells(i, 4).Value If Not dict.Exists(key) Then dict.Add key, Sheets(BOM明细).Cells(i, 1).Value Else dict(key) dict(key) , Sheets(BOM明细).Cells(i, 1).Value End If Next i 遍历字典按排序规则写入站位表结果表 此处省略排序与写入代码核心是遍历 dict.Keys读取聚合后的位号串 End Sub代码里我把排序和写入过程省略了实际实现时可以用数组保存字典的Keys然后按用量字段做冒泡排序或调用内置排序函数。这一步输出的站位表每一行就是一个站位、一种料、一串位号和手工做的格式完全一致但全程没有任何手抄。4.4 为什么不建议用纯公式处理大板子有人可能会问Power Query和XLOOKUP也能做为什么非得上VBA我的答案是分规模。小板子三五百个位号Power Query纯鼠标操作就够门槛最低但到了2000位号以上而且每颗料都要带出坐标、数量、封装、飞达类型这些字段时公式法的计算链非常长Excel会频繁重算卡顿而且中间任何一步引用错位都很难查。VBA的另一个优势是可以把整个流程串成一个按钮。工艺员点一下“生成站位表”宏自动执行位号展开、聚合、排序、排位、输出最后再跑一遍校验直接弹窗告诉你有几类异常。这个体验对产线工程师来说非常友好不需要理解背后的逻辑只需要按流程点按钮。5. 自动与BOM校验的规则设计五道关卡怎么落成Excel逻辑5.1 第一道关卡位号闭环校验校验最底层的一条规则是位号闭环BOM里每一个位号都必须能在站位表里找到唯一对应的站位和料号反过来站位表里的每一个位号也必须能在BOM里查到。这一步能拦住的问题包括BOM漏行、站位表粘贴串行、位号拼写错误、坐标文件里残留多余位号。落表方法很直接建一个闭环校验表三列就够——位号、BOM是否存在、站位表是否存在用COUNTIF跨表统计。把“BOM存在但站位表不存在”的位号标红这是要补料的把“站位表存在但BOM不存在”的位号标黄这可能是贴错料的隐患。两类都要进异常清单不能只处理红的忽略黄的。5.2 第二道关卡料号三元组匹配按料号比对时核心规则是每个站位上挂的料号必须能在BOM中“该封装、该规格”的物料集合里找到。我把它叫做“封装-规格-料号”三元组匹配判定结果分三档站位表料号在BOM主料列表中状态OK不在主料列表但在替代料列表里状态WARN替代料必须经过工程批准才能放行既不在主料也不在替代料状态NG锁定站位表禁止下发。Excel实现不复杂给BOM增加一个“允许料号”字段把主料和替代料拼成“|A|B|C|”的形式用ISNUMBER(SEARCH(|站位料号|, 允许料号))判断。这里两端的竖线一定不能少否则“1206”会错误匹配到“12061”这个细节我踩过坑。5.3 第三道关卡数量守恒与料号自身校验数量守恒校验包含两个方向一是BOM中每颗料的数量要和坐标文件里的位号数一致二是站位表里每个站位的位号数量要能对上BOM汇总。这个规则能抓出很隐蔽的问题比如BOM里R101-R150写成一行但坐标文件里只有40个位号因为其中一段实际上改成了两个0欧电阻并联BOM却没同步更新。数量守恒还有一个重要用途是齐套性预估。站位表里能算出每颗料在每块板上的消耗量再乘以投产数量就能精确判断哪些料需要中途接料、哪些料一整盘都不够。很多厂把这个事交给ERP但ERP的数据更新往往滞后Excel里的消耗汇总永远是反应最快的那一个。另外如果企业内部的料号体系本身带了校验位例如用ISO 7064 Mod 11,10这类算法可以在这一步直接加上料号合法性检查。原理上就是先根据前几位计算校验位再把算出来的值和最后一位比对不一致直接NG连BOM比对都不需要做。这个思路适合工厂自编料号体系能拦住手工输入料号时最常见的抄错一位问题。5.4 第四道关卡物理参数校验第四道关卡经常被忽略但它恰恰是错料的最后一道防线比对封装、极性、供料方式这些物理参数。站位表上的封装必须和BOM一致0402的料不能出现在0603的站位上有极性的元器件二极管、电解电容、IC要在站位表里备注方向标识如果某颗料需要特殊供料方式比如散料托盘、管装料也必须和飞达类型匹配。在系统里这几项都可以做成规则列表一个站位一旦分配了料就把该料的封装、极性、供料方式写入站位表再用条件格式对不一致的单元格标红。物理参数校验的价值在于它能在装料之前就发现“机器程序里的封装”和“站位表上的料”不匹配的情况而不是等贴完才发现。5.5 第五道关卡变更痕迹与文件哈希版本锁站位表和BOM校验经常面临一个尴尬当前这版站位表是对BOM V2.0生成并校验通过的但BOM后来变成了V2.1甚至都没人通知工艺。为了防止这种“静默变更”我给每份关键文件引入了哈希校验。具体做法是收到BOM后先用Windows自带的命令算一个文件指纹certutil -hashfile BOM_V2.1.xlsx MD5把算出来的MD5值连同接收时间、版本号记录在《版本台账》里。每次跑站位表校验宏之前先重新计算当前BOM文件的MD5和台账里记录的比对。不一致就直接提示“当前BOM与生成站位表时的版本不一致”强制要求重新生成站位表。有人可能会问为什么不用更复杂的算法。我的回答是这里要的不是密码学级别的防篡改而是防版本错位和防手误。CRC32、MD5这种级别已经完全够用。我们也不需要像海明校验那样去设计纠错能力——站位表一旦发现错了正确做法是退回去重做纠错在这个场景没有意义我们要的只是快速发现。5.6 校验报告怎么输出才有用校验结果千万不能只是在站位表上标几个红黄绿。给操作员一张满是颜色的表他根本不知道该干什么。我习惯输出一张独立的异常明细表列清楚五类信息异常类型、涉及位号、BOM里的值、站位表里的值、建议动作。只有拿到这种带证据链的报告工艺员才能直接定位问题而不是在原始表里翻半天。同时给每个站位生成一个“内容指纹”。具体做法是把料号、规格、封装、位号清单、数量拼成一个长字符串再用CRC32算一个哈希码。每次站位表有改动重新算一遍哈希和前版对比一眼就知道哪个站位被动过。这个思路是从软件行业的文件校验借来的在多人同时维护站位表、或者站位表通过邮件来回复传的场景下哈希码比文件名版本号可靠得多。6. 落地到产线的坑从EDA导出到现场改站的完整记录6.1 Altium Designer导出BOM的常见坑AD导出BOM时默认位号字段叫Designator但如果你在导出界面勾选了按某些字段分组合并位号可能会被压缩成“R1-R30”这种紧凑格式直接拉到Excel里很容易断行。建议导出时把Value、Footprint、Manufacturer Part Number这些字段全都勾上并且取消默认的合并选项保留一料一行的原始明细。另一个AD的坑是“组件的Manufacturer Part Number属性可能为空”。很多原理图库只填了Value料号没填全。如果后面按料号做三元组匹配空料号会让整行变成NG。我在实际项目里会加一道预处理料号为空时自动用“规格封装”生成一个临时内部料号先跑通流程再回头补正式料号。6.2 Cadence导出BOM的常见坑Cadence Allegro导出BOM时第一个坑是位号里可能包含空格例如“ R1”前面多了一个空格COUNTIF和SEARCH匹配时就会莫名失败。解决办法是在进入校验之前统一对位号字段做一次TRIM并去掉所有空格字符。第二个坑更隐蔽从OrCAD导出时芯片类元件的Part Number可能被映射到了Value列导致后面按料号比对永远匹配不上。原因是Capture里不同元件库的属性命名不一致。建议在导出之前先统一Capture里的属性名把要用的字段固定为Part Number、Value、Footprint三列不要每次导出后再手工猜。6.3 操作员现场改站怎么把校验闭环起来站位表下发到产线之后操作员换线时经常会有临时改动某个飞达坏了要换站某盘料用完了换了一盘相同料号但包装不同的料等等。这些改动如果不回传校验就彻底失效了。我的建议是给站位表加一个“回传签名”机制操作员改动站位表之后必须重新跑一次BOM校验宏把改动后的哈希码和工厂基线版本一起提交到共享目录或者MES系统。这个动作在Excel里实现其实很简单就是另存一份带校验结果的工作簿难的是把它变成换线流程的强制节点——不跑校验就不能开工。技术上1分钟的事流程习惯才是真正需要花力气的地方。6.4 一次真实复盘自动校验抓出的5000片隐患最后说一个让我彻底认可这套做法的案例。有批4层板2000位号客户给了72小时交期。工程师赶时间直接从上一版BOM的站位表复制过来改了几个料号就下发了。结果下到产线的时候操作员觉得不对——某个站位显示“1206 4.7uF”领料单上写的却是“0805 4.7uF”把表退回工艺。其实这个案例暴露的是人肉校验的极限新旧BOM的差异只有一行肉眼根本看不过来。后来上了自动校验同一批板子在装料前先跑一遍位号闭环和料号三元组匹配立刻抓出一个旧版冗余位号和一个料号不匹配。如果没有这层自动校验5000片板子全部贴错返修成本至少五位数交期直接崩盘。我现在的体会是自动生成站位表和自动与BOM校验表面上省的是工程师整理表格的时间实际上是把质量节点的壁垒从“人的细心”转移到了“规则的确定性”上。人可以不细心规则不会。只要输入数据是准确的、规则是完整的机器生成的结果永远不会抄错行、不会漏掉一列、不会在凌晨三点犯困时把100K看错成10K。这才是智能制造里“智能”二字最实在的落地方式。