560 lines
21 KiB
C#
560 lines
21 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.Data;
|
|
using System.Text;
|
|
using System.Linq;
|
|
using System.Windows.Forms;
|
|
using System.IO;
|
|
|
|
using DevExpress.XtraWaitForm;
|
|
using DevExpress.XtraSplashScreen;
|
|
using DevExpress.XtraCharts;
|
|
|
|
using System.Data.SQLite;
|
|
using LFP_Manager.DataStructure;
|
|
using LFP_Manager.Function;
|
|
using LFP_Manager.Utils;
|
|
|
|
namespace LFP_Manager.Controls
|
|
{
|
|
public partial class ucHistroy : DevExpress.XtraEditors.XtraUserControl
|
|
{
|
|
#region VARIABLES
|
|
|
|
CommConfig Config;
|
|
|
|
DataTable dtHistory;
|
|
|
|
Series seriesVolt;
|
|
Series seriesCurr;
|
|
Series seriesTemp;
|
|
Series seriesSoc;
|
|
LineSeriesView currLineView;
|
|
LineSeriesView tempLineView;
|
|
LineSeriesView socLineView;
|
|
SecondaryAxisY currAxisY;
|
|
SecondaryAxisY tempAxisY;
|
|
SecondaryAxisY socAxisY;
|
|
|
|
#endregion
|
|
|
|
#region CONSTRUCTOR
|
|
|
|
public ucHistroy()
|
|
{
|
|
InitializeComponent();
|
|
|
|
dtHistory = new DataTable();
|
|
|
|
InitChart();
|
|
|
|
gridSearchResult.CellFormatting += gridSearchResult_CellFormatting;
|
|
}
|
|
|
|
public void SetCommCofig(CommConfig aConfig)
|
|
{
|
|
Config = aConfig;
|
|
}
|
|
|
|
private void InitChart()
|
|
{
|
|
chartVI.Series.Clear();
|
|
chartVI.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False;
|
|
|
|
if (chartVI.Titles.Count > 0)
|
|
chartVI.Titles[0].Visibility = DevExpress.Utils.DefaultBoolean.False;
|
|
|
|
//-------------------- Series Volt -----------------------//
|
|
seriesVolt = new Series(String.Format("Volt"), ViewType.Line)
|
|
{
|
|
DataSource = dtHistory,
|
|
CrosshairLabelVisibility = DevExpress.Utils.DefaultBoolean.True,
|
|
CrosshairLabelPattern = "{S} : {V:F1}V",
|
|
|
|
// Specify data members to bind the series.
|
|
ArgumentScaleType = ScaleType.DateTime,
|
|
ArgumentDataMember = "create_date",
|
|
ValueScaleType = ScaleType.Numerical,
|
|
};
|
|
seriesVolt.ValueDataMembers.AddRange(new string[] { String.Format("module_voltage") });
|
|
chartVI.Series.Add(seriesVolt);
|
|
|
|
//-------------------- Series Current -----------------------//
|
|
seriesCurr = new Series(String.Format("Curr"), ViewType.Line)
|
|
{
|
|
DataSource = dtHistory,
|
|
CrosshairLabelVisibility = DevExpress.Utils.DefaultBoolean.True,
|
|
CrosshairLabelPattern = "{S} : {V:F1}A",
|
|
|
|
// Specify data members to bind the series.
|
|
ArgumentScaleType = ScaleType.DateTime,
|
|
ArgumentDataMember = "create_date",
|
|
|
|
ValueScaleType = ScaleType.Numerical,
|
|
};
|
|
seriesCurr.ValueDataMembers.AddRange(new string[] { String.Format("module_current") });
|
|
chartVI.Series.Add(seriesCurr);
|
|
|
|
//-------------------- Series Temperature -----------------------//
|
|
seriesTemp = new Series(String.Format("Temp"), ViewType.Line)
|
|
{
|
|
DataSource = dtHistory,
|
|
CrosshairLabelVisibility = DevExpress.Utils.DefaultBoolean.True,
|
|
CrosshairLabelPattern = "{S} : {V:F1}C",
|
|
|
|
// Specify data members to bind the series.
|
|
ArgumentScaleType = ScaleType.DateTime,
|
|
ArgumentDataMember = "create_date",
|
|
|
|
ValueScaleType = ScaleType.Numerical,
|
|
};
|
|
seriesTemp.ValueDataMembers.AddRange(new string[] { String.Format("temperature_01") });
|
|
chartVI.Series.Add(seriesTemp);
|
|
|
|
//-------------------- Series SOC -----------------------//
|
|
seriesSoc = new Series(String.Format("SOC"), ViewType.Line)
|
|
{
|
|
DataSource = dtHistory,
|
|
CrosshairLabelVisibility = DevExpress.Utils.DefaultBoolean.True,
|
|
CrosshairLabelPattern = "{S} : {V:F1}%",
|
|
|
|
// Specify data members to bind the series.
|
|
ValueScaleType = ScaleType.Numerical,
|
|
ArgumentScaleType = ScaleType.DateTime,
|
|
ArgumentDataMember = "create_date",
|
|
};
|
|
seriesSoc.ValueDataMembers.AddRange(new string[] { String.Format("module_soc") });
|
|
chartVI.Series.Add(seriesSoc);
|
|
|
|
XYDiagram diagram = (XYDiagram)chartVI.Diagram;
|
|
|
|
diagram.AxisX.DateTimeScaleOptions.AggregateFunction = AggregateFunction.Sum;
|
|
diagram.AxisX.DateTimeScaleOptions.MeasureUnit = DateTimeMeasureUnit.Second;
|
|
|
|
diagram.AxisX.VisualRange.Auto = true;
|
|
diagram.AxisX.VisualRange.AutoSideMargins = false;
|
|
diagram.AxisX.VisualRange.SideMarginsValue = 0;
|
|
diagram.AxisX.VisualRange.StartSideMargin = 0;
|
|
diagram.AxisX.VisualRange.EndSideMargin = 0;
|
|
|
|
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.TextPattern = "{A:HH:mm:ss}";
|
|
|
|
// Axis Y - Voltage
|
|
diagram.AxisY.VisualRange.Auto = false;
|
|
diagram.AxisY.VisualRange.AutoSideMargins = false;
|
|
diagram.AxisY.VisualRange.StartSideMargin = 0;
|
|
diagram.AxisY.VisualRange.EndSideMargin = 0;
|
|
diagram.AxisY.VisualRange.MaxValue = 60.0;
|
|
diagram.AxisY.VisualRange.MinValue = 40.0;
|
|
diagram.AxisY.WholeRange.MaxValue = 60.0;
|
|
diagram.AxisY.WholeRange.MinValue = 40.0;
|
|
|
|
diagram.AxisY.Title.Text = "Voltage (V)";
|
|
diagram.AxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
|
|
diagram.AxisY.Title.Font = new System.Drawing.Font("Tahoma", 10F, System.Drawing.FontStyle.Regular);
|
|
|
|
chartVI.Diagram.Assign(diagram);
|
|
|
|
// Axis Y - Current
|
|
currAxisY = new SecondaryAxisY("Current Y-Axis");
|
|
((XYDiagram)chartVI.Diagram).SecondaryAxesY.Add(currAxisY);
|
|
|
|
currAxisY.VisualRange.Auto = false;
|
|
currAxisY.VisualRange.AutoSideMargins = false;
|
|
currAxisY.VisualRange.StartSideMargin = 0;
|
|
currAxisY.VisualRange.EndSideMargin = 0;
|
|
currAxisY.VisualRange.MaxValue = 300.0;
|
|
currAxisY.VisualRange.MinValue = -300.0;
|
|
currAxisY.WholeRange.MaxValue = 300.0;
|
|
currAxisY.WholeRange.MinValue = -300.0;
|
|
currAxisY.Visibility = DevExpress.Utils.DefaultBoolean.True;
|
|
|
|
currAxisY.Title.Text = "Current (A)";
|
|
currAxisY.Title.Font = new System.Drawing.Font("Tahoma", 10F, System.Drawing.FontStyle.Regular);
|
|
currAxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
|
|
|
|
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;
|
|
|
|
// Axis Y - Temperature
|
|
tempAxisY = new SecondaryAxisY("Temperature Y-Axis");
|
|
((XYDiagram)chartVI.Diagram).SecondaryAxesY.Add(tempAxisY);
|
|
|
|
tempAxisY.VisualRange.Auto = false;
|
|
tempAxisY.VisualRange.AutoSideMargins = false;
|
|
tempAxisY.VisualRange.StartSideMargin = 0;
|
|
tempAxisY.VisualRange.EndSideMargin = 0;
|
|
tempAxisY.VisualRange.MaxValue = 80.0;
|
|
tempAxisY.VisualRange.MinValue = -30.0;
|
|
tempAxisY.WholeRange.MaxValue = 80.0;
|
|
tempAxisY.WholeRange.MinValue = -30.0;
|
|
tempAxisY.Visibility = DevExpress.Utils.DefaultBoolean.True;
|
|
|
|
tempAxisY.Title.Text = "Temperature (C)";
|
|
tempAxisY.Title.Font = new System.Drawing.Font("Tahoma", 10F, System.Drawing.FontStyle.Regular);
|
|
tempAxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
|
|
|
|
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;
|
|
|
|
// Axis Y - SOC
|
|
socAxisY = new SecondaryAxisY("SOC Y-Axis");
|
|
((XYDiagram)chartVI.Diagram).SecondaryAxesY.Add(socAxisY);
|
|
|
|
socAxisY.VisualRange.Auto = false;
|
|
socAxisY.VisualRange.AutoSideMargins = false;
|
|
socAxisY.VisualRange.StartSideMargin = 0;
|
|
socAxisY.VisualRange.EndSideMargin = 0;
|
|
socAxisY.VisualRange.MaxValue = 105.0;
|
|
socAxisY.VisualRange.MinValue = -5.0;
|
|
socAxisY.WholeRange.MaxValue = 105;
|
|
socAxisY.WholeRange.MinValue = -5.0;
|
|
socAxisY.Visibility = DevExpress.Utils.DefaultBoolean.True;
|
|
|
|
socAxisY.Title.Text = "SOC (%)";
|
|
socAxisY.Title.Font = new System.Drawing.Font("Tahoma", 10F, System.Drawing.FontStyle.Regular);
|
|
socAxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
|
|
|
|
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;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region UPDATE DATA
|
|
|
|
private void UpdateChart(DataTable dt)
|
|
{
|
|
chartVI.Series.Clear();
|
|
InitChart();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region SQL QUARY EXCUTE
|
|
|
|
private void quaryExcute(string quary)
|
|
{
|
|
string dbFilename = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + csDbConstData.DataBase.FileName;
|
|
|
|
// Open database
|
|
string strConn = @"Data Source=" + dbFilename;
|
|
using (var connection = new SQLiteConnection(strConn))
|
|
{
|
|
connection.Open();
|
|
try
|
|
{
|
|
DataTable aT = new DataTable();
|
|
|
|
DbWaitForm.ShowWaitForm();
|
|
|
|
csDbUtils.BeginTran(connection);
|
|
// Update data
|
|
using (SQLiteCommand command = connection.CreateCommand())
|
|
{
|
|
//sSQL = "insert into TrendTable ( TrendStamp, TagName, TagValue) Values ( " + IntToStr(stamp) + "," + name + "," + value + ");";
|
|
command.CommandText = quary;
|
|
|
|
try
|
|
{
|
|
SQLiteDataReader reader = command.ExecuteReader();
|
|
aT.Load(reader);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
}
|
|
}
|
|
csDbUtils.CommitTran(connection);
|
|
dtHistory = aT;
|
|
//RealGridView.DataSource = dt;
|
|
|
|
DbWaitForm.CloseWaitForm();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Result", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
finally
|
|
{
|
|
connection.Close();
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region BUTTON EVENT
|
|
|
|
private void btnSearch_Click(object sender, EventArgs e)
|
|
{
|
|
DateTime start = dtpStart.Value;
|
|
DateTime mid;
|
|
DateTime end = dtpEnd.Value;
|
|
TimeSpan span = end - start;
|
|
|
|
int sDay = start.DayOfYear;
|
|
int eDay = end.DayOfYear;
|
|
|
|
dtHistory.Clear();
|
|
|
|
int total_days = eDay - sDay;
|
|
|
|
DataTable[] dDt = new DataTable[total_days + 1];
|
|
|
|
string quary = "";
|
|
|
|
try
|
|
{
|
|
if (total_days == 0)
|
|
{
|
|
quary = String.Format(" where create_date > '{0:yyyy-MM-dd HH:mm:ss}'", start);
|
|
quary += String.Format(" and create_date < '{0:yyyy-MM-dd HH:mm:ss}'", end);
|
|
dDt[0] = csDbUtils.BmsDataSelectToDataTable(Config, start, quary);
|
|
if (dDt[0] == null)
|
|
MessageBox.Show("No data", "Result", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
else
|
|
{
|
|
dtHistory = dDt[0];
|
|
dtHistory.TableName = "THistory";
|
|
gridSearchResult.DataSource = dtHistory;
|
|
//gridSearchResult.();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DataTable bDt = new DataTable();
|
|
for (int i = 0; i < (total_days + 1); i++)
|
|
{
|
|
//dDt[i] = new DataTable();
|
|
if (i == 0)
|
|
{
|
|
quary = String.Format(" where create_date > '{0:yyyy-MM-dd HH:mm:ss}'", start);
|
|
dDt[i] = csDbUtils.BmsDataSelectToDataTable(Config, start, quary);
|
|
}
|
|
else if (i == total_days)
|
|
{
|
|
quary = String.Format(" where create_date < '{0:yyyy-MM-dd HH:mm:ss}'", end);
|
|
dDt[i] = csDbUtils.BmsDataSelectToDataTable(Config, end, quary);
|
|
}
|
|
else
|
|
{
|
|
quary = "";
|
|
mid = start.AddDays(i);
|
|
dDt[i] = csDbUtils.BmsDataSelectToDataTable(Config, mid, quary);
|
|
}
|
|
if (dDt[i] != null)
|
|
bDt.Merge(dDt[i]);
|
|
}
|
|
if (bDt == null)
|
|
MessageBox.Show("No data", "Result", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
else
|
|
{
|
|
|
|
dtHistory = bDt;
|
|
dtHistory.TableName = String.Format("THistory_{0:yyMMdd_HHmmss}", DateTime.Now);
|
|
gridSearchResult.DataSource = dtHistory;
|
|
|
|
UpdateChart(dtHistory);
|
|
//gridSearchResult.();
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
}
|
|
|
|
private void btnExportExcel_Click(object sender, EventArgs e)
|
|
{
|
|
SaveFileDialog sDialog = new SaveFileDialog();
|
|
sDialog.Title = "Select save file";
|
|
sDialog.DefaultExt = "xlsx";
|
|
sDialog.Filter = "Excel files 2003 (*.xls)|*.xls|All files (*.*)|*.*";
|
|
|
|
if (sDialog.ShowDialog() == DialogResult.OK)
|
|
{
|
|
string filename = sDialog.FileName;
|
|
|
|
try
|
|
{
|
|
csExcelExport.ExportToExcelExt(dtHistory, filename);
|
|
|
|
MessageBox.Show("Complete Export Excel File", "Result", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region GRID FORMATTING
|
|
|
|
private void gridSearchResult_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
|
|
{
|
|
if (e.Value == null || e.Value == DBNull.Value || e.RowIndex < 0) return;
|
|
|
|
string colName = gridSearchResult.Columns[e.ColumnIndex].Name;
|
|
|
|
if (colName == "op_status")
|
|
{
|
|
if (short.TryParse(e.Value.ToString(), out short val))
|
|
{
|
|
e.Value = GetOpStatusDisplayText(val);
|
|
e.FormattingApplied = true;
|
|
}
|
|
}
|
|
else if (colName == "alarm_status")
|
|
{
|
|
if (short.TryParse(e.Value.ToString(), out short val))
|
|
{
|
|
e.Value = GetAlarmStatusDisplayText(val);
|
|
e.FormattingApplied = true;
|
|
}
|
|
}
|
|
else if (colName == "warning")
|
|
{
|
|
if (short.TryParse(e.Value.ToString(), out short val))
|
|
{
|
|
e.Value = GetWarningDisplayText(val);
|
|
e.FormattingApplied = true;
|
|
}
|
|
}
|
|
else if (colName == "fault")
|
|
{
|
|
if (short.TryParse(e.Value.ToString(), out short val))
|
|
{
|
|
e.Value = GetFaultDisplayText(val);
|
|
e.FormattingApplied = true;
|
|
}
|
|
}
|
|
else if (colName == "error_code")
|
|
{
|
|
if (short.TryParse(e.Value.ToString(), out short val))
|
|
{
|
|
e.Value = GetErrorCodeDisplayText(val);
|
|
e.FormattingApplied = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
private string GetOpStatusDisplayText(short val)
|
|
{
|
|
ushort uval = (ushort)(val & 0x7FFF);
|
|
switch (uval)
|
|
{
|
|
case 0x0000: return "STANDBY (0x0000)";
|
|
case 0x0001: return "CHARGING (0x0001)";
|
|
case 0x0002: return "DISCHARGING (0x0002)";
|
|
case 0x0003: return "FLOATING (0x0003)";
|
|
case 0x0004: return "TRIP (0x0004)";
|
|
case 0x0008: return "CHG-LIMIT (0x0008)";
|
|
case 0x0032: return "POWER-ON (0x0032)";
|
|
default: return string.Format("UNKNOWN (0x{0:X4})", uval);
|
|
}
|
|
}
|
|
|
|
private string GetAlarmStatusDisplayText(short val)
|
|
{
|
|
switch (val)
|
|
{
|
|
case 0: return "NORMAL (0)";
|
|
case 1: return "WARNING (1)";
|
|
case 2: return "FAULT (2)";
|
|
case 3: return "WARMING UP (3)";
|
|
default: return string.Format("UNKNOWN ({0})", val);
|
|
}
|
|
}
|
|
|
|
private string GetWarningDisplayText(short val)
|
|
{
|
|
if (val == 0) return "0x0000";
|
|
|
|
List<string> list = new List<string>();
|
|
bool[] b = csUtils.Int16ToBitArray(val);
|
|
|
|
if (b[0]) list.Add("HighTemp");
|
|
if (b[1]) list.Add("LowTemp");
|
|
if (b[2]) list.Add("PackOV");
|
|
if (b[3]) list.Add("PackUV");
|
|
if (b[4]) list.Add("CellOV");
|
|
if (b[5]) list.Add("CellUV");
|
|
if (b[6]) list.Add("ChaOC");
|
|
if (b[7]) list.Add("DchOC");
|
|
if (b[8]) list.Add("PcbHighTemp");
|
|
if (b[9]) list.Add("CvDiff");
|
|
if (b[11]) list.Add("LowSOC");
|
|
|
|
string str = list.Count > 0 ? string.Join(", ", list) : "";
|
|
return string.IsNullOrEmpty(str) ? string.Format("0x{0:X4}", (ushort)val) : string.Format("0x{0:X4} ({1})", (ushort)val, str);
|
|
}
|
|
|
|
private string GetFaultDisplayText(short val)
|
|
{
|
|
if (val == 0) return "0x0000";
|
|
|
|
List<string> list = new List<string>();
|
|
bool[] b = csUtils.Int16ToBitArray(val);
|
|
|
|
if (b[0]) list.Add("HighTemp");
|
|
if (b[1]) list.Add("LowTemp");
|
|
if (b[2]) list.Add("PackOV");
|
|
if (b[3]) list.Add("PackUV");
|
|
if (b[4]) list.Add("CellOV");
|
|
if (b[5]) list.Add("CellUV");
|
|
if (b[6]) list.Add("ChaOC");
|
|
if (b[7]) list.Add("DchOC");
|
|
if (b[8]) list.Add("PcbHighTemp");
|
|
if (b[9]) list.Add("ShortCircuit");
|
|
|
|
string str = list.Count > 0 ? string.Join(", ", list) : "";
|
|
return string.IsNullOrEmpty(str) ? string.Format("0x{0:X4}", (ushort)val) : string.Format("0x{0:X4} ({1})", (ushort)val, str);
|
|
}
|
|
|
|
private string GetErrorCodeDisplayText(short val)
|
|
{
|
|
if (val == 0) return "0x0000";
|
|
|
|
List<string> list = new List<string>();
|
|
bool[] b = csUtils.Int16ToBitArray(val);
|
|
|
|
if (b[0]) list.Add("VoltError");
|
|
if (b[1]) list.Add("TempError");
|
|
if (b[2]) list.Add("CurrCheckError");
|
|
if (b[3]) list.Add("CellUnbalance");
|
|
if (b[14]) list.Add("AntiTheftGyro");
|
|
|
|
string str = list.Count > 0 ? string.Join(", ", list) : "";
|
|
return string.IsNullOrEmpty(str) ? string.Format("0x{0:X4}", (ushort)val) : string.Format("0x{0:X4} ({1})", (ushort)val, str);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|