1. 项目背景与核心痛点
作为一名在工业自动化领域摸爬滚打多年的C#开发者,我见过太多同行在工控上位机开发中反复踩同样的坑。最常见的场景就是:当你刚完成一个温湿度监控系统的开发,现场突然要求增加西门子PLC的数据采集功能;好不容易改造完PLC接口,客户又提出要接入Modbus协议的智能仪表。每次需求变更都伴随着代码的大幅修改,最终系统变成一堆if-else和switch-case的"意大利面条代码"。
更深层次的问题在于:
- 设备耦合严重:采集逻辑与具体设备型号强绑定,更换设备需要重写核心代码
- 协议处理混乱:不同厂商设备的通信协议(如Modbus RTU/TCP、西门子S7协议)处理代码散落在各处
- 配置僵化:串口参数、设备地址等硬编码在程序中,现场调试需要重新编译
- 扩展困难:每新增一种设备类型,都要修改数据采集、处理、显示的完整链路
关键经验:工控系统的核心价值不在于实现单个设备通信,而在于构建设备无关的数据采集框架。好的架构应该像乐高积木——新增设备只需"插拔模块",而不影响整体结构。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 架构设计思路
2.1 分层设计原则
我们采用经典的四层架构,每层有明确的职责边界:
code复制[设备层] ←→ [驱动层] ←→ [服务层] ←→ [展示层]
- 设备层:物理设备(PLC、传感器、仪表等)
- 驱动层:封装设备通信协议(一个设备类型对应一个驱动)
- 服务层:统一管理设备连接、数据采集、异常处理
- 展示层:处理UI交互和数据可视化
2.2 关键设计模式
2.2.1 抽象工厂模式(设备驱动)
csharp复制public interface IDeviceDriver
{
bool Connect(DeviceConfig config);
DeviceData ReadData();
void WriteData(DeviceCommand command);
event EventHandler<DataReceivedEventArgs> DataReceived;
}
// 具体实现示例(Modbus RTU驱动)
public class ModbusRtuDriver : IDeviceDriver
{
private SerialPort _port;
public bool Connect(DeviceConfig config)
{
_port = new SerialPort(config.PortName, config.BaudRate);
// 更多初始化代码...
}
// 实现其他接口方法...
}
2.2.2 观察者模式(数据更新)
csharp复制// 在服务层维护设备列表和数据订阅关系
public class DeviceMonitorService
{
private Dictionary<string, IDeviceDriver> _devices = new();
public void RegisterDevice(string deviceId, IDeviceDriver driver)
{
_devices.Add(deviceId, driver);
driver.DataReceived += (sender, e) =>
{
// 统一处理数据更新事件
UpdateDataView(deviceId, e.Data);
};
}
}
2.2.3 策略模式(协议解析)
csharp复制public interface IProtocolParser
{
object Parse(byte[] rawData);
byte[] BuildCommand(object command);
}
// 西门子S7协议解析器
public class S7ProtocolParser : IProtocolParser
{
public object Parse(byte[]
