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

搞上位机开发的兄弟应该都懂,Excel表格配工艺参数有多反人类。最近在车间里被老师傅吐槽了三个月之后,我决定用C#重构生产线控制系统。这次不搞那些花里胡哨的,直接上硬菜——既能怼PLC又能接485,还得让操作工看得懂界面。

主控界面直接拿WPF开刀,XAML里塞个DockPanel打底。重点在通讯模块搞双协议支持,这里用了个工厂模式:
public ICommProtocol CreateProtocol(ProtocolType type, string config)
{
switch (type)
{
case ProtocolType.PLC_S7:
return new S7Protocol(config); // 引用S7.Net库
case ProtocolType.RS485_MODBUS:
var serialPort = new SerialPortWrapper(config);
return new ModbusRTU(serialPort); // 自己封装的Modbus库
default:
throw new ArgumentOutOfRangeException();
}
}
PLC通讯这块坑最多,特别是S7协议的数据块解析。之前被大端小端序坑过,现在学乖了:
// 处理PLC返回的字节数组
float ParseReal(byte[] data, int startIndex)
{
// 西门子PLC的浮点数存储是反人类设计
Array.Reverse(data, startIndex, 4);
return BitConverter.ToSingle(data, startIndex);
}
工艺编辑界面直接抛弃Excel,用MVVM模式搞了个可拖拽的流程图控件。重点是把工艺节点抽象成ViewModel:
public class ProcessNodeVM : INotifyPropertyChanged
{
private Point _position;
public Point Position
{
get => _position;
set => SetField(ref _position, value);
}
// 绑定到Canvas的Left/Top属性
public double CanvasLeft => Position.X - NodeSize / 2;
public double CanvasTop => Position.Y - NodeSize / 2;
}
操作工说想要像手机相册那样双指缩放曲线图,直接上OxyPlot库真香。但原生的缩放不跟手,得自己魔改:
// 在PlotView的MouseMove事件里搞事情
if (e.MiddleButton == MouseButtonState.Pressed)
{
var delta = e.GetPosition(this) - _lastMousePosition;
plotModel.AxisX[0].Zoom(_lastX0 + delta.X * xScale, _lastX1 + delta.X * xScale);
plotModel.InvalidatePlot(true);
}
游标功能更刺激,得在渲染层插个LineAnnotation:
var cursorLine = new LineAnnotation
{
Type = LineAnnotationType.Vertical,
X = currentX,
StrokeThickness = 2,
Text = $"{selectedValue:0.00}"
};
plotModel.Annotations.Add(cursorLine);
实测发现频繁更新曲线会导致界面卡顿,最后用了个环形缓冲区+DispatcherTimer限流,刷新率控制在30fps左右刚刚好。现在这套系统扔车间里跑了小半年,老师傅们终于不说我写的界面像火星文了——果然干掉Excel才是工业软件的终极正义。


更多推荐
所有评论(0)