简介:面向PCB制造企业与电子组装工厂的生产管理、品质工程及信息化建设人员,这份PDF方案围绕MES追溯系统展开,覆盖从SMT贴装、组装测试到包装入库的全流程精细化管理,可用于系统选型参考、内部方案汇报或信息化项目立项。资源包共1个PDF文件,大小约5.22MB,内容以方案文档形式组织,便于直接阅读与打印传阅。方案重点拆解品质管理中的参数实时监控与超限预警、生产流程可视化追踪、工单调度与BOM版本控制、设备数据采集与预防性维护、不良预警与检验策略优化,以及在线包装标贴打印和与WMS集成的成品入库等模块,读者可据此梳理追溯系统的功能边界与落地路径。目前已有623人学习下载,适合需要快速理解PCB行业MES追溯架构与关键业务场景的从业者参考。
1. 从一块板子的“身世”说起:PCB 制造为什么绕不开 MES 追溯
一块 PCB 从光板进线到成品装箱,中间要过 SMT 贴片、回流焊、AOI 检测、功能测试、分板、包装入库十几道工序,任何一道出问题,最后追责时最怕的就是“查不到”。某电子厂曾出现过一批板子在客户端批量失效,产线翻遍纸质流转卡也定位不到是哪台贴片机、哪批锡膏、哪个班次做的,最后只能整批召回。这类血泪经验在 PCB 行业并不少见,也正是 MES 追溯系统要解决的核心问题:把 SMT 组装、测试、包装全过程的品质数据、工单信息、设备状态串成一条可回查的链路。这套方案面向的是需要交一份完整制造信息化设计的学生,以及要给车间落地一套追溯体系的从业者,重点不在概念科普,而在需求怎么立、模块怎么拆、数据怎么落、最后怎么验收。
2. 需求与总体设计:从 SMT 到包装的追溯链路怎么搭
PCB 制造的追溯难点不在“记录”,而在“关联”。一块板子要能追到它的批次、工单、物料、设备、工艺参数、检验结果和操作人员,这些数据分散在不同设备、不同系统、不同班次里,如果一开始不把数据模型和采集边界定清楚,后面做出来的系统就是个只能看不能查的花架子。这一章先把需求边界和技术选型讲透,再给出总体架构和模块划分,让后面的实现有据可依。
2.1 需求边界:追溯粒度与采集范围先定死
做追溯系统最容易翻车的地方,是一上来就想着“什么都要采”,结果设备协议对不上、数据量爆炸、现场工人嫌麻烦不配合。我一般会先和产线负责人确认两件事:追溯粒度到“板”还是到“批次”,采集范围覆盖“关键工序”还是“全工序”。
对 PCB 制造来说,合理的做法是:SMT 段按“板序列号 + 工单”双维度追溯,因为贴片和回流焊的参数直接影响焊接质量;测试段按“板序列号 + 测试结果”记录;包装段按“箱号 + 板序列号”建立父子关系。采集范围上,优先覆盖贴片机、回流焊、AOI、功能测试、标签打印这几个关键节点,其他辅助工序先做状态记录,不做参数级采集。
下面这张表是我在方案里常用的追溯粒度定义,可以直接作为需求文档的一节:
| 工序节点 | 追溯对象 | 关键数据 | 采集方式 |
|---|---|---|---|
| SMT 贴片 | 板序列号 + 工单 | 贴片程序、元件批次、吸嘴状态 | 设备接口 / 扫码 |
| 回流焊 | 板序列号 + 炉次 | 温区曲线、传送速度 | 设备接口 |
| AOI 检测 | 板序列号 | 检测结果、缺陷类型、图片 | 设备接口 / 文件 |
| 功能测试 | 板序列号 | 测试项、通过/失败、测试时间 | 测试治具接口 |
| 包装 | 箱号 + 板序列号 | 包装时间、标签内容、操作员 | 扫码 + 打印 |
| 成品入库 | 箱号 | 库位、入库时间、数量 | WMS 接口 |
这张表的作用不是给领导看的,而是给开发和现场实施的人对齐口径。比如“炉次”这个字段,如果回流焊设备不提供炉次号,就得用“进炉时间 + 炉号”组合生成,这个规则要在需求阶段就写死,不然后面数据对不上。
2.2 技术选型:为什么用关系库 + 时序库的混合存储
MES 追溯系统的数据分两类:一类是工单、物料、产品、设备这些结构化主数据,变更少、关联多,适合关系型数据库;另一类是设备参数、检测结果、温度曲线这些高频写入的时序数据,量大、按时间查询多,适合时序数据库。我一般会选 PostgreSQL 存主数据和业务数据,选 InfluxDB 或 TDengine 存设备时序数据,中间用板序列号做关联。
这个选型不是赶时髦,而是踩过坑之后的结论。早期用纯关系库存回流焊温度曲线,一条曲线几百个采样点,一天几千块板,一个月下来单表就上亿行,查询慢到没法用。后来把曲线拆到时序库,关系库只存“板序列号 + 曲线 ID + 关键统计值”,查询性能立刻恢复正常。
后端框架用 Spring Boot 或 Django 都可以,看团队熟悉度;前端用 Vue 或 React 做可视化看板;设备采集层用 Python 写协议适配脚本,因为现场设备协议杂,Python 改起来快。下面是一个采集脚本的骨架,展示怎么把设备数据落到时序库:
# device_collector.py # 设备采集适配脚本骨架,按设备协议替换 read_device 部分 import time import requests from influxdb_client import InfluxDBClient, Point INFLUX_URL = "http://localhost:8086" INFLUX_TOKEN = "your-token" INFLUX_ORG = "pcb-mes" INFLUX_BUCKET = "device_metrics" client = InfluxDBClient(url=INFLUX_URL, token=INFLUX_TOKEN, org=INFLUX_ORG) write_api = client.write_api() def read_device(device_ip, register): # 实际项目中替换为 Modbus / OPC UA / 厂商 SDK 调用 # 这里返回模拟的温区数据 return [180.5, 200.3, 245.1, 230.8] def collect_reflow(device_ip, board_sn, work_order): temps = read_device(device_ip, "temperature_zones") point = Point("reflow_profile") \ .tag("board_sn", board_sn) \ .tag("work_order", work_order) \ .field("zone1", temps[0]) \ .field("zone2", temps[1]) \ .field("zone3", temps[2]) \ .field("zone4", temps[3]) \ .time(time.time_ns()) write_api.write(bucket=INFLUX_BUCKET, record=point) if __name__ == "__main__": # 实际运行时由产线触发或定时轮询 collect_reflow("192.168.1.10", "PCB20240501001", "WO20240501A")这段脚本的关键点有三个:tag用板序列号和工单号,保证能按板反查;field存具体温区值,方便做曲线和阈值判断;time用纳秒时间戳,避免同一秒内多块板数据覆盖。实际部署时,read_device要按设备手册替换成 Modbus TCP 或 OPC UA 调用,采集频率一般设为每块板进炉时触发一次,不要做成高频轮询,否则现场网络扛不住。
2.3 总体架构:四层结构与模块职责划分
这套系统的总体架构我一般画成四层:设备采集层、数据服务层、业务应用层、展示层。设备采集层负责和贴片机、回流焊、AOI、测试治具、标签打印机打交道,把原始数据转成统一格式;数据服务层负责数据清洗、关联、存储和接口暴露;业务应用层实现工单管理、品质管理、设备管理、包装管理、入库管理这些模块;展示层做生产看板和追溯查询界面。
模块划分上,核心是六个模块:工单与产品管理、品质管理与不良预警、设备管理与预防性维护、可视化流程管理、在线包装与标贴打印、成品入库与 WMS 集成。这六个模块不是并列关系,工单和产品管理是主线,品质、设备、包装、入库都挂在工单上,可视化流程管理则是把这些模块的状态汇总呈现。
架构设计里有一个容易被忽略的点:追溯查询的入口要统一。不管是从板序列号查、从工单查、从箱号查,最后都要落到同一个追溯服务上,由它去关系库和时序库拼数据。如果每个模块各写一套查询逻辑,后面字段一改就到处漏。我一般会在数据服务层做一个TraceService,对外只暴露trace_by_board_sn、trace_by_work_order、trace_by_box_no三个方法,内部统一组装。
3. 核心模块实现:工单、品质、设备与包装怎么落地
总体设计定下来之后,真正决定系统能不能用的是模块实现。这一章按工单主线、品质预警、设备管理、包装入库四个方向展开,每个方向给出可执行的数据表设计或代码片段,重点讲清楚字段为什么这么设、逻辑为什么这么走,方便直接照着改。
3.1 工单与产品管理:BOM 版本和工单状态机是两条命脉
工单管理模块负责生产任务的调度和追踪,产品管理模块负责 BOM、版本控制和产品追溯。这两个模块合在一起,本质上是回答“做什么、用什么做、做到哪了”三个问题。
数据表设计上,工单表work_order至少要有工单号、产品编码、BOM 版本、计划数量、实际数量、状态、优先级、计划开始时间、计划结束时间。产品表product要有产品编码、名称、当前 BOM 版本、工艺路线。BOM 表bom_item要有产品编码、BOM 版本、物料编码、用量、替代料标识。这里的关键是 BOM 版本必须和工单绑定,不能只绑产品,否则同一产品换版本后,历史工单追溯时物料清单会对不上。
工单状态机是另一个容易做歪的地方。我见过有的系统工单状态有十几种,现场工人根本记不住。合理的状态设计是六态:待排产、已排产、生产中、待检验、已完工、已关闭。状态流转要加约束,比如“生产中”才能触发物料上线,“待检验”才能录入检验结果,“已完工”才能做成品入库。下面是一段状态流转校验的伪代码:
# work_order_state.py # 工单状态流转校验,防止现场误操作跳过关键节点 VALID_TRANSITIONS = { "PENDING": ["SCHEDULED"], "SCHEDULED": ["IN_PROGRESS", "PENDING"], "IN_PROGRESS": ["WAIT_INSPECT", "SCHEDULED"], "WAIT_INSPECT": ["COMPLETED", "IN_PROGRESS"], "COMPLETED": ["CLOSED"], "CLOSED": [] } def change_status(order, target_status): current = order.status if target_status not in VALID_TRANSITIONS.get(current, []): raise ValueError(f"工单 {order.no} 不允许从 {current} 流转到 {target_status}") # 流转前做业务校验:生产中必须有物料上线记录 if target_status == "IN_PROGRESS" and not order.material_loaded: raise ValueError("物料未上线,不能进入生产") order.status = target_status order.save()这段校验的价值在于把“流程约束”写进代码,而不是靠人盯。VALID_TRANSITIONS字典就是状态机的核心,改流程只需要改这个字典,不用动业务代码。实际项目里,我还会在状态变更时写一条操作日志,记录谁在什么时间改的,方便后面追责。
3.2 品质管理与不良预警:阈值规则和检验方案要可配置
品质管理模块的核心是实时监控生产参数、记录品质数据、超阈值预警。PCB 制造里常见的品质数据包括焊接温度曲线、元件对位精度、AOI 缺陷类型、功能测试通过率。这些数据有的来自设备接口,有的来自人工录入,系统要能统一接收并按规则判断。
阈值规则我一般做成可配置表,而不是写死在代码里。表quality_rule包含规则编码、适用工序、监控字段、下限、上限、预警级别、通知对象。比如回流焊第三温区上限设 250 度,超过就触发高级预警;AOI 缺陷率连续三块板超过 5% 触发中级预警。规则配置化之后,工艺工程师自己就能调,不用每次找开发改代码。
不良预警的处理流程要闭环:触发预警、生成预警记录、通知责任人、责任人处理、记录处理结果、关闭预警。下面这张表是预警记录的核心字段设计:
| 字段 | 类型 | 说明 |
|---|---|---|
| alert_id | varchar | 预警编号,规则编码 + 时间戳生成 |
| rule_code | varchar | 触发的规则编码 |
| board_sn | varchar | 关联板序列号,批次预警可为空 |
| alert_level | int | 1 提示 / 2 警告 / 3 严重 |
| trigger_value | decimal | 触发时的实际值 |
| status | varchar | 待处理 / 处理中 / 已关闭 |
| handler | varchar | 处理人 |
| handle_result | text | 处理结果描述 |
检验方案模块则要支持按产品、按工序配置检验项和抽检比例。比如某产品功能测试全检,AOI 首件全检、后续抽检 20%。这些配置放在inspection_plan表里,工单排产时自动带出对应检验方案,检验员按方案执行,系统记录执行结果。历史数据积累后,可以做简单的规则优化,比如某类缺陷连续多批未出现,提示降低抽检比例,但这一步不要做成自动调整,保留人工确认。
3.3 设备管理与预防性维护:采集频率和告警阈值要分开调
设备管理模块要集成工厂内的贴片机、回流焊、AOI、测试治具,收集运行数据,做预防性维护。这里的关键不是“采多少数据”,而是“采什么数据对维护有用”。我一般关注三类指标:运行状态(运行/待机/故障)、关键参数(如贴片机吸嘴真空度、回流焊风机转速)、累计运行时长。
预防性维护的规则通常按“运行时长 + 参数漂移”双条件触发。比如贴片机吸嘴累计贴片 50 万次或真空度低于阈值,触发保养工单;回流焊风机累计运行 2000 小时,触发检查。这些规则放在maintenance_rule表里,由定时任务每天扫描一次,命中规则就生成保养任务并通知设备负责人。
采集频率上,状态数据可以 30 秒一次,关键参数按设备能力取,不要强求高频。我见过一个项目把贴片机参数做成每秒采集,结果现场网络拥堵,反而影响了设备通信。合理的做法是状态数据定时采,参数数据在换料、换程序、报警时触发采集,既够用又不给现场添负担。
设备使用报告按月生成,包含设备利用率、故障次数、平均修复时间、保养完成率。这些指标不需要实时算,用定时任务在凌晨跑批生成日报和月报,查询时直接读结果表,避免看板打开时拖垮数据库。
3.4 在线包装与成品入库:箱板关系和 WMS 接口要对齐
包装模块负责产品分类、打包、标签打印,成品入库模块负责和 WMS 集成。这两个模块的衔接点是“箱板关系”:一个箱子里装了哪些板,这个关系必须在包装时建立,入库时传给 WMS,后续客户追溯才能从箱号查到板号。
包装流程一般是:扫码枪扫板序列号,系统校验该板是否已完工且检验合格,合格则加入当前箱,扫满一箱后生成箱号,打印标签,标签内容包含箱号、产品编码、数量、生产日期、工单号。标签打印用 ZPL 或 TSPL 指令直接推给打印机,不要走人工复制粘贴,否则标签错一个字符,后面追溯全乱。
下面是一段生成箱号和标签内容的示例:
# packing.py # 包装扫码与箱号生成逻辑 import datetime def pack_board(box, board_sn): # 校验板子状态:必须已完工且检验合格 board = get_board(board_sn) if board.status != "COMPLETED" or not board.inspected: raise ValueError(f"板 {board_sn} 未完工或未检验,不能包装") if board_sn in box.boards: raise ValueError(f"板 {board_sn} 已在本箱中,请勿重复扫码") box.boards.append(board_sn) if len(box.boards) >= box.capacity: box.box_no = generate_box_no(box.product_code) box.pack_time = datetime.datetime.now() box.save() print_label(box) return box def generate_box_no(product_code): # 箱号规则:产品编码 + 日期 + 4 位流水 today = datetime.date.today().strftime("%Y%m%d") seq = get_next_sequence(product_code, today) return f"{product_code}{today}{seq:04d}"这段逻辑里,pack_board做了三重校验:状态、重复扫码、箱容量。generate_box_no的流水号按产品和日期分段,避免不同产品箱号冲突。print_label实际项目中要对接打印机 SDK,把箱号、产品、数量、日期打成二维码和明文,二维码内容建议用 JSON 字符串,方便 WMS 和客户端解析。
成品入库时,系统把箱号、产品编码、数量、工单号推给 WMS,WMS 返回入库单号和库位,MES 记录后更新箱状态为“已入库”。这个接口要做幂等,同一箱号重复推送不能生成两张入库单,通常用箱号做唯一键,WMS 侧做去重。
4. 避坑与排查:追溯系统上线前后最容易翻车的五件事
这套系统从设计到上线,真正让人半夜爬起来处理问题的,往往不是核心逻辑,而是数据对不上、设备连不上、现场不配合这些“小事”。下面五条是我在类似项目里反复遇到的坑,按现象、原因、解决三段式写清楚,方便提前规避。
4.1 追溯查不到数据:时间戳和时区先对齐
现象:按板序列号查追溯记录,SMT 段有数据,回流焊段查不到,或者时间显示差 8 小时。
原因:设备采集脚本用本地时间,数据库存 UTC,展示层又按浏览器时区转,三层时区不一致。另外,板序列号在贴片机和回流焊之间可能被重新扫码覆盖,导致关联字段对不上。
解决:全链路统一用 UTC 时间戳存储,展示层按配置时区转换;板序列号在每道工序扫码时写入board_process_log表,保留原始扫码值和工序标识,追溯查询以这张日志表为基准去关联各段数据,不要直接依赖设备原始记录。
4.2 设备采集断连:协议适配要有降级方案
现象:某台贴片机换了个网口,采集脚本报连接超时,整条线的看板数据停更。
原因:采集脚本没有重连机制,也没有断连告警,设备 IP 变更后没人发现。
解决:采集脚本加指数退避重连,连续失败超过阈值写告警记录并通知设备负责人;关键设备保留手工补录入口,断连期间由操作员扫码记录关键节点,恢复后补传。协议适配层做成插件式,新增设备类型只加适配器,不改主流程。
4.3 工单状态卡死:流转校验要留管理员通道
现象:工单在“待检验”状态卡住,检验员说没收到检验任务,生产说已经送检,两边扯皮。
原因:状态流转只允许系统自动触发,缺少人工干预入口,一旦某个环节漏触发,工单就卡死。
解决:状态机保留管理员强制流转通道,但强制流转必须填原因并写审计日志;同时增加状态超时提醒,工单在某一状态停留超过设定时长,自动通知责任人。强制通道不能开放给普通操作员,权限要收紧。
4.4 标签打印错位:模板和打印机要绑定校验
现象:包装标签打出来二维码扫不出,或者文字和条码错位。
原因:标签模板按 A 打印机调好,换到 B 打印机分辨率不同,没有做模板适配;或者 ZPL 指令里坐标写死,换纸宽就错位。
解决:标签模板按打印机型号绑定,打印前校验模板与打印机分辨率匹配;模板里的坐标用相对单位,不要写死像素;上线前用实际打印机打样,扫码枪实测二维码可读性,不要只看屏幕预览。
4.5 现场不愿用:扫码动作要嵌进原有作业习惯
现象:系统上线一个月,扫码率不到 60%,追溯数据大量缺失。
原因:扫码步骤加在工人原有动作之外,增加了操作负担,又没有即时反馈,工人觉得“扫了也没用”。
解决:把扫码嵌进原有动作,比如贴片机上料时顺手扫物料码,包装封箱时扫箱码,不额外增加工位动作;扫码后立即给出反馈,比如屏幕显示“已记录,当前箱 12/20”,让工人看到进度;追溯查询结果对班组开放,让工人自己也能查到自己做的板子去了哪,形成正向使用习惯。
5. 验收与答辩:用一条追溯链路和一张指标表说话
这套系统做完,验收和答辩最忌讳的是上来就讲架构图和技术栈。评审和答辩老师真正想看的,是“给我一块板,你能不能当场查出它的全部身世”。我一般会准备一条完整的追溯演示链路,再配一张量化指标表,两条腿走路。
演示链路选一块实际生产过的板子,从包装箱号开始,先扫箱号查出箱内板列表,再选一块板查它的工单、BOM 版本、物料批次、贴片程序、回流焊曲线、AOI 结果、功能测试记录、包装时间和入库库位。每一步都当场操作,不切 PPT。这条链路能走通,说明数据关联是真实的,不是演示数据摆拍。演示前要确认这块板的数据在系统里完整,最好提前跑一遍,把断点补上。
指标表用来回答“系统到底有没有用”。我通常准备四类指标:追溯完整率(有完整链路记录的板数 / 总生产板数)、预警响应时长(从预警触发到责任人处理完成的平均时间)、工单准时完工率、设备故障平均修复时间。下面这张表可以直接作为验收文档的一页:
| 指标 | 上线前基线 | 验收目标 | 统计方式 |
|---|---|---|---|
| 追溯完整率 | 无法统计 | ≥ 95% | 按周统计完工板 |
| 预警响应时长 | 平均 4 小时 | ≤ 1 小时 | 预警记录时间差 |
| 工单准时完工率 | 78% | ≥ 90% | 按工单计划 vs 实际 |
| 设备平均修复时间 | 3.5 小时 | ≤ 2 小时 | 故障记录时间差 |
答辩时,如果被问到“这套系统最大的难点是什么”,不要答技术栈,答数据关联和现场落地。可以举一个具体例子,比如某道工序设备不提供标准接口,怎么用扫码补录加时间窗匹配把数据关联上。这种回答比背架构图有说服力。
还有一个技巧:准备一份“异常演示”。故意扫一块未检验的板子去包装,让系统当场报错并给出原因,这比只演示正常流程更能证明系统的约束是真实生效的。评审看到校验逻辑真的拦住了错误操作,对方案的可信度会明显提升。
从那以后我每次带项目验收,都强制自己先走一遍“从箱号到板号到工序”的完整链路,再准备一个异常场景,两个都过了才敢上会。希望帮到你。
本文还有配套的精品资源,点击获取