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

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

界面如图:

最后测试效果如图:

代码:

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using ZedGraph; 11 12namespace ProfessionalTest 13{ 14 public partial class FrMain : Form 15 { 16 #region 构造函数 17 int tickStart = 0; 18 int tickStart2 = 0; 19 int zQ1 = 0; 20 int zQ2 = 0; 21 int fZ1 = 0; 22 int fZ2 = 0; 23 int pY1 = 0; 24 int pY2 = 0; 25 public FrMain() 26 { 27 InitializeComponent(); 28 this.ControlBox = false; 29 } 30 #endregion 31 /// <summary> 32 /// 窗体加载对两个表进行初始化 33 /// </summary> 34 /// <param name="sender"></param> 35 /// <param name="e"></param> 36 private void FrMain_Load(object sender, EventArgs e) 37 { 38 //无需油源流量压力设置,油源手动控制 39 //OPC.OpcServer server = OPC.OpcServer.GetServer(); ///一个PC ACCESS 即为一个OPC server 40 //server["油源"]["专业台当前流量"] = (float)50; 41 //server["油源"]["专业台当前压力"] = (float)10; 42 #region 负载模拟1 43 //获取引用 44 GraphPane myPane = zedGraphControl1.GraphPane; 45 //设置标题 46 myPane.Title.Text = "负载模拟1"; 47 //设置X轴说明文字 48 myPane.XAxis.Title.Text = "时间"; 49 //设置Y轴说明文字 50 myPane.YAxis.Title.Text = "给定压力/实测压力"; 51 52 //设置1200个点,假设每50毫秒更新一次,刚好检测1分钟,一旦构造后将不能更改这个值 53 RollingPointPairList list = new RollingPointPairList(1200); 54 RollingPointPairList list2 = new RollingPointPairList(1200); 55 //开始,增加的线是没有数据点的(也就是list为空) 56 //增加一条名称:Voltage,颜色Color.Bule,无符号,无数据的空线条 57 LineItem curve = myPane.AddCurve("给定压力", list, Color.Blue, SymbolType.None); 58 LineItem curve2 = myPane.AddCurve("实际压力", list2, Color.Red, SymbolType.None); 59 timerDraw.Interval = 1000; //设置timer控件的间隔为500毫秒 60 timerDraw.Enabled = true; //timer可用 61 timerDraw.Stop(); //开始 62 63 myPane.XAxis.Scale.Min = 0; //X轴最小值0 64 myPane.XAxis.Scale.Max = 30; //X轴最大30 65 myPane.XAxis.Scale.MinorStep = 1;//X轴小步长1,也就是小间隔 66 myPane.XAxis.Scale.MajorStep = 5;//X轴大步长为5,也就是显示文字的大间隔 67 68 //改变轴的刻度 69 zedGraphControl1.AxisChange(); 70 71 //保存开始时间 72 //tickStart = Environment.TickCount; 73 #endregion 74 #region 负载模拟2 75 //获取引用 76 GraphPane myPane1 = zedGraphControl2.GraphPane; 77 //设置标题 78 myPane1.Title.Text = "负载模拟2"; 79 //设置X轴说明文字 80 myPane1.XAxis.Title.Text = "时间"; 81 //设置Y轴说明文字 82 myPane1.YAxis.Title.Text = "给定压力/实测压力"; 83 84 //设置1200个点,假设每50毫秒更新一次,刚好检测1分钟,一旦构造后将不能更改这个值 85 RollingPointPairList list3 = new RollingPointPairList(1200); 86 RollingPointPairList list4 = new RollingPointPairList(1200); 87 //开始,增加的线是没有数据点的(也就是list为空) 88 //增加一条名称:Voltage,颜色Color.Bule,无符号,无数据的空线条 89 LineItem curve3 = myPane1.AddCurve("给定压力", list3, Color.Blue, SymbolType.None); 90 LineItem curve4 = myPane1.AddCurve("实际压力", list4, Color.Red, SymbolType.None); 91 92 timer1Draw.Interval = 1000; //设置timer控件的间隔为500毫秒 93 timer1Draw.Enabled = true; //timer可用 94 timer1Draw.Stop(); //暂不启动 95 96 myPane1.XAxis.Scale.Min = 0; //X轴最小值0 97 myPane1.XAxis.Scale.Max = 30; //X轴最大30 98 myPane1.XAxis.Scale.MinorStep = 1;//X轴小步长1,也就是小间隔 99 myPane1.XAxis.Scale.MajorStep = 5;//X轴大步长为5,也就是显示文字的大间隔 100 101 //改变轴的刻度 102 zedGraphControl2.AxisChange(); 103 104 //保存开始时间 105 //tickStart2 = Environment.TickCount; 106 #endregion 107 } 108 /// <summary> 109 /// 负载1模拟开始 110 /// </summary> 111 /// <param name="sender"></param> 112 /// <param name="e"></param> 113 private void button1_Click(object sender, EventArgs e) 114 { 115 try 116 { 117 zQ1 = int.Parse(textBox1.Text); 118 fZ1 = int.Parse(textBox2.Text); 119 pY1 = int.Parse(textBox5.Text); 120 if (zQ1<=10) 121 { 122 MessageBox.Show("周期过小,请将周期设为10秒以上") ; 123 return; 124 } 125 if (fZ1<=5) 126 { 127 MessageBox.Show("幅值过小,请将幅值设为5MPa以上"); 128 return; 129 } 130 else if (fZ1>=15) 131 { 132 MessageBox.Show("幅值过大,请将幅值设为15MPa以下"); 133 return; 134 } 135 if (pY1-fZ1 <0) 136 { 137 MessageBox.Show("压力过小,请将压力设为0MPa以上"); 138 return; 139 } 140 else if (fZ1 +pY1> 31.5) 141 { 142 MessageBox.Show("压力过大,请将压力设为15MPa以下"); 143 return; 144 } 145 button1.Enabled = false; 146 timerDraw.Start(); 147 //保存开始时间 148 tickStart = Environment.TickCount; 149 #region 清空原有图表 150 //确保CurveList不为空 151 if (zedGraphControl1.GraphPane.CurveList.Count <= 0) 152 { 153 return; 154 } 155 156 //取Graph第一个曲线,也就是第一步:在GraphPane.CurveList集合中查找CurveItem 157 LineItem curve = zedGraphControl1.GraphPane.CurveList[0] as LineItem; 158 LineItem curve2 = zedGraphControl1.GraphPane.CurveList[1] as LineItem; 159 if (curve == null | curve2 == null) 160 { 161 return; 162 } 163 //第二步:在CurveItem中访问PointPairList(或者其它的IPointList),根据自己的需要增加新数据或修改已存在的数据 164 IPointListEdit list = curve.Points as IPointListEdit; 165 IPointListEdit list2 = curve2.Points as IPointListEdit; 166 list.Clear(); 167 list2.Clear(); 168 //第三步:调用Form.Invalidate()方法更新图表 169 zedGraphControl1.Invalidate(); 170#endregion 171 } 172 catch (Exception) 173 { 174 MessageBox.Show("请输入正确数值"); 175 } 176 } 177 /// <summary> 178 /// 负载2模拟开始 179 /// </summary> 180 /// <param name="sender"></param> 181 /// <param name="e"></param> 182 private void button2_Click(object sender, EventArgs e) 183 { 184 try 185 { 186 zQ2 = int.Parse(textBox3.Text); 187 fZ2 = int.Parse(textBox4.Text); 188 pY2 = int.Parse(textBox6.Text); 189 if (zQ2 <= 10) 190 { 191 MessageBox.Show("周期过小,请将周期设为10秒以上"); 192 return; 193 } 194 if (fZ2 <= 5) 195 { 196 MessageBox.Show("幅值过小,请将幅值设为5MPa以上"); 197 return; 198 } 199 else if (fZ2 >= 15) 200 { 201 MessageBox.Show("幅值过大,请将幅值设为15MPa以下"); 202 return; 203 } 204 if (pY2 - fZ2 < 0) 205 { 206 MessageBox.Show("压力过小,请将压力设为0MPa以上"); 207 return; 208 } 209 else if (fZ2 + pY2 > 31.5) 210 { 211 MessageBox.Show("压力过大,请将压力设为15MPa以下"); 212 return; 213 } 214 button2.Enabled = false; 215 timer1Draw.Start(); 216 //保存开始时间 217 tickStart2 = Environment.TickCount; 218 #region 清空原有图表 219 //确保CurveList不为空 220 if (zedGraphControl2.GraphPane.CurveList.Count <= 0) 221 { 222 return; 223 } 224 225 //取Graph第一个曲线,也就是第一步:在GraphPane.CurveList集合中查找CurveItem 226 LineItem curve3 = zedGraphControl2.GraphPane.CurveList[0] as LineItem; 227 LineItem curve4 = zedGraphControl2.GraphPane.CurveList[1] as LineItem; 228 if (curve3 == null | curve4 == null) 229 { 230 return; 231 } 232 //第二步:在CurveItem中访问PointPairList(或者其它的IPointList),根据自己的需要增加新数据或修改已存在的数据 233 IPointListEdit list3 = curve3.Points as IPointListEdit; 234 IPointListEdit list4 = curve4.Points as IPointListEdit; 235 if (list3 == null | list4 == null) 236 { 237 return; 238 } 239 list3.Clear(); 240 list4.Clear(); 241 //第三步:调用Form.Invalidate()方法更新图表 242 zedGraphControl2.Invalidate(); 243 #endregion 244 245 } 246 catch (Exception) 247 { 248 MessageBox.Show("请输入正确数值"); 249 } 250 } 251 /// <summary> 252 /// 负载1模拟停止 253 /// </summary> 254 /// <param name="sender"></param> 255 /// <param name="e"></param> 256 private void button3_Click(object sender, EventArgs e) 257 { 258 timerDraw.Enabled = false; 259 timerDraw.Stop(); 260 button1.Enabled = true; 261 OPC.OpcServer server = OPC.OpcServer.GetServer(); 262 server["专业试验台"]["比例溢流阀4_1模拟缓存"] = (float)0;//写入压力0 263 } 264 /// <summary> 265 /// 负载2模拟停止 266 /// </summary> 267 /// <param name="sender"></param> 268 /// <param name="e"></param> 269 private void button4_Click(object sender, EventArgs e) 270 { 271 timer1Draw.Enabled = false; 272 timer1Draw.Stop(); 273 button2.Enabled = true; 274 OPC.OpcServer server = OPC.OpcServer.GetServer(); 275 server["专业试验台"]["比例溢流阀4_2模拟缓存"] = (float)0;//写入压力0 276 } 277 /// <summary> 278 /// 负载模拟1表格定时更新 279 /// </summary> 280 /// <param name="sender"></param> 281 /// <param name="e"></param> 282 private void timerDraw_Tick(object sender, EventArgs e) 283 { 284 //确保CurveList不为空 285 if (zedGraphControl1.GraphPane.CurveList.Count <= 0) 286 { 287 return; 288 } 289 290 //取Graph第一个曲线,也就是第一步:在GraphPane.CurveList集合中查找CurveItem 291 LineItem curve = zedGraphControl1.GraphPane.CurveList[0] as LineItem; 292 LineItem curve2 = zedGraphControl1.GraphPane.CurveList[1] as LineItem; 293 if (curve == null | curve2 == null) 294 { 295 return; 296 } 297 //第二步:在CurveItem中访问PointPairList(或者其它的IPointList),根据自己的需要增加新数据或修改已存在的数据 298 IPointListEdit list = curve.Points as IPointListEdit; 299 IPointListEdit list2 = curve2.Points as IPointListEdit; 300 if (list == null | list2 == null) 301 { 302 return; 303 } 304 // 时间用秒表示 305 double time = (Environment.TickCount - tickStart) / 1000.0; 306 // 周期为zQ1,幅值为fZ1 307 OPC.OpcServer server = OPC.OpcServer.GetServer(); 308 float gDYL = (float)(fZ1 * Math.Sin(2.0 * Math.PI * time / zQ1))+pY1;//给定压力值 309 float sJYL = server["专业试验台"]["负载模拟压力缓存1_1"];//实际读取压力值 310 server["专业试验台"]["比例溢流阀4_1模拟缓存"] = gDYL;//将周期值写入PLC 311 list.Add(time, (double)gDYL); 312 list2.Add(time, (double)sJYL); 313 Console.WriteLine(time.ToString()); 314 Scale xScale = zedGraphControl1.GraphPane.XAxis.Scale; 315 if (time > xScale.Max - xScale.MajorStep) 316 { 317 xScale.Max = time + xScale.MajorStep; 318 xScale.Min = xScale.Max - 30.0; 319 } 320 321 //第三步:调用ZedGraphControl.AxisChange()方法更新X和Y轴的范围 322 zedGraphControl1.AxisChange(); 323 324 //第四步:调用Form.Invalidate()方法更新图表 325 zedGraphControl1.Invalidate(); 326 } 327 /// <summary> 328 /// 负载模拟2表格定时更新 329 /// </summary> 330 /// <param name="sender"></param> 331 /// <param name="e"></param> 332 private void timer1Draw_Tick(object sender, EventArgs e) 333 { 334 //确保CurveList不为空 335 if (zedGraphControl2.GraphPane.CurveList.Count <= 0) 336 { 337 return; 338 } 339 340 //取Graph第一个曲线,也就是第一步:在GraphPane.CurveList集合中查找CurveItem 341 LineItem curve3 = zedGraphControl2.GraphPane.CurveList[0] as LineItem; 342 LineItem curve4 = zedGraphControl2.GraphPane.CurveList[1] as LineItem; 343 if (curve3 == null | curve4 == null) 344 { 345 return; 346 } 347 //第二步:在CurveItem中访问PointPairList(或者其它的IPointList),根据自己的需要增加新数据或修改已存在的数据 348 IPointListEdit list3 = curve3.Points as IPointListEdit; 349 IPointListEdit list4 = curve4.Points as IPointListEdit; 350 if (list3 == null | list4 == null) 351 { 352 return; 353 } 354 // 时间用秒表示 355 double time = (Environment.TickCount - tickStart2) / 1000.0; 356 // 周期为zQ2,幅值为fZ2 357 OPC.OpcServer server = OPC.OpcServer.GetServer(); 358 float gDYL = (float)(fZ2 * Math.Sin(2.0 * Math.PI * time / zQ2))+pY2;//给定压力值 359 float sJYL = server["专业试验台"]["负载模拟压力缓存1_2"];//实际读取压力值 360 server["专业试验台"]["比例溢流阀4_2模拟缓存"] = gDYL;//将周期值写入PLC 361 list3.Add(time, gDYL); 362 list4.Add(time, sJYL); 363 Console.WriteLine(time.ToString()); 364 Scale xScale = zedGraphControl2.GraphPane.XAxis.Scale; 365 if (time > xScale.Max - xScale.MajorStep) 366 { 367 xScale.Max = time + xScale.MajorStep; 368 xScale.Min = xScale.Max - 30.0; 369 } 370 371 //第三步:调用ZedGraphControl.AxisChange()方法更新X和Y轴的范围 372 zedGraphControl2.AxisChange(); 373 374 //第四步:调用Form.Invalidate()方法更新图表 375 zedGraphControl2.Invalidate(); 376 } 377 /// <summary> 378 /// 关闭窗体 379 /// </summary> 380 /// <param name="sender"></param> 381 /// <param name="e"></param> 382 private void button5_Click(object sender, EventArgs e) 383 { 384 OPC.OpcServer server = OPC.OpcServer.GetServer(); 385 server["专业试验台"]["比例溢流阀4_1模拟缓存"] = (float)0;//写入压力0 386 server["专业试验台"]["比例溢流阀4_2模拟缓存"] = (float)0;//写入压力0 387 this.Close(); 388 } 389 } 390}
点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )