前言
工业自动化领域,PLC(可编程逻辑控制器)作为核心控制设备,其运行数据的实时采集与监控对生产效率、设备维护和能源管理至关重要。传统PLC数据采集系统常面临扩展性差、维护成本高、代码耦合度高等问题。
今天推荐一个PLC数据采集与监控系统,通过重构架构,采用策略模式与工厂模式,结合开闭原则(OCP),实现了高扩展性、低耦合的模块化设计,支持动态添加轴位置、动作流、水电用量等多样化数据类型,并支持自定义消息与异常处理。
项目介绍
1、功能目标
轴位置数据:机械臂或传动设备的实时位置与运动状态。
动作流数据:设备执行动作的序列与时间戳。
水电用量数据:生产过程中的能源消耗统计。
自定义消息:支持用户定义报警、日志等非标准数据类型。
2、架构重构目标
原系统采用硬编码方式实现数据采集,新增数据类型需修改核心代码,违反开闭原则。
重构后的架构需满足:
扩展性:新增数据类型无需修改现有代码。
可维护性:模块化设计降低耦合度,便于独立测试与调试。
性能优化:异步采集、并发控制与内存管理。
项目架构
策略模式与工厂模式的融合
1、核心组件
系统通过四层核心组件实现数据采集与管理的解耦:
|
|
|
|---|---|
| IDataCollector |
|
| BaseDataCollector |
|
| DataCollectorFactory |
|
| DataCollectionManager |
|
2、类图与继承关系
IDataCollector
↑
BaseDataCollector<TData, TAddress, TDataModel>
↑
├── AxisPositionDataCollector // 轴位置采集器
├── IODataCollector // 输入输出信号采集器
├── AlarmDataCollector // 报警信息采集器
└── EnergyDataCollector // 能源数据采集器(示例扩展)
3、关键设计模式
策略模式:通过BaseDataCollector的抽象方法(如ReadDataFromDeviceAsync)定义采集策略,子类实现具体逻辑。
工厂模式:DataCollectorFactory根据数据类型名称(如"Temperature")创建对应采集器,隐藏复杂初始化过程。
开闭原则:新增数据类型时,仅需扩展子类与注册工厂,无需修改现有代码。
项目说明
新增数据类型的实现步骤
以温度数据采集器为例,演示如何扩展系统功能:
1、创建数据模型
[SplitTable(SplitType.Day)]
[SugarTable("{year}{month}{day}_温度数据")]
internal class TemperatureDataModel : BasePlcDataModel
{
public string TemperatureName { get => Name; set => Name = value; }
public float TemperatureValue
{
get => BitConverter.ToSingle(BitConverter.GetBytes(Value), 0);
set => Value = BitConverter.ToInt32(BitConverter.GetBytes(value), 0);
}
}
注解说明:
SplitTable:按天分表存储数据。
SugarTable:定义数据库表名格式。
2、创建地址模型(可选)
[SqlSugar.SugarTable("Temperature")]
internal class TemperatureAddressModel : BaseAddressModel
{
// 定义温度传感器的PLC地址映射
}
3、实现数据采集器
public classTemperatureDataCollector : BaseDataCollector<float, TemperatureAddressModel, TemperatureDataModel>
{
publicoverridestring DataTypeName => "温度数据";
protected override ObservableArray<float> CreateDataArray(int size)
{
returnnew ObservableArray<float>(size);
}
protectedoverrideasync Task<DataReadResult<float[]>> ReadDataFromDeviceAsync()
{
// 调用PLC SDK读取浮点数数组
var result = await _device.ReadFloatAsync(_addressList[0].Address, (ushort)_addressList.Count);
// 返回结果处理(如异常捕获、数据校验)
}
protected override TemperatureDataModel CreateDataModel(int index, float value)
{
returnnew TemperatureDataModel
{
SamplingTime = DateTime.Now,
TemperatureValue = value,
Address = _addressList[index].Address,
TemperatureName = _addressList[index].Name
};
}
}
4、注册采集器
// 静态注册(应用启动时)
DataCollectorFactory.RegisterCollector("Temperature", () => new TemperatureDataCollector());
// 动态注册(运行时)
await PLCDataExchange.AddDataCollectorAsync("Temperature");
项目效果
系统稳定性也提升了,各个采集器之间互不影响,某个采集器出错不会导致整个系统崩溃。
PLC数据采集与监控系统
设置PLC
报警查询
获取连接地址
项目源码
Gitee:https://gitee.com/WoShangZaoBa1314/universal-version-log-pc
总结
本文介绍的PLC数据采集与监控系统通过策略模式与工厂模式的重构,实现了高扩展性、低耦合的模块化架构。开发仅需遵循四步流程(定义模型、实现采集器、注册工厂、动态管理),即可快速扩展系统支持的数据类型。该设计不仅符合SOLID原则,还通过异步编程、并发控制等手段优化了性能,为工业互联网场景提供了可靠、灵活的数据采集解决方案。
关键词
#PLC、#PLC数据采集、#策略模式、#工厂模式、#开闭原则、#模块化架构、#异步设计、#工业监控、#监控系统、#WinForm、#工业自动化、#数据采集
作者:小码编匠

.NET 8 + Avalonia 跨平台简易校园信息管理系统的开发实战
C# + WPF + SuperSocket 开发面向工业自动化的 MES 系统
告别服务宕机,C# 看门狗守护你的 WinForm 与 Windows 服务
.NET 一款高效跨平台的自动更新工具(差异更新+热修复+自动升级)
WinForm 工业流量计串口调试助手:支持Modbus双协议的智能调试工具
面向工厂自动化的智能语音播报方案(基于.NET Windows服务)
工业自动化UI太难做?WPF 这套工业级控件方案真香(附源码)
工业自动化 WPF + Halcon 的模块化机器视觉解决方案
开源福利!八款 WPF + HandyControl 工业管理系统源码全公开
WinForm + Win32 API 自定义无边框窗口实战(工业软件必备)
基于 HslCommunication 的多端同步PLC远程监控系统
WinForm 数据采集实战:从串口通信到MES对接的轻量化解决方案
一个拒绝过度设计的 .NET 快速开发框架:开箱即用,专注"干活"
WinForm + SunnyUI 与 MQTTnet 实现智能可视化的火警联动大屏系统
工业自动化实战:基于 .NET + ModBus RTU协议的称重机开发
WinForm 基于 SunnyUI+ PCLSharp 的机器视觉焊接系统
.NET 9 + WPF + Halcon 构建工业视觉流程框架:从架构设计到落地实践
WinForm 高分屏适配难题?一款强大的控件自适应缩放工具
.NET 桌面应用 (WPF/WinForm) 高效自动更新解决方案
一行代码快速开发 AntdUI 风格的 WinForm 通用后台框架
WinForm + SQL Server + Modbus 实现仓库温控上位机系统开发
WinForm 开发的多功能工具:串口通信、加密解密、图像转换等功能
觉得有收获?不妨分享让更多人受益
关注「DotNet技术匠」,共同提升技术实力

