1. MES与ERP工单同步接口配置
接口同步的核心对象与数据流
MES 从 ERP 接收生产工单,本质上是把 ERP 中已下达的工单主数据与 MES 的工单执行表建立映射。同步接口需要处理四类关键字段:工单号(ERP 唯一标识)、物料编码、计划数量、交期。接口的可靠性取决于三个环节:拉取/推送方式、字段映射规则、异常重试策略。
接口配置的关键参数
以下参数决定了同步接口的行为边界,配置时需与 ERP 侧约定一致:
| 参数 | 示例值 | 说明 |
|---|---|---|
| 同步模式 | 定时拉取 | MES 主动调用 ERP 接口,避免 ERP 推送时 MES 不可用导致丢单 |
| 轮询间隔 | 60 秒 | 根据工单下达频率调整,过短增加 ERP 压力,过长延迟工单可见性 |
| 增量标识 | last_sync_time | 只拉取该时间之后更新或新增的工单,避免全量扫描 |
| 重试次数 | 3 次 | 网络超时或 ERP 返回 5xx 时触发 |
| 重试间隔 | 30s / 2min / 10min | 指数退避,避免瞬时故障反复冲击 |
| 幂等键 | 工单号 + 版本号 | 同一工单多次拉取不产生重复记录 |
异常重试的实现逻辑
接口调用失败时,不能简单丢弃。以下伪代码展示了重试队列的核心判断逻辑:
def sync_work_orders(last_sync_time):
try:
orders = erp_client.fetch_orders(since=last_sync_time)
except (Timeout, ERP5xxError) as e:
retry_queue.push(task_id, retry_count=0)
return
for order in orders:
if not validate(order):
error_log.write(order.work_order_no, reason)
continue
if mes_db.exists(order.work_order_no, order.version):
continue # 幂等跳过
mes_db.insert(order)
def retry_worker():
task = retry_queue.pop()
if task.retry_count >= 3:
alert("工单同步失败超过3次", task.work_order_no)
return
delay = [30, 120, 600][task.retry_count]
schedule(task, delay)
task.retry_count += 1
验证方法:在 ERP 中新建一张测试工单(工单号 TEST-001,物料 M001,数量 100,交期 2025-06-30),等待一个轮询周期后检查 MES 工单执行表是否出现对应记录。再手动断开 ERP 接口模拟超时,观察重试队列是否按 30s/2min/10min 间隔重试,3 次后是否触发告警。
常见配置错误:增量标识使用工单创建时间而非更新时间,导致 ERP 修改交期后 MES 无法感知;幂等键仅用工单号,导致同一工单的版本变更被错误跳过。