摘要:工业自动化领域,PLC(可编程逻辑控制器)作为核心控制设备,其运行数据的实时采集与监控对生产效率、设备维护和能源管理至关重要。传统PLC数据采集系统常面临扩展性差、维护成本高、代码耦合度高等问题。
工业自动化领域,PLC(可编程逻辑控制器)作为核心控制设备,其运行数据的实时采集与监控对生产效率、设备维护和能源管理至关重要。传统PLC数据采集系统常面临扩展性差、维护成本高、代码耦合度高等问题。
今天推荐一个PLC数据采集与监控系统,通过重构架构,采用策略模式与工厂模式,结合开闭原则(OCP),实现了高扩展性、低耦合的模块化设计,支持动态添加轴位置、动作流、水电用量等多样化数据类型,并支持自定义消息与异常处理。
项目介绍1、功能目标轴位置数据:机械臂或传动设备的实时位置与运动状态。
动作流数据:设备执行动作的序列与时间戳。
水电用量数据:生产过程中的能源消耗统计。
自定义消息:支持用户定义报警、日志等非标准数据类型。
2、架构重构目标原系统采用硬编码方式实现数据采集,新增数据类型需修改核心代码,违反开闭原则。
重构后的架构需满足:
扩展性:新增数据类型无需修改现有代码。
可维护性:模块化设计降低耦合度,便于独立测试与调试。
性能优化:异步采集、并发控制与内存管理。
项目架构策略模式与工厂模式的融合
1、核心组件系统通过四层核心组件实现数据采集与管理的解耦:
组件
职责
IDataCollector定义数据采集器的标准接口,包括数据读取、模型转换等方法。 BaseDataCollector抽象基类,封装通用逻辑(如地址解析、错误处理),提供模板方法供子类实现。 DataCollectorFactory工厂类,根据数据类型动态创建采集器实例。 DataCollectionManager管理器,协调采集器生命周期、状态监控与并发控制。 2、类图与继承关系IDataCollector↑
BaseDataCollector
↑
├── 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 : BaseDataCollectorfloat, TemperatureAddressModel, TemperatureDataModel>
{
publicoverridestring DataTypeName => "温度数据";
protected override ObservableArrayfloat> CreateDataArray(int size)
{
returnnew ObservableArrayfloat>(size);
}
protectedoverrideasync Task
{
// 调用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原则,还通过异步编程、并发控制等手段优化了性能,为工业互联网场景提供了可靠、灵活的数据采集解决方案。
关键词、、、、、、、、、、、
来源:opendotnet