转载声明:本文经原作者 wackyxk 授权,由 CodeWF 转载发布。

原文首发于微信公众号「wacky的碎碎念」,版权归原作者所有。

原文链接:阅读原文

本文仅作 Markdown 排版与图片本地化处理,未对原文观点作实质性修改。


前言

大家好,我是 wacky。

前面几期概念篇,我们从实时性、扫描周期,聊到下位机、固件,再到上一期 SCADA、MES、ERP 的三层边界。一条从设备底层到企业顶层的认知链路,算是打通了。

但打通认知和能上手干活,中间还差一张全貌图。

我见过不少刚写上位机的人,案头贴的是"PLC 通信代码片段",不是"系统全貌"。结果一遇到跨部门扯皮、架构决策、排错定位就懵,不知道自己写的那段程序,在整个系统里到底算哪根葱。

所以这一篇,我们来做一个收尾:把前面所有概念串起来,画一张 .NET 工控项目的典型架构全景图。看完后你就知道自己站在哪,应该往哪个方向去努力。

一、先上全景图:你的程序站在哪

我们把整个系统从下到上摞成七层,你一眼就能看清边界:

设备层:PLC / MCU / 传感器 / 电机 / 阀门

通信层:Modbus TCP / OPC UA

采集层(★你的主战场):.NET 程序 —— 轮询、清洗、换算、报警

数据层:时序库 InfluxDB(高频波形)+ 关系库 SQLite / SQL Server(业务数据)

业务层:MES —— 排产、报工、追良率,不直接操作设备

展示层:WinForm / WPF / Web 看板 / 实时曲线

企业层:ERP —— 通过 REST API / 中间表对接,永远不直接碰设备

看到那颗星没?你写的 .NET 程序,主战场在采集层。往下通过通信层跟设备"交流",往上把清洗好的数据喂给数据层、对接业务层的 MES、支撑展示层的看板,再往上才到企业层的 ERP,而 ERP 那一层,你一般只做接口对接,不进去写业务。

一句话总结:你在设备和生产系统之间做"翻译"和"搬运"。这句话是整篇文章的中心思想,下面所有内容都是围绕它展开。

二、从下往上,逐层拆解

设备层:一切的起点

PLC、MCU、传感器、电机、阀门,都在这一层轰隆隆转。PLC 里跑的是扫描周期(我们在扫描周期那一篇聊过),固件是它的操作系统加运行时(固件概念那一期讲的一清二楚)。

这一层你基本不写代码,但你得懂它——因为所有数据都从这儿来,所有坑也都从这儿埋。

通信层:把数据搬上来

Modbus TCP、OPC UA等,是这一层的主力协议。你的 .NET 程序通过 NModbus4 读 Modbus 寄存器,用 OpcUaHelper 订阅 OPC UA 节点通信。

协议怎么选、怎么避坑,是上位机的基本功。选错了,后面全是技术债。

采集层:你的主战场

这是我们一天到晚写的东西。核心一共有三件事:

轮询。按 PLC 的扫描周期节奏去读数据,不能太快把设备网络打爆,也不能太慢漏掉关键变化。

清洗换算。寄存器 D100 里是个原始整数,你得知道它乘 0.1 才是真实温度。把 raw data 换算成物理量,这一步错了,上面全错。

解耦。之前我们写的那一段:MES 不该紧耦合到 PLC 的寄存器地址和扫描周期。采集层把数据洗好、换算好,再通过接口喂给上层。你干的正是这"采集 + 清洗 + 换算"的苦差事。

数据层:数据落地

高频波形(温度、压力的连续曲线)进时序数据库,比如 InfluxDB——一天 86 万条那种数据,只有时序库扛得住。业务数据(工单、良率、工时)进关系库,SQLite 够小项目用,大点上 SQL Server,ORM 用 EF Core 或轻量点的 Dapper。

业务层:MES 来接管

数据到这儿,排产、报工、追良率的事归 MES。你跟它的关系是:你供数据,它下指令,你再把指令翻译成 PLC 能执行的动作。

展示层:给人看的地方

WinForm、WPF 画看板、画实时曲线、弹报警窗。还是那个经典案例——反应釜温度超标了,曲线变红、弹个窗、记条日志。这一层是用户感知你系统价值的入口。

企业层:ERP 在顶上

最顶层的 ERP 管钱管料管人,通过 REST API 或中间表来取它关心的那几个汇总指标。

三、你写的 .NET 程序,到底干了啥

把上面七层收回来,落到你个人身上,就两件事:翻译 + 搬运。

往下,你把 PLC 的寄存器值,翻译成人类能懂的物理量。这是一个"设备语言到程序语言"的翻译。

往上,你把清洗好的结构化数据,搬运给 MES、塞进数据库、推上展示层看板。这是"程序语言到业务语言"的搬运。

典型的技术栈大概是这样:

  • 通信:NModbus4(Modbus)、OpcUaHelper(OPC UA)

  • 采集:按扫描周期轮询,清洗换算,写报警逻辑

  • 持久化:InfluxDB(时序)、EF Core / Dapper(关系)

  • 接口:REST API 对接 MES,中间表或 API 对接 ERP

  • 界面:WinForm / WPF 看板

你看,从汇川 EVO 系列 PLC 的固件,到 InfluxDB 的时序点,中间全是你写的 .NET 程序在承上启下。这就是上位机开发者的价值:你是设备和业务之间的那层胶水。

四、一个反应釜,把前面几篇全串起来

光说分层还是虚,我还是用那个反应釜的案例走一遍,你就知道前面每篇主要是在哪用上了。

设备层:汇川 EVO 系列 PLC 做下位机,里面跑着固件(【下位机和固件,上位机开发者必须搞懂的"另一半"】)。

通信层:你的 .NET 程序通过 OPC UA(【通信协议实战:Modbus与OPC UA怎么选】)把温度压力读上来。

采集层:按 PLC 扫描周期节奏轮询(【工控的"实时"和Web的"实时"不是一回事】),把 D100 里的原始值乘系数换算成真实温度(清洗换算),超标就报警——这是你的主战场。

数据层:温度压力的连续曲线写进 InfluxDB(时序库扛高频),工单良率写进 SQLite。

业务层:MES 接到 ERP 下发的 500 公斤 A 产品工单,拆成工序,通过接口下发给你的程序;你执行完,把实际产量良率回传 MES(【SCADA、MES、ERP三种系统的边界】)。

展示层:WinForm 看板上温度曲线实时跳动,超 120 度弹窗报警。

企业层:ERP 通过 REST API 取走汇总后的产量和成本,更新库存和交期——它全程没碰过 PLC 一个寄存器。

一条链路走完,你会发现:实时性、扫描周期、下位机固件、SCADA/MES/ERP 边界、MES 单独采集。前面几篇讲的概念,没有一个在这套架构里是摆设。

后记

这个系列的文章其实很久以前就在我脑海里面构思好了,所以趁这段时间密集输出,一次性讲透彻,我们从实时性、扫描周期,聊到下位机、固件,再到 SCADA/MES/ERP 三层边界和这张架构全景图——一条从设备底层到企业顶层的认知链路,到这篇就算打通收束了。

因此这个系列的更新到此就画上了尾声,后面我们可能会使用独立话题的方式讲讲工控中的每一个业务点,比如字节序的概念和它带来的坑,EtherNet/IP协议和EtherCAT协议的概念以及在上位机中怎么使用等等。这样我们不需要追更也可以很好的学到独立的知识点。

您的点赞和在看是我创作的最大动力,感谢支持

公众号:wacky的碎碎念

知乎:wacky