C#开发上位机控制系统 主控界面,可以PLC通讯,可以接入485通讯。 可多样形成工艺编辑界面,避免Excel表格的繁琐。 曲线显示美观,纵横坐标可以放缩,游标可以显示具体数值。

主控界面设计得先解决布局问题。在WinForms里SplitContainer是个好东西,左边导航栏,右边工作区,下面状态栏,这结构用户看着舒服。代码里加个自定义控件集合,比如这样:

private void InitializeWorkspace()
{
    var flowPanel = new FlowLayoutPanel
    {
        Dock = DockStyle.Fill,
        WrapContents = false,
        AutoScroll = true
    };
    splitContainer.Panel2.Controls.Add(flowPanel);
}

PLC通讯这块,得搞个抽象层。见过太多项目把Modbus TCP和串口485混着写的,后面维护简直灾难。试试工厂模式:

public interface IPlcDriver
{
    bool Connect(string param);
    byte[] ReadHoldingRegisters(ushort address, ushort length);
}

public class ModbusTcpDriver : IPlcDriver 
{
    // 具体实现用NModbus库
    public byte[] ReadHoldingRegisters(ushort address, ushort length)
    {
        return _modbus.ReadHoldingRegisters(address, length);
    }
}

工艺编辑界面要避免Excel,但也不能搞得太复杂。用PropertyGrid控件配合自定义对象,比表格直观多了:

public class ProcessStep
{
    [Category("参数"), DisplayName("加热温度")]
    public int Temperature { get; set; }

    [Category("时间控制"), DisplayName("保持时间")]
    public TimeSpan Duration { get; set; }
}

// 绑定数据
propertyGrid.SelectedObject = new ProcessStep();

曲线控件推荐用OxyPlot,比自带的Chart控件灵活。实现缩放时注意坐标轴重置事件:

private void OnAxisChanged(object sender, AxisChangedEventArgs e)
{
    if (e.Axis == plotModel.Axes[0]) // X轴
    {
        // 动态调整Y轴范围
        plotModel.Axes[1].Zoom(calculatedMinY, calculatedMaxY);
    }
}

游标跟踪用鼠标移动事件处理,别用Timer轮询,效率太低:

void OnMouseMove(object sender, OxyMouseEventArgs e)
{
    var point = plotModel.GetPoint(e.Position);
    txtValue.Text = $"{point.X:F2}, {point.Y:F2}";
}

串口通讯注意线程安全,收到数据时记得用Control.Invoke更新UI。建议用队列做缓冲,别直接操作控件:

private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    byte[] buffer = new byte[serialPort.BytesToRead];
    serialPort.Read(buffer, 0, buffer.Length);
    BeginInvoke((Action)(() => ProcessData(buffer)));
}

最后给主界面加点现代化元素,用DevExpress的DockPanelManager做布局管理,比原生控件好看多了。不过记得处理好许可证问题,商用项目别踩坑。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐