简介:在SAP R/3与制造执行系统集成项目中,清晰的接口设计说明至关重要,此文档即是一份面向设计、开发及实施人员的MES接口设计说明书,基于MELEBUS-BMAS模板,解决R/3与MES之间数据交互的接口设计与实现问题。资源为1份doc格式文档,压缩包大小仅178KB,内容涵盖系统概要、接口文件一览与规格、程序仕様(ZMAF001、ZMAF005)以及参数设定等章节。已有2665人学习下载,关注度较高。文档详细描述了制造指图抽出、实绩数据计上、排他控制等关键功能,对每个接口的文件格式、运行环境配置、日志管理方式均有明确说明,并区分了R/3侧与MES侧接口定义,可作为接口开发的学习模板。读者可据此理解系统间数据交互的完整流程,并在实际项目中参照其中的程序结构和参数设定进行接口设计与问题排查。
1. MES 接口设计说明书:先定契约,再写代码
MES 系统 上线后最惨的翻车现场,不是操作员不会点界面,而是 MES 跟 ERP、WMS、设备各说各话:工单发了两遍、完工数对不上、库位查不到。MES 接口设计说明书 就是用来解决这一整类问题的。它是生产制造 企业做数字化集成时的契约文件,把数据谁给谁、字段怎么叫、失败怎么重试写死,谁也不能临时改。适合正在选型或自研 MES 的产品经理、系统集成工程师,以及决定要不要上 MES 系统的车间负责人。按下面的思路做完,你会得到一张清晰的接口清单、一份能直接拿去联调的文档,和一组投产前避坑的用例。
2. 接口对象与数据流:ERP、WMS、质量、设备四张网先铺开
写接口设计说明书的第一步不是打开接口工具,而是先画一张数据流图。MES 处在车间的中间层,往下接设备,往上接 ERP,横向接 WMS/QMS。四个方向的对象与方向定义好了,接口数量自然会浮出来。
| 对象方向 | 主要数据 |
|---|---|
| ERP | 工单、物料主数据、BOM/工艺路线、报工、完工入库 |
| WMS | 领料申请、发料确认、退料、线边库调整 |
| QMS/质量 | 不良记录、处置指令、返工返修、复检结果 |
| 设备/PLC/SCADA | 状态、产量、工艺参数、报警、控制指令 |
这张数据流图画完,才知道哪些接口是实时同步,哪些接口能容忍定时拉取,哪些接口必须做成异步。下面把四个方向逐个拆开。
2.1 ERP 双向接口:工单、物料主数据、完工回写
大多数 MES 的第一个接口都是跟 ERP 下发生产工单。这里要区分双向:下行从 ERP 到 MES 的是工单、物料主数据、BOM/工艺路线版本;上行从 MES 到 ERP 的是报工、完工入库、消耗物料、返工报废数量。
常见做法是 ERP 维护主数据,MES 查询并保存副本。生产订单下发时,接口里至少要有:生产订单号、物料编号、计划数量、开工日期、完工日期、工艺路线版本号、BOM 版本号。实测踩过的坑是很多工厂只同步订单号没有同步版本号,MES 用的工艺路线还是上一版,焊接到一半发现工序少了。
我一般这样约定:
第一步,先和 ERP 方确认物料主数据来源是同步接口还是 ERP 的标准 API,料号长度、启用状态、是否唯一必须两边一致。
第二步,定义生产订单增量同步策略。列表接口不能只靠 updated_time,要带来源系统、外部单号、状态变更时间、删除标记。常见的列表接口翻车正是因为增量条件少了删除标记,ERP 撤单后 MES 里还留着这条工单。
第三步,定义完工回写时机:每道工序报工,还是仅末道工序完工入库。如果是多工序厂,建议每道工序都报工,MES 才能核算在制品数量。完工回写接口的字段可参考:工单号、工序号、完工数量、报废数量、作业员、设备号、开始时间、结束时间。ERP 侧拿到后做收货,不要把 MES 的字段名直接灌进 ERP 表,要让 ERP 顾问先确认他们需要什么字段。
2.2 WMS/仓库接口:领料、退料、线边库协同
MES 不直接管成品仓库,但管线边库。WMS 接口的核心是物资流转凭证:生产领料申请、发料确认、退料、报废出库、线边库盘点差异。
我习惯把请求拆成“申请与执行”两步:MES 向 WMS 发领料申请,WMS 扫描料箱回传发料结果。如果只是点到点一步,WMS 作业没完成但系统已经扣了线边库,月底必然盘亏。
字段至少要包括:领料单号、工单号、物料编号、申请数量、实际发料数量、批次号/序列号、库位号、发料时间。重点提醒:实际发料数量不一定等于申请数量,接口必须支持数量差异,否则缺料、替代料的场景没法走。
退料接口方向反过来,字段会更多一些:退料原因代码、原领料单号、物料编号、批次号、退回库位、退料人。这个原因代码要和 QMS 的不良代码对应起来,不能退料原因只写“现场不符”,后道又不知道到底哪里不符。
2.3 质量接口与返工返修模块:把不良品变成可追踪的数据流
质量数据的接口比 ERP 更贴近业务。一条不良品从产生到闭环,至少要经过登记、判定、处置、复检四段。MES 里一般都有质量模块,当外部 QMS 已存在时,MES 要把不良记录推送出去,再接收判定结果。
接口对象可以分两类:不良记录上报、处置指令下发。不良上报至少要有:工单号、批次号/序列号、物料编号、工序号、不良数量、不良代码、责任工序、发现时间、检验员。不良代码必须在 MES 和 QMS 之间统一,常见的定义方式是两位大类加三位细类,例如“泄漏”用 LK 表示,后缀再跟具体位置。
这里的返工返修模块特别值得多写两行:返工不是把数量加回去,而是单独开返工工单、走返工路线、记录返工前后批次关系。以汽车水冷板的返工返修模块为例:水冷板泄漏测试不过,MES 生成一张返工单,带上不良代码“泄漏”和原批次,返工路线是钎焊缺陷返修加复测。返工完成后,接口把返工后的数量上报给质量模块,并关联原不良记录,这样追溯链才是完整的:原工单、不良记录、返工单、复测记录、成品批次。
具体设计时,返工完成接口不能把返工数量直接加到原工单的完成量上,否则 ERP 收到重复的完工数量,财务那边就要多付一遍计件工资。
2.4 设备侧接口:PLC/SCADA 采集与下发的边界
设备数据通常不走 ERP 方向,而是走边缘网关到 MES。如果预算简单,让每台 PLC 直接调 MES 接口会有两个大坑:车间网络波动导致丢包,并发量一大会把 MES 服务打爆。我一般会在设备区和 MES 之间加一层边缘网关,PLC 先把数据写到网关本地缓存,网关再批量上传 MES。
设备接口至少分两类:采集接口和下发接口。采集的是状态、产量、参数、报警信息;下发的是程序号、工艺参数、启动/停止命令。现场常见做法是状态按 3—5 秒周期上报,计数按事件触发上报,参数只在变化时上报。频率不能每个车间一刀切,要在说明书的接口总览里标清楚。
举个例子,一千台设备每 5 秒上报一次状态,那就是每秒 200 条请求,直接冲给 MES 会把数据库连接池打满;网关把同一个设备短时间内的状态合并成一条,上报量能降一个数量级。
这里还要标注一个问题:设备上报的“已完工数量”如果只是当前计数器值,MES 必须保存设备号和计数时间。后续对账时,要靠“设备号+批次+计数器值”组成唯一索引,而不是把计数器当成产量增量直接入库。设备侧接口的时序字段不能省,否则数据到了 SQL 里错位,半天查不出来。
3. 接口定义与参数设计:协议、报文、字段映射和幂等性
数据流画完,就要进入接口层面。这块的目标是让两个开发团队不看对方内部代码,只看文档就能把接口调通。要定清楚四件事:选什么协议、用什么报文结构、字段和状态码怎么对齐、写接口怎么防重。
3.1 选 REST/JSON 还是 WebService:按系统现状和团队水平来
接口协议不是一个纯粹的技术偏好。老 ERP 系统很多只暴露 SOAP WebService,或者用 RFC 再加一层中间件;新开发的 WMS、QMS 一般有 REST/JSON;PLC 设备基本走 OPC UA/MQTT。MES 本身建议以 REST/JSON 为主,对外部老系统用企业服务总线做一层适配,不要让 ERP 侧拿着 SOAP 直接打到 MES 的控制器代码里。
选择标准其实很简单,就看后期谁维护。车间级 MES 往往是中小团队开发,维护能力有限。SOAP 有 WSDL 和严格的 schema,适合正式合同驱动、接口变更很少的老系统;REST/JSON 联调成本低,适合快速迭代的 MES 和 WMS。对于设备接口,不建议再去发明文本协议,优先走 MQTT JSON,网关消费完只回一个 ack,能省一大半排障时间。
同时要在说明书中写清楚接口的触发方式:定时轮询、事件推送、请求应答三种。ERP 下发工单常见是事件推送后,MES 调 ERP 的列表接口拉取明细;如果中途失败,事件不能丢,要配消息队列。说明书里每个接口必须写清触发方式,否则调用方会默认是轮询,改成事件驱动时又没人知道。
3.2 统一报文封装与列表接口约定:code、message、data 三件套
所有 MES 写接口我都建议用统一 JSON 外壳,不要每个系统定义一种风格。信封统一,业务参数放在 data 里面,解析代码才能只写一遍。对外 API 接口 的请求头统一带上 app_id、timestamp、nonce、sign,响应统一用下面的壳:
{ "code": 0, "message": "ok", "data": { "request_id": "20250118103000001", "items": [], "page": 1, "page_size": 100, "total": 0 } }code=0 表示业务成功;HTTP 状态码只表达网络层是否送达,业务错误一律用 code 表达。举例来说,ERP 传了一个不存在的物料编号,HTTP 仍旧返回 200,但 code 是 40010,message 是“物料编号不存在”。如果调用方只判断 HTTP 200 就算成功,这类错误就会被当成成功处理,尾部数据就会缺料。
列表接口统一分页参数:page 从 1 开始,page_size 默认 20、最大 1000,total 是总条数,排序规则用 sort 字段传。增量列表还要带 since_time,服务端按上次同步时间过滤。工单和批次记录表一旦超过百万行,深分页 offset 会越翻越慢,列表接口早期就要支持游标方式,避免一年后大表翻页超时。
3.3 字段映射与状态码:四张表怎么对齐
接口最容易出问题的地方不是格式,而是同一个东西在两套系统里叫法不同。物料编号在 ERP 里叫 material_no,在 MES 里叫 product_code;库位在 WMS 里是“WH-A-01”,在 MES 里是“01-01”;设备状态是 0/1/2,到了 MES 又变成拼音缩写。说明书里必须有一张字段映射表和一张状态码映射表。
| 来源系统 | 原值 | 含义 | MES 统一值 |
|---|---|---|---|
| ERP 状态 | 41/42 | 已收货/已入库 | 30=已入库 |
| PLC 状态字 | 0/1/2/3 | 停机/运行/故障/空闲 | 10/20/30/40 |
| QMS 不良代码 | LK | 泄漏 | defect_code=30101 |
码表放在数据库里维护,不要在代码里硬编码,接口校验到未知状态时返回明确错误码,同时保留原值,不要让后续环节识别不了就默默变成空值。字符串字段统一 UTF-8,响应不要带 BOM;金额和数量用字符串传,避免 float 精度丢失。时间为 ISO8601 带时区,MES 侧统一存北京时间。
3.4 接口幂等性设计:request_id 与状态机保护
MES 的写接口必须做接口幂等性设计,这句话要在说明书第一版就写死。生产网络不稳定,客户端发起完工上报没收到回复会重试;ERP 也会因为事务回滚重推消息。没有幂等,同一张工单会重复入库,一个批次被扣两次料。
具体做法分三层:
第一层,请求方生成 request_id,服务端按 request_id 去重。相同 request_id 第二次进来,直接返回第一次的处理结果,不再重复写库。
第二层,数据库唯一约束兜底。在业务表加“来源系统+外部单号+请求ID”的唯一键。应用层判断不可靠,并发下两条请求同时查到不存在,然后都插入;唯一索引是底线。
第三层,对状态更新类接口做状态机保护。比如完工上报要求工单从“生产中”变更为“已完工”,如果重试时工单已经是“已完工”,就直接返回成功但不重复记账;如果工单是“已锁定”,则返回冲突码。这样才能保证追溯链不被重试打乱。
这里给一个通用的处理逻辑,不限定某一种语言,方便你们对照翻译:
- 校验请求头 app_id、timestamp、nonce、sign,不通过返回 401。
- 读 request_id,查处理记录;存在就直接返回历史响应。
- 加锁并检查业务状态机;不允许跳转则返回冲突码。
- 在同一事务里写业务记录和 request_id 处理记录。
- 提交成功后返回带新数据的结果。
步骤 2 的缓存建议保留至少 24 小时。生产环境里有些定时任务会在凌晨三四点重试,保留时间太短,重试就会穿透幂等保护,再次落库。
4. 把说明书写成能施工的文件:八章结构、参数模板与验收点
设计讨论完,下一步就是把结论落成文档。MES 接口设计说明书 不是给开发自嗨的,是签完字要当验收依据的项目文件。结构不统一,后面每个人理解的接口都不一样。
4.1 接口说明书必备的八个章节和验收点
通用结构常见做法是八节:接口总览、数据字典、时序说明、报文示例、错误码表、幂等与重试、安全鉴权、验收用例。
| 章节 | 包含内容 | 验收点 |
|---|---|---|
| 接口总览 | 接口编号、接口名、方向、触发方式、频率 | 每个接口触发方式清晰,调用方无歧义 |
| 数据字典 | 全字段定义、类型、长度、必填、默认值 | 所有接口字段能回溯到主数据 |
| 时序说明 | 正常时序与异常时序 | 新人按图能独立联调 |
| 报文示例 | 正常请求/响应、异常响应 | 示例可复制直接发起联调 |
| 错误码表 | 错误码、含义、可能场景、处理动作 | 每个错误码都写了处理动作 |
| 幂等与重试 | request_id 规则、超时值、重试间隔 | 调用方知道怎么写重试 |
| 安全鉴权 | app_id、timestamp、nonce、签名算法、密钥管理 | 客户端可独立实现签名 |
| 验收用例 | 正常、异常、并发、断网用例 | 用例可进自动化回归 |
特别提醒,错误码表不要只写 code 和 message。比如“10086:数据已存在”这种没写处理动作的错误码,联调碰到只会互相甩锅。每个错误码后面要跟“调用方动作”:是直接丢弃、查数后重试,还是人工介入。说明书的价值就在这种地方。
4.2 参数模板与分页约定:字段表怎么定才不返工
字段表是接口文档的主体。我见过不少说明书的字段名和 ERP 的参数名混着写,联调时才发现大小写都不一样。字段表统一用下划线小写命名,同一个字段在多个接口里保持同样的类型和长度。
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 | 示例 |
|---|---|---|---|---|---|---|
| work_order_no | string | 32 | 是 | - | 生产工单号,来源 ERP | WO20250118 |
| item_code | string | 32 | 是 | - | 物料编号 | ML-CP-001 |
| plan_qty | string | 18 | 是 | - | 计划数量,用字符串避免精度 | 500 |
| actual_qty | string | 18 | 是 | - | 实际完工或发料数量 | 498 |
| batch_no | string | 64 | 否 | - | 批次号,按物料配置 | B20250118001 |
| request_id | string | 64 | 是 | - | 全局唯一请求号 | R001-20250118-00021 |
几个容易写漏的字段:创建时间、更新时间、来源系统标识、逻辑删除标记。增量列表接口必须带逻辑删除标记,不然 ERP 撤单同步不了,MES 月底对账就全是幽灵工单。
分页约定统一写:page 从 1 开始,page_size 默认 20、最大 1000,total 只填总条数;超过 1000 条建议走游标模式。不写清这个,第一个列表接口里只返回 20 条,联调的人会怀疑是 bug,其实只是文档缺一行字。
4.3 版本管理与兼容:v1/v2 灰度,字段只能增不能删
接口只要一上线就有外部方依赖。升级时最常见的错误是直接改字段、删字段。约定几条硬规则:
第一,路径带版本号,用 /api/v1/ 起头,新增功能走 /api/v2/,同一接口不破坏旧调用。
第二,能加字段就加字段,不能删字段,也不能改字段类型和长度。字段废弃也要先在文档标 deprecated,保留空值或原值一段时间再下线。
第三,调用方先升级,服务方后删废弃字段。版本升级要有灰度计划,先放一个白名单客户端试用,不要直接全量切换。
现实情况是,工厂侧 ERP 往往由乙方维护,升级窗口以季度为单位。说明书必须写明老版本的停用时间,至少给 90 天并行期,否则车间就得被迫跟着 IT 节奏加班。
4.4 认证签名与审计日志:app_id、timestamp、nonce
MES 接口不要裸奔。虽然多数跑在内网,但车间大屏、外包运维都可能碰到链路。常见做法是给每个调用方发 app_id 和 app_secret,请求头带 app_id、timestamp、nonce,服务端按签名校验。
签名计算方式一般是:把 app_id、timestamp、nonce、请求体摘要拼接后,用 app_secret 做 HMAC-SHA256,结果放 X-Sign 头。服务端校验时间戳在正负 5 分钟内,nonce 在有效期内不能重复。这个方案不复杂,每个调用方花半小时就能接上。
所有写接口都要记审计日志:调用方 app_id、request_id、接口名、动作、参数摘要、结果码、耗时。日志不仅为了安全,也是处理接口争议的依据。MES 的完工、领料、返工只要涉及数量,就必须可追溯。没有日志的接口等于把黑匣子扔给车间,出了差异只能靠人肉翻 Excel。
5. MES 接口实施避坑:五个高频翻车现场和排查路径
设计文档做得再漂亮,现场联调还是会碰到一堆实际问题。下面五个场景是我在 MES 接口实施里遇到频率最高的,每一条都按“现象、原因、解决”写透。
5.1 同一条工单被写了两遍,在制批次多出一份
现象:ERP 重推同一张工单,MES 里出现两笔在制批次,后道工序按批次领料,计划员发现数量翻倍。
原因:MES 接口用“先查后插”做防重,并发或定时轮询交错时,两条线程都没查到记录,然后都插进去。应用层判断从来不能替代数据库约束。
解决:在工单同步表上建唯一索引,字段为 (source_system, external_order_no, order_version),插入用 upsert 语义。ERP 修订工单数量时版本号递增,就能覆盖旧单而不是重复建单;同时把 request_id 也纳入约束,防止同一次推送被重试两遍。
提示:别只建普通唯一索引,版本号必须纳入。否则 ERP 允许修订计划数量的工单会被当成新单,越改越多。
5.2 完工数量对不上:MES 库存比实物少了几十件
现象:月底盘点,MES 的完工数和车间实物差几十件,而且集中在某几台设备。
原因:设备上报用的是“增量数量”,断网期间增量丢掉,恢复后网关只补最后一包,前面的计数就消失了;还有的情况是设备报数时 MES 事务回滚,设备侧没收到 ack,也不再重发。
解决:改事件上报。一台设备加工完一个托盘或批次,上报该批次的序列号列表,而不是每秒上报累计值。MES 按序列号计数就不会丢。如果设备太老,PLC 不支持序列号,就让网关缓存在本地,恢复网络后按时间窗口补传,并在接口里加 upload_from 字段标记这是重传数据。补传窗口设 24 小时,超过的转人工介入。接口侧要允许补传的时间序列,不能因为时间戳不是当前时间就把数据丢进黑名单。
做 MES 接口的人看到设备传来的数字,第一反应不要信,要看设备的计数器是累计值还是增量值,这是血泪经验。
5.3 本地调试正常,生产环境一到高峰期就超时
现象:联调环境同一接口 200ms 返回,生产环境早班高峰 80% 请求超过 5 秒。
原因:联调库数据量小,生产环境工单表几百万行,接口里嵌套查询掉到慢 SQL;同时 ERP 侧在关账,把 MES 的完工回写当成远端数据库锁等待。超时问题一半是玄学,一半是没做隔离。
解决:把 MES 对外的写接口改成“受理+回调”模式。调用方立刻收到“已受理”,MES 异步落库后再回调通知结果。接口超时参数要分开定义,连接超时 3 秒,读超时 30 秒,写超时 30 秒;不做异步时,要给调用方配置合理的重试间隔。排查时从 request_id 贯穿日志链路:外部调用、网关、MES 服务、数据库,凡是跨系统的调用都把 request_id 写进日志,别再靠时间戳去猜。
5.4 WMS 回传的库位编号在 MES 里“查无此位”
现象:WMS 完成出入库后回传库位字段,内容类似“WH-01-02-03”,MES 这边报库位不存在,入库接口失败。
原因:两个系统的库位编码规则不一致。WMS 把库房、通道、货架拼在一起,MES 只有三位货位号。这是主数据问题,不是代码 bug。
解决:MES 侧建一张外部库位映射表,接口落库时先查映射;查不到就落到“未知库位”,挂起做差异分析,不要直接回 500。接口说明书里写清:库位参数允许空值,空值也归入异常库;后续靠盘点修正。同时在联调阶段,要求 WMS 先提供库位主数据清单,跟 MES 初始化一把,能挡住大部分“查无此位”的单据。
5.5 升级版本后老客户端 401,新老字段打架
现象:MES 增加新版返工回写接口,老客户端上线当天全部 401,同时文档里新增字段是必填,老客户端没传,又报参数缺失。
原因:版本路径从 /api/v1 改成了 /api/v2,签名算法也从旧方案换成了 HMAC-SHA256,老调用方没跟着更新。
解决:版本切换不要跟安全策略切换捆绑。老的 /api/v1 并行跑 90 天,新调用方全部走 v2;等老日志确认没有流量,再做标记废弃。字段兼容规则是只能新增,新增字段不允许设为必填,除非是全新版本。这条写进说明书落款页:上线超过 30 天的接口,再改字段时只能增加 nullable 字段。
6. 投产前用模拟报文和链路压测把接口逼出问题
6.1 用脚本把 ERP 和设备报文“假打”一遍
投产前常见做法是拿 Postman 或脚本准备一批标准报文,把 ERP 端、WMS 端、设备网关联调方都模拟一遍。不必等到对方系统联调,MES 侧先拿预置 JSON 把链路跑通。从说明书报文示例里复制工单下发、完工回写、返工处置三个用例,替换 request_id,连续打 50 遍,关注错误码和耗时。
6.2 幂等、超时、重试的验证用例组合
固定出这么几个用例:同一个 request_id 发送两次,断言第二次返回与第一次相同,且库里只有一笔记录;模拟断网后 5 秒重试;并发 20 个相同 request_id,断言数据库唯一索引没有冲突记录;把 ERP 端接口停掉,断言 MES 端返回预期的错误码。
压测时 JMeter 的聚合报告里平均响应时间不一定能反映问题,要打开查看结果树,看响应体里的业务 code,不能只看 HTTP 200。
6.3 上线首周的监控指标与告警阈值
| 指标 | 阈值 | 处理动作 |
|---|---|---|
| 写接口平均时延 | 大于 3 秒 | 查慢 SQL 和锁等待 |
| 业务错误码占比 | 15 分钟内大于 1% | 查调用方报文 |
| 消息队列积压 | 大于 1000 条 | 扩容消费者或降级 |
| 幂等命中率 | 大于 5% | 说明调用方在疯狂重试,需排查重试逻辑 |
| 重复工单数 | 大于 0 | 立即止血并核对来源 |
MES 接口上线前我把这几个阈值写进告警,第一周每天都盯一遍。时间一久就发现,重复工单和库位查无此位这种小错误,才是车间数据对不上的真正源头。
最后留个个人习惯:每次做 MES 接口设计说明书,我都会在文档首页附一页“接口负责联络表”,ERP 找谁、WMS 找谁、MES 后端找谁。等上线那天,三方各拿一页纸,数据对不上时先互查日志再打电话。这个清单花不了十分钟,但能省掉上线后一周的扯皮。希望帮到你。
本文还有配套的精品资源,点击获取