Files
PR_PRM_GUI/LFP_Manager_PRM/Controls/ucMainStatus.cs
2026-02-11 10:10:43 +09:00

495 lines
18 KiB
C#

using DevExpress.XtraCharts;
using LFP_Manager.DataStructure;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Threading;
namespace LFP_Manager.Controls
{
public partial class ucMainStatus : DevExpress.XtraEditors.XtraUserControl
{
private delegate void CanIJust();
private List<int> _valueList;
private Thread _thread;
private CanIJust _doIt;
private Random _ran;
private int _interval;
private CommConfig Config;
private DeviceSystemData SystemData;
private DataTable dtVI;
private DateTime OldTime;
Series seriesVolt;
Series seriesCurr;
Series seriesTemp;
Series seriesSoc;
LineSeriesView currLineView;
LineSeriesView tempLineView;
LineSeriesView socLineView;
SecondaryAxisY currAxisY;
SecondaryAxisY tempAxisY;
SecondaryAxisY socAxisY;
private double TotalVoltage;
private double TotalCurrent;
private double TotalTemperature;
private double TotalSoc;
private bool active = false;
private bool ThreadEnd = false;
private int logTimeSec = 5;
public ucMainStatus()
{
InitializeComponent();
InitDataTableVolt();
InitChart();
}
public void SimStart()
{
_valueList = new List<int>();
_ran = new Random();
_interval = 500;
GoBoy();
}
private void GoBoy()
{
_doIt += new CanIJust(AddData);
_thread = new Thread(new ThreadStart(ComeOnYouThread));
_thread.Start();
}
public void Start(CommConfig aConfig, ref DeviceSystemData aSystemData)
{
Config = aConfig;
SystemData = aSystemData;
reloadChart();
_interval = 200;
_doIt += new CanIJust(AddData);
ThreadEnd = false;
_thread = new Thread(new ThreadStart(ComeOnYouThread));
_thread.Start();
active = true;
tmrDisplay.Start();
}
public void Stop()
{
active = false;
tmrDisplay.Stop();
ThreadEnd = true;
if (_thread != null)
{
if (_thread.IsAlive)
_thread.Abort();
}
}
public void UpdateData(ref DeviceSystemData aSystemData)
{
if (active)
{
SystemData = aSystemData;
TotalVoltage = (double)SystemData.ValueData.voltageOfPack / 10;
TotalCurrent = (double)SystemData.ValueData.current / 10;
TotalSoc = (double)SystemData.ValueData.rSOC / 10;
TotalTemperature = (double)SystemData.AvgData.maxTemp / 10;
}
}
private void InitDataTableVolt()
{
dtVI = new DataTable();
dtVI.Columns.Add("DateTime", typeof(DateTime));
dtVI.Columns.Add(String.Format("Volt"), typeof(double));
dtVI.Columns.Add(String.Format("Curr"), typeof(double));
dtVI.Columns.Add(String.Format("Temp"), typeof(double));
dtVI.Columns.Add(String.Format("SOC"), typeof(double));
// Add data rows to the table.
DataRow row = null;
row = dtVI.NewRow();
row["DateTime"] = DateTime.Now;
row[String.Format("Volt")] = 0;
row[String.Format("Curr")] = 0;
row[String.Format("Temp")] = 0;
row[String.Format("SOC")] = 0;
dtVI.Rows.Add(row);
}
private void InitChart()
{
chartVI.Series.Clear();
chartVI.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False;
chartVI.Titles[0].Visibility = DevExpress.Utils.DefaultBoolean.False;
//-------------------- Series VOLT -----------------------//
seriesVolt = new Series(String.Format("Volt"), ViewType.Line)
{
DataSource = dtVI,
//seriesVolt.Label.PointOptions.PointView = PointView.Values;
//seriesVolt.Label.PointOptions.ValueNumericOptions.Format = NumericFormat.Number;
//seriesVolt.Label.PointOptions.ValueNumericOptions.Precision = 1;
CrosshairLabelVisibility = DevExpress.Utils.DefaultBoolean.True,
CrosshairLabelPattern = "{S} : {V:F1}V",
//seriesVolt.CrosshairLabelPattern = "{S} {A:hh:mm:ss} : {V:F1}V";
// Specify data members to bind the series.
ArgumentScaleType = ScaleType.DateTime,
ArgumentDataMember = "DateTime",
ValueScaleType = ScaleType.Numerical
};
seriesVolt.ValueDataMembers.AddRange(new string[] { String.Format("Volt") });
chartVI.Series.Add(seriesVolt);
//-------------------- Series CURR -----------------------//
seriesCurr = new Series(String.Format("Curr"), ViewType.Line)
{
DataSource = dtVI,
//seriesCurr.Label.PointOptions.PointView = PointView.Values;
//seriesCurr.Label.PointOptions.ValueNumericOptions.Format = NumericFormat.Number;
//seriesCurr.Label.PointOptions.ValueNumericOptions.Precision = 1;
CrosshairLabelVisibility = DevExpress.Utils.DefaultBoolean.True,
CrosshairLabelPattern = "{S} : {V:F1}A",
//seriesCurr.CrosshairLabelPattern = "{S} {A:hh:mm:ss} : {V:F1}A";
// Specify data members to bind the series.
ArgumentScaleType = ScaleType.DateTime,
ArgumentDataMember = "DateTime",
ValueScaleType = ScaleType.Numerical
};
seriesCurr.ValueDataMembers.AddRange(new string[] { String.Format("Curr") });
chartVI.Series.Add(seriesCurr);
//-------------------- Series TEMP -----------------------//
seriesTemp = new Series(String.Format("Temp"), ViewType.Line)
{
DataSource = dtVI,
//seriesTemp.Label.PointOptions.PointView = PointView.Values;
//seriesTemp.Label.PointOptions.ValueNumericOptions.Format = NumericFormat.Number;
//seriesTemp.Label.PointOptions.ValueNumericOptions.Precision = 1;
CrosshairLabelVisibility = DevExpress.Utils.DefaultBoolean.True,
CrosshairLabelPattern = "{S} : {V:F1}C",
//seriesTemp.CrosshairLabelPattern = "{S} {A:hh:mm:ss} : {V:F1}A";
// Specify data members to bind the series.
ArgumentScaleType = ScaleType.DateTime,
ArgumentDataMember = "DateTime",
ValueScaleType = ScaleType.Numerical
};
seriesTemp.ValueDataMembers.AddRange(new string[] { String.Format("Temp") });
chartVI.Series.Add(seriesTemp);
//-------------------- Series SOC -----------------------//
seriesSoc = new Series(String.Format("SOC"), ViewType.Line)
{
DataSource = dtVI,
//seriesSoc.Label.PointOptions.PointView = PointView.Values;
//seriesSoc.Label.PointOptions.ValueNumericOptions.Format = NumericFormat.Number;
//seriesSoc.Label.PointOptions.ValueNumericOptions.Precision = 1;
CrosshairLabelVisibility = DevExpress.Utils.DefaultBoolean.True,
CrosshairLabelPattern = "{S} : {V:F1}%",
//seriesTemp.CrosshairLabelPattern = "{S} {A:hh:mm:ss} : {V:F1}A";
// Specify data members to bind the series.
ArgumentScaleType = ScaleType.DateTime,
ArgumentDataMember = "DateTime",
ValueScaleType = ScaleType.Numerical
};
seriesSoc.ValueDataMembers.AddRange(new string[] { String.Format("SOC") });
chartVI.Series.Add(seriesSoc);
XYDiagram diagram = (XYDiagram)chartVI.Diagram;
//diagram.AxisX.DateTimeScaleOptions.AggregateFunction = AggregateFunction.Sum;
//diagram.AxisX.DateTimeScaleOptions.GridAlignment = DateTimeGridAlignment.Minute;
//diagram.AxisX.DateTimeScaleOptions.MeasureUnit = DateTimeMeasureUnit.Second;
diagram.AxisX.Title.Text = "Date Time (hh:mm:ss)";
diagram.AxisX.Title.Visibility = DevExpress.Utils.DefaultBoolean.False;
diagram.AxisX.Title.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular);
//diagram.AxisX.Label.DateTimeOptions.Format = DevExpress.XtraCharts.DateTimeFormat.Custom;
//diagram.AxisX.Label.DateTimeOptions.FormatString = "HH:mm:ss";
diagram.AxisY.WholeRange.MaxValue = 60.0;
diagram.AxisY.WholeRange.MinValue = 40.0;
diagram.AxisY.WholeRange.Auto = false;
diagram.AxisY.WholeRange.AlwaysShowZeroLevel = true;
diagram.AxisY.VisualRange.MaxValue = 60.0;
diagram.AxisY.VisualRange.MinValue = 40.0;
diagram.AxisY.VisualRange.Auto = false;
//diagram.AxisY.GridSpacing = 1;
diagram.AxisY.Title.Text = "Voltage (V)";
diagram.AxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.False;
diagram.AxisY.Title.Font = new System.Drawing.Font("Tahoma", 10F, System.Drawing.FontStyle.Regular);
chartVI.Diagram.Assign(diagram);
currAxisY = new SecondaryAxisY("Current Y-Axis");
((XYDiagram)chartVI.Diagram).SecondaryAxesY.Add(currAxisY);
//currAxisY.GridSpacing = 10D;
//currAxisY.GridSpacingAuto = false;
currAxisY.WholeRange.MinValue = "-300";
currAxisY.WholeRange.MaxValue = "300";
currAxisY.WholeRange.Auto = false;
currAxisY.WholeRange.AlwaysShowZeroLevel = true;
currAxisY.Visibility = DevExpress.Utils.DefaultBoolean.False;
currAxisY.Title.Text = "Current (A)";
currAxisY.Title.Font = new System.Drawing.Font("Tahoma", 10F, System.Drawing.FontStyle.Regular);
currAxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.False;
currLineView = new LineSeriesView();
currLineView = (LineSeriesView)seriesCurr.View;
currLineView.AxisY = currAxisY;
currLineView.LineMarkerOptions.BorderVisible = false;
currLineView.LineMarkerOptions.Color = Color.Red;
currLineView.LineStyle.Thickness = 2;
currLineView.MarkerVisibility = DevExpress.Utils.DefaultBoolean.False;
currLineView.Shadow.Visible = false;
tempAxisY = new SecondaryAxisY("Temperature Y-Axis");
((XYDiagram)chartVI.Diagram).SecondaryAxesY.Add(tempAxisY);
//tempAxisY.GridSpacing = 5D;
//tempAxisY.GridSpacingAuto = false;
tempAxisY.WholeRange.MinValue = "-25.0";
tempAxisY.WholeRange.MaxValue = "80.0";
tempAxisY.WholeRange.Auto = false;
tempAxisY.WholeRange.AlwaysShowZeroLevel = true;
tempAxisY.Visibility = DevExpress.Utils.DefaultBoolean.False;
tempAxisY.Title.Text = "Temperature (C)";
tempAxisY.Title.Font = new System.Drawing.Font("Tahoma", 10F, System.Drawing.FontStyle.Regular);
tempAxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.False;
tempLineView = new LineSeriesView();
tempLineView = (LineSeriesView)seriesTemp.View;
tempLineView.AxisY = tempAxisY;
tempLineView.LineMarkerOptions.BorderVisible = false;
tempLineView.LineMarkerOptions.Color = Color.Red;
tempLineView.LineStyle.Thickness = 2;
tempLineView.MarkerVisibility = DevExpress.Utils.DefaultBoolean.False;
tempLineView.Shadow.Visible = false;
// SOC AxisY
socAxisY = new SecondaryAxisY("SOC Y-Axis");
((XYDiagram)chartVI.Diagram).SecondaryAxesY.Add(socAxisY);
//socAxisY.GridSpacing = 10D;
//socAxisY.GridSpacingAuto = false;
socAxisY.WholeRange.MinValue = "-2.0";
socAxisY.WholeRange.MaxValue = "102.0";
socAxisY.WholeRange.Auto = false;
socAxisY.WholeRange.AlwaysShowZeroLevel = true;
socAxisY.Visibility = DevExpress.Utils.DefaultBoolean.False;
socAxisY.Title.Text = "SOC (%)";
socAxisY.Title.Font = new System.Drawing.Font("Tahoma", 10F, System.Drawing.FontStyle.Regular);
socAxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.False;
socLineView = new LineSeriesView();
socLineView = (LineSeriesView)seriesSoc.View;
socLineView.AxisY = socAxisY;
socLineView.LineMarkerOptions.BorderVisible = false;
socLineView.LineMarkerOptions.Color = Color.Red;
socLineView.LineStyle.Thickness = 2;
socLineView.MarkerVisibility = DevExpress.Utils.DefaultBoolean.False;
socLineView.Shadow.Visible = false;
}
private void reloadChart()
{
chartVI.Series.Clear();
//for (int i = 0; i < mQty; i++)
//{
chartVI.Series.Add(seriesVolt);
//}
//for (int i = 0; i < mQty; i++)
//{
chartVI.Series.Add(seriesCurr);
//}
//for (int i = 0; i < mQty; i++)
//{
chartVI.Series.Add(seriesTemp);
//}
//for (int i = 0; i < mQty; i++)
//{
chartVI.Series.Add(seriesSoc);
//}
}
private void ComeOnYouThread()
{
while (ThreadEnd == false)
{
try
{
chartVI.Invoke(_doIt);
Thread.Sleep(_interval);
}
catch (Exception)
{
}
}
}
public void SetLogTime(int aSec)
{
logTimeSec = aSec;
}
private void AddData()
{
DateTime now = DateTime.Now;
TimeSpan dTime = now - OldTime;
//if (OldTime.Second != now.Second)
if ((dTime.Seconds >= logTimeSec) && ((now.Second % logTimeSec) == 0))
{
if (dtVI.Rows.Count > 1000)
{
dtVI.Rows.RemoveAt(0);
}
// Add data rows to the table.
DataRow row = null;
row = dtVI.NewRow();
row["DateTime"] = DateTime.Now;
row[String.Format("Volt")] = TotalVoltage;
row[String.Format("Curr")] = TotalCurrent;
row[String.Format("Temp")] = TotalTemperature;
row[String.Format("SOC")] = TotalSoc;
dtVI.Rows.Add(row);
OldTime = now;
}
}
private void tmrDisplay_Tick(object sender, EventArgs e)
{
DisplayTotalValue();
DisplayStatusAndAlarm();
}
private void DisplayTotalValue()
{
if (active)
{
dgTotalVoltage.Text = String.Format("{0:0.0}", TotalVoltage);
dgTotalCurrent.Text = String.Format("{0:0.0}", TotalCurrent);
dgTotalTemp.Text = String.Format("{0:0.0}", TotalTemperature);
dgTotalSOC.Text = String.Format("{0:0.0}", TotalSoc);
chartVI.Invalidate();
}
}
private void DisplayStatusAndAlarm()
{
if (SystemData.CommFail == false)
{
// Operating Status
if (SystemData.StatusData.status == 0)
{
lbStatus.Text = "STANDBY";
lbStatus.ForeColor = System.Drawing.Color.Black;
}
else if (SystemData.StatusData.status == 1)
{
lbStatus.Text = "CHARGING";
lbStatus.ForeColor = System.Drawing.Color.Blue;
}
else if (SystemData.StatusData.status == 2)
{
lbStatus.Text = "DISCHARGING";
lbStatus.ForeColor = System.Drawing.Color.Magenta;
}
else if (SystemData.StatusData.status == 3)
{
lbStatus.Text = "FLOATING";
lbStatus.ForeColor = System.Drawing.Color.Black;
}
else
{
lbStatus.Text = "UNKNOWN";
lbStatus.ForeColor = System.Drawing.Color.Black;
}
// Alarm Display
if (SystemData.StatusData.alarm == 0)
{
lbAlarm.Text = "NORMAL";
lbAlarm.ForeColor = System.Drawing.Color.Green;
}
else if (SystemData.StatusData.alarm == 1)
{
lbAlarm.Text = "WARNING";
lbAlarm.ForeColor = System.Drawing.Color.Orange;
}
else if (SystemData.StatusData.alarm == 2)
{
lbAlarm.Text = "FAULT";
lbAlarm.ForeColor = System.Drawing.Color.Red;
}
else if (SystemData.StatusData.alarm == 3)
{
lbAlarm.Text = "WARMING UP";
lbAlarm.ForeColor = System.Drawing.Color.Green;
}
else
{
lbAlarm.Text = "UNKNOWN";
lbAlarm.ForeColor = System.Drawing.Color.Red;
}
}
else
{
lbStatus.Text = "OFF LINE";
lbStatus.ForeColor = System.Drawing.Color.Red;
lbAlarm.Text = "OFF LINE";
lbAlarm.ForeColor = System.Drawing.Color.Red;
}
}
}
}