如何使一个界面上两个zedGraph收到数据 都实时的刷新 不卡死
private void Form1_Load(object sender, EventArgs e)
{
initZedGraph(zedGraphControl1);
Task task = new Task(new Action(sampling));
task.Start();
}
private PointPairList list1 = new PointPairList(); //AD1的点
private PointPairList list2 = new PointPairList(); //AD2的点
private PointPairList list3 = new PointPairList();
private PointPairList list4 = new PointPairList(); //AD1的点
private PointPairList list5 = new PointPairList(); //AD2的点
private PointPairList list6 = new PointPairList();
private void initZedGraph(ZedGraphControl zedgraph)
{
GraphPane myPane = zedgraph.GraphPane;
if (zedgraph == zedGraphControl1)
{
myPane.Title.Text = "1";
LineItem Curve1 = myPane.AddCurve("电压1", list1, Color.Yellow, SymbolType.None);
LineItem Curve2 = myPane.AddCurve("电压2", list2, Color.Green, SymbolType.None);
LineItem Curve3 = myPane.AddCurve("电压3", list3, Color.Red, SymbolType.None);
Curve1.IsY2Axis = true;
Curve2.IsY2Axis = true;
}
if (zedgraph == zedGraphControl2)
{
myPane.Title.Text = "2";
LineItem Curve1 = myPane.AddCurve("电压1", list4, Color.Yellow, SymbolType.None);
LineItem Curve2 = myPane.AddCurve("电压2", list5, Color.Green, SymbolType.None);
LineItem Curve3 = myPane.AddCurve("电压3", list6, Color.Red, SymbolType.None);
Curve1.IsY2Axis = true;
Curve2.IsY2Axis = true;
}
myPane.XAxis.Title.Text = "时间";
myPane.YAxis.Title.Text = "距离(μm)";//"电压值"; //
myPane.XAxis.Scale.Max = 100;
myPane.XAxis.Scale.Min = 0;
myPane.XAxis.MajorTic.IsOpposite = false;
myPane.XAxis.MinorTic.IsOpposite = false;
myPane.YAxis.Scale.Max = 3500;
myPane.YAxis.Scale.Min = -3500;
myPane.YAxis.MajorTic.IsOpposite = false;
myPane.YAxis.MinorTic.IsOpposite = false; //小刻度
myPane.YAxis.Scale.Align = AlignP.Inside;
myPane.Y2Axis.Title.Text = "电压值";
myPane.Y2Axis.Scale.Max = 4;
myPane.Y2Axis.Scale.Min = -4;
myPane.Y2Axis.Scale.FontSpec.FontColor = Color.Black;
myPane.Y2Axis.Title.FontSpec.FontColor = Color.Black;
myPane.Y2Axis.MajorTic.IsOpposite = false;
myPane.Y2Axis.MinorTic.IsOpposite = false;
myPane.Y2Axis.Scale.Align = AlignP.Inside;
myPane.Y2Axis.IsVisible = true;
myPane.Chart.Fill = new Fill(Color.White, Color.SteelBlue, 45.0F);
myPane.Legend.IsVisible = false;
zedgraph.AxisChange();
zedgraph.Refresh();
}
int count = 0;
private void sampling()
{
int itime = 0;
while (true)
{
Random rd = new Random(); //无参即为使用系统时钟为种子
list1.Add((double)itime, rd.Next(1,4));
list2.Add((double)itime, rd.Next(1, 4));
list4.Add((double)itime, rd.Next(1, 4));
list5.Add((double)itime, rd.Next(1, 4));
list3.Add((double)itime, rd.Next(1, 4000));
list6.Add((double)itime, rd.Next(1, 4000));
count++;
if (count == 200)
{
count = 0;
itime++;
if (itime > 10000)
{
itime = 0;
list1.Clear();
list2.Clear();
list4.Clear();
list5.Clear();
list3.Clear();
list6.Clear();
}
//Thread.Sleep(100);
if (itime >= 100)
{
zedGraphControl1.GraphPane.XAxis.Scale.Min = (double)itime - 100;
zedGraphControl1.GraphPane.XAxis.Scale.Max = (double)itime;
RefreshGraph(zedGraphControl1);
zedGraphControl2.GraphPane.XAxis.Scale.Min = (double)itime - 100;
zedGraphControl2.GraphPane.XAxis.Scale.Max = (double)itime;
RefreshGraph(zedGraphControl2);
}
}
}
}
private delegate void RefreshDelegate();
private void RefreshGraph(ZedGraphControl zg)
{
if (zg == null)
return;
//判断是否是非创建控件的线程调用控件
if (zg.InvokeRequired)
{
RefreshDelegate a = new RefreshDelegate(new Action(() => { zg.Invalidate(); }));
zg.BeginInvoke(a);
}
else
{
zg.AxisChange();
zg.Invalidate();
zg.Refresh();
}
}
相关推荐
C#上位机串口接收数据并绘图:帧拆解与实时曲线刷新实战
串口通信是工业设备数据采集的基础,C#上位机通过SerialPort接收传感器数据,但原始字节流并不直接等于可用数据,需要按帧协议进行拆解。DataReceived事件负责快速搬运字节,粘包与半包问题则依赖帧头、长度与校验和来定位边界。经过帧解析后的数值,通过线程安全的队列交给UI定时器批量刷新,配合ZedGraph控件绘制实时曲线,可有效避免跨线程卡顿与绘图性能瓶颈。这种模式广泛应用于设备调试、实验室采集与产线监控,既保证数据完整性,又让界面保持流畅。围绕串口接收与曲线绘图,梳理参数配置、帧解析与UI异步
C#串口上位机开发:数据采集、存储与实时显示全解析
在工业调试与设备运维中,串口通信是连接上位机与下位机的基础桥梁。许多工程师在开发数据采集工具时,往往只关注界面能否显示数据,却忽略了数据存储、异常恢复与高频读写等工程化问题。本文从串口通信原理出发,深入讲解SerialPort参数配置、缓冲区设计、粘包与半包解析等关键技术;再结合SQLite与MySQL的选型场景,说明批量落库与事务机制对采集性能的重要影响;同时介绍ZedGraph实时曲线绘制、线程模型分离等显示层优化手段。无论是设备调试人员、测试工程师,还是正在搭建C#上位机项目的开发者,都能从中掌握一套
MATLABSimulink模拟及会议论文,关于具备自动温度控制和能耗分析的智能太阳能热水系统。.zip
1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
完美复现基于自适应虚拟谐波阬的光储VSG并网电流谐波抑制模型(Simulink仿真实现)
内容概要:本文围绕基于自适应虚拟谐波阬的光储VSG并网电流谐波抑制模型展开研究,提出了一种结合虚拟同步发电机(VSG)控制与自适应虚拟谐波阬技术的谐波治理方案,旨在有效应对光伏发电与储能系统并网过程中产生的特定次谐波问题。通过在Simulink中构建完整的系统仿真模型,详细实现了VSG的惯量阻尼控制、功率环调控以及自适应谐波阬的频率识别与阻抗重塑机制,能够动态跟踪并抑制并网电流中的谐波成分,从而提升电能质量和系统并网稳定性。文章深入剖析了控制器结构设计、关键参数整定方法及谐波抑制效果的仿真验证过程,充分验证了该方法在复杂工况下的有效性、鲁棒性与工程应用潜力。; 适合人群:具备电力电子、新能源并网、电力系统分析等相关专业知识背景的科研人员与工程技术人员,尤其适用于熟悉Simulink仿真环境、掌握基本控制理论与信号处理技术的研究生、高校教师及企业研发人员。; 使用场景及目标:①应用于光伏-储能联合系统的并网逆变器控制设计;②用于提升VSG并网系统的电能质量与抗扰动能力;③为高比例新能源接入场景下的谐波分析与主动抑制策略提供仿真验证平台与技术支撑;④辅助开展新型电力系统中电能质量治理相关的教学与科研工作。; 阅读建议:建议读者结合提供的Simulink模型文件进行同步仿真操作,重点理解VSG控制架构与自适应虚拟谐波阬模块的耦合关系,关注谐波检测、频率自适应调整与复矢量控制的实现细节,并可通过改变负载条件或电网阻抗参数进行多工况测试,以深入掌握系统的动态响应特性与控制性能边界。
机械三维3D设计图-食品皮带机输送除尘消毒设备.zip
机械三维3D设计图-食品皮带机输送除尘消毒设备.zip


