在这里插入图片描述
做过上位机开发的人,几乎都踩过同一个坑:

初期为了快速上线,把PLC通信、数据处理、UI显示、报警逻辑全揉在一个类里,几百行代码跑得顺畅;可随着需求迭代,加个报表功能、换个PLC型号、改个弹窗样式,轻则编译报错,重则整个系统卡死,甚至牵连原本稳定的设备通信逻辑——这种“牵一发而动全身”的乱象,本质上不是代码写得差,而是架构设计缺失

罗伯特·C·马丁(Uncle Bob)在《架构整洁之道》中提出:“好的架构,能让系统的变更成本降到最低,让业务逻辑独立于技术实现”。这一思想,恰恰是解决上位机开发乱象的“金钥匙”。

上位机作为工控系统的“中枢”,既要对接PLC、传感器、变频器等底层设备,又要承载UI交互、数据存储、报表生成等上层功能,更要应对频繁的需求变更与设备迭代,整洁架构的核心逻辑——分层解耦、依赖倒置、职责单一,正是为这类场景量身定制。

今天,我们从上位机开发的实际痛点出发,结合《架构整洁之道》的核心原则,拆解如何搭建“易维护、可扩展、低耦合”的上位机架构,附实战分层方案与避坑指南,工控开发人员直接套用即可。

先扎心:上位机开发的3大乱象,皆因架构不整洁

很多上位机开发人员认为“架构是大型项目的事,小项目没必要”,可实际情况是,哪怕是几百行代码的温湿度采集上位机,只要架构混乱,后期迭代都会陷入困境。这3个高频乱象,你一定遇到过:

  • 乱象1:耦合严重,改UI崩通信——把WinForm按钮点击事件、S7-1200 PLC通信逻辑、数据报警判断全写在同一个Form类里,改个弹窗颜色都要小心翼翼,生怕误删PLC通信代码,这正是违背了“单一职责原则”的典型问题;

  • 乱象2:依赖混乱,换设备重写——PLC从西门子换成三菱、串口通信换成EtherCAT,就要大面积修改核心代码,甚至重构整个项目,本质是没有隔离“设备通信细节”与“业务逻辑”,违背了依赖倒置原则;

  • 乱象3:维护困难,新人上手难——代码没有分层,变量命名混乱,没有明确的职责边界,新人接手后要花3个月才能理清逻辑,不敢轻易修改,后期维护成本呈指数级上升,这也是很多工控项目“越改越烂”的根源。

这些问题的核心,不是开发能力不足,而是没有遵循《架构整洁之道》的核心逻辑:架构的本质是“决策的持久化表达”,要明确哪些是核心业务规则(不变),哪些是技术实现细节(可变),并通过分层隔离,让可变部分不影响不变部分

核心落地:上位机视角下的整洁架构(4层分层方案)

《架构整洁之道》的核心是“同心圆分层架构”,内层是核心业务逻辑(稳定不变),外层是技术实现细节(灵活可变),依赖关系只能从外层指向内层,绝不能反向穿透。结合上位机开发场景(对接设备、数据处理、UI交互),我们将其落地为4层架构,每一层职责清晰、边界明确,可直接套用在C# WinForm/WPF、Python PyQt等主流开发框架中。

1. 核心层(Entities):上位机的“业务灵魂”(最内层)

核心层是整个系统的根基,封装上位机的核心业务实体与不变规则,完全独立于任何框架、设备与UI,只关注“业务是什么”,不关注“如何实现”——这也是整洁架构中最稳定、最不容易变更的一层。

上位机场景中,核心层主要包含:

  • 业务实体:如设备数据模型(温度、压力、转速等)、报警规则模型(阈值、等级、联动逻辑)、生产参数模型(批次、产能、工艺参数),这些是上位机的核心业务对象,不受技术实现影响;

  • 核心规则:如报警阈值判断(温度>50℃触发报警)、数据校验规则(传感器数据范围校验)、生产流程约束(先采集数据再存储),这些是上位机的业务核心,一旦确定很少变更。

示例(C#):核心层仅定义实体与规则,不依赖任何外部库,哪怕后期换UI框架、换设备,这一层代码无需任何修改,真正实现“业务与技术解耦”。

2. 用例层(Use Cases):上位机的“业务流程”(核心层外层)

用例层承接核心层的业务规则,定义具体的业务流程,协调核心层实体完成具体功能,回答“系统要做什么”,同样不依赖外部技术细节,只依赖核心层的抽象。

上位机场景中,用例层主要包含各类业务场景的实现,比如:

  • 数据采集用例:协调设备通信、数据校验、数据转换,将采集到的原始数据转换为核心层实体可识别的格式;

  • 报警处理用例:根据核心层的报警规则,判断采集数据是否异常,触发报警联动(弹窗、声光提示、日志记录);

  • 数据存储用例:将校验后的有效数据,按规则存储到数据库(SQLite/MySQL),不关心具体用什么数据库、怎么存储;

  • 报表生成用例:根据核心业务规则,统计分析历史数据,生成符合需求的报表,不关心报表的具体展示形式。

关键原则:用例层只依赖核心层的抽象,不调用任何UI、设备通信、数据库的具体实现,这样无论外部技术如何变更,业务流程逻辑都无需修改——比如把数据存储从SQLite换成MySQL,只用修改外层实现,用例层代码完全不变。

3. 接口适配层(Interface Adapters):上位机的“翻译官”(用例层外层)

接口适配层是“内外隔离的边界”,负责将用例层的业务逻辑,转换为外部技术能识别的格式,同时将外部的输入(设备数据、用户操作)转换为用例层能处理的格式,核心作用是“解耦用例层与外部技术”,对应《架构整洁之道》中的接口适配器层。

上位机场景中,接口适配层主要包含3类适配器,完美解决“技术变更不影响业务”的痛点:

  • 设备适配适配器:封装PLC、传感器、变频器等设备的通信逻辑(S7.Net、Snap7、Modbus、EtherCAT),对外提供统一的抽象接口(如IDeviceComm),用例层只需调用接口,无需关心具体是西门子还是三菱PLC——换设备时,只需新增一个适配器实现,无需修改用例层代码;

  • 数据存储适配器:封装数据库操作逻辑,对外提供统一的抽象接口(如IDataRepository),用例层调用接口实现数据存储/查询,换数据库时,只需替换适配器实现,核心逻辑不动;

  • UI适配适配器(Presenter/ViewModel):将用例层的处理结果,转换为UI能显示的格式(如将数据实体转换为UI绑定的ViewModel),同时将用户操作(如点击“开始采集”)转换为用例层的调用指令——换UI框架(WinForm→WPF→MAUI)时,只需重写UI适配器,用例层与核心层完全不变。

这一层完美践行了“依赖倒置原则”:高层业务逻辑(用例层)不依赖低层技术细节(设备、数据库、UI),二者都依赖抽象接口,彻底切断了技术细节对业务逻辑的耦合。

4. 框架与驱动层(Frameworks & Drivers):上位机的“工具集”(最外层)

最外层是所有外部技术实现的集合,负责提供具体的技术支撑,完全依赖内层(接口适配层),不影响任何核心业务逻辑——这一层是“最容易变更”的,也是整洁架构中“灵活性”的核心体现。

上位机场景中,框架与驱动层主要包含:

  • UI框架:WinForm、WPF、PyQt、MAUI等,负责界面显示与用户交互,依赖UI适配层的ViewModel/Presenter;

  • 设备驱动:PLC通信库(S7.Net、Snap7)、串口通信库(SerialPort)、工业总线协议(EtherCAT、Profinet),实现接口适配层定义的设备通信接口;

  • 数据存储驱动:SQLite、MySQL、Redis等数据库的具体实现,实现接口适配层定义的数据存储接口;

  • 第三方工具:日志工具(NLog)、报表工具(DevExpress)、曲线绘制工具(ZedGraph、pyqtgraph),作为辅助工具支撑系统运行。

举个例子:如果需要将上位机从WinForm迁移到Web端,只需替换“UI框架”和“UI适配适配器”,核心层、用例层、设备适配、数据存储适配器完全不变;如果需要将串口通信换成EtherCAT,只需替换“设备驱动”和“设备适配适配器”,业务逻辑无需任何修改——这就是整洁架构的核心价值:技术迭代不影响业务,需求变更成本最低

实战避坑:上位机整洁架构的3个关键落地细节

很多开发人员说“分层架构太复杂,小项目没必要”,但实际上,哪怕是几百行代码的小项目,只要遵循这3个细节,就能快速落地整洁架构,避免后期踩坑——这也是《架构整洁之道》强调的“架构要服务于开发,而非增加负担”。

1. 坚守“单一职责”:一个类只做一件事

上位机开发中,最容易犯的错误就是“一个类包揽所有事”:比如在WinForm的MainForm类中,既写UI交互,又写PLC通信,还写数据处理。正确的做法是:

  • UI类(MainForm):只负责界面显示、接收用户操作,不写任何业务逻辑、不调用任何设备通信接口;

  • 设备通信类:只负责与PLC/传感器通信,不处理数据、不触发报警;

  • 数据处理类:只负责数据校验、转换,不关心数据来自哪里、存到哪里;

  • 报警类:只负责报警判断、联动,不参与数据采集、UI显示。

这样一来,每一个类的职责清晰,修改某一个功能时,只需改动对应类,不会影响其他模块——比如修改报警弹窗样式,只需改UI类,不会牵连PLC通信逻辑。

2. 依赖倒置:面向抽象编程,拒绝“硬编码”

上位机开发中,“硬编码”是耦合的根源:比如直接在业务逻辑中写死“PLC IP=192.168.1.10”“数据库类型=SQLite”,后期修改时需要全局搜索、逐一修改。

遵循依赖倒置原则,只需做好2件事:

  • 定义抽象接口:比如IDeviceComm(设备通信接口)、IDataRepository(数据存储接口),接口中定义核心方法(如ReadData、WriteData、SaveData);

  • 依赖抽象而非具体实现:用例层调用接口,不调用具体的PLC通信类、数据库类;具体实现类(如SiemensS7Comm、SQLiteRepository)实现接口,通过依赖注入的方式注入到用例层。

这样一来,更换设备、更换数据库时,只需新增一个实现类,修改注入配置,无需修改用例层、核心层代码——比如将西门子PLC换成三菱PLC,只需新增MitsubishiComm类实现IDeviceComm接口,其他代码完全不变,这也是很多大型上位机项目能快速适配多设备的核心原因。

3. 拒绝“过度设计”:小项目简化分层,核心不变

《架构整洁之道》强调“架构要适配项目规模”,不是所有上位机项目都需要严格的4层架构:

  • 小项目(如简单温湿度采集):可简化为“核心层+接口适配层+框架驱动层”,合并用例层与核心层,重点保证“业务与技术解耦”;

  • 中大型项目(如多设备协同监控、生产管控系统):严格遵循4层架构,拆分核心业务与技术细节,方便多人并行开发、后期维护——比如7人团队开发20万行代码的光伏电站监控上位机,通过分层架构,可实现并行开发,需求响应速度提升3倍,线上BUG率下降80%。

核心原则:无论项目大小,都要坚守“分层解耦、依赖倒置”的核心,避免“无架构”开发,哪怕是简单项目,也要做好职责拆分,为后期迭代留有余地。

总结:上位机开发,整洁架构不是“锦上添花”,而是“雪中送炭”

很多上位机开发人员觉得“架构是花架子”,直到项目变得臃肿不堪、维护成本高到无法承受,才明白“好架构能省一半力”。

《架构整洁之道》带给我们的,从来不是一套固定的分层模板,而是一种“以业务为核心、以解耦为目标”的开发思维——上位机的核心价值是“稳定、高效地对接设备、处理数据、服务生产”,而整洁架构,正是让我们摆脱“代码混乱、迭代困难、维护繁琐”的关键。

对于上位机开发而言,整洁架构的本质的是:让业务逻辑不被技术细节绑架,让系统能灵活应对设备迭代、需求变更,让每一行代码都有清晰的职责,让新人能快速上手,让维护者能轻松迭代

不必追求“完美架构”,但一定要坚守“整洁原则”——哪怕是从拆分一个类、定义一个接口开始,也是在向更高效、更稳定的开发模式靠近。
在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐