【工业自动化】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优化数据可视化报警联动等)形成完整技术栈,可直接用于实际产线项目。


需要我继续补充以下任意部分吗?

  1. 完整报警联动引擎 代码
  2. 实时数据网格 + 导出功能
  3. Native AOT 发布配置
  4. 整个 Demo 项目结构 + 关键文件

更多推荐