电话&微信

18600577194

工业设备软件为什么要分采集层、业务层和界面层?架构边界怎么划分

标签: 工业软件 工业电子设备开发 2026-09-25 

很多工业设备软件的第一版,并不会遇到明显的架构问题。

例如一台测试设备通过RS485连接电脑,上位机读取数据,然后把温度、压力和运行状态显示在界面上。

最直接的程序写法可能是:

串口收到数据 → 解析 → 更新界面 → 保存数据库。

设备只有一台、协议简单、功能较少时,这种方式开发很快,也完全能运行。

问题通常出现在项目继续增长以后。

设备从1台变成5台;
通信从RS485增加到CAN和TCP;
界面增加曲线、报表和权限;
数据还要同步到Web后台;
现场又要求断线重连、日志和远程诊断。

这时,原来“通信代码、业务逻辑和界面写在一起”的结构就会迅速变复杂。

真正的问题并不是某个程序员写得不好,而是软件边界没有提前划分。

工业设备软件为什么需要分层,本质上是为了回答一个问题:

当设备、协议和业务不断变化时,哪些部分应该跟着变化,哪些部分应该保持稳定。

一、最容易出问题的结构:设备通信直接驱动界面

先看一个常见场景。

串口线程收到一条数据:

01 03 04 00 7A 00 35 ...

程序解析后得到:

温度 = 12.2℃
压力 = 5.3 bar

然后通信线程直接执行:

更新温度文本框
更新压力仪表
写入数据库
判断报警
刷新曲线

第一版看起来非常方便。

但这种结构有一个明显问题:

设备通信和业务界面已经绑定在一起。

如果后续把RS485设备换成TCP设备,就可能需要改界面代码。

如果同一份数据还要提供给Web接口,又要重新从UI逻辑里拆。

如果后台线程频繁直接更新界面,还可能引入线程同步和UI卡顿问题。

所以设备通信层最重要的职责,不应该是“操作界面”。

它应该只回答:

设备现在发来了什么数据。

二、采集层应该只关心“怎么和设备说话”

工业软件的最底层通常是设备通信和采集。

这一层可能面对:

  • 串口;

  • RS485;

  • CAN;

  • TCP;

  • UDP;

  • Modbus;

  • 自定义二进制协议。

它的职责是建立连接、发送请求、接收数据、处理超时和断线。

例如同样是读取温度:

RS485设备可能需要发送Modbus命令;

TCP设备可能主动推送数据;

CAN设备可能通过特定帧ID周期发送。

这些实现方式完全不同。

但上层业务真正关心的其实只是:

设备A
温度:72.4℃
时间:10:21:15
状态:正常

所以一个合理的采集层应该把底层协议差异转换成统一的数据结构。

这样,即使后续更换设备协议,上面的业务逻辑也不需要全部重写。

断网与恢复后的数据同步流程.jpeg


三、协议解析最好不要和串口收发写成一整块

设备通信代码里还有一个很容易混在一起的部分:

传输

和

协议解析。

例如串口本身只负责收到字节:

AA 55 01 04 ...

至于:

第几个字节代表温度;

CRC怎么算;

设备地址在哪里;

某个功能码代表什么;

这些应该属于协议层。

把两者分开的好处是,当同一协议未来从串口改到TCP时,协议解析逻辑仍然可以复用。

可以理解为:

传输层
串口 / TCP / CAN
        ↓
协议层
Modbus / 自定义协议
        ↓
统一设备数据

这种分离在协议简单时似乎“多写了一层”,但一旦项目有多个设备型号,价值会迅速体现出来。

四、业务层负责的不是“显示什么”,而是“系统应该怎么判断”

假设设备上报温度82℃。

采集层只负责告诉系统:

当前温度是82℃。

至于:

是否超过报警阈值;

是否需要保存;

是否触发停机;

是否需要向平台上报告警;

这些已经属于业务逻辑。

业务层应该处理的是:

数据意味着什么,以及系统接下来应该做什么。

例如:

设备温度 > 80℃
↓
持续超过5秒
↓
产生高温告警
↓
记录事件
↓
通知界面
↓
必要时触发控制逻辑

如果把这套判断直接写在某个界面按钮或曲线控件里面,后续增加Web后台或者无界面服务程序时,就很难复用。

所以业务层应该尽量独立于UI。

五、界面层应该是业务状态的“展示者”

上位机界面当然很重要。

用户需要看:

实时数据、曲线、报警、设备状态和历史记录。

但从软件架构上看,UI最好不要成为系统核心。

例如业务层已经判断:

设备状态 = 高温报警

界面只负责决定怎样展示:

红色状态;

弹窗;

报警列表;

趋势图标记。

如果未来换成Web后台,核心业务依然可以使用,只需要换一套展示方式。

这也是为什么工业软件在项目后期从桌面端扩展到Web时,有没有分层会产生很大差别。

一个高度耦合的上位机,往往需要大量重写。

一个业务层独立的系统,则可以继续复用原有逻辑。

六、数据库应该放在哪一层?

数据库经常成为另一个耦合点。

有些程序会在按钮点击事件中直接写SQL:

用户点击开始
↓
insert test_record

或者在串口接收线程中直接写数据库。

这种方式短期开发方便,但长期会让数据库逻辑散落在整个程序中。

更合理的方式是把数据存储作为独立能力。

例如:

采集层
   ↓
业务层
   ↓
数据服务
   ↓
数据库

业务层只表达:

保存一次测试记录。

至于数据最终存到SQLite、MySQL还是服务端接口,由数据层负责。

这样数据库方案发生变化时,不需要修改大量业务代码。

七、分层不是为了“架构漂亮”,而是为了控制变化范围

软件分层最实际的价值,是控制修改影响。

可以用一个简单对比理解:

项目变化高耦合结构分层结构
RS485改TCP可能影响UI和业务主要修改采集层
更换设备协议多处修改主要修改协议层
增加Web后台业务逻辑可能重写业务层可复用
更换数据库多处SQL调整数据层调整
增加新设备型号容易复制代码增加适配层
UI重新设计可能牵动通信主要影响界面层

因此,分层真正解决的是:

变化发生以后,修改能不能被限制在一个合理区域。

八、工业软件常见的一套分层方式

实际项目不一定必须完全照搬某一种架构。

但对于典型工业设备软件,可以参考:

设备
 ↓
通信驱动层
 ↓
协议解析层
 ↓
设备模型 / 数据模型
 ↓
业务逻辑层
 ↓
数据服务层
 ↓
界面 / API / Web

其中:

通信驱动层处理连接、收发、重连;

协议层把字节转换成业务数据;

设备模型统一不同设备状态;

业务层处理报警、流程、控制和规则;

数据层负责历史数据和数据库;

界面/API层面向用户或其他系统。

不需要为了“分层”强行建立很多项目或文件夹。

真正重要的是职责边界清楚。

九、设备数量增加以后,为什么分层价值会更明显?

只有一台设备时,通信问题通常比较简单。

但如果一套上位机同时连接:

4台RS485设备;

2台TCP设备;

1个PLC;

一个扫码枪;

情况就不同了。

每种设备都有:

自己的连接状态;

超时;

错误;

重连机制;

采集周期。

如果所有逻辑都直接进入UI线程,程序很容易出现:

界面卡顿;

一个设备异常影响其他设备;

线程难以管理;

状态难以追踪。

所以多设备系统通常更需要把设备连接和界面完全解耦。

界面只读取统一状态。

设备通信则在后台独立运行。

十、为什么“线程越多”并不能解决架构问题?

工业上位机性能出现问题时,有时会直接增加线程。

一个设备一个线程;

一个功能一个线程;

一个曲线一个线程。

短期可能缓解阻塞,但线程数量增加并不等于架构合理。

如果线程之间仍然直接修改同一份数据、同一个界面或者同一个数据库,反而可能产生:

竞争条件;

死锁;

数据不同步;

随机异常。

因此并发设计仍然应该围绕清晰的数据流。

例如:

设备线程
  ↓
消息/数据队列
  ↓
业务处理
  ↓
UI订阅状态

这样不同模块之间通过明确的数据传递协作,而不是互相直接调用。

工业设备本地+服务端混合数据架构.jpeg

十一、什么时候不需要做得这么复杂?

分层也不能走向另一个极端。

如果一个工具软件只有:

一个串口设备;

三个数据显示;

两个按钮;

也没有长期扩展计划,

那么设计几十个接口、服务和抽象层反而会增加开发和维护成本。

所以工业软件架构仍然需要与项目规模匹配。

更值得提前分层的情况通常包括:

  • 多设备;

  • 多协议;

  • 长期维护;

  • 未来增加Web或APP;

  • 数据规模较大;

  • 多人持续开发。

真正合理的目标不是:

层数越多越专业。

而是:

未来最可能变化的部分,是否已经和稳定部分分开。

十二、已有上位机很乱,需要全部重写吗?

不一定。

这是实际项目中很常见的问题。

已经运行几年的工业软件,可能通信、数据库和界面都混在一起。

如果系统仍然稳定运行,没有新的扩展需求,贸然全部重写风险很高。

更合理的做法通常是先分析:

哪部分修改最频繁;

哪部分故障最多;

哪些模块阻碍新需求。

然后逐步拆分。

例如先把设备协议从UI中抽出来。

再把数据库访问统一。

然后再建立业务服务层。

这种渐进式重构通常比“一次性推倒重来”更适合已经投入使用的工业系统。

十三、软件架构还应该考虑未来谁来维护

工业软件与普通短生命周期应用有一个明显区别:

很多系统可能需要运行多年。

几年以后维护这套软件的人,很可能已经不是最初开发者。

如果代码结构高度依赖个人习惯,那么后续增加设备、修复故障和迁移系统都会变得困难。

因此,好的软件架构除了技术性能,还应该让新的开发人员能够相对清楚地判断:

设备通信在哪里;

协议解析在哪里;

报警逻辑在哪里;

数据库在哪里;

界面负责什么。

这也是“可维护性”在工业软件项目中的实际价值。

十四、北京心玥科技如何参与工业设备软件开发?

北京心玥科技有限公司可独立承接软件开发,也可结合工业电子设备、智能硬件和IoT项目进行整体开发。

在工业软件项目中,可以根据需求涉及:

设备通信、协议对接、上位机、数据采集、数据库、Web后台、设备管理、数据展示以及服务端系统等部分。

对于新项目,可以在早期根据设备数量、协议类型、数据规模和后续扩展要求确定软件边界。

对于已有设备或已有上位机,也可以先分析现有通信协议、程序结构和业务需求,再判断是进行局部模块改造、增加新平台,还是重新划分软件架构。

实际采用的技术栈、部署方式、接口以及源码和相关资料的交付范围,以项目合作内容和双方约定为准。

工业设备软件分层真正要解决的并不是“代码看起来是否整齐”,而是:

当设备、协议、数据库和用户界面发生变化时,系统能不能只修改真正需要变化的部分。

这决定了一套工业软件能不能从“第一版能运行”,逐渐变成“长期可以维护和扩展”。

常见问题 FAQ

工业上位机一定要采用分层架构吗?

不一定。简单、短期且功能固定的小工具可以采用更直接的结构。设备和功能越多、维护周期越长,分层带来的价值越明显。

设备通信代码可以直接更新界面吗?

简单程序可以这样实现,但复杂系统容易产生耦合和线程问题。更推荐通信层输出统一数据,由业务和界面层分别处理。

协议层和采集层有什么区别?

采集层负责连接和数据收发,协议层负责解释数据内容。例如串口负责接收字节,而Modbus解析负责理解寄存器和数据含义。

已有上位机架构比较混乱,是否必须重新开发?

不一定。通常可以先识别影响维护和扩展最大的模块,再逐步拆分,避免一次性重写带来新的项目风险。

上位机未来可能增加Web后台,现在需要提前考虑吗?

如果需求已经比较明确,建议提前把设备通信和业务逻辑与桌面UI解耦。这样后续增加Web后台时,更容易复用已有业务能力。