付同学的技术客栈/

用 .NET 做 MES:Web API 之外还有很多活

所属专题 MES现场落地手记 第 8 篇 / 共 9 篇 查看专题目录

用 .NET 做 MES,我觉得是很自然的。

ASP.NET Core 做业务 API,Worker Service 做后台消费,SignalR 做看板推送,Redis 存实时状态,RabbitMQ 或 MQTT 接设备消息,SQL Server 或 PostgreSQL 存业务数据。

但真正进现场以后会发现,Web API 只是 MES 的一部分。

很多麻烦活都不在页面请求里。

用 .NET 做 MES,真正麻烦的地方往往不在 Web API。

Web API 只是最容易被看到的一层。后面还有采集服务、后台任务、实时推送、日志、部署、Windows 服务或 Linux 容器、和现场网络打交道的一堆细节。

我见过一些系统,接口写得很整齐,但一到现场就暴露问题:服务重启后状态没恢复,日志查不到设备原始报文,采集程序异常退出没人知道。

这些才是 .NET 落到 MES 现场时真正要补齐的部分。

一、Web API 不要吞下所有职责

如果把所有逻辑都塞进 Web API,早期开发会很快。

工单、质检、扫码、设备上传、看板刷新、ERP 同步,全在一个项目里。

但设备数据一多,它就会变成大杂烩。

我更倾向于拆成这些边界:

MES.Api
MES.Worker.Realtime
MES.Worker.Integration
MES.Edge.Agent
MES.Web
MES.Shared.Contracts
MES.Infrastructure

MES.Api 处理工单、质检、追溯、报表、设备档案。

MES.Worker.Realtime 消费设备消息,做清洗、去重、状态计算、事件化和落库。

MES.Worker.Integration 同步 ERP、WMS、PLM 等外部系统。

MES.Edge.Agent 部署在边缘侧,读 PLC、测试机、扫码枪或现场文件。

MES.Web 做管理端和看板。

二、Worker 是现场数据的处理工位

设备数据不是典型的请求响应。

它是持续流入的。

边缘节点把数据发到消息队列,中心 Worker 持续消费:

  • 校验消息格式。
  • 判断是否重复。
  • 更新 Redis 实时状态。
  • 写入时序库或采集库。
  • 识别过站、报警、测试完成等业务事件。
  • 写入业务库。
  • 推送看板刷新。

这样 Web API 不需要被设备高频写入拖垮。

更重要的是,现场数据处理可以单独扩容、单独重启、单独监控。

三、边缘 Agent 要能在车间活下来

边缘 Agent 可能部署在工控机、边缘服务器或产线旁的小主机上。

它不一定要功能很花,但要可靠。

它要做:

  • 加载点位配置。
  • 连接 PLC 或设备。
  • 轮询或订阅数据。
  • 做数据类型和字节序转换。
  • 本地缓存关键数据。
  • 上传中心。
  • 记录本地日志。
  • 暴露健康检查。
  • 支持自动重启。

如果边缘 Agent 出问题,现场数据就断了。

所以它的设计要比普通后台任务更谨慎。

比如本地缓存不能只放内存,日志不能只写控制台,配置变更要能追溯,重启后要能继续补传。

四、数据库选型要看数据类型

业务库可以用 SQL Server 或 PostgreSQL。

设备高频数据可以用 TimescaleDB、InfluxDB,或者先用 PostgreSQL 分区表过渡。

Redis 用来放当前状态和看板缓存。

文件存储放检测图片、测试报告和设备日志。

不要为了“统一”把所有数据都塞 SQL Server。

也不要为了“先进”引入一堆团队不会维护的组件。

现场系统最重要的是稳定可维护。

五、第一版可以小步走

我会按这个顺序落地:

1. 接一条产线的关键设备。
2. 打通边缘采集 -> 消息 -> Worker -> 看板。
3. 接工单和 SN。
4. 绑定测试结果和质量追溯。
5. 补断网缓存、幂等、监控告警。
6. 再扩多产线和外部系统。

这比一开始就做完整平台更稳。

第一阶段不要把所有技术一次上满,但要把边界设计清楚。

六、小结

.NET 做 MES,技术栈本身不是问题。

真正要想清楚的是:哪些逻辑在 API,哪些逻辑在 Worker,哪些逻辑在边缘 Agent,哪些数据进业务库,哪些进 Redis、采集库或文件存储。

边界清楚了,系统才有机会从一条产线长到一个工厂。


本系列:

MES现场落地手记 第 8 篇 / 共 9 篇
查看专题目录

留下一条评论

暂无评论