using JinYuan.Helper; using JinYuan.VirtualDataLibrary; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Text; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; namespace LargeSquareOne { public partial class FrmMonitor : Form { private static object uiLock = new object(); /// /// 窗体实例 /// private static FrmMonitor _instance; public static FrmMonitor Instance { get { lock (uiLock) { if (_instance == null) { _instance = new FrmMonitor(); } return _instance; } } } public FrmMonitor() { InitializeComponent(); ////设置控件样式,去除缓冲 this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); this.SetStyle(ControlStyles.DoubleBuffer, true); this.SetStyle(ControlStyles.ResizeRedraw, true); this.SetStyle(ControlStyles.Selectable, true); this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); #region 字体加载 // 加载字体文件 font.AddFontFile(Environment.CurrentDirectory + "\\Assts\\Fonts\\FZY4JW.ttf"); //定义成新的字体对象 FontFamily myFontFamily = new FontFamily(font.Families[0].Name, font); myFont = new Font(myFontFamily, 20, FontStyle.Bold); //将字体显示到控件 //longTitleStyle21.Font = myFont; #endregion this.FormClosing += (sender, e) => { this.m_RefreshTimer?.Dispose(); //this.m_RefreshTimerWeeding?.Dispose(); }; } #region 静止闪烁 protected override void WndProc(ref Message m) { if (m.Msg == 0x0014) // 禁掉清除背景消息 return; base.WndProc(ref m); } #endregion PrivateFontCollection font = new PrivateFontCollection(); Font myFont; /// /// 按钮状态委托 /// /// private delegate void ShowChatHandler(); //定时存储定时器 private System.Threading.Timer m_RefreshTimer; private void FrmMonitor_Load(object sender, EventArgs e) { SetChart(); RefreshXiaoLvData(); RefreshChatTop10AlarmData(); m_RefreshTimer = new System.Threading.Timer(TimerWork_Elapsed, null, Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan); StartTimer(m_RefreshTimer);//开启刷新 } /// /// 开启定时器 /// /// private void StartTimer(System.Threading.Timer timer) { timer?.Change(TimeSpan.Zero, Timeout.InfiniteTimeSpan); } #region 定时刷新状态 /// /// /// /// private void TimerWork_Elapsed(object sender) { try { using (new TimerReset(m_RefreshTimer, 2000)) { Refish12ProdQty(); RefreshXiaoLvData(); RefreshChatTop10AlarmData(); RefreshChatNGData(); } } catch (Exception ex) { CommonMethods.AddLog(true, "定时刷新异常:" + ex.Message); } } #endregion #region 刷新12小时产能 private void SetChart() { #region 24小时统计 Chart12HourTotal.Series.Clear(); //chart12Hour.Titles.Clear(); Chart12HourTotal.ChartAreas[0].AxisY.Minimum = 0; Chart12HourTotal.ChartAreas[0].AxisY.Maximum = 2000; ChartHelper.AddSeries(Chart12HourTotal, "投入", SeriesChartType.Column, ChartValueType.Auto, MarkerStyle.Diamond, 8, Color.DarkTurquoise, Color.Aqua, "", false, true); ChartHelper.AddSeries(Chart12HourTotal, "产出", SeriesChartType.Column, ChartValueType.Auto, MarkerStyle.Diamond, 8, Color.PaleGoldenrod, Color.PaleGoldenrod, "", false, true); ChartHelper.AddSeries(Chart12HourTotal, "优率", SeriesChartType.Spline, ChartValueType.String, MarkerStyle.Circle, 8, Color.Lime, Color.Lime, "#VAL{P}", true, true); //JinYuan.Helper.ChartHelper.SetTitle(chart12Hour, "当日每1小时投入与产出", new Font("微软雅黑", 12), Docking.Top, Color.White); ChartHelper.SetStyle(Chart12HourTotal, Color.Transparent, Color.White); ChartHelper.SetLegend(Chart12HourTotal, Docking.Top, StringAlignment.Center, Color.Transparent, Color.White); ChartHelper.SetXY(Chart12HourTotal, "时间", "数值", 0, StringAlignment.Center, Color.White, Color.White, AxisArrowStyle.None, 1, true); ChartHelper.SetMajorGrid(Chart12HourTotal, Color.Transparent, 20, 2); #endregion } /// /// 刷新12小时产能 /// /// private void Refish12ProdQty() { Task.Run(() => { try { this.BeginInvoke((EventHandler)delegate { ucPanel12Hour.Title = string.Format($"当前({CommonMethods.strClass})产能"); if (CommonMethods.Lst_Prod12HourData != null && CommonMethods.Lst_Prod12HourData.Count > 0) { Chart12HourTotal.ChartAreas[0].AxisY.Minimum = 0; var maxValue = CommonMethods.Lst_Prod12HourData.Max(x => x.ProdIn); Chart12HourTotal.ChartAreas[0].AxisY.Maximum = (int)maxValue + 1500; var x1 = CommonMethods.Lst_Prod12HourData.Select(c => c.DisplayTime).ToList(); var y1 = CommonMethods.Lst_Prod12HourData.Select(c => c.ProdIn).ToList(); var y2 = CommonMethods.Lst_Prod12HourData.Select(c => c.ProdOut).ToList(); var y3 = CommonMethods.Lst_Prod12HourData.Select(c => c.OKRatio).ToList(); //绑定数据 Chart12HourTotal.Series[0].Points.DataBindXY(x1, y1); Chart12HourTotal.Series[1].Points.DataBindXY(x1, y2); Chart12HourTotal.Series[2].Points.DataBindXY(x1, y3); } }); } catch { } }); } #endregion #region 设备综合效率 private void RefreshXiaoLvData() { int TotalQty = CommonMethods.TotalQty; int ProOKQty = CommonMethods.ProOKQty; int PPM = CommonMethods.Ppm; string Factory_code = CommonMethods.mesConfig.siteCode; string line_No = CommonMethods.mesConfig.lineCode; string Eqp_code = CommonMethods.mesConfig.equipNum; double UtilizationRate = Convert.ToDouble(CommonMethods.JiaDL) * 100; double YieldRate = 0; bool flag = TotalQty == 0L; if (!flag) { YieldRate = Convert.ToDouble((Convert.ToDouble(ProOKQty) / Convert.ToDouble(TotalQty) * 100.0).ToString("f2")); } this.Invoke((EventHandler)delegate { #region 除尘风速 //if (CommonMethods.AntiDustAirSpeed[0] > 0.001f) //{ // ucFengSu1.CurrentValue = CommonMethods.AntiDustAirSpeed[0]; //} //else //{ // ucFengSu1.CurrentValue = 0; //} #endregion titleModeName.Title = CommonMethods.mesConfig.ModelName; titleFactory_code.Title = Factory_code; titleLine_No.Title = line_No; titleEqp_code.Title = Eqp_code; proUtilizationRate.FloatValue = (float)UtilizationRate; proPPM.IntValue = PPM; proOKQty.IntValue = ProOKQty; proOKRatio.Value = YieldRate.ToString() == "NaN" ? 0 : YieldRate; proTotalQty.TotalValue = TotalQty; if (CommonMethods.PlcOpenAndRunTime != null && CommonMethods.PlcOpenAndRunTime.Count > 0) { titleStartTime.Title = $"{CommonMethods.PlcOpenAndRunTime[0]}:{CommonMethods.PlcOpenAndRunTime[1]}:{CommonMethods.PlcOpenAndRunTime[2]}"; titleRunTime.Title = $"{CommonMethods.PlcOpenAndRunTime[3]}:{CommonMethods.PlcOpenAndRunTime[4]}:{CommonMethods.PlcOpenAndRunTime[5]}"; } if (CommonMethods.listElectricEnergy != null && CommonMethods.listElectricEnergy.Count > 0) { this.ucElectricityMeterV1.ElectricEnergy = CommonMethods.listElectricEnergy[0]; //this.ucElectricityMeterV2.ElectricEnergy = CommonMethods.listElectricEnergy[1]; } }); } #endregion #region 报警Top10信息刷新 private void RefreshChatTop10AlarmData() { this.BeginInvoke((EventHandler)delegate { if (CommonMethods.Lst_AlarmTop10_Qty != null && CommonMethods.Lst_AlarmTop10_Qty.Count > 0) { chartAlarmData.Series.Clear(); chartAlarmData.Titles.Clear(); chartAlarmData.ChartAreas[0].AxisY.Minimum = 0; var maxValue1 = CommonMethods.Lst_AlarmTop10_Qty.Max(x => x.DataCount); chartAlarmData.ChartAreas[0].AxisY.Maximum = (int)maxValue1 + 20; foreach (var item in CommonMethods.Lst_AlarmTop10_Qty) { ChartHelper.AddSeries(chartAlarmData, item.DataType, SeriesChartType.Column, ChartValueType.Auto, MarkerStyle.Diamond, 4, Color.DarkTurquoise, Color.White, "", false, true); } ChartHelper.SetTitle(chartAlarmData, "报警TOP10", new Font("微软雅黑", 12), Docking.Top, Color.White); ChartHelper.SetStyle(chartAlarmData, Color.Transparent, Color.White); ChartHelper.SetLegend(chartAlarmData, Docking.Top, StringAlignment.Center, Color.Transparent, Color.White); ChartHelper.SetXY(chartAlarmData, "报警项", "次数", -45, StringAlignment.Center, Color.White, Color.White, AxisArrowStyle.None, 1, false); ChartHelper.SetMajorGrid(chartAlarmData, Color.Transparent, 20, 2); //不良类型统计 List xData1 = CommonMethods.Lst_AlarmTop10_Qty.Select(c => c.DataType).ToList(); List yData1 = CommonMethods.Lst_AlarmTop10_Qty.Select(c => c.DataCount).ToList(); chartAlarmData.Series[0].Points.DataBindXY(xData1, yData1); } else { chartAlarmData.Series.Clear(); chartAlarmData.Titles.Clear(); chartAlarmData.ChartAreas[0].AxisY.Minimum = 0; } }); } #endregion #region 不良信息刷新 private void RefreshChatNGData() { this.BeginInvoke((EventHandler)delegate { if (CommonMethods.Lst_DefectTypeQty != null && CommonMethods.Lst_DefectTypeQty.Count > 0) { chartNgShow.Series.Clear(); chartNgShow.Titles.Clear(); chartNgShow.ChartAreas[0].AxisY.Minimum = 0; var maxValue = CommonMethods.Lst_DefectTypeQty.Max(x => x.DataCount); chartNgShow.ChartAreas[0].AxisY.Maximum = (int)maxValue + 100; foreach (var item in CommonMethods.Lst_DefectTypeQty) { ChartHelper.AddSeries(chartNgShow, item.DataType, SeriesChartType.Column, ChartValueType.Auto, MarkerStyle.Diamond, 4, Color.Red, Color.White, "", false, true); } ChartHelper.SetTitle(chartNgShow, "各不良项", new Font("微软雅黑", 12), Docking.Top, Color.White); ChartHelper.SetStyle(chartNgShow, Color.Transparent, Color.White); ChartHelper.SetLegend(chartNgShow, Docking.Top, StringAlignment.Center, Color.Transparent, Color.White); ChartHelper.SetXY(chartNgShow, "项名", "数值", 0, StringAlignment.Center, Color.White, Color.White, AxisArrowStyle.None, 1, false); ChartHelper.SetMajorGrid(chartNgShow, Color.Transparent, 1, 1); //不良类型统计 List xData = CommonMethods.Lst_DefectTypeQty.Select(c => c.DataType).ToList(); List yData = CommonMethods.Lst_DefectTypeQty.Select(c => c.DataCount).ToList(); chartNgShow.Series[0].Points.DataBindXY(xData, yData); } }); } #endregion private void titleStartTime_Load(object sender, EventArgs e) { } } }