转载声明:本文经原作者 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
