为什么应用必须和通讯解耦?一套能维护十年的设计原则

丁丁智造 · 2026-07-13
为什么应用必须和通讯解耦?一套能维护十年的设计原则
导读:通讯逻辑和业务逻辑混写,是上位机项目后期改不动、不敢改的主要原因。本文讲清解耦的具体做法和带来的长期价值。

耦合的典型症状

  • 想换通讯库,发现界面、报警、存储代码全要改
  • 通讯一卡,整个界面卡死
  • 同一个读 PLC 的逻辑,在三个窗口里复制了三遍
  • 设备离线时,业务层拿到一堆异常却不知道怎么处理

这些都是通讯层和应用层没分开导致的。

解耦后的三层结构

通讯层:只负责连接、读写、重连,对外提供“当前值”和“写入命令”,不关心界面和业务。

数据模型层:维护一份统一的“点位实时值缓存”,带时间戳和质量戳(好/坏/不确定)。

应用层:界面、报警、存储只跟数据模型层打交道,根本不知道底层是什么协议。

关键:用“实时值缓存”做中间媒介

通讯线程按周期把读到的值写进缓存,应用层只读缓存、不直接触发通讯。这样:

  • 界面刷新再频繁,也不会重复打 PLC
  • 通讯中断时,缓存里的值带“坏质量”标记,界面据此显示灰色状态灯
  • 换协议只改通讯层,应用层零感知

状态质量为什么重要

工业现场不能只有“值”,还要有“质量”。一个温度点显示 85℃,但如果通讯已中断,这个 85℃ 是过期数据,必须用质量戳标出来,避免误判。这也是状态灯分绿/黄/红/灰的原因:

  • 绿:正常运行
  • 黄:待机/告警
  • 红:故障
  • 灰:通讯中断(数据不可信)

解耦带来的长期收益

  1. 通讯库可整体替换(比如从厂商 SDK 换成开源 OPC UA)
  2. 可以用“模拟驱动”在没有 PLC 时开发调试界面
  3. 多人协作不冲突:一人写驱动,一人做界面
  4. 单元测试可针对数据模型和业务逻辑独立进行

落地最小动作

哪怕项目不大,也建议先做两件事:一是建一个全局点位缓存字典,二是把所有通讯收进独立模块/线程。这两步成本不高,却决定了项目三年后还能不能轻松迭代。