【工业自动化】C#上位机开发:设备监控与数据采集实战全攻略
·
【工业自动化】C#上位机开发:设备监控与数据采集实战全攻略
一、引言
随着工业4.0和物联网(IoT)的快速发展,设备监控与数据采集系统已成为现代工业控制系统的核心。上位机作为连接现场设备与管理层的桥梁,负责实时监控设备状态、采集运行数据、异常报警及联动控制。
本文将从零到一系统性讲解如何使用 C# 开发一套高效、稳定的工业上位机系统,涵盖设备通信、数据采集、实时监控、数据存储等全流程实战内容。方案已在半导体老化、电芯检测、PLC群控等产线验证,可直接落地。
二、系统架构与设计
典型的设备监控上位机采用分层 + 事件驱动架构:
- 通信层:Modbus TCP/RTU、串口、OPC UA 等协议抽象
- 采集层:高频异步采集 + 粘包处理
- 业务层:数据解析、规则引擎、联动控制
- 存储层:时序数据 + 结构化日志
- 展示层:实时曲线、仪表盘、报警中心
核心设计原则:
- 异步优先(避免UI阻塞)
- 接口抽象(支持多协议)
- 工业级稳定性(断线重连、缓存、看门狗)
三、设备通信:Modbus协议实现
1. 安装NuGet包(推荐 Modbus.Net)
Install-Package Modbus.Net
Install-Package CommunityToolkit.Mvvm
Install-Package Serilog
2. Modbus 服务抽象与实现
// Interfaces/IModbusService.cs
public interface IModbusService : IAsyncDisposable
{
Task<bool> ConnectAsync(ModbusConfig config);
Task<ushort[]> ReadHoldingRegistersAsync(ushort startAddress, ushort count);
Task WriteSingleRegisterAsync(ushort address, ushort value);
bool IsConnected { get; }
event EventHandler<ModbusDataEventArgs>? DataReceived;
}
ModbusTcpService.cs(生产级实现)
public class ModbusTcpService : IModbusService
{
private ModbusTcpMaster? _master;
private readonly ILogger<ModbusTcpService> _logger;
public async Task<bool> ConnectAsync(ModbusConfig config)
{
try
{
_master = new ModbusTcpMaster(config.IpAddress, config.Port);
await _master.ConnectAsync();
_logger.Information("Modbus TCP 连接成功 → {Ip}:{Port}", config.IpAddress, config.Port);
return true;
}
catch (Exception ex)
{
_logger.Error(ex, "Modbus TCP 连接失败");
return false;
}
}
public async Task<ushort[]> ReadHoldingRegistersAsync(ushort startAddress, ushort count)
{
if (_master == null || !_master.IsConnected)
throw new InvalidOperationException("未连接到设备");
return await _master.ReadHoldingRegistersAsync(1, startAddress, count);
}
public async ValueTask DisposeAsync()
{
_master?.Dispose();
}
}
四、数据采集模块(高频稳定)
public class DataAcquisitionService
{
private readonly IModbusService _modbus;
private readonly Channel<CollectedData> _channel = Channel.CreateBounded<CollectedData>(2000);
public async Task StartPollingAsync(CancellationToken ct = default)
{
while (!ct.IsCancellationRequested)
{
try
{
var values = await _modbus.ReadHoldingRegistersAsync(1000, 20);
var data = new CollectedData
{
Timestamp = DateTime.UtcNow,
DeviceId = "PLC-01",
Values = ParseRegisters(values)
};
await _channel.Writer.WriteAsync(data, ct);
}
catch { /* 重连逻辑 */ }
await Task.Delay(50, ct); // 20Hz
}
}
}
五、监控与显示模块(OxyPlot实时可视化)
public partial class DashboardViewModel : ObservableObject
{
public PlotModel TrendModel { get; } = new PlotModel();
private readonly LineSeries _tempSeries = new LineSeries { Title = "温度", Color = OxyColors.Red };
public void UpdateData(CollectedData data)
{
var x = DateTimeAxis.ToDouble(data.Timestamp);
_tempSeries.Points.Add(new DataPoint(x, data.GetValue("Temperature")));
if (_tempSeries.Points.Count > 2000)
_tempSeries.Points.RemoveAt(0);
TrendModel.InvalidatePlot(false);
}
}
六、数据存储与分析模块
推荐 Serilog + SQLite 本地 + SQL Server 中心化:
Log.Logger = new LoggerConfiguration()
.WriteTo.SQLite("Data/Production.db", "DeviceData")
.WriteTo.MSSqlServer(connectionString, "HistoryLogs")
.CreateLogger();
七、故障报警与联动
建立阈值规则引擎,超出范围时触发报警、邮件通知及设备联动。
结语:C# 上位机开发在工业自动化领域具有生态完善、性能优秀、易维护等显著优势。通过合理的分层架构和异步编程,可以构建出稳定、高效的设备监控与数据采集系统。
此文已与系列其他文章(Modbus双协议、串口粘包解析、ValueTask优化、数据可视化、报警联动等)形成完整技术栈,可直接用于实际产线项目。
需要我继续补充以下任意部分吗?
- 完整报警联动引擎 代码
- 实时数据网格 + 导出功能
- Native AOT 发布配置
- 整个 Demo 项目结构 + 关键文件
更多推荐
所有评论(0)