大数跨境
0
0

WinForm 下基于策略与工厂模式的 PLC 数据采集与监控系统

WinForm 下基于策略与工厂模式的 PLC 数据采集与监控系统 跨境电商创业日记
2025-10-22
9
导读:推荐一个PLC数据采集与监控系统。

前言

工业自动化领域,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<floatTemperatureAddressModelTemperatureDataModel>
{
    publicoverridestring DataTypeName => "温度数据";

    protected override ObservableArray<floatCreateDataArray(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#工业自动化#数据采集

最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号[DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

作者:小码编匠

出处:gitee.com/smallcore/DotNetCore
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!



END



方便大家交流、资源共享和共同成长
纯技术交流群,需要加入的小伙伴请扫码,并备注加群



推荐阅读






C# 开发工业级温湿度上位机:实时采集与存储

面向工业自动化的 WPF PLC 风格上位机开发框架

C# 写的一个开源免费的OPC UA网关,支持西门子PLC

WinForm + FFmpeg 开发的轻量级视频压缩工具

.NET 8 + Avalonia 跨平台简易校园信息管理系统的开发实战

Windows 服务可视化管理器:安装、启停、定时全搞定

C# + WPF + SuperSocket 开发面向工业自动化的 MES 系统

告别服务宕机,C# 看门狗守护你的 WinForm 与 Windows 服务

.NET 一款高效跨平台的自动更新工具(差异更新+热修复+自动升级)

WinForm 工业流量计串口调试助手:支持Modbus双协议的智能调试工具

面向工厂自动化的智能语音播报方案(基于.NET Windows服务)

基于 WPF + Prism 的工业自动化监控系统开源实践

工业自动化UI太难做?WPF 这套工业级控件方案真香(附源码)

工业自动化 WPF + Halcon 的模块化机器视觉解决方案

C# 开源视觉与运动控制集成平台,模块化设计赋能工业自动化

开源福利!八款 WPF + HandyControl 工业管理系统源码全公开

WinForm + Win32 API 自定义无边框窗口实战(工业软件必备)

WPF + MVVM架构的轻量级视频播放器实现

基于 HslCommunication 的多端同步PLC远程监控系统

C# + Vue 面向工业场景的实时数据采集与监控平台

WinForm 数据采集实战:从串口通信到MES对接的轻量化解决方案

一个拒绝过度设计的 .NET 快速开发框架:开箱即用,专注"干活"

C# 工业视觉全流程实战:模板匹配、胶钉定位与下位机通信
WPF 通信控制台:功能丰富、界面美观的上位机开发实战
拿来就用!一个基于 .NET 6 + WPF 的开源数据大屏模板

WinForm + SunnyUI  与 MQTTnet 实现智能可视化的火警联动大屏系统

工业自动化实战:基于 .NET + ModBus RTU协议的称重机开发

WinForm 基于 SunnyUI+ PCLSharp 的机器视觉焊接系统

.NET 9 + WPF + Halcon 构建工业视觉流程框架:从架构设计到落地实践

WinForm 高分屏适配难题?一款强大的控件自适应缩放工具

开源轻量的 WinForm 图片处理工具,提取主色调、应用滤镜、重新上色
基于 .NET 6 + OpenCVSharp 的跨平台工业视觉图像分析工具
WinForm 框架下的工控领域视觉检测
基于 .NET 8 + React 的轻量高效库存管理系统(前后端分离)
WPF 实时工业监控大屏:ModBus协议集成与无边框动态可视化方案
图形化操作 Windows 服务?这个开源小工具做到了
.NET 9.0 一个可复用 WPF 界面框架
手把手教会设计 WinForm 高DPI兼容程序,告别字体模糊与控件乱飞

WPF + MVVM 自助式检验报告打印机的多框架实现

为什么 .NET 内存占用非常大?

C# 部署 Yolov8 全攻略:OpenVINO 与 TensorRT  双引擎加速
WPF 一款通用的嵌入式测控上位机(灵活配置免重复)
干货推荐:五款功能强大的 .NET 开源工作流系统,拿来即用
全栈 .NET 低代码引擎:权限、工作流、API动态生成,开源即用
一款基于 .NET 的轻量级 ERP 进销存系统:扫码入库、订单变标签,直达发货
.NET 8 + Vue 3 的智能工厂 MES 快速开发框架:设备监控、数据大屏全覆盖
.NET 9 + React 基于 DDD架构的动态路由 + RBAC权限实战
基于 SunnyUI 的企业级 WinForm 快速开发框架,开箱即用!
免硬件方案!基于.NET 的摄像头扫码工具(支持回车/连续扫描)
工业级 MES 系统开发 WPF + MVVM 从入门到实战(全源码/收藏版)

C# 工业常用的控件库

C# 轻松搞定工业上位机程序开机自启

C# 工业视觉开发选择 Halcon 还是 OpenCV?

C# 上位机开发怎么学?给自动化工程师的建议

.NET 桌面应用 (WPF/WinForm) 高效自动更新解决方案

一行代码快速开发 AntdUI 风格的 WinForm 通用后台框架

WinForm + SQL Server + Modbus 实现仓库温控上位机系统开发

WinForm 开发的多功能工具:串口通信、加密解密、图像转换等功能

.NET 开源免费、功能强大的图表库 ScottPlot(WinForm/WPF 通用)

C#+ OpenCvSharp 工业视觉常用图像处理示例集(开箱即用,附源码)


觉得有收获?不妨分享让更多人受益

关注「DotNet技术匠」,共同提升技术实力


收藏
点赞
分享
在看

【声明】内容源于网络
0
0
跨境电商创业日记
跨境分享馆 | 每天分享跨境见解
内容 44961
粉丝 0
跨境电商创业日记 跨境分享馆 | 每天分享跨境见解
总阅读255.6k
粉丝0
内容45.0k