【工业自动化】C#上位机平台开发:数据可视化与故障报警的实战指南

一、引言

在工业自动化领域,随着设备智能化程度的提高,上位机系统已成为监控、控制和数据分析的核心平台。上位机通过与PLC、传感器等下位设备进行实时数据交换,不仅能监控设备运行状态,还能通过数据可视化技术帮助操作员直观理解生产过程,及时发现并处理故障。

本文将使用 C# + WPF(也可扩展至 .NET MAUI)开发一套工业级上位机平台,重点实现高性能数据可视化智能故障报警功能,结合实际产线经验,提供可直接落地的代码和架构方案。

二、系统架构与设计

工业级上位机系统核心模块包括:

  • 实时数据采集与通讯模块:Modbus、OPC UA、串口等协议支持
  • 数据存储与处理模块:时序数据 + 结构化日志
  • 数据可视化模块:曲线、仪表盘、热力图等
  • 故障报警模块:阈值判断、联动控制、通知推送
  • 用户界面与交互模块:响应式操作界面

架构原则:分层设计、异步优先、事件驱动、依赖注入。

三、实时数据采集与通讯

推荐使用 Modbus.Net 实现稳定通讯,结合 ValueTask 优化高频采集。

public class DataAcquisitionService
{
    private readonly IModbusService _modbus;
    private readonly Channel<DeviceData> _dataChannel = Channel.CreateBounded<DeviceData>(1000);

    public async Task StartAsync(CancellationToken ct = default)
    {
        while (!ct.IsCancellationRequested)
        {
            try
            {
                var result = await _modbus.ReadHoldingRegistersAsync(0, 20); // 示例
                var data = ParseToDeviceData(result);

                await _dataChannel.Writer.WriteAsync(data, ct);
            }
            catch (Exception ex)
            {
                Log.Error(ex, "数据采集异常");
            }

            await Task.Delay(50, ct); // 20Hz
        }
    }
}

四、数据可视化实战(OxyPlot高性能实现)

DashboardViewModel.cs

public partial class DashboardViewModel : ObservableObject
{
    public PlotModel TrendModel { get; } = new PlotModel { Title = "实时趋势监控" };

    private readonly LineSeries _tempSeries = new LineSeries 
    { 
        Title = "温度 (°C)", 
        Color = OxyColors.OrangeRed,
        StrokeThickness = 2 
    };

    public void AddDataPoint(DateTime time, double temperature, double pressure)
    {
        var x = DateTimeAxis.ToDouble(time);

        _tempSeries.Points.Add(new DataPoint(x, temperature));

        // 滚动窗口 + 下采样
        if (_tempSeries.Points.Count > 1500)
            _tempSeries.Points.RemoveAt(0);

        TrendModel.InvalidatePlot(false);   // 轻量刷新,关键优化
    }
}

XAML 使用

<oxy:PlotView Model="{Binding TrendModel}" 
              Width="1200" Height="500" 
              Background="Transparent"/>

推荐可视化组件

  • 实时曲线 → OxyPlot(高频首选)
  • 仪表盘 → Custom Gauge 或 MudBlazor(MAUI场景)
  • 状态监控 → 颜色编码的 Border + TextBlock

五、故障报警模块(核心实战)

1. 报警规则引擎
public class AlarmRule
{
    public string RuleName { get; set; } = string.Empty;
    public string DeviceId { get; set; } = string.Empty;
    public string Parameter { get; set; } = string.Empty;
    public double ThresholdHigh { get; set; }
    public double ThresholdLow { get; set; }
    public AlarmSeverity Severity { get; set; }
    public bool Enabled { get; set; } = true;
}
2. 报警服务实现
public class AlarmService
{
    private readonly Serilog.ILogger _logger;
    private readonly IEventAggregator _eventAggregator;

    public void Evaluate(DeviceData data)
    {
        foreach (var rule in _rules.Where(r => r.Enabled && r.DeviceId == data.DeviceId))
        {
            double value = data.GetValue(rule.Parameter);

            if (value > rule.ThresholdHigh || value < rule.ThresholdLow)
            {
                var alarm = new AlarmEventArgs
                {
                    DeviceId = data.DeviceId,
                    Parameter = rule.Parameter,
                    Value = value,
                    Severity = rule.Severity,
                    Description = $"{rule.Parameter} 超出阈值: {value}"
                };

                TriggerAlarm(alarm);
            }
        }
    }

    private void TriggerAlarm(AlarmEventArgs alarm)
    {
        _logger.Warning("报警触发 [{Severity}] {Device} - {Desc}", 
            alarm.Severity, alarm.DeviceId, alarm.Description);

        _eventAggregator.GetEvent<AlarmRaisedEvent>().Publish(alarm);

        // 邮件/短信推送(高危)
        if (alarm.Severity >= AlarmSeverity.High)
            _notificationService.SendAlarm(alarm);
    }
}
3. 报警中心界面(WPF)

使用 DataGrid + 颜色标记显示当前报警,支持确认、消音等操作。

六、生产级优化建议

  • 性能:数据采集与UI更新完全解耦(Channel + MainThread)
  • 稳定性:MQTT断连处理 + 自动重连 + 本地缓存
  • 扩展性:规则支持动态配置(JSON存储)
  • 部署:.NET 9 Native AOT 单文件发布

结语:数据可视化让生产过程“看得见”,故障报警让异常“停得住”。通过C#强大的生态和异步编程能力,我们可以构建出既美观又稳定的工业上位机平台。

本方案已与之前的 Modbus实战串口粘包解析ValueTask优化Serilog日志 等内容形成完整技术体系,适合从轻量调试工具到大型产线监控平台的演进。


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

  1. 完整报警中心 View + ViewModel 代码
  2. OxyPlot 多曲线 + 仪表盘 完整示例
  3. 动态报警规则配置界面
  4. Native AOT 发布配置

更多推荐