简介:针对智能工厂信息化建设规划,这份容量为1.08MB的DOCX文档深入剖析了ERP、PLM、MES、WMS四类核心系统的整体架构与建设方案。文档从智能工厂总体框架切入,强调信息物理系统、物联网和服务网对智能设计、智能经营、智能生产、智能决策等系统的支撑作用,并逐一说明各系统功能定位:ERP是企业级资源管理核心,覆盖销售、生产、采购、成本等关键业务;PLM负责产品设计与变更管理,为其他系统提供BOM和工艺路线;MES承担车间数字化生产执行,打通信息流与设备控制;WMS对接立体仓库与AGV小车,优化入出库及物料配送。文档还给出了每个系统的分项架构规划、功能目标以及系统间的数据交互关系,如物料清单、工艺路线、执行数据如何流转,有助于避免信息孤岛、提升协同效率,适合制造企业信息化规划人员、IT架构师、智能制造项目参与者参考。资源包中仅包含一个以DOCX格式呈现的文档,文件整体大小约1.08MB,当前已有180人学习。通过它可建立多系统集成与纵向协同的整体认知,为项目设计、选型与实施提供框架性支撑。
1. 四套系统放一个架构里,先分清ERP、PLM、MES、WMS各自的账
很多制造企业的信息化规划是从“买系统”开始的,先上ERP,发现车间数据补不进来,再补MES;上了MES,又发现库存对不上,回头再实施WMS;最后还发现PLM里的BOM和ERP里的BOM是两套数。真正的问题不是软件选型,而是这四套系统的边界没在建设规划阶段说清楚。ERP管钱和资源,PLM管产品定义,MES管车间执行,WMS管仓库实物,各自握着一份“账”,但生产业务从头到尾是一条链,账与账之间必须有明确的数据主从关系。这篇文章按“系统定位—数据主权—集成架构—实施顺序—验证手法”这条路径,把四套系统整合成一套可落地的制造运营架构。
2. 系统定位与数据主权:ERP、PLM、MES、WMS的物料主数据从哪来
2.1 先商定“数据所有者”,再谈系统集成
四套系统集成时最容易犯的错,是让每个系统都去维护一套物料主数据。ERP里叫“物料编码”,PLM里叫“物料编号”,MES里叫“零件号”,WMS里叫“SKU”,同一个实物在四个库里对应四个主键,后续所有接口都要做映射,越映射越乱。建架构的第一步不是画接口,而是把每类数据的“所有者”定死。
物料主数据的所有者应该是PLM。产品设计阶段,物料在PLM中创建,走审批流程后才能发布到ERP;ERP负责财务视图和采购视图的扩展;MES和WMS只消费物料主数据,不自行创建。供应商主数据归ERP,客户主数据归ERP,工艺路线主数据归PLM或独立的工艺管理系统,库存实物账归WMS,在制品账归MES。这个归属关系要写进架构设计文档,并且用一张表固化下来。
我用下面这张表在两个项目里验证过,能快速消除“这数据到底谁改”的争论:
| 数据对象 | 所有者系统 | 发布方式 | 消费系统 |
|---|---|---|---|
| 物料主数据 | PLM | 审批发布后推送 | ERP、MES、WMS |
| 设计BOM | PLM | 版本发布 | ERP、MES |
| 制造BOM | PLM/工艺 | 工艺评审后发布 | ERP、MES |
| 供应商 | ERP | 准入审核通过后分发 | PLM、WMS、MES |
| 工单 | ERP | 计划下达 | MES |
| 成品库存 | WMS | 入库/出库实时记账 | ERP |
| 工序报工 | MES | 完工上报 | ERP |
这张表落地时,还需要一个主数据登记表来记录“哪个系统的哪条物料记录是权威版本”。常见做法是建一张轻量的集成日志表,每次分发都记录源系统、目标系统和数据版本号,不搞重型数据中台。
2.2 EBOM到MBOM的断点,决定PLM和MES谁说了算
PLM和ERP之间最常出问题的,不是物料编码,而是BOM转换。设计工程师在PLM里维护的是EBOM(设计BOM),按产品功能结构组织;生产要的是MBOM(制造BOM),按装配顺序和加工路线组织。这两个BOM在PLM内部完成转换后发布,ERP拿到的应该是已经转好的MBOM,而不是直接把EBOM推过去。
断点通常发生在两个地方。第一,EBOM里一个零件是虚拟件,设计上表示一个组件,制造上根本不需要独立下单,MES的工艺路线里也不出现;如果ERP把虚拟件也展开成物料需求,采购和车间就得多出一堆无效作业。第二,PLM的EBOM变更后,ERP里关联的旧版本MBOM没有同步升版,工单已经按旧BOM下达,车间按新图纸加工,到报工时才发现物料清单对不上。
我一般建议在架构层面做一道“BOM发布状态机”:PLM发布新版本MBOM后,不是直接覆盖,而是先进入“待替换”状态;ERP在制品订单全部关闭后才切换主用版本。这道状态机要有PLM和ERP两侧的状态字段,MES的工艺路线也要跟着MBOM版本一起切换。否则就会出现“ERP用的是BOM版本2,MES工艺文件还挂在版本1”的错位。
2.3 账务模板这样设计,四个系统的账才能对起来
四个系统各自有“账”:PLM管版本账,ERP管财务账,MES管在制账,WMS管实物账。设计账务对账模板时,要抓住“数量、金额、状态”三个维度,而不是只对库存数量。
以物料存量为例,ER P统称库存,WMS写的是库位级库存,二者天然不在一个颗粒度。架构设计时约定:ERP库存只到“工厂+库存地点”,WMS库存到“仓库+库区+库位”,两边通过“库存地点”这个字段做映射,不允许WMS直接给ERP写库位。对账时用物料编码+工厂+库存地点+批次四个键值,ERP的库存事务(移动类型)和WMS的出入库单据逐笔配对。
为了不让数字对不上时互相扯皮,需要建一个数据归属标记表。下面的表结构用于记录“每个业务主数据在四个系统中的归属关系”:
CREATE TABLE md_owner_registry ( data_domain VARCHAR(30) NOT NULL COMMENT '数据域:物料/BOM/供应商/工艺路线', main_id VARCHAR(64) NOT NULL COMMENT '业务主键:物料编码或BOM编号', owner_sys VARCHAR(20) NOT NULL COMMENT '所有者系统:PLM/ERP/MES/WMS', publish_status TINYINT NOT NULL DEFAULT 0 COMMENT '0草稿 1已发布 2已过期', publish_ver VARCHAR(20) COMMENT '版本号,PLM侧是版本,ERP侧是物料状态', last_sync_time DATETIME COMMENT '最近一次成功分发时间', PRIMARY KEY (data_domain, main_id, owner_sys) );这张表设计成“一物四行”的写法,主键是数据域加业务主键加所有者系统。查询时按main_id汇总,就能看出同一个物料在四个系统里各自处于什么状态。如果PLM已经发布但ERP还是草稿,说明分发链路断了;如果ERP已发布但MES没有记录,说明MES的主数据消费接口有问题。参数上要注意publish_ver不要只存版本号,ERP侧的物料状态(如“已审核”“冻结”)在业务上同样重要。
3. 集成架构设计:从业务触发点画ERP与MES、WMS的数据流
3.1 四条主干流:计划下达、领料、报工、完工入库
先不画API列表,而是从业务流程的触发点出发。制造企业最核心的集成链路是四条:ERP下达生产订单给MES,MES按工单领料(与WMS交互),MES完工报工回写ERP,MES入库/ WMS收货后把库存回报给ERP。把这四条流走通,其余接口都是在这四条旁边的扩展。
| 主流程 | 发起系统 | 接收系统 | 关键传递字段 | 返回结果 |
|---|---|---|---|---|
| 生产订单下达 | ERP | MES | 工单号、物料、数量、交期、BOM版本 | 工单接收回执 |
| 工单领料 | MES | WMS | 工单号、物料、应发数量、批次 | 实发数量、批次、库位 |
| 工序报工 | MES | ERP | 工单号、工序、合格数、报废数 | 报工确认号 |
| 完工入库 | MES/WMS | ERP | 工单号、物料、入库量、库位 | 库存增加记账凭证 |
每一条主流程都要定义“谁发起、谁响应、超时怎么办、对方没收到怎么办”。最常见的坑是发起方只发不收,MES把报工数据发出去了,ERP因为主数据不一致拒绝入库,MES却已经把该工单标记为完工。所以在设计上必须加回执机制:ERP收到数据后,要么返回成功确认,要么返回业务错误码,MES根据错误码决定是否回滚自己的状态。
3.2 集成交互选型:ESB、数据中台还是直接调API
技术选型上,制造企业常见的三种做法是:企业服务总线(ESB)负责同步和异步消息路由;数据中台用CDC采集各系统数据库日志做贴源同步;小系统之间直接写接口。三者不冲突,但必须划定边界。
| 方案 | 适合场景 | 不适合场景 |
|---|---|---|
| ESB消息路由 | 跨系统的业务单据流转,要求可追踪 | 大批量数据初始化,比如期初库存导入 |
| 数据中台CDC同步 | 数据分析和报表为主,允许分钟级延迟 | 需要即时的业务回执,比如报工确认 |
| 点对点API | 两个系统间低频率、明确归属的调用 | 链路超过三个系统时,会退化成蛛网 |
| 本地文件交换 | 老系统批量导入或外围设备数据采集 | 实时性要求高的主流程 |
PLM、ERP、MES、WMS四套系统并存时,优先以消息总线作为主干线。理由不是追求技术先进性,而是MES与WMS之间往往还有设备、质检、Andon等子系统,如果全部两两对接,接口数量会指数增长。总线承担的是“路由+重试+审计”职责,业务逻辑仍留在各系统内部,避免变成一个大泥球。数据中台只负责为BI、数字孪生、绩效分析提供统一数据视图,不承担主业务链路的实时交互。
3.3 报工回执的幂等设计:MES重复发送不能造成ERP重复记账
MES报工接口在车间网络不稳定时,经常出现“应用超时但服务端已处理”的情况。如果MES因此重发一次,ERP很可能产生两条完工入库记录。这不是网络问题,而是集成架构缺少幂等设计。
解决思路是给每条跨系统消息一个全局唯一msg_id,接收方用“源系统+业务主键+消息编号”做唯一性校验,对已处理的消息直接返回上次的结果,不重复写库。下面这段Python伪代码描述了MES侧发报工并处理回执的逻辑:
def send_finish_report(order_no, operation_no, ok_qty, defect_qty): msg_id = f"{order_no}:{operation_no}:{uuid4().hex[:8]}" payload = { "msg_id": msg_id, "source_sys": "MES", "target_sys": "ERP", "biz_type": "PROCESS_REPORT", "biz_key": f"{order_no}#{operation_no}", # 幂等键 "data": { "order_no": order_no, "operation_no": operation_no, "ok_qty": ok_qty, "defect_qty": defect_qty, } } resp = call_erp_finish_api(payload) if resp.status == 200 and resp.data.get("accepted"): update_msg_status(msg_id, status="SUCCESS", erp_voucher=resp.data["voucher_no"]) else: update_msg_status(msg_id, status="FAILED") retry_seconds = min(300, 5 * (2 ** retry_count[msg_id])) schedule_retry(msg_id, delay_seconds=retry_seconds)代码里最关键的是幂等键biz_key,它由工单号和工序号拼接而成,而不是使用随机数。只要这个键不变,ERP即使收到重复请求,也能判断“这不是新报工”。重试退避的2的幂次方算法,最大延迟封顶在300秒,这是车间场景比较合适的参数。失败的消息不能直接丢弃,要有一个修复入口,比如数据库中标记为FAILED的记录,管理员修正后点重发。
3.4 状态机要覆盖“回退”场景,不只是成功路径
集成架构设计得再完整,也会遇到业务上“单据被退回”的场景。最典型的是:MES报工100件合格品,ERP按库存移动类型收货后,质检发现整批不良,需要做红冲退货。此时如果架构成只支持单向推送,退回应收单就得人工在ERP里录一遍。
我在设计中会为每一条主数据流定义显式状态机:待发送、已发送、待回执、成功、失败、已回退。回退不是简单调用反向接口,而是基于同一msg_id做冲销,保证两个系统里各有一笔可以追溯的凭证。对应到数据库,用一张消息回执表来记录状态迁移:
CREATE TABLE int_msg_receipt ( msg_id VARCHAR(64) NOT NULL COMMENT '全局唯一消息ID', source_sys VARCHAR(10) NOT NULL COMMENT '发起方 ERP/PLM/MES/WMS', target_sys VARCHAR(10) NOT NULL COMMENT '接收方', biz_type VARCHAR(40) NOT NULL COMMENT '业务类型', biz_key VARCHAR(128) NOT NULL COMMENT '业务幂等键', status TINYINT NOT NULL DEFAULT 0 COMMENT '0待发 1已投递 2成功 3失败 4已回退', retry_count INT NOT NULL DEFAULT 0 COMMENT '已重试次数', last_err_msg VARCHAR(500) COMMENT '最近一次失败原因', created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, UNIQUE KEY uk_biz (source_sys, biz_type, biz_key) );参数上要注意uk_biz这个唯一索引是幂等的前提。如果去掉它,重复消息靠应用层判断,在高并发时报工数据会从缝隙里穿过去。重试次数建议单条消息不超过10次;超过后进入死信队列,由集成平台的运维人员处理,而不是无限自动重发。这个表同样可以用来做接口对账,每天扫一次status=3的记录,就是一份现成的接口健康报告。
4. 建设规划:实施顺序、试点切换与架构文档的落地写法
4.1 按“先主数据、再库存、后执行”分批实施
四套系统的建设顺序不能按部门着急程度来排,而要按数据依赖关系排。我的建议是三批:第一批做PLM与ERP的主数据及MBOM集成,让“产品定义”这一源头先干净起来;第二批实施WMS或升级现有WMS,打通仓库实物流转,这一步解决的是“账实一致”问题;第三批实施MES或扩充MES功能,把车间执行接进来。
| 批次 | 实施范围 | 前置条件 | 上线标志 |
|---|---|---|---|
| 第一批 | PLM物料/BOM发布、ERP基础数据 | 物料编码规则统一 | PLM发布的BOM自动进入ERP,无手工录入 |
| 第二批 | WMS仓储与发运、ERP库存接口 | 盘点完成、期初库存导入 | 出入库单据在WMS和ERP逐笔可对账 |
| 第三批 | MES排产、报工、质量,与WMS领料 | 工单和BOM数据准确 | 车间报工后ERP自动生成入库凭证 |
SMT行业可以调整顺序:先做WMS线边库,再做MES上料防错,因为SMT的物料最小包装管理和Feeder上料校验强依赖库位精准度。模具行业则相反,先做PLM的EBOM/MBOM转换,理由是模具生产按单设计,BOM变化比库存问题更致命。规划时不要照搬顺序表,而是先问“哪个环节的数据质量在拖累整体”。
4.2 试点产线和推广铺开的四步切换法
系统上线要选试点,但试点的目的不是验证软件功能,而是验证数据流在真实业务下的行为。我的切换方法是四个阶段:试点产线单轨、试点产线双轨、扩展产线、全面切换。启动前现场执行一条清点脚本,核对“四账一致”:
SELECT (SELECT COUNT(*) FROM wms_inv WHERE plant = :plant) AS wms_qty, (SELECT COUNT(*) FROM erp_inv WHERE plant = :plant) AS erp_qty, (SELECT COUNT(*) FROM mes_wip WHERE plant = :plant) AS mes_qty, (SELECT COUNT(*) FROM plm_item WHERE plant = :plant) AS plm_qty FROM dual;注意这个查询不是金额核对,而是数量核对。四个系统的数量口径不同,不能因为plm_qty包含设计阶段物料就要求四者相等,要按“该系统中当前生效的物料与库存记录数”来核对。若发现差异,不是改数据库,而是回到第2章的主数据所有者表,找出没有按约定分发的断点。
这是判断系统是否切换的关键,也是四个人,如上。双轨运行一般维持2到4周,至少经历一个完整的月末结账周期。双轨期间不要手工补录系统间差异,要把每个差异都提成工单,由集成架构组判断是配置问题还是流程问题,否则双轨变成了双倍工作量。
4.3 TOGAF模板的取舍:架构文档只留五份能更新的内容
很多企业拿到TOGAF架构设计模板后,生成一大堆几十页的正式文档,交付后就再没人打开。制造企业IT团队规模有限,我更倾向于把文档收敛成五份持续维护的文件:架构原则与决策记录、当前系统现状与数据流图、目标架构四系统集成矩阵、差距分析与迁移路径、接口清单及负责人表。
- 架构原则与决策记录:记录“物料主数据归PLM”这类约定及其理由,避免换人后推倒重来。
- 四系统集成矩阵:一张系统行列矩阵,交叉格写接口协议和SLA。
- 接口清单:第3.3节的int_msg_receipt表字段中提取出接口编号、负责人、失败处理方式。
- 迁移路径:从现状到目标的分批计划,每批要有明确的退出条件。
TOGAF的“架构愿景-业务架构-信息系统架构-技术架构”分层思路值得保留,但实现时不要四个层次各写一本厚文档。把业务架构和信息系统架构合并成“由主干业务流驱动的集成矩阵”,技术架构只写消息中间件、数据库、网络部署几张图。文档再有价值,不更新就是负债。
5. 验证架构能落地的三张表和一条流水线技巧
5.1 集成链路追溯表:抽三类单据追一遍全链路
系统上线后,验证架构不是看登录页面,而是抽业务单据做全链路追溯。每类集成至少抽取10笔当天流水,从源头系统查到目标系统,并在追溯表上记录源主键、目标主键、处理状态:
| 业务单据 | 源系统主键 | 中间消息ID | 目标系统主键 | 状态 |
|---|---|---|---|---|
| 生产订单下达 | ERP订单100123 | msg_20250113_001 | MES工单MO23114 | 已接收 |
| 工序报工 | MES报工ID 8907 | msg_20250113_118 | ERP物料凭证5000012321 | 已记账 |
| 领料出库 | WMS出库单OUT-2201 | msg_20250113_205 | MES领料记录PKCT-88 | 已扣减 |
半小时完成一次全链路抽检后,根据fail点把问题放进集成运维台,可以避免等到月底结账才发现MES报工与ERP库存对不上。追溯表本身也可以作为审计证据,比依赖各系统自己的日志更有说服力。
5.2 消息回执表的稽核SQL:盯住失败和没回执的接口
int_msg_receipt表除了平时写数据,还要每天跑一遍稽核。关注两个维度:status=3即失败率达0.5%以上的接口;retry_count超过5次的消息。用SQL可以快速定位到问题接口:
SELECT source_sys, biz_type, COUNT(*) AS total_cnt, SUM(CASE WHEN status = 3 THEN 1 ELSE 0 END) AS fail_cnt FROM int_msg_receipt WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY) GROUP BY source_sys, biz_type HAVING fail_cnt > 0 AND fail_cnt / total_cnt > 0.005;这个查询的结果不要直接发给业务部门,而要发给系统接口负责人确认,区分是配置错误、数据错误还是程序缺陷。每天的稽核报表放出来后,我一般要求接口负责人次日下班前给出原因说明,这比一个月一次的集成评审会有效得多。
5.3 一个预防回归的技巧:把接口契约测试放进部署流水线
最后说一个从运维转向开发侧的做法:对ERP、PLM、MES、WMS之间相对稳定的接口,用消费者驱动的契约测试将接口契约记录版本化,然后接入各系统的CI/CD流水线。PLM发布BOM结构接口时,会自动跑一遍ERP消费者场景,能暴露出字段名、嵌套层级、枚举值的变化,避免上线当天出现“联调通过、切生产失败”。这一条技巧对老系统同样适用,老系统加入契约测试时,最先暴露的是那些没有明确所有者的字段,解决它们的过程正好能补上架构文档中缺失的差异清单。
本文还有配套的精品资源,点击获取