C#上位机中ZedGraph控件的使用

Stella981
• 阅读 535

上位机程序控制PLC模拟量通道输出周期性正弦波信号,并采集所造成改变的模拟量输入信号,并绘制数据变化曲线。

界面如图:

C#上位机中ZedGraph控件的使用

最后测试效果如图:

C#上位机中ZedGraph控件的使用

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ZedGraph;

namespace ProfessionalTest
{
    public partial class FrMain : Form
    {
        #region 构造函数
        int tickStart = 0;
        int tickStart2 = 0;
        int zQ1 = 0;
        int zQ2 = 0;
        int fZ1 = 0;
        int fZ2 = 0;
        int pY1 = 0;
        int pY2 = 0;
        public FrMain()
        {
            InitializeComponent();
            this.ControlBox = false;
        }
        #endregion
        /// <summary>
        /// 窗体加载对两个表进行初始化
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrMain_Load(object sender, EventArgs e)
        {
            //无需油源流量压力设置,油源手动控制
            //OPC.OpcServer server = OPC.OpcServer.GetServer();  ///一个PC ACCESS 即为一个OPC server
            //server["油源"]["专业台当前流量"] = (float)50;
            //server["油源"]["专业台当前压力"] = (float)10;
            #region 负载模拟1
            //获取引用
            GraphPane myPane = zedGraphControl1.GraphPane;
            //设置标题
            myPane.Title.Text = "负载模拟1";
            //设置X轴说明文字
            myPane.XAxis.Title.Text = "时间";
            //设置Y轴说明文字
            myPane.YAxis.Title.Text = "给定压力/实测压力";

            //设置1200个点,假设每50毫秒更新一次,刚好检测1分钟,一旦构造后将不能更改这个值
            RollingPointPairList list = new RollingPointPairList(1200);
            RollingPointPairList list2 = new RollingPointPairList(1200);
            //开始,增加的线是没有数据点的(也就是list为空)
            //增加一条名称:Voltage,颜色Color.Bule,无符号,无数据的空线条
            LineItem curve = myPane.AddCurve("给定压力", list, Color.Blue, SymbolType.None);
            LineItem curve2 = myPane.AddCurve("实际压力", list2, Color.Red, SymbolType.None);
            timerDraw.Interval = 1000; //设置timer控件的间隔为500毫秒
            timerDraw.Enabled = true; //timer可用
            timerDraw.Stop(); //开始

            myPane.XAxis.Scale.Min = 0; //X轴最小值0
            myPane.XAxis.Scale.Max = 30; //X轴最大30
            myPane.XAxis.Scale.MinorStep = 1;//X轴小步长1,也就是小间隔
            myPane.XAxis.Scale.MajorStep = 5;//X轴大步长为5,也就是显示文字的大间隔

            //改变轴的刻度
            zedGraphControl1.AxisChange();

            //保存开始时间
            //tickStart = Environment.TickCount;
            #endregion
            #region 负载模拟2
            //获取引用
            GraphPane myPane1 = zedGraphControl2.GraphPane;
            //设置标题
            myPane1.Title.Text = "负载模拟2";
            //设置X轴说明文字
            myPane1.XAxis.Title.Text = "时间";
            //设置Y轴说明文字
            myPane1.YAxis.Title.Text = "给定压力/实测压力";

            //设置1200个点,假设每50毫秒更新一次,刚好检测1分钟,一旦构造后将不能更改这个值
            RollingPointPairList list3 = new RollingPointPairList(1200);
            RollingPointPairList list4 = new RollingPointPairList(1200);
            //开始,增加的线是没有数据点的(也就是list为空)
            //增加一条名称:Voltage,颜色Color.Bule,无符号,无数据的空线条
            LineItem curve3 = myPane1.AddCurve("给定压力", list3, Color.Blue, SymbolType.None);
            LineItem curve4 = myPane1.AddCurve("实际压力", list4, Color.Red, SymbolType.None);

            timer1Draw.Interval = 1000; //设置timer控件的间隔为500毫秒
            timer1Draw.Enabled = true; //timer可用
            timer1Draw.Stop(); //暂不启动

            myPane1.XAxis.Scale.Min = 0; //X轴最小值0
            myPane1.XAxis.Scale.Max = 30; //X轴最大30
            myPane1.XAxis.Scale.MinorStep = 1;//X轴小步长1,也就是小间隔
            myPane1.XAxis.Scale.MajorStep = 5;//X轴大步长为5,也就是显示文字的大间隔

            //改变轴的刻度
            zedGraphControl2.AxisChange();

            //保存开始时间
            //tickStart2 = Environment.TickCount;
            #endregion
        }
        /// <summary>
        /// 负载1模拟开始
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                zQ1 = int.Parse(textBox1.Text);
                fZ1 = int.Parse(textBox2.Text);
                pY1 = int.Parse(textBox5.Text);
                if (zQ1<=10)
                {
                    MessageBox.Show("周期过小,请将周期设为10秒以上") ;
                    return;
                }
                if (fZ1<=5)
                {
                    MessageBox.Show("幅值过小,请将幅值设为5MPa以上");
                    return;
                }
                else if (fZ1>=15)
                {
                    MessageBox.Show("幅值过大,请将幅值设为15MPa以下");
                    return;
                }
                if (pY1-fZ1 <0)
                {
                    MessageBox.Show("压力过小,请将压力设为0MPa以上");
                    return;
                }
                else if (fZ1 +pY1> 31.5)
                {
                    MessageBox.Show("压力过大,请将压力设为15MPa以下");
                    return;
                }
                button1.Enabled = false;
                timerDraw.Start();
                //保存开始时间
                tickStart = Environment.TickCount;
                #region 清空原有图表
                //确保CurveList不为空
                if (zedGraphControl1.GraphPane.CurveList.Count <= 0)
                {
                    return;
                }

                //取Graph第一个曲线,也就是第一步:在GraphPane.CurveList集合中查找CurveItem
                LineItem curve = zedGraphControl1.GraphPane.CurveList[0] as LineItem;
                LineItem curve2 = zedGraphControl1.GraphPane.CurveList[1] as LineItem;
                if (curve == null | curve2 == null)
                {
                    return;
                }
                //第二步:在CurveItem中访问PointPairList(或者其它的IPointList),根据自己的需要增加新数据或修改已存在的数据
                IPointListEdit list = curve.Points as IPointListEdit;
                IPointListEdit list2 = curve2.Points as IPointListEdit;
                list.Clear();
                list2.Clear();
                //第三步:调用Form.Invalidate()方法更新图表
                zedGraphControl1.Invalidate();
#endregion
            }
            catch (Exception)
            {
                MessageBox.Show("请输入正确数值");
            }
        }
        /// <summary>
        /// 负载2模拟开始
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                zQ2 = int.Parse(textBox3.Text);
                fZ2 = int.Parse(textBox4.Text);
                pY2 = int.Parse(textBox6.Text);
                if (zQ2 <= 10)
                {
                    MessageBox.Show("周期过小,请将周期设为10秒以上");
                    return;
                }
                if (fZ2 <= 5)
                {
                    MessageBox.Show("幅值过小,请将幅值设为5MPa以上");
                    return;
                }
                else if (fZ2 >= 15)
                {
                    MessageBox.Show("幅值过大,请将幅值设为15MPa以下");
                    return;
                }
                if (pY2 - fZ2 < 0)
                {
                    MessageBox.Show("压力过小,请将压力设为0MPa以上");
                    return;
                }
                else if (fZ2 + pY2 > 31.5)
                {
                    MessageBox.Show("压力过大,请将压力设为15MPa以下");
                    return;
                }
                button2.Enabled = false;
                timer1Draw.Start();
                //保存开始时间
                tickStart2 = Environment.TickCount;
                #region 清空原有图表
                //确保CurveList不为空
                if (zedGraphControl2.GraphPane.CurveList.Count <= 0)
                {
                    return;
                }

                //取Graph第一个曲线,也就是第一步:在GraphPane.CurveList集合中查找CurveItem
                LineItem curve3 = zedGraphControl2.GraphPane.CurveList[0] as LineItem;
                LineItem curve4 = zedGraphControl2.GraphPane.CurveList[1] as LineItem;
                if (curve3 == null | curve4 == null)
                {
                    return;
                }
                //第二步:在CurveItem中访问PointPairList(或者其它的IPointList),根据自己的需要增加新数据或修改已存在的数据
                IPointListEdit list3 = curve3.Points as IPointListEdit;
                IPointListEdit list4 = curve4.Points as IPointListEdit;
                if (list3 == null | list4 == null)
                {
                    return;
                }
                list3.Clear();
                list4.Clear();
                //第三步:调用Form.Invalidate()方法更新图表
                zedGraphControl2.Invalidate();
                #endregion

            }
            catch (Exception)
            {
                MessageBox.Show("请输入正确数值");
            }
        }
        /// <summary>
        /// 负载1模拟停止
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            timerDraw.Enabled = false;
            timerDraw.Stop();
            button1.Enabled = true;
            OPC.OpcServer server = OPC.OpcServer.GetServer();
            server["专业试验台"]["比例溢流阀4_1模拟缓存"] = (float)0;//写入压力0
        }
        /// <summary>
        /// 负载2模拟停止
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            timer1Draw.Enabled = false;
            timer1Draw.Stop();
            button2.Enabled = true;
            OPC.OpcServer server = OPC.OpcServer.GetServer();
            server["专业试验台"]["比例溢流阀4_2模拟缓存"] = (float)0;//写入压力0
        }
        /// <summary>
        /// 负载模拟1表格定时更新
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timerDraw_Tick(object sender, EventArgs e)
        {
            //确保CurveList不为空
            if (zedGraphControl1.GraphPane.CurveList.Count <= 0)
            {
                return;
            }

            //取Graph第一个曲线,也就是第一步:在GraphPane.CurveList集合中查找CurveItem
            LineItem curve = zedGraphControl1.GraphPane.CurveList[0] as LineItem;
            LineItem curve2 = zedGraphControl1.GraphPane.CurveList[1] as LineItem;
            if (curve == null | curve2 == null)
            {
                return;
            }
            //第二步:在CurveItem中访问PointPairList(或者其它的IPointList),根据自己的需要增加新数据或修改已存在的数据
            IPointListEdit list = curve.Points as IPointListEdit;
            IPointListEdit list2 = curve2.Points as IPointListEdit;
            if (list == null | list2 == null)
            {
                return;
            }
            // 时间用秒表示
            double time = (Environment.TickCount - tickStart) / 1000.0;
            // 周期为zQ1,幅值为fZ1
            OPC.OpcServer server = OPC.OpcServer.GetServer();
            float gDYL = (float)(fZ1 * Math.Sin(2.0 * Math.PI * time / zQ1))+pY1;//给定压力值
            float sJYL = server["专业试验台"]["负载模拟压力缓存1_1"];//实际读取压力值
            server["专业试验台"]["比例溢流阀4_1模拟缓存"] = gDYL;//将周期值写入PLC
            list.Add(time, (double)gDYL);
            list2.Add(time, (double)sJYL);
            Console.WriteLine(time.ToString());
            Scale xScale = zedGraphControl1.GraphPane.XAxis.Scale;
            if (time > xScale.Max - xScale.MajorStep)
            {
                xScale.Max = time + xScale.MajorStep;
                xScale.Min = xScale.Max - 30.0;
            }

            //第三步:调用ZedGraphControl.AxisChange()方法更新X和Y轴的范围
            zedGraphControl1.AxisChange();

            //第四步:调用Form.Invalidate()方法更新图表
            zedGraphControl1.Invalidate();
        }
        /// <summary>
        /// 负载模拟2表格定时更新
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1Draw_Tick(object sender, EventArgs e)
        {
            //确保CurveList不为空
            if (zedGraphControl2.GraphPane.CurveList.Count <= 0)
            {
                return;
            }

            //取Graph第一个曲线,也就是第一步:在GraphPane.CurveList集合中查找CurveItem
            LineItem curve3 = zedGraphControl2.GraphPane.CurveList[0] as LineItem;
            LineItem curve4 = zedGraphControl2.GraphPane.CurveList[1] as LineItem;
            if (curve3 == null | curve4 == null)
            {
                return;
            }
            //第二步:在CurveItem中访问PointPairList(或者其它的IPointList),根据自己的需要增加新数据或修改已存在的数据
            IPointListEdit list3 = curve3.Points as IPointListEdit;
            IPointListEdit list4 = curve4.Points as IPointListEdit;
            if (list3 == null | list4 == null)
            {
                return;
            }
            // 时间用秒表示
            double time = (Environment.TickCount - tickStart2) / 1000.0;
            // 周期为zQ2,幅值为fZ2
            OPC.OpcServer server = OPC.OpcServer.GetServer();
            float gDYL = (float)(fZ2 * Math.Sin(2.0 * Math.PI * time / zQ2))+pY2;//给定压力值
            float sJYL = server["专业试验台"]["负载模拟压力缓存1_2"];//实际读取压力值
            server["专业试验台"]["比例溢流阀4_2模拟缓存"] = gDYL;//将周期值写入PLC
            list3.Add(time, gDYL);
            list4.Add(time, sJYL);
            Console.WriteLine(time.ToString());
            Scale xScale = zedGraphControl2.GraphPane.XAxis.Scale;
            if (time > xScale.Max - xScale.MajorStep)
            {
                xScale.Max = time + xScale.MajorStep;
                xScale.Min = xScale.Max - 30.0;
            }

            //第三步:调用ZedGraphControl.AxisChange()方法更新X和Y轴的范围
            zedGraphControl2.AxisChange();

            //第四步:调用Form.Invalidate()方法更新图表
            zedGraphControl2.Invalidate();
        }
        /// <summary>
        /// 关闭窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button5_Click(object sender, EventArgs e)
        {
            OPC.OpcServer server = OPC.OpcServer.GetServer();
            server["专业试验台"]["比例溢流阀4_1模拟缓存"] = (float)0;//写入压力0
            server["专业试验台"]["比例溢流阀4_2模拟缓存"] = (float)0;//写入压力0
            this.Close();
        }
    }
}
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
2年前
Postman 使用方法详细介绍
1,下载安装:https://www.getpostman.com/apps2,打开Postman,如图所示:!(https://oscimg.oschina.net/oscnet/00f434cd831f2f74fea6f6d7b86bc46a751.png)3,创建一个接口项目!(https://oscimg.oschina.
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这