410 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			410 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections.Generic;
 | |
| using System;
 | |
| using System.Drawing;
 | |
| using System.Diagnostics;
 | |
| using System.Data;
 | |
| using System.Collections;
 | |
| using System.Windows.Forms;
 | |
| using AR;
 | |
| using System.Linq;
 | |
| using System.Net.Security;
 | |
| using COMM;
 | |
| using OpenTK.Audio.OpenAL;
 | |
| using System.ComponentModel;
 | |
| 
 | |
| namespace vmsnet
 | |
| {
 | |
| 
 | |
|     public partial class Frm_Cell
 | |
|     {
 | |
|         public HMI.CITEM cellidx = null;
 | |
|         readonly DataTable DT = new DataTable();
 | |
| 
 | |
|         //  SpPerfChart.PerfChart runChart1;
 | |
|         ScottPlot.Plottables.Scatter Logger1;
 | |
|         ScottPlot.Plottables.Crosshair CrossHair;
 | |
|         //ScottPlot.Plottables.VerticalLine[] CursorLine;
 | |
|         ScottPlot.WinForms.FormsPlot formsPlot1;
 | |
|         private int currentDataCount = 10;
 | |
|         private const int maxDataCount = 600;
 | |
| 
 | |
|         short voltlimit = 0;
 | |
|         short timelimit = 1;
 | |
| 
 | |
|         List<float> dataVolt = null;
 | |
|         List<double> dataTime = null;
 | |
| 
 | |
|         public Frm_Cell()
 | |
|         {
 | |
| 
 | |
|             // 이 호출은 디자이너에 필요합니다.
 | |
|             InitializeComponent();
 | |
|             // InitializeComponent() 호출 뒤에 초기화 코드를 추가하십시오.
 | |
| 
 | |
|             InitControl();
 | |
|         }
 | |
|         public Frm_Cell(HMI.CITEM pidx)
 | |
|         {
 | |
| 
 | |
|             // 이 호출은 디자이너에 필요합니다.
 | |
|             InitializeComponent();
 | |
|             cellidx = pidx;
 | |
|             cellidx.OnAlamStausChanged += cellidx_OnChangeStatus;
 | |
|             cellidx.OnChangeData += cellidx_OnChangeData;
 | |
|             cellidx.OnChangeValueData += cellidx_OnChangeValueData;
 | |
|             // InitializeComponent() 호출 뒤에 초기화 코드를 추가하십시오.
 | |
|             InitControl();
 | |
|         }
 | |
| 
 | |
|         public void InitControl()
 | |
|         {
 | |
|             dataVolt = new List<float>(0);
 | |
|             dataTime = new List<double>(0);
 | |
| 
 | |
|             formsPlot1 = new ScottPlot.WinForms.FormsPlot() { Dock = DockStyle.Fill };
 | |
|             formsPlot1.MouseDown += FormsPlot1_MouseDown;
 | |
|             formsPlot1.MouseUp += FormsPlot1_MouseUp;
 | |
|             formsPlot1.MouseMove += FormsPlot1_MouseMove;
 | |
| 
 | |
|             CrossHair = formsPlot1.Plot.Add.Crosshair(0, 0);
 | |
|             CrossHair.TextColor = ScottPlot.Colors.White;
 | |
|             CrossHair.TextBackgroundColor = CrossHair.HorizontalLine.Color;
 | |
| 
 | |
|             formsPlot1.Plot.YLabel("VOLTAGE");
 | |
|             formsPlot1.Plot.XLabel("COUNT");
 | |
|             formsPlot1.Plot.Axes.SetLimitsX(0, currentDataCount);
 | |
| 
 | |
|             this.formsPlot1.Plot.ShowLegend();
 | |
| 
 | |
|             formsPlot1.Plot.Axes.DateTimeTicksBottom();
 | |
|             this.formsPlot1.Plot.Axes.ContinuouslyAutoscale = true;
 | |
|             this.formsPlot1.Plot.RenderManager.RenderStarting += (s1, e1) =>
 | |
|             {
 | |
|                 ScottPlot.Tick[] ticks = formsPlot1.Plot.Axes.Bottom.TickGenerator.Ticks;
 | |
|                 for (int i = 0; i < ticks.Length; i++)
 | |
|                 {
 | |
|                     DateTime dt = DateTime.FromOADate(ticks[i].Position);
 | |
|                     string label = $"{dt:yy-MM-dd\nHH:mm:ss}";
 | |
|                     ticks[i] = new ScottPlot.Tick(ticks[i].Position, label);
 | |
|                 }
 | |
|             };
 | |
| 
 | |
|             this.TabPage1.Controls.Clear();
 | |
|             this.TabPage1.Controls.Add(this.formsPlot1); //runChart1
 | |
|             this.TabPage1.Controls.Add(this.DV_VALUE);
 | |
|             this.TabPage1.Controls.Add(this.ToolStrip2);
 | |
|         }
 | |
| 
 | |
| 
 | |
| 
 | |
|         public void Frm_Cell_Load(object sender, System.EventArgs e)
 | |
|         {
 | |
| 
 | |
|             DT.Columns.Add("VOLT");
 | |
|             DT.Columns.Add("TIME");
 | |
|             this.BS_DATA.DataSource = DT;
 | |
|             this.Text = cellidx.이름 + "셀 속성";
 | |
|             this.PropertyGrid1.SelectedObject = cellidx;
 | |
| 
 | |
|             loadviewSetting();
 | |
| 
 | |
|             System.Windows.Forms.Binding bd = new System.Windows.Forms.Binding("text", cellidx, "column");
 | |
| 
 | |
|             refreshalama();
 | |
|         }
 | |
|         public void Frm_Cell_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
 | |
|         {
 | |
|             cellidx.OnAlamStausChanged -= cellidx_OnChangeStatus;
 | |
|             cellidx.OnChangeData -= cellidx_OnChangeData;
 | |
|             cellidx.OnChangeValueData -= cellidx_OnChangeValueData;
 | |
| 
 | |
|             formsPlot1.MouseDown -= FormsPlot1_MouseDown;
 | |
|             formsPlot1.MouseUp -= FormsPlot1_MouseUp;
 | |
|             formsPlot1.MouseMove -= FormsPlot1_MouseMove;
 | |
| 
 | |
|             saveviewSetting();
 | |
|         }
 | |
|         private void loadviewSetting()
 | |
|         {
 | |
|             cmb_volt.SelectedIndex = (PUB.CONFIG.cell_voltindex); // Xml.Data("rtlview", "voltindex", "1")
 | |
|             cmb_time.SelectedIndex = (PUB.CONFIG.cell_timeindex); // XMl.Data("rtlview", "timeindex", "0")
 | |
|         }
 | |
|         private void saveviewSetting()
 | |
|         {
 | |
|             PUB.CONFIG.cell_voltindex = (cmb_volt.SelectedIndex);
 | |
|             PUB.CONFIG.cell_timeindex = (cmb_time.SelectedIndex);
 | |
|             PUB.CONFIG.Save();
 | |
|         }
 | |
|         #region "scott plot mouse event"
 | |
| 
 | |
|         private ScottPlot.Plottables.AxisLine GetLineUnderMouse(float x, float y)
 | |
|         {
 | |
|             ScottPlot.CoordinateRect rect = formsPlot1.Plot.GetCoordinateRect(x, y, radius: 10);
 | |
| 
 | |
|             foreach (var axLine in formsPlot1.Plot.GetPlottables<ScottPlot.Plottables.AxisLine>().Reverse())
 | |
|             {
 | |
|                 if (axLine.IsUnderMouse(rect))
 | |
|                     return axLine;
 | |
|             }
 | |
| 
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
| 
 | |
| 
 | |
|         private void FormsPlot1_MouseDown(object sender, MouseEventArgs e)
 | |
|         {
 | |
|             var lineUnderMouse = GetLineUnderMouse(e.X, e.Y);
 | |
|             if (lineUnderMouse != null)
 | |
|             {
 | |
|                 PlottableBeingDragged = lineUnderMouse;
 | |
|                 formsPlot1.Interaction.Disable(); // disable panning while dragging
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void FormsPlot1_MouseUp(object sender, MouseEventArgs e)
 | |
|         {
 | |
|             PlottableBeingDragged = null;
 | |
|             formsPlot1.Interaction.Enable(); // enable panning again
 | |
|             formsPlot1.Refresh();
 | |
|         }
 | |
|         ScottPlot.Plottables.AxisLine PlottableBeingDragged = null;
 | |
|         private void FormsPlot1_MouseMove(object sender, MouseEventArgs e)
 | |
|         {
 | |
| 
 | |
|             //update cross line
 | |
|             ScottPlot.Pixel mousePixel = new ScottPlot.Pixel(e.X, e.Y);
 | |
|             ScottPlot.Coordinates mouseCoordinates = formsPlot1.Plot.GetCoordinates(mousePixel);
 | |
| 
 | |
|             if (mouseCoordinates.X is double.NaN || mouseCoordinates.Y is double.NaN ||
 | |
|                 mouseCoordinates.X is double.PositiveInfinity || mouseCoordinates.Y is double.PositiveInfinity ||
 | |
|                 mouseCoordinates.X is double.NegativeInfinity || mouseCoordinates.Y is double.NegativeInfinity)
 | |
|             {
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             if (CrossHair != null)
 | |
|             {
 | |
|                 CrossHair.Position = mouseCoordinates;
 | |
|                 var time = DateTime.FromOADate(mouseCoordinates.X);
 | |
| 
 | |
|                 CrossHair.VerticalLine.Text = $"{time:yy-MM-dd\nHH:mm:ss}";
 | |
| 
 | |
|                 CrossHair.HorizontalLine.Text = $"{mouseCoordinates.Y:N2}v";
 | |
|                 formsPlot1.Refresh();
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|             // this rectangle is the area around the mouse in coordinate units
 | |
|             ScottPlot.CoordinateRect rect = formsPlot1.Plot.GetCoordinateRect(e.X, e.Y, radius: 10);
 | |
| 
 | |
|             if (PlottableBeingDragged is null)
 | |
|             {
 | |
|                 // set cursor based on what's beneath the plottable
 | |
|                 var lineUnderMouse = GetLineUnderMouse(e.X, e.Y);
 | |
|                 if (lineUnderMouse is null) Cursor = Cursors.Default;
 | |
|                 else if (lineUnderMouse.IsDraggable && lineUnderMouse is ScottPlot.Plottables.VerticalLine) Cursor = Cursors.SizeWE;
 | |
|                 else if (lineUnderMouse.IsDraggable && lineUnderMouse is ScottPlot.Plottables.HorizontalLine) Cursor = Cursors.SizeNS;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 // update the position of the plottable being dragged
 | |
|                 if (PlottableBeingDragged is ScottPlot.Plottables.HorizontalLine hl)
 | |
|                 {
 | |
|                     hl.Y = rect.VerticalCenter;
 | |
|                     hl.Text = $"{hl.Y:0.00}v";
 | |
|                 }
 | |
|                 else if (PlottableBeingDragged is ScottPlot.Plottables.VerticalLine vl)
 | |
|                 {
 | |
|                     vl.X = rect.HorizontalCenter;
 | |
|                     var time = DateTime.FromOADate(vl.X);
 | |
|                     //vl.Text = $"{vl.X:0.00}";
 | |
|                     vl.Text = $"{time:yy-MM-dd\nHH:mm:ss}";
 | |
|                 }
 | |
|                 formsPlot1.Refresh();
 | |
|             }
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
| 
 | |
| 
 | |
|         public void Frm_Grp_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
 | |
|         {
 | |
|             if (e.KeyCode == Keys.Escape)
 | |
|             {
 | |
|                 this.DialogResult = System.Windows.Forms.DialogResult.OK;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void refreshalama()
 | |
|         {
 | |
|             if (cellidx.상위알람발생)
 | |
|             {
 | |
|                 this.ToolStripButton2.Image = global::vmsnet.Properties.Resources.Red_Ball;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 this.ToolStripButton2.Image = global::vmsnet.Properties.Resources.Green_Ball;
 | |
|             }
 | |
|             if (cellidx.하위알람발생)
 | |
|             {
 | |
|                 this.ToolStripButton1.Image = global::vmsnet.Properties.Resources.Red_Ball;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 this.ToolStripButton1.Image = global::vmsnet.Properties.Resources.Green_Ball;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|          public void TabControl1_SelectedIndexChanged(object sender, System.EventArgs e)
 | |
|         {
 | |
| 
 | |
|             switch (this.TabControl1.SelectedIndex)
 | |
|             {
 | |
|                 case 1: ////알림목록 tab
 | |
| 
 | |
|                     var Dt =  PUB.Alarm.GetAlarmData(cellidx.인덱스_번호);
 | |
|                     foreach (var Dr in Dt.Item2)
 | |
|                     {
 | |
|                         Dr.RTYPESTR = ((COMM.EALAMRAISETYPE)Dr.RTYPE).ToString();
 | |
|                         Dr.ATYPESTR = ((COMM.EALAMTYPE)Dr.ATYPE).ToString();
 | |
|                     }
 | |
|                     Dt.Item2.AcceptChanges();
 | |
|                     this.BS_ALAM.DataSource = Dt;
 | |
|                     this.DataGridView1.AutoGenerateColumns = false;
 | |
|                     this.DataGridView1.DataSource = this.BS_ALAM;
 | |
|                     this.DataGridView1.AutoResizeColumns();
 | |
|                     break;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void DataGridView1_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e)
 | |
|         {
 | |
|             var row = this.DataGridView1.Rows[e.RowIndex];
 | |
|             var CV = row.Cells["RTYPESTR"].Value;
 | |
|             if (CV == null)
 | |
|             {
 | |
|                 row.DefaultCellStyle.BackColor = Color.Empty;
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             switch (this.DataGridView1.Rows[e.RowIndex].Cells["RTYPESTR"].Value.ToString().ToUpper())
 | |
|             {
 | |
|                 case "HIGH-OFF":
 | |
|                     DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Empty;
 | |
|                     break;
 | |
|                 case "HIGH-ON":
 | |
|                     DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Orange;
 | |
|                     break;
 | |
|                 case "LOW-OFF":
 | |
|                     DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Empty;
 | |
|                     break;
 | |
|                 case "LOW-ON":
 | |
|                     DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Blue;
 | |
|                     break;
 | |
|                 case "OVER-ON":
 | |
|                     DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Magenta;
 | |
|                     break;
 | |
|                 case "OVER-OFF":
 | |
|                     DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Empty;
 | |
|                     break;
 | |
|                 default:
 | |
|                     DataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Empty;
 | |
|                     break;
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
|         private void cellidx_OnChangeStatus()
 | |
|         {
 | |
|             refreshalama();
 | |
|         }
 | |
| 
 | |
|         private void cellidx_OnChangeData()
 | |
|         {
 | |
| 
 | |
|             bool ok = PUBC.UpdateChannel(cellidx.idx, cellidx.이름, (int)cellidx.알람형태, (cellidx.사용 ? 1 : 0), cellidx.HIGH, cellidx.LOW, cellidx.H, cellidx.L);
 | |
|             if (!ok)
 | |
|             {
 | |
|                 UTIL.MsgE("셀 정보가 업데이트되지 않았습니다");
 | |
|                 PUB.log.Add("Cell update error idx=" + cellidx.ToString());
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
|         private void cellidx_OnChangeValueData()
 | |
|         {
 | |
|             ////값이 바뀌엇다.
 | |
| 
 | |
|             float value = 0.0F;
 | |
|             float.TryParse(cellidx.Value.Replace("V", "").Replace("v", ""), out value);
 | |
|             this.tb_val.Text = value.ToString();
 | |
|             this.tb_time.Text = cellidx.mtime;
 | |
| 
 | |
|             try
 | |
|             {
 | |
|                 //datetime = CDate(cellidx.측정시간)
 | |
|                 var dt = DateTime.Parse(cellidx.측정시간);
 | |
| 
 | |
|                 formsPlot1.Plot.Clear<ScottPlot.Plottables.Scatter>();
 | |
|                 dataVolt.Add(value);
 | |
|                 dataTime.Add(dt.ToOADate());
 | |
|                 Logger1 = formsPlot1.Plot.Add.Scatter(dataTime.ToArray(), dataVolt.ToArray());
 | |
|                 Logger1.Color = ScottPlot.Colors.Blue;
 | |
| 
 | |
|                 var mintime = DateTime.FromOADate(dataTime.First());
 | |
|                 var maxtime = DateTime.FromOADate(dataTime.Last());
 | |
|                 var ts = (maxtime - mintime);
 | |
|                 if (ts.TotalMinutes >= this.timelimit)
 | |
|                 {
 | |
|                     //10개지운다
 | |
|                     if (dataTime.Count > 10)
 | |
|                     {
 | |
|                         dataVolt.RemoveRange(0, 10);
 | |
|                         dataTime.RemoveRange(0, 10);
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
| 
 | |
|                 this.BeginInvoke(new Action(() =>
 | |
|                 {
 | |
|                     this.DT.Rows.Add(value, dt.ToString("yy-MM-dd HH:mm:ss"));
 | |
|                     this.DT.AcceptChanges();
 | |
|                     if (voltlimit != 0) formsPlot1.Plot.Axes.AutoScaleX();
 | |
|                     this.formsPlot1.Refresh();
 | |
|                 }));
 | |
| 
 | |
|             }
 | |
|             catch (Exception)
 | |
|             {
 | |
| 
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void ToolStripComboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
 | |
|         {
 | |
| 
 | |
|         }
 | |
| 
 | |
| 
 | |
|         public void cmb_time_SelectedIndexChanged(object sender, System.EventArgs e)
 | |
|         {
 | |
|             if (cmb_time.SelectedIndex < 0) return;
 | |
| 
 | |
|             timelimit = short.Parse(this.cmb_time.Text.Replace("분", ""));
 | |
|         }
 | |
| 
 | |
|         private void runChart1_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
 | |
|         {
 | |
|             this.DV_VALUE.Visible = !this.DV_VALUE.Visible;
 | |
|         }
 | |
| 
 | |
|         private void TabPage1_Click(object sender, EventArgs e)
 | |
|         {
 | |
|             DV_VALUE.Visible = !DV_VALUE.Visible;
 | |
|         }
 | |
|     }
 | |
| }
 | 
