【Winform+WPF】喷涂工艺SCADA采集监控上位机教程

281 阅读7分钟

一、上位机开发概述(/s/1k3bBkzhn58TOg2Y2FA-nvw 提取码: 6qjn

上位机开发是指为工业控制系统、测试测量设备、自动化装置等硬件设备开发控制与监控软件的过程。这类软件通常运行在PC端,通过与下位机(如PLC、单片机、嵌入式设备等)进行通信,实现对硬件设备的监控、数据采集、参数配置和操作控制。

在上位机开发领域,微软的.NET平台提供了两种主要的UI框架:Windows Forms(简称Winform)和Windows Presentation Foundation(WPF)。这两种技术各有特点,适用于不同的开发场景和需求。

二、Winform技术在上位机开发中的应用

  1. Winform技术简介

Windows Forms是.NET Framework最早提供的用户界面框架,自2002年随.NET Framework 1.0发布以来,已成为Windows桌面应用程序开发的主流选择之一。它基于传统的GDI+绘图技术,采用事件驱动的编程模型。

  1. Winform在上位机开发中的优势

开发效率高:Winform提供了丰富的可视化设计工具,开发者可以通过简单的拖拽操作快速构建界面。Visual Studio中的设计器支持实时预览,属性窗口可以方便地设置控件属性,这大大提高了开发效率。

学习曲线平缓:Winform的编程模型相对简单,对于有C 基础但缺乏前端开发经验的工程师来说更容易上手。其事件处理机制直观明了,如按钮的Click事件、文本框的TextChanged事件等。

稳定性与兼容性:经过近20年的发展,Winform技术非常成熟稳定。它能在从Windows XP到Windows 11的各种Windows版本上良好运行,兼容性极佳。

丰富的第三方控件库:市场上有大量成熟的第三方Winform控件库,如DevExpress、Telerik等,这些控件库提供了专业的图表、仪表盘、网格等组件,非常适合工业控制软件的开发。

  1. Winform在上位机开发中的典型应用

设备控制面板:Winform适合开发设备操作控制面板,通过按钮、开关、指示灯等控件模拟真实设备操作界面。例如:

private void btnStart_Click(object sender, EventArgs e)
{
    if(serialPort1.IsOpen)
    {
        byte[] command = {0x01, 0x06, 0x00, 0x01, 0x00, 0x01, 0x19, 0xCA};
        serialPort1.Write(command, 0, command.Length);
        lblStatus.Text = "设备已启动";
        lblStatus.BackColor = Color.LightGreen;
    }
}

数据采集监控:Winform可以方便地集成图表控件(如MSChart或ZedGraph)来显示实时采集的数据:

private void UpdateChart(double newValue)
{
    this.Invoke((MethodInvoker)delegate {
        chart1.Series[0].Points.AddY(newValue);
        if(chart1.Series[0].Points.Count > 100)
            chart1.Series[0].Points.RemoveAt(0);
    });
}

通信协议实现:Winform可以方便地集成串口通信、网络通信等功能:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    int bytesToRead = serialPort1.BytesToRead;
    byte[] buffer = new byte[bytesToRead];
    serialPort1.Read(buffer, 0, bytesToRead);
    
    // 处理接收到的数据
    ProcessReceivedData(buffer);
}
  1. Winform的局限性

界面美观性有限:虽然可以通过自定义绘制和第三方控件改善,但整体视觉效果仍不如WPF现代化。

分辨率适应性差:Winform界面在不同DPI设置下的表现不一致,在高分屏上可能出现模糊或布局错乱。

数据绑定功能弱:相比WPF的数据绑定机制,Winform的数据绑定功能较为简单,复杂数据展示需要更多手动编码。

三、WPF技术在上位机开发中的应用

  1. WPF技术简介

Windows Presentation Foundation(WPF)是微软在.NET Framework 3.0中引入的新一代图形系统,它基于DirectX渲染,采用XAML标记语言定义界面,支持丰富的视觉效果和灵活的布局方式。

  1. WPF在上位机开发中的优势

强大的图形能力:WPF基于DirectX,支持硬件加速,能够实现复杂的2D/3D图形效果,适合开发具有现代化界面的工业控制软件。

分辨率无关性:WPF使用与设备无关的单位(1/96英寸),能够自动适应不同DPI设置,在高分屏上显示清晰。

灵活的数据绑定:WPF提供了强大的数据绑定机制,支持双向绑定、数据模板、数据验证等,大大简化了数据展示和交互的代码。

MVVM模式支持:WPF天然适合Model-View-ViewModel设计模式,可以实现良好的前后端分离,提高代码的可维护性和可测试性。

样式和模板:WPF允许开发者通过样式和控件模板完全重新定义控件的外观和行为,而不需要编写自定义控件代码。

  1. WPF在上位机开发中的典型应用

现代化控制界面:WPF可以创建具有动画、透明效果等现代化视觉元素的操作界面:

<Button Content="启动设备" Command="{Binding StartCommand}">
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="Background" Value=" FF008000"/>
            <Setter Property="Foreground" Value="White"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value=" FF00CC00"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

数据可视化:WPF内置的图表和图形功能强大,适合展示复杂的工业数据:

<Chart>
    <Chart.Series>
        <LineSeries ItemsSource="{Binding SensorData}" 
                   DependentValuePath="Value" 
                   IndependentValuePath="Time"/>
    </Chart.Series>
</Chart>

3D设备模拟:WPF支持3D模型展示,可以创建设备的3D模拟界面:

<Viewport3D>
    <ModelVisual3D>
        <ModelVisual3D.Content>
            <DirectionalLight Color="White" Direction="-1,-1,-1" />
        </ModelVisual3D.Content>
    </ModelVisual3D>
    <ModelVisual3D>
        <ModelVisual3D.Content>
            <GeometryModel3D Geometry="{StaticResource DeviceGeometry}" 
                             Material="{StaticResource DeviceMaterial}"/>
        </ModelVisual3D.Content>
    </ModelVisual3D>
</Viewport3D>
  1. WPF的局限性

学习曲线较陡:WPF涉及XAML、数据绑定、MVVM等概念,初学者需要较长时间适应。

内存消耗较大:相比Winform,WPF应用程序通常占用更多内存资源。

旧系统兼容性:WPF需要.NET Framework 3.0或更高版本,在极旧的Windows系统上可能无法运行。

四、Winform与WPF的选择策略

  1. 选择Winform的场景
  • 开发周期紧张,需要快速交付的项目

  • 目标运行环境是较旧的Windows系统

  • 开发团队对Winform更熟悉,且项目不需要复杂视觉效果

  • 已有大量Winform代码基础,需要维护或扩展现有系统

    1. 选择WPF的场景
  • 需要现代化、高交互性的用户界面

  • 项目需要良好的数据可视化展示

  • 长期维护的大型项目,需要良好的架构支持

  • 需要适应不同DPI的显示设备

  • 未来可能扩展到跨平台需求(通过.NET Core/.NET 5+)

    1. 混合使用策略

在实际项目中,也可以考虑混合使用两种技术:

Winform宿主WPF:通过ElementHost在Winform中嵌入WPF控件,逐步迁移界面:

var elementHost = new ElementHost();
elementHost.Dock = DockStyle.Fill;
var wpfControl = new MyWpfControl();
elementHost.Child = wpfControl;
this.Controls.Add(elementHost);

WPF宿主Winform:通过WindowsFormsHost在WPF中嵌入Winform控件,复用已有组件:

<WindowsFormsHost>
    <wf:Chart x:Name="winformsChart"/>
</WindowsFormsHost>

五、上位机开发的最佳实践

  1. 通信层设计

无论选择Winform还是WPF,良好的通信层设计都至关重要:

public interface IDeviceCommunication
{
    event EventHandler<DataReceivedEventArgs> DataReceived;
    bool Connect();
    void Disconnect();
    void SendCommand(byte[] command);
}

public class SerialPortCommunication : IDeviceCommunication
{
    // 实现串口通信细节
}

public class TcpIpCommunication : IDeviceCommunication
{
    // 实现网络通信细节
}
  1. 数据展示优化

对于实时数据展示,应注意性能优化:

// WPF中大数据量更新的优化
ObservableCollection<DataPoint> _data = new ObservableCollection<DataPoint>();
public ObservableCollection<DataPoint> Data => _data;

// 使用DispatcherTimer而不是CompositionTarget.Rendering
_timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(50) };
_timer.Tick += (s,e) => UpdateData();
_timer.Start();

private void UpdateData()
{
    // 批量更新数据,而不是单个添加
    var newData = GetNewDataFromDevice();
    _data.AddRange(newData);
    while(_data.Count > MaxPoints) 
        _data.RemoveAt(0);
}
  1. 多线程处理

上位机软件通常需要处理设备通信、数据采集等耗时操作,必须合理使用多线程:

// WPF MVVM模式中的异步命令示例
public ICommand StartAcquisitionCommand => new AsyncCommand(async () => 
{
    IsBusy = true;
    try 
    {
        await _deviceService.StartAcquisitionAsync();
        Status = "采集已启动";
    }
    catch (Exception ex)
    {
        Status = $"错误: {ex.Message}";
    }
    finally
    {
        IsBusy = false;
    }
});
  1. 日志记录

完善的日志系统对于调试和维护至关重要:

public static class Logger
{
    private static readonly ILog _log = LogManager.GetLogger(typeof(Logger));
    
    public static void Initialize()
    {
        log4net.Config.XmlConfigurator.Configure();
    }
    
    public static void LogCommunication(byte[] data, bool isSent)
    {
        if(_log.IsDebugEnabled)
        {
            var direction = isSent ? "发送" : "接收";
            _log.Debug($"{direction}: {BitConverter.ToString(data)}");
        }
    }
}

六、未来发展趋势

随着.NET Core/.NET 5+的推出,WPF的未来发展路径更为清晰。微软已将WPF开源并继续改进,而Winform虽然仍被支持,但新功能开发有限。对于新项目,特别是需要长期维护的上位机软件,WPF是更面向未来的选择。

同时,跨平台技术如Avalonia、Uno Platform等基于XAML的UI框架也在兴起,这些技术可以视为WPF理念的跨平台延伸。对于考虑未来可能需要在Linux或macOS上运行的上位机软件,可以评估这些技术。

七、结论

Winform和WPF都是上位机开发的优秀选择,各有其适用场景。Winform适合开发周期短、运行环境受限或维护现有系统的项目;而WPF则更适合需要现代化界面、复杂数据可视化或长期维护的新项目。开发者应根据项目需求、团队技能和未来规划做出合理选择,有时混合使用两种技术也是可行的方案。无论选择哪种技术,良好的架构设计、模块化实现和完善的通信处理都是开发高质量上位机软件的关键。