当前位置:首页 > MES/ERP 工厂落地实战 > 正文内容

MES系统架构设计实战:模块化设计从混乱到清晰的演进

MES系统架构设计实战:模块化设计从混乱到清晰的演进

【摘要】

本文系统梳理MES 制造执行系统领域的核心问题与落地路径。2018年我接手了一个自研MES项目,前任团队写了大概15万行C#代码,但几乎所有模块都直接调用数据库,一个简单的改工单状态操作,…。全文围绕「问题背景:模块耦合严重的痛苦、技术原理:分层架构与领域驱动设计、实战:从三层到微服务的演进过程、完整代码:服务注册与接口调用示例、效果对比」逐层展开,给出原理说明、实操步骤与验证方法。核心结论:Kubernetes+Docker容器化部署,支持各服务独立扩缩容;Istio服务网格实现熔断、限流、链路追踪。补充说明:MES 的定位是承上启下的中间层:向上承接 ERP 的计划与订单,向下衔接设备与人员,负责把「计划做什么」变成「现场怎么做的记录」。因此 MES 的价值不仅在于执行,更在于产生完整、可信的过程数据。

【核心要点】

  • 问题背景:模块耦合严重的痛苦:2018年我接手了一个自研MES项目,前任团队写了大概15万行C#代码,但几乎所有模块都直接调用数据库,一个简单的改工单状态操作,牵扯到5个不同的类,…
  • 技术原理:分层架构与领域驱动设计:成熟MES通常采用三层/四层架构:表现层(Web/APP/大屏)→ 业务服务层(领域模型+应用服务)→ 数据访问层(Repository模式)→ 基础设施层(消…
  • 实战:从三层到微服务的演进过程:第一步:纵向拆分。按业务领域(工单、库存、SPC、设备)拆分为独立服务,每个服务独立数据库(Database per Service)。
  • 完整代码:服务注册与接口调用示例:以下代码展示服务注册中心和依赖注入的配置,以及工单服务的标准调用流程。使用反射自动扫描并注册服务实现类,减少手工配置。
  • 实施建议:第一,不要一开始就想做微服务。先在单体应用内做好模块化拆分(Namespace/Assembly分离),验证领域边界后再考虑服务化。

【适用场景】

  • MES 选型评估与功能边界划分。
  • 工单执行流程不畅、状态混乱的治理。
  • 追溯链断裂问题的定位与补齐。
  • MES 与 ERP、设备层的数据集成设计。
🔧 配套工具:本节的核算/判读可用站内工具直接跑,推荐 半导体MES工单管理v2 详解、半导体生产排程优化v2、半导体批次追溯增强版v2(zip 包,含可运行 Python 脚本与示例数据)。
这个方向的工具共 53 款,完整清单与选型建议见 MES与生产管理工具包。全部 351 款见 工具资源包下载页。

一、问题背景:模块耦合严重的痛苦

2018年我接手了一个自研MES(制造执行系统,Manufacturing Execution System)项目,前任团队写了大概15万行C#代码,但几乎所有模块都直接调用数据库,一个简单的改工单状态操作,牵扯到5个不同的类,改一个Bug影响三个模块简直是家常便饭。

那个系统上线后,光是一个"修改工艺路线"的需求,开发+测试+部署整整用了3周,而且上线后还引入了2个新Bug。这种耦合到骨髓的架构,逼得我们不得不启动重构。

MES 的失败原因里,技术问题通常排在组织问题之后。工艺路线不稳定、职责边界不清、编码体系混乱这三类前置问题未解决时,系统上线只会把混乱数字化。

存量 MES 的改造比新建更难:历史数据与既有习惯形成的路径依赖,使得任何变更都需要兼容处理。因此改造通常采用渐进式替换而非一次性切换。

MES 的实时性要求分层设计:工单状态与报工需要秒级响应,而统计报表与分析可以分钟级甚至小时级。把所有功能都按最高实时性建设会显著推高成本,按需求分层才是合理做法。

二、技术原理:分层架构与领域驱动设计

成熟MES通常采用三层/四层架构:表现层(Web/APP/大屏)→ 业务服务层(领域模型+应用服务)→ 数据访问层(Repository模式)→ 基础设施层(消息队列/缓存/文件)。每层只对上下层负责,领域模型保持技术无关性。

DDD(Domain-Driven Design)核心概念:聚合根(Aggregate Root)是领域对象的统一入口,比如工单(WorkOrder)就是一个聚合根,所有对工单的操作都通过WorkOrderService进行,保证聚合内的一致性约束。

MES 的数据模型是整个系统的地基:物料、设备、工序、工单、批次五类主数据的编码规则与关联关系一旦确定,后续所有功能都建立在其上。模型设计不当会在系统运行一段时间后集中爆发为数据不一致问题。

MES 的用户体验直接影响数据质量:现场人员若觉得录入繁琐,就会出现事后补录、批量代录甚至随意填报,系统内的数据随即失去可信度。简化录入与自动采集的结合是保障数据质量的根本手段。

三、实战:从三层到微服务的演进过程

第一步:纵向拆分。按业务领域(工单、库存、SPC、设备)拆分为独立服务,每个服务独立数据库(Database per Service)。工单服务只关心工单相关逻辑,不再直接读写库存表。

第二步:依赖倒置。数据访问层定义为接口(IWorkOrderRepository),基础设施层实现具体逻辑,上层业务代码只依赖接口,不依赖实现。这一步花了2个月,但效果立竿见影——换数据库从改2周变成改2天。

第三步:事件驱动。用RabbitMQ做服务间解耦,工单状态变更发布事件,库存服务订阅事件后自动更新,彻底消灭跨服务的同步调用。

图1:MES架构从网状耦合(左)到清晰分层(右)的演进

图2:MES架构重构前后关键指标对比

追溯能力依赖数据的完整性而非系统的复杂度。追溯链要求在物料批次、设备、参数、人员、时间五个维度上都留有记录,任何一环缺失都会让追溯在关键节点断裂。

四、完整代码:服务注册与接口调用示例

以下代码展示服务注册中心和依赖注入的配置,以及工单服务的标准调用流程。使用反射自动扫描并注册服务实现类,减少手工配置。

MES架构示例:服务注册中心

from abc import ABC, abstractmethod
from typing import Dict, Type, Any
import inspect

# 1. 定义仓储接口(依赖倒置)
class IWorkOrderRepository(ABC):
    @abstractmethod
    def get_by_id(self, wo_id: str) -> Dict[str, Any]: pass
    @abstractmethod
    def update_status(self, wo_id: str, status: str) -> bool: pass
    @abstractmethod
    def list_by_state(self, state: str) -> list: pass

class ISpcRepository(ABC):
    @abstractmethod
    def save_control_chart(self, data: Dict) -> bool: pass

# 2. 服务容器(简单DI容器)
class ServiceContainer:
    _services: Dict[Type, Type] = {}
    _instances: Dict[Type, Any] = {}
    
    @classmethod
    def register(cls, interface: Type, impl: Type):
        cls._services[interface] = impl
    
    @classmethod
    def resolve(cls, interface: Type) -> Any:
        if interface not in cls._instances:
            impl = cls._services.get(interface)
            if not impl:
                raise ValueError(f"Service {interface} not registered")
            cls._instances[interface] = impl()
        return cls._instances[interface]
    
    @classmethod
    def auto_register(cls, base_package):
        # 反射扫描:自动将接口的实现类注册到容器
        for name, obj in inspect.getmembers(__import__(base_package)):
            if inspect.isclass(obj) and hasattr(obj, '__bases__'):
                for base in obj.__bases__:
                    if base != ABC and issubclass(base, ABC):
                        cls.register(base, obj)

# 3. 应用服务(用例编排层)
class WorkOrderService:
    def __init__(self):
        self.repo = ServiceContainer.resolve(IWorkOrderRepository)
    
    def change_route(self, wo_id: str, new_route: str) -> Dict:
        wo = self.repo.get_by_id(wo_id)
        if not wo: raise ValueError(f"WO {wo_id} not found")
        if wo['status'] not in ['released', 'pending']:
            raise ValueError(f"Cannot change route at status {wo['status']}")
        success = self.repo.update_status(wo_id, 'route_changed')
        return {'success': success, 'wo_id': wo_id, 'new_route': new_route}

为什么这样写:IWorkOrderRepository接口定义数据访问契约,使业务层与具体数据库解耦;ServiceContainer通过简单DI容器实现依赖注入,支持接口替换(如测试时注入MockRepo);auto_register用反射自动扫描,符合开闭原则,新增服务无需修改注册代码。

工单状态机是 MES 架构的核心。工单从创建、下达、开工、暂停、完工到关闭,每一状态的转换条件、权限与副作用(如扣料、报工、触发质检)都必须明确定义,否则会出现数据不一致。

系统集成成本随系统数量非线性上升:接口数量按系统数的组合增长,因此架构设计应追求「少而集成」而非「多而孤立」。每新增一个系统都需评估其带来的集成复杂度。

ERP 的价值在数据一致性:同一笔业务在业务模块与财务模块中必须指向同一数据源,任何人工重复录入都是错误与延迟的入口。因此系统设计的核心是减少重复录入并建立校验规则。

报表体系的设计要建立在主数据规范之上:同一指标在不同报表中口径不一致,会引发无休止的争议。指标定义应集中管理并有唯一权威来源。

五、效果对比

MES 的定位是承上启下的中间层:向上承接 ERP 的计划与订单,向下衔接设备与人员,负责把「计划做什么」变成「现场怎么做的记录」。因此 MES 的价值不仅在于执行,更在于产生完整、可信的过程数据。

把主数据整理推给实施方,内部无人负责,导致编码规则与实际业务脱节。

现场录入负担过重,数据质量在系统上线数月后显著下降。

现场数据质量下降的原因分析与改善。

数据治理必须先于数据应用。口径不统一、编码混乱、质量不可信的状态下,任何报表与看板都会引发争议而非决策。

数字化项目的推进节奏应与组织能力匹配:推进过快会导致使用方跟不上、数据质量下降;过慢则失去动力与关注。合理做法是分阶段交付,并在每阶段完成培训与标准固化,让能力沉淀在组织内。

外部实施方与内部团队的职责应明确划分:需求定义、流程确认、数据准备、验收测试必须有内部责任人。若这些环节全部外包,项目结束时能力不会留在组织里,后续任何调整都需再次付费。

六、实施建议

第一,不要一开始就想做微服务。先在单体应用内做好模块化拆分(Namespace/Assembly分离),验证领域边界后再考虑服务化。第二,API版本管理要提前规划。v1/api/workorders和v2/api/workorders的路由分离,避免升级时影响旧客户端。第三,引入Swagger/OpenAPI做接口文档自动化,防止接口文档过时引发的扯皮。

功能边界可依据 ISA-95(企业控制系统集成标准,ISA-95 / IEC 62264) 的五级模型划定:L4 负责经营计划,L3 负责制造执行(MES 所在层),L2 负责监控与自动化,L1 负责传感与执行,L0 是实际物理过程。边界清晰是避免系统间职责重叠与重复录入的前提。

所有功能都要求实时,成本高且复杂度失控。

系统间集成只考虑协议连通,未统一业务语义,数据对不上。

BOM 的准确性是成本核算与投料控制的共同基础。BOM 版本管理失控会造成两种典型问题:投料错误(用了过期版本)与成本失真(核算口径与实物不符)。

基础数据(物料、供应商、客户、会计科目)未清理就导入。垃圾数据进入新系统后清理成本远高于实施前的清理。

系统数量的增长会带来集成成本的非线性上升。接口数量随系统数呈组合级增长,因此「少而集成」通常优于「多而孤立」。

七、进阶方向

Kubernetes+Docker容器化部署,支持各服务独立扩缩容;Istio服务网格实现熔断、限流、链路追踪;GraphQL统一API网关,解决REST API过度获取/不足获取问题;低代码平台集成,让工艺工程师通过配置而非代码来调整业务流程。

📝 互动话题

你们FAB的设备综合效率OEE(设备综合效率,Overall Equipment Effectiveness)目前大概在什么水平?最大的损失来源是哪一块?

在实施OEE改善项目时,有什么坑是特别容易踩的?欢迎评论区分享!

觉得这篇文章有收获?欢迎收藏、点赞支持!

您的支持是我持续输出的最大动力!

本文首发于:blog.csdn.net/yeflashzhihui

---

集成的难点通常在语义而非协议:即使通过统一协议连通了数据,各系统对同一概念的定义(如「完工」是指报工完成还是检验合格)不一致时,数据对不上。因此集成设计必须先统一语义再谈技术。

MES 主数据模型与编码规则的设计评审。

多个系统间集成的语义统一与接口设计。

数字化建设的优先级应由业务损失决定,而不是由部门呼声或技术先进性决定。量化各环节的当前损失,优先解决损失最大的环节,能显著提高投入产出比。

库存的本质是资金占用,库存周转率是衡量供应链效率的核心指标。降低库存的前提是提高需求预测精度与供应响应速度,单纯压库存只会把问题转移到缺料上。

指标口径统一与报表体系规范化。

【常见坑】

  • 把 MES 当作万能工具,试图用它解决工艺不稳定问题。MES 记录过程,不改善工艺;工艺本身不稳,系统只会更快地记录不良品。
  • 基础数据未治理就上系统。物料编码、设备编码、工艺路线版本混乱时,系统内的关联关系会全部失真。
  • 过度定制。为每个车间的习惯做单独开发,导致后续升级困难、维护成本失控。行业通行做法是先统一主干流程,把差异留在配置层。
  • 只关注功能清单不关注数据质量。系统功能齐全但数据录入随意,最终得到的是无法用于决策的「精确的垃圾」。
  • 上线后不做数据校验与稽核。缺少反向校验机制时,错误数据会持续累积并污染后续所有分析。

常见问题(FAQ)

Q:MES 和 ERP 到底谁管什么?

A:简单区分:ERP 管「要不要做、要多少、成本多少」,面向计划与财务;MES 管「怎么做、做得怎么样」,面向现场执行与过程数据。两者的交界通常在工单下达与完工回报,边界设计不清就会出现重复录入与口径冲突。

Q:为什么很多 MES 项目最终效果不佳?

A:排除供应商能力因素后,主因通常有三个:基础数据未治理、业务流程本身不稳定、以及项目被当作纯 IT 项目而缺少工艺与现场的深度参与。三者都会让系统沦为电子台账。

Q:MES 上线后如何评价它是否成功?

A:建议用过程指标而非功能清单衡量:数据录入的及时率与准确率、追溯完整率、异常响应时长、工单执行周期等。若这些指标没有改善,功能再多也不构成成功。

Q:小工厂有必要上 MES 吗?

A:取决于复杂度而非规模。工序多、批次追溯要求高、良率需要精细化管理的场景有价值;工序简单、品种单一的车间,用轻量的工单与报表工具往往更划算。核心判断标准是「是否需要过程数据来支撑决策」。

Q:MES 与 SPC 系统是什么关系?

A:SPC 是 MES 可集成的能力之一,也可以独立部署。由 MES 提供工序与批次上下文,SPC 负责统计监控,两者结合才能定位到「哪个批次在哪个工序出了偏差」。若各自独立运行,数据关联会变得困难。

Q:MES 上线后数据不准,从哪查起?

A:按嫌疑顺序查三类原因:录入环节(是否事后补录、有无必填校验)、集成环节(上下游系统的语义与口径是否一致)、以及主数据(编码是否一物多码或一码多物)。实践中录入环节的问题最常见,而主数据问题影响最深远。

Q:MES 与 SCADA、WMS 的边界怎么划?

A:常见划分是按数据性质:SCADA 负责设备层实时采集与控制,MES 负责制造过程与工单执行,WMS 负责库存与库位管理。交界处的常见冲突是库存扣减与工单报工的时点定义,需要在集成设计阶段明确由谁在哪一步触发。

Q:MES 项目应该做多少定制开发?

A:原则是主干流程标准化、差异留在配置层。为每个车间的个别习惯做定制开发,会显著提高后续升级与维护成本,且随着定制项增加,系统逐渐失去可维护性。建议先统一主干,确有个性需求时优先评估配置能力,配置无法满足再考虑有限定制。

【总结】

MES 制造执行系统的难点往往不在单点技术,而在于把原理、数据与现场验证串成闭环。Kubernetes+Docker容器化部署,支持各服务独立扩缩容;Istio服务网格实现熔断、限流、链路追踪;GraphQL统一API网关,解决REST API过度获取/不足获取问题;低代码平台集成,让工艺工程师通过配置而非代码来调整业务流程。功能边界可依据 ISA-95 的五级模型划定:L4 负责经营计划,L3 负责制造执行(MES 所在层),L2 负责监控与自动化,L1 负责传感与执行,L0 是实际物理过程。边界清晰是避免系统间职责重叠与重复录入的前提。建议先用小范围试点验证有效性,再逐步扩大适用范围,并保留完整的数据与判断记录以便复盘。

术语速查

  • MES(Manufacturing Execution System,制造执行系统):位于计划层与控制层之间,负责工单执行、过程追溯、数据采集与质量管控的信息系统。 工程意义:是打通 ERP 计划与车间现场的中间层。
  • AP(Action Priority,措施优先级):按严重度、发生度、探测度的组合直接划分高/中/低优先级,替代单纯依赖 RPN 排序。 工程意义:解决了 RPN 相同但风险性质完全不同的问题。
  • OEE(Overall Equipment Effectiveness,设备综合效率):由可用率、性能率、良品率相乘得到的设备效率综合指标。 工程意义:单一数字便于横向比较,但必须拆解到六大损失才能定位问题。
  • SPC(Statistical Process Control,统计过程控制):用控制图等统计方法对过程进行实时监控,区分随机波动与异常波动的管理方法。 工程意义:是把「事后检验」变为「过程预防」的核心工具。
  • WIP(Work In Process,在制品):处于生产流程中尚未完工的产品或批次。 工程意义:WIP 金额与停留时间过高意味着流程存在瓶颈或积压。
  • ISA-95(ISA-95 / IEC 62264,企业控制系统集成标准):定义企业层到现场层五级功能模型(L0~L4)与接口的国际标准。 工程意义:MES 功能边界与集成接口设计的基本依据。

相关阅读

进阶:MES 制造执行系统的通用工程判据

MES 制造执行系统·实践参考

架构演进的一般路径可参考:从单体三层架构起步,先按业务域(工单、库存、SPC、设备)纵向拆分模块,明确各模块的数据归属;再在模块成熟后逐步走向服务化。反向操作(先拆服务后理业务)通常导致接口频繁变更与数据不一致。

📚 同栏目延伸阅读:FAB设备健康管理与预测性维护实战:从被动维修到主动预防、MES与RMS集成实战:Recipe配方全生命周期管控、SECS/GEM数据采集架构:从RS232到HSMS演进、MES系统WIP看板设计:实时监控与瓶颈识别

📦 本文相关资源:文中方法可直接用站内工具落地,推荐 半导体MES工单管理v2、半导体生产排程优化v2、半导体批次追溯增强版v2、SPC 判异 AI 归因助手、控制图基线建立与阶段化监控分析器(zip 包,含可运行 Python 脚本与示例数据)。更多同类工具见 工具资源包下载页(共 351 款)。

相关文章

MES制造执行系统:半导体FAB的信息中枢到底管什么

MES制造执行系统:半导体FAB的信息中枢到底管什么

【摘要】 本文系统梳理MES 制造执行系统领域的核心问题与落地路径。Manufacturing Execution System — 当FAB遇上数字化转型,信息流如何驱动价值流?。全文围绕「问题背...

APC先进过程控制:工艺参数自动调控的秘密武器

APC先进过程控制:工艺参数自动调控的秘密武器

【摘要】 本文系统梳理APC 先进过程控制领域的核心问题与落地路径。我在FAB里做工艺工程师的时候,最头疼的事情就是调参数。全文围绕「问题背景:手动调整的局限性、技术原理:R2R控制与核心算法、实战...

EAP设备自动化:SECS/GEM协议从零到实战

EAP设备自动化:SECS/GEM协议从零到实战

【摘要】 本文系统梳理SECS/GEM 设备通信与 EAP领域的核心问题与落地路径。我在FAB第一次接触EAP的时候,被一堆缩写搞晕了——MES、EAP、EDA、SECS、GEM……傻傻分不清。全文...

半导体行业职业进阶:从新人到专家的成长路线图

半导体行业职业进阶:从新人到专家的成长路线图

【摘要】 本文系统梳理工程师能力与方法论领域的核心问题与落地路径。我做半导体工程师10年了,从FAB工艺工程师做到整合主管,再到现在做智能制造顾问。全文围绕「问题背景:为什么我要写这篇文章?、技术原...

存储器技术详解:DRAM/NAND/HBM一篇看懂

存储器技术详解:DRAM/NAND/HBM一篇看懂

从存储单元结构到市场格局:全面拆解三大存储技术的原理与应用 【摘要】 本文系统梳理工业 AI 与机器学习落地领域的核心问题与落地路径。从存储单元结构到市场格局:全面拆解三大存储技术的原理与应用。全文...

APC系统实施避坑指南:从选型到落地

APC系统实施避坑指南:从选型到落地

【摘要】 本文系统梳理APC 先进过程控制领域的核心问题与落地路径。APC(Advanced Process Control,先进过程控制)是半导体制造中用算法自动调控工艺参数的技术。全文围绕「什么...