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

1229 lines
48 KiB
C#

using System;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using DevExpress.XtraCharts;
using LFP_Manager.Forms;
using LFP_Manager.DataStructure;
using LFP_Manager.Utils;
using System.Threading;
using System.Text;
namespace LFP_Manager.Controls
{
public delegate void paramCommand(int sId, int mode, int flag, ref DeviceParamData aParam, ref DeviceCalibration aCalib);
public delegate void MsgPrint(object sender, string msg);
public partial class ucShelfStatus : DevExpress.XtraEditors.XtraUserControl
{
#region VARIABLES
const int STATUS_QTY = 10;
int SystemId = 0;
bool start = false;
int CellDivUnit = csConstData.Unit.CELL_DIV_P3;
string CellDisUnit = csConstData.Unit.CELL_DIS_P4;
CommConfig Config;
DeviceSystemData SystemData;
DataTable[] dtVolt;
DataTable[] dtTemp;
Series[] seriesVolt;
Series[] seriesTemp;
ucStatus[] alarmTrip;
Palette paletteV;
Palette paletteT;
public event paramCommand OnCommand = null;
public event MsgPrint OnMsgPrint = null;
#endregion
#region CONSTRUCTORS
public ucShelfStatus()
{
InitializeComponent();
btnParam.Enabled = false;
btnCalibration.Enabled = false;
btnINV.Enabled = false;
gaugeControl1.BackColor = Control.DefaultBackColor;
gaugeControl2.BackColor = Control.DefaultBackColor;
gaugeControl3.BackColor = Control.DefaultBackColor;
gaugeControl4.BackColor = Control.DefaultBackColor;
gaugeControl5.BackColor = Control.DefaultBackColor;
gaugeControl1.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
gaugeControl2.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
gaugeControl3.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
gaugeControl4.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
gaugeControl5.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
gaugeControl1.LayoutPadding = new DevExpress.XtraGauges.Core.Base.Thickness(2, 2, 2, 2);
gaugeControl2.LayoutPadding = new DevExpress.XtraGauges.Core.Base.Thickness(2, 2, 2, 2);
gaugeControl3.LayoutPadding = new DevExpress.XtraGauges.Core.Base.Thickness(2, 2, 2, 2);
gaugeControl4.LayoutPadding = new DevExpress.XtraGauges.Core.Base.Thickness(2, 2, 2, 2);
gaugeControl5.LayoutPadding = new DevExpress.XtraGauges.Core.Base.Thickness(2, 2, 2, 2);
}
#endregion
#region PUBLIC FUNCTIONS
public void UpdateSystemId(int sId)
{
SystemId = sId;
switch (Config.TargetModelIndex)
{
case 0: // PR-57150
SystemData.cellQty = 18;
SystemData.tempQty = 6;
break;
case 1: // PR-64150
SystemData.cellQty = 20;
SystemData.tempQty = 8;
break;
case 2: // LFPM-57080
SystemData.cellQty = 18;
SystemData.tempQty = 6;
break;
case 3: // PR-102150
SystemData.cellQty = 32;
SystemData.tempQty = 8;
break;
case 4: // PR-115300
SystemData.cellQty = 36;
SystemData.tempQty = 16;
break;
case 5: // PR-67150
SystemData.cellQty = 21;
SystemData.tempQty = 8;
break;
default:
SystemData.cellQty = 18;
SystemData.tempQty = 6;
break;
}
}
public void Start(int sId, ref CommConfig aConfig, ref DeviceSystemData aSystemData)
{
SystemId = sId;
Config = aConfig;
SystemData = aSystemData;
switch (Config.TargetModelIndex)
{
case 0: // PR-57150
CellDivUnit = csConstData.Unit.CELL_DIV_P3;
CellDisUnit = csConstData.Unit.CELL_DIS_P3;
break;
case 1: // PR-64150
CellDivUnit = csConstData.Unit.CELL_DIV_P4;
CellDisUnit = csConstData.Unit.CELL_DIS_P4;
break;
case 2: // LFPM-57080
CellDivUnit = csConstData.Unit.CELL_DIV_P4;
CellDisUnit = csConstData.Unit.CELL_DIS_P4;
break;
case 3: // PR-102150
CellDivUnit = csConstData.Unit.CELL_DIV_P4;
CellDisUnit = csConstData.Unit.CELL_DIS_P4;
break;
case 4: // PR-115300
CellDivUnit = csConstData.Unit.CELL_DIV_P4;
CellDisUnit = csConstData.Unit.CELL_DIS_P4;
break;
case 5: // PR-67150
CellDivUnit = csConstData.Unit.CELL_DIV_P4;
CellDisUnit = csConstData.Unit.CELL_DIS_P4;
break;
default:
CellDivUnit = csConstData.Unit.CELL_DIV_P3;
CellDisUnit = csConstData.Unit.CELL_DIS_P3;
break;
}
InitStatusName();
InitDataTableVolt();
InitDataTableTemp();
VSeriesInit();
tSeriesInit();
tmrDisplay.Start();
btnParam.Enabled = true;
btnCalibration.Enabled = true;
btnINV.Enabled = true;
start = true;
}
public void Stop()
{
start = false;
tmrDisplay.Stop();
}
public void SystemIdSet(int sId)
{
SystemId = sId;
}
public void UpdateData(ref DeviceSystemData aSystemData)
{
SystemData = aSystemData;
}
#endregion
#region INIT_COMPONENT
private void InitStatusName()
{
ucHighTemp.SetName("High Temp");
//ucHighTemp.SetTextWidth(80);
ucLowTemp.SetName("Low Temp");
//ucLowTemp.SetTextWidth(80);
ucOverVolt.SetName("System OV");
//ucOverVolt.SetTextWidth(80);
ucUnderVolt.SetName("System UV");
//ucUnderVolt.SetTextWidth(80);
ucCellOverVolt.SetName("Cell OV");
//ucOverVolt.SetTextWidth(80);
ucCellUnderVolt.SetName("Cell UV");
//ucUnderVolt.SetTextWidth(80);
ucChaOverCurr.SetName("Cha OC");
//ucChaOverCurr.SetTextWidth(110);
ucDchOverCurr.SetName("Dch OC");
//ucDchOverCurr.SetTextWidth(110);
ucLowSOC.SetName("Low SOC");
//ucLowSOC.SetTextWidth(80);
ucCvDiff.SetName("Cell Voltage Dev");
//ucMdComm.SetTextWidth(80);
alarmTrip = new ucStatus[STATUS_QTY];
alarmTrip[0] = ucOverVolt;
alarmTrip[1] = ucCellOverVolt;
alarmTrip[2] = ucUnderVolt;
alarmTrip[3] = ucCellUnderVolt;
alarmTrip[4] = ucChaOverCurr;
alarmTrip[5] = ucDchOverCurr;
alarmTrip[6] = ucHighTemp;
alarmTrip[7] = ucLowTemp;
//alarmTrip[0] = ucHighTemp;
//alarmTrip[1] = ucLowTemp;
//alarmTrip[2] = ucOverVolt;
//alarmTrip[3] = ucUnderVolt;
//alarmTrip[4] = ucCellOverVolt;
//alarmTrip[5] = ucCellUnderVolt;
//alarmTrip[6] = ucChaOverCurr;
//alarmTrip[7] = ucDchOverCurr;
alarmTrip[8] = ucLowSOC;
alarmTrip[9] = ucCvDiff;
}
private void InitDataTableVolt()
{
if ((dtVolt != null) && (dtVolt.Length > 0))
{
for (int i = 0; i < dtVolt.Length; i++)
dtVolt[i].Dispose();
}
dtVolt = new DataTable[SystemData.cellQty];
for (int i = 0; i < dtVolt.Length; i++)
{
dtVolt[i] = new DataTable();
dtVolt[i].Columns.Add("C_No", typeof(Int32));
dtVolt[i].Columns.Add("Alarm", typeof(Int32));
dtVolt[i].Columns.Add("Value", typeof(double));
// Add data rows to the table.
DataRow row = null;
row = dtVolt[i].NewRow();
row["C_No"] = i + 1;
row["Alarm"] = 0;
row["Value"] = 3.2;
dtVolt[i].Rows.Add(row);
}
}
private void InitDataTableTemp()
{
if ((dtTemp != null) && (dtTemp.Length > 0))
{
for (int i = 0; i < dtTemp.Length; i++)
dtTemp[i].Dispose();
}
dtTemp = new DataTable[SystemData.tempQty];
for (int i = 0; i < dtTemp.Length; i++)
{
dtTemp[i] = new DataTable();
dtTemp[i].Columns.Add("T_No", typeof(Int32));
dtTemp[i].Columns.Add("Alarm", typeof(Int32));
dtTemp[i].Columns.Add("Value", typeof(double));
// Add data rows to the table.
DataRow row = null;
row = dtTemp[i].NewRow();
row["T_No"] = i + 1;
row["Alarm"] = 0;
row["Value"] = 25.4;
dtTemp[i].Rows.Add(row);
}
}
private Palette VPaletteInit(string bName)
{
paletteV = new Palette(bName);
for (int i = 0; i < SystemData.cellQty; i++)
{
paletteV.Add(Color.Green);
}
return paletteV;
}
private void VPaletteUpdate2(uint LvValue, uint HvValue)
{
int nIC, nID;
uint[] bValue = new uint[2];
paletteV.Clear();
bValue[0] = LvValue;
bValue[1] = HvValue;
for (int i = 0; i < SystemData.cellQty; i++)
{
nIC = 0; nID = 0;
switch (Config.TargetModelIndex)
{
case 0: // PR-57150
case 1:
case 2:
nIC = 0;
nID = i;
break;
case 3: // PR-102150
nIC = 0;
nID = i;
break;
case 4: // PR-115300
nIC = i / csConstData.SystemInfo.CELL_MAX_PER_IC;
nID = i % csConstData.SystemInfo.CELL_MAX_PER_IC;
break;
case 5:
nIC = 0;
nID = i;
break;
default:
nIC = 0;
nID = i;
break;
}
if (((bValue[nIC] >> nID) & 0x00000001) == 0x00000001)
paletteV.Add(Color.Orange);
else
paletteV.Add(Color.Green);
}
}
private void VPaletteUpdate(uint LvValue, uint HvValue)
{
int nIC, nID;
uint[] bValue = new uint[2];
paletteV.Clear();
bValue[0] = LvValue;
bValue[1] = HvValue;
for (int i = 0; i < SystemData.cellQty; i++)
{
nIC = 0; nID = 0;
switch (Config.TargetModelIndex)
{
case 4: // PR-115300
nIC = i / csConstData.SystemInfo.CELL_MAX_PER_IC;
nID = i % csConstData.SystemInfo.CELL_MAX_PER_IC;
if (((bValue[nIC] >> nID) & 0x00000001) == 0x00000001)
paletteV.Add(Color.Orange);
else
paletteV.Add(Color.Green);
break;
case 0: // PR-57150
nID = i;
if (((bValue[0] >> nID) & 0x00000001) == 0x00000001)
{
if (((bValue[1] >> nID) & 0x00000001) == 0x00000001)
paletteV.Add(Color.Orange);
else
paletteV.Add(Color.Blue);
}
else
{
paletteV.Add(Color.Green);
}
break;
case 1:
case 2:
case 3: // PR-102150
case 5:
default:
nIC = 0;
nID = i;
break;
}
}
}
private Palette TPaletteInit(string bName, short bValue)
{
paletteT = new Palette(bName);
for (int i = 0; i < SystemData.tempQty; i++)
{
if (((bValue >> i) & 0x0001) == 0x0001)
paletteT.Add(Color.Orange);
else
paletteT.Add(Color.Green);
}
return paletteT;
}
private void TPaletteUpdate(short bValue)
{
paletteT.Clear();
for (int i = 0; i < SystemData.tempQty; i++)
{
if (((bValue >> i) & 0x0001) == 0x0001)
paletteT.Add(Color.Orange);
else
paletteT.Add(Color.Green);
}
}
private void VSeriesInit()
{
VChart.Series.Clear();
VChart.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False;
seriesVolt = new Series[SystemData.cellQty];
for (int i = 0; i < seriesVolt.Length; i++)
{
seriesVolt[i] = new Series(String.Format("C_{0:00}", i + 1), ViewType.Bar)
{
DataSource = dtVolt[i],
CrosshairLabelPattern = "C_{A:00} : {V:F4}",
// Specify data members to bind the series.
ArgumentScaleType = ScaleType.Numerical,
ArgumentDataMember = "C_No",
ValueScaleType = ScaleType.Numerical,
};
((SideBySideBarSeriesView)(seriesVolt[i].View)).BarWidth = 10.0;
seriesVolt[i].ValueDataMembers.AddRange(new string[] { "Value" });
VChart.Series.Add(seriesVolt[i]);
}
VChart.PaletteRepository.Clear();
VChart.PaletteRepository.Add("V Palette", VPaletteInit("V Palette"));
VChart.PaletteName = "V Palette";
// Cast the chart's diagram to the XYDiagram type, to access its axes.
XYDiagram diagram = (XYDiagram)VChart.Diagram;
if (diagram.AxisY.ConstantLines.Count > 0)
diagram.AxisY.ConstantLines.Clear();
// Create a constant line.
ConstantLine constantLineMax = new ConstantLine("Limit(Max)");
ConstantLine constantLineMin = new ConstantLine("Limit(Min)");
ConstantLine constantDataMax = new ConstantLine(string.Format(" Max({0:#0.0000}V:{1:00}-{2:00})", 0, 0, 0));
ConstantLine constantDataAvg = new ConstantLine(string.Format(" Avg({0:#0.0000}V)", 0));
ConstantLine constantDataMin = new ConstantLine(string.Format("Min({0:#0.0000}V:{1:00}-{2:00})", 0, 0, 0));
ConstantLine constantDataBalancing = new ConstantLine(string.Format("Balancing ({0:#0.000}", 0));
constantDataBalancing.Title.Alignment = ConstantLineTitleAlignment.Far;
constantDataBalancing.LineStyle.DashStyle = DashStyle.Dash;
constantLineMax.Color = Color.Red;
constantLineMin.Color = Color.Red;
// Customize the behavior of the constant line.
constantLineMax.Visible = true;
constantLineMax.ShowInLegend = true;
constantLineMax.LegendText = "Limit(Max)";
constantLineMax.ShowBehind = false;
constantLineMin.Visible = true;
constantLineMin.ShowInLegend = true;
constantLineMin.LegendText = "Limit(Min)";
constantLineMin.ShowBehind = false;
constantDataMax.Visible = true;
constantDataMax.ShowInLegend = true;
constantDataMax.LegendText = "Max";
constantDataMax.ShowBehind = false;
constantDataMax.Color = Color.MediumVioletRed;
constantDataMax.Title.Font = new Font("Tahoma", 10F, FontStyle.Bold);
constantDataAvg.Visible = true;
constantDataAvg.ShowInLegend = true;
constantDataAvg.LegendText = "Avg";
constantDataAvg.ShowBehind = false;
constantDataAvg.Color = Color.Green;
constantDataAvg.Title.Font = new Font("Tahoma", 10F, FontStyle.Bold);
constantDataMin.Visible = true;
constantDataMin.ShowInLegend = true;
constantDataMin.LegendText = "Min";
constantDataMin.ShowBehind = false;
constantDataMin.Color = Color.BlueViolet;
constantDataMin.Title.Font = new Font("Tahoma", 10F, FontStyle.Bold);
constantDataBalancing.Visible = true;
constantDataBalancing.ShowInLegend = true;
constantDataBalancing.LegendText = "Min";
constantDataBalancing.ShowBehind = false;
constantDataBalancing.Color = Color.BlueViolet;
constantDataBalancing.Title.TextColor = Color.Black;
constantDataBalancing.Title.Font = new Font("Tahoma", 10F, FontStyle.Bold);
constantDataBalancing.Title.Alignment = ConstantLineTitleAlignment.Far;
constantDataBalancing.LineStyle.DashStyle = DashStyle.Dash;
// Define its axis value.
constantLineMax.AxisValue = 3.85;
constantLineMin.AxisValue = 2.5;
constantDataMax.AxisValue = 0;
constantDataAvg.AxisValue = 0;
constantDataMin.AxisValue = 0;
diagram.AxisY.ConstantLines.Add(constantLineMax);
diagram.AxisY.ConstantLines.Add(constantLineMin);
diagram.AxisY.ConstantLines.Add(constantDataMax);
diagram.AxisY.ConstantLines.Add(constantDataAvg);
diagram.AxisY.ConstantLines.Add(constantDataMin);
diagram.AxisY.ConstantLines.Add(constantDataBalancing);
// Axis Y
diagram.AxisY.VisualRange.Auto = false;
diagram.AxisY.VisualRange.AutoSideMargins = false;
diagram.AxisY.VisualRange.StartSideMargin = 0;
diagram.AxisY.VisualRange.EndSideMargin = 0;
diagram.AxisY.VisualRange.MaxValue = 4.5;
diagram.AxisY.VisualRange.MinValue = 2.0;
diagram.AxisY.WholeRange.MaxValue = 4.5;
diagram.AxisY.WholeRange.MinValue = 2.0;
diagram.AxisY.NumericScaleOptions.AutoGrid = false;
diagram.AxisY.NumericScaleOptions.GridAlignment = NumericGridAlignment.Ones;
diagram.AxisY.NumericScaleOptions.GridOffset = 0;
diagram.AxisY.NumericScaleOptions.GridSpacing = 0.1;
//diagram.AxisY.GridSpacing = 0.1;
diagram.AxisY.Title.Text = "Voltage(V)";
//diagram.AxisY.Label.NumericOptions.Precision = 3;
diagram.AxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
diagram.AxisY.Title.Font = new Font("Tahoma", 9F, FontStyle.Regular);
// Axis X
diagram.AxisX.WholeRange.Auto = false;
diagram.AxisX.WholeRange.MaxValue = seriesVolt.Length;
diagram.AxisX.WholeRange.MinValue = 0;
diagram.AxisX.VisualRange.MaxValue = seriesVolt.Length;
diagram.AxisX.VisualRange.MinValue = 1;
diagram.AxisX.VisualRange.Auto = false;
diagram.AxisX.VisualRange.AutoSideMargins = false;
diagram.AxisX.VisualRange.SideMarginsValue = 0.5;
diagram.AxisX.GridLines.Visible = false;
diagram.AxisX.NumericScaleOptions.AutoGrid = false;
diagram.AxisX.NumericScaleOptions.GridSpacing = 1D;
diagram.AxisX.Title.Text = "Cell No";
diagram.AxisX.Title.Visibility = DevExpress.Utils.DefaultBoolean.False;
diagram.AxisX.Title.Font = new Font("Tahoma", 9F, FontStyle.Regular);
diagram.DefaultPane.BackColor = Color.FromArgb(242, 242, 242);
}
private void tSeriesInit()
{
TChart.Series.Clear();
TChart.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False;
seriesTemp = new Series[SystemData.tempQty];
for (int i = 0; i < seriesTemp.Length; i++)
{
seriesTemp[i] = new Series(String.Format("T_{0:00}", i + 1), ViewType.Bar)
{
DataSource = dtTemp[i],
CrosshairLabelPattern = "T_{A:00} : {V:F1}",
// Specify data members to bind the series.
ArgumentScaleType = ScaleType.Numerical,
ArgumentDataMember = "T_No",
ValueScaleType = ScaleType.Numerical
};
((SideBySideBarSeriesView)(seriesTemp[i].View)).BarWidth = 2.0;
seriesTemp[i].ValueDataMembers.AddRange(new string[] { "Value" });
TChart.Series.Add(seriesTemp[i]);
}
TChart.PaletteRepository.Clear();
TChart.PaletteRepository.Add("T Palette", TPaletteInit("T Palette", 0));
TChart.PaletteName = "T Palette";
// Cast the chart's diagram to the XYDiagram type, to access its axes.
XYDiagram diagram = (XYDiagram)TChart.Diagram;
if (diagram.AxisY.ConstantLines.Count > 0)
diagram.AxisY.ConstantLines.Clear();
diagram.Margins.All = 0;
ConstantLine constantLineMax = new ConstantLine("Limit(Max)");
ConstantLine constantLineMin = new ConstantLine("Limit(Min)");
ConstantLine constantDataMax = new ConstantLine(String.Format(" Max({0:#0.0}C)", 0));
ConstantLine constantDataAvg = new ConstantLine(String.Format(" Avg({0:#0.0}C)", 0));
ConstantLine constantDataMin = new ConstantLine(String.Format("Min({0:#0.0}C)", 0));
constantLineMax.Color = Color.Red;
constantLineMin.Color = Color.Red;
// Customize the behavior of the constant line.
constantLineMax.Visible = true;
constantLineMax.ShowInLegend = true;
constantLineMax.LegendText = "Limit(Max)";
constantLineMax.ShowBehind = false;
constantLineMin.Visible = true;
constantLineMin.ShowInLegend = true;
constantLineMin.LegendText = "Limit(Min)";
constantLineMin.ShowBehind = false;
constantDataMax.Visible = true;
constantDataMax.ShowInLegend = true;
constantDataMax.LegendText = "Max";
constantDataMax.ShowBehind = false;
constantDataMax.Color = Color.MediumVioletRed;
constantDataMax.Title.Font = new Font("Tahoma", 9F, FontStyle.Bold);
constantDataAvg.Visible = true;
constantDataAvg.ShowInLegend = true;
constantDataAvg.LegendText = "Avg";
constantDataAvg.ShowBehind = false;
constantDataAvg.Color = Color.LawnGreen;
constantDataAvg.Title.Font = new Font("Tahoma", 9F, FontStyle.Bold);
constantDataMin.Visible = true;
constantDataMin.ShowInLegend = true;
constantDataMin.LegendText = "Min";
constantDataMin.ShowBehind = false;
constantDataMin.Color = Color.BlueViolet;
constantDataMin.Title.Font = new Font("Tahoma", 9F, FontStyle.Bold);
// Define its axis value.
constantLineMax.AxisValue = 60.0;
constantLineMin.AxisValue = -10.0;
constantDataMax.AxisValue = 0;
constantDataAvg.AxisValue = 0;
constantDataMin.AxisValue = 0;
diagram.AxisY.ConstantLines.Add(constantLineMax);
diagram.AxisY.ConstantLines.Add(constantLineMin);
diagram.AxisY.ConstantLines.Add(constantDataMax);
diagram.AxisY.ConstantLines.Add(constantDataAvg);
diagram.AxisY.ConstantLines.Add(constantDataMin);
// Axis Y
diagram.AxisY.VisualRange.Auto = false;
diagram.AxisY.VisualRange.AutoSideMargins = false;
diagram.AxisY.VisualRange.StartSideMargin = 0;
diagram.AxisY.VisualRange.EndSideMargin = 0;
diagram.AxisY.VisualRange.MaxValue = 80.0;
diagram.AxisY.VisualRange.MinValue = -30.0;
diagram.AxisY.WholeRange.MaxValue = 80.0;
diagram.AxisY.WholeRange.MinValue = -30.0;
diagram.AxisY.NumericScaleOptions.AutoGrid = false;
diagram.AxisY.NumericScaleOptions.GridAlignment = NumericGridAlignment.Ones;
diagram.AxisY.NumericScaleOptions.GridOffset = 0;
diagram.AxisY.NumericScaleOptions.GridSpacing = 5;
diagram.AxisY.Title.Text = "Temperature(C)";
diagram.AxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
diagram.AxisY.Title.Font = new Font("Tahoma", 9F, FontStyle.Regular);
// Axis X
diagram.AxisX.WholeRange.Auto = false;
diagram.AxisX.WholeRange.MaxValue = seriesTemp.Length;
diagram.AxisX.WholeRange.MinValue = 0;
diagram.AxisX.VisualRange.MaxValue = seriesTemp.Length;
diagram.AxisX.VisualRange.MinValue = 1;
diagram.AxisX.VisualRange.Auto = false;
diagram.AxisX.VisualRange.AutoSideMargins = false;
diagram.AxisX.VisualRange.SideMarginsValue = 0.5;
diagram.AxisX.GridLines.Visible = false;
//diagram.AxisX.NumericScaleOptions.AutoGrid = false;
diagram.AxisX.NumericScaleOptions.GridSpacing = 1D;
diagram.AxisX.Title.Text = "Temperature No";
diagram.AxisX.Title.Visibility = DevExpress.Utils.DefaultBoolean.False;
diagram.AxisX.Title.Font = new Font("Tahoma", 9F, FontStyle.Regular);
diagram.DefaultPane.BackColor = Color.FromArgb(242, 242, 242);
}
#endregion
#region DISPLAY DATA
private void tmrDisplay_Tick(object sender, EventArgs e)
{
if (start)
{
dgVoltage.Text = String.Format("{0:0.0}", Convert.ToDouble(SystemData.ValueData.voltageOfPack) / 10);
dgAvgCellVoltage.Text = String.Format(CellDisUnit, Convert.ToDouble(SystemData.AvgData.avgCellVoltage) / CellDivUnit);
dgDiffCellVoltage.Text = String.Format(CellDisUnit, Convert.ToDouble(SystemData.AvgData.diffCellVoltage) / CellDivUnit);
dgAvgTemperature.Text = String.Format("{0:0.0}", Convert.ToDouble(SystemData.AvgData.avgTemp) / 10);
dgDiffTemperature.Text = String.Format("{0:0.0}", Convert.ToDouble(SystemData.AvgData.diffTemp) / 10);
//dgAvgTemperature.Text = String.Format("{0:0.0}", ((XYDiagram)VChart.Diagram).AxisX.VisualRange.MinValueInternal);
//dgDiffTemperature.Text = String.Format("{0:0.0}", ((XYDiagram)VChart.Diagram).AxisX.WholeRange.MaxValueInternal);
DisplayCellVoltage();
DisplayCellTemperature();
DisplayStatusAndAlarm();
DisplayAlarm();
lbHeatbeat.Text = String.Format("HB({0}): {1}", (SystemData.CalibriationData.ForcedBalancing.AutoB) ? 1 : 0, SystemData.heatbeat);
//lbOneBuffTime.Text = string.Format(" OBT: {0}", SystemData.OneBuffTime);
//lbAllBuffTime.Text = string.Format(" DCP: {0:X4}", SystemData.StatusData.batteryStatusA);
lbOneBuffTime.Text = string.Format(" ENAB: {0:X8}", SystemData.StatusData.BalanceEnable);
lbAllBuffTime.Text = string.Format(" MODE: {0:X8}", SystemData.StatusData.BalanceMode);
}
}
private void DisplayCellVoltage()
{
try
{
for (int i = 0; i < dtVolt.Length; i++)
{
dtVolt[i].Rows[0]["Value"] = Convert.ToDouble(SystemData.ValueData.CellVoltage[i]) / CellDivUnit;
}
//for (int i = 0; i < cellQty; i++)
//{
// dtVolt[i].Rows[0]["Value"] = Convert.ToDouble(SystemData.ValueData.CellVoltage[i]) / CellDivUnit;
// //((SideBySideBarSeriesView)seriesVolt[i].View).BarWidth = 10.0;
//}
//if (SystemData.StatusData.cellBalanceFlag == 0x0001)
//{
VPaletteUpdate(SystemData.StatusData.BalanceEnable, SystemData.StatusData.BalanceMode);
//}
//else
//{
// VPaletteUpdate(0, 0);
//}
double maxValue = Convert.ToDouble(SystemData.AvgData.maxCellVoltage) / CellDivUnit;
double avgValue = Convert.ToDouble(SystemData.AvgData.avgCellVoltage) / CellDivUnit;
double minValue = Convert.ToDouble(SystemData.AvgData.minCellVoltage) / CellDivUnit;
double balanceValue = Convert.ToDouble(SystemData.StatusData.cellBalanceValue) / CellDivUnit;
int maxCno = Convert.ToInt32(SystemData.AvgData.maxCellNum);
int minCno = Convert.ToInt32(SystemData.AvgData.minCellNum);
// Cast the chart's diagram to the XYDiagram type, to access its axes.
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[2].Name =
String.Format(" Max({0:#0.0000}V:{1:00})", maxValue, maxCno);
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[3].Name =
String.Format(" Avg({0:#0.0000}V)", avgValue);
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[4].Name =
String.Format("Min({0:#0.0000}V:{1:00})", minValue, minCno);
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[5].Name =
String.Format("Cell Balancing ({0:#0.000}V: EndGap[{1}])"
, balanceValue, SystemData.StatusData.cellBalanceEndGap);
// Define its axis value.
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[2].AxisValue = maxValue;
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[3].AxisValue = avgValue;
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[4].AxisValue = minValue;
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[5].AxisValue = balanceValue;
if (SystemData.StatusData.cellBalanceFlag == 1)
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[5].Title.TextColor = Color.Red;
else
((XYDiagram)VChart.Diagram).AxisY.ConstantLines[5].Title.TextColor = Color.Blue;
//((XYDiagram)VChart.Diagram).AxisX.WholeRange.MinValue = 0.5;
//((XYDiagram)VChart.Diagram).AxisX.VisualRange.MinValue = 0.5;
//VChart.Legend.Visible = true;
//VChart.Titles[0].Text =
// String.Format("Voltage Status");
//VChart.Invalidate();
}
catch (Exception)
{
//MsgBox.ErrorShow(ex);
}
}
private void DisplayCellTemperature()
{
try
{
for (int i = 0; i < seriesTemp.Length; i++)
seriesTemp[i].DataSource = null;
for (int i = 0; i < dtTemp.Length; i++)
{
dtTemp[i].Rows[0]["Value"] = Convert.ToDouble(SystemData.ValueData.CellTemperature[i]) / 10;
}
for (int i = 0; i < seriesTemp.Length; i++)
seriesTemp[i].DataSource = dtTemp[i];
//for (int i = 0; i < tempQty; i++)
//{
// dtTemp[i].Rows[0]["Value"] = Convert.ToDouble(SystemData.ValueData.CellTemperature[i]) / 10;
//}
double maxValue = Convert.ToDouble(SystemData.AvgData.maxTemp) / 10;
double avgValue = Convert.ToDouble(SystemData.AvgData.avgTemp) / 10;
double minValue = Convert.ToDouble(SystemData.AvgData.minTemp) / 10;
int maxCno = Convert.ToInt32(SystemData.AvgData.maxTempNum);
int minCno = Convert.ToInt32(SystemData.AvgData.minTempNum);
((XYDiagram)TChart.Diagram).AxisY.ConstantLines[2].Name = String.Format(" Max({0:#0.0}C:{1:00})", maxValue, maxCno);
((XYDiagram)TChart.Diagram).AxisY.ConstantLines[3].Name = String.Format(" Avg({0:#0.0}C)", avgValue);
((XYDiagram)TChart.Diagram).AxisY.ConstantLines[4].Name = String.Format("Min({0:#0.0}C:{1:00})", minValue, minCno);
// Define its axis value.
((XYDiagram)TChart.Diagram).AxisY.ConstantLines[2].AxisValue = maxValue;
((XYDiagram)TChart.Diagram).AxisY.ConstantLines[3].AxisValue = avgValue;
((XYDiagram)TChart.Diagram).AxisY.ConstantLines[4].AxisValue = minValue;
//TChart.Legend.Visible = true;
//TChart.Titles[0].Text =
// String.Format("Temperature Status");
}
catch (Exception)
{
//MsgBox.ErrorShow(ex);
}
}
private void DisplayStatusAndAlarm()
{
if (SystemData.CommFail == false)
{
if (SystemData.ShelfCommFail == false)
{
switch (SystemData.StatusData.status)
{
case 0x0000: // Stand by
lbStatus.Text = "STANDBY";
lbStatus.ForeColor = System.Drawing.Color.Black;
break;
case 0x0001: // Charging
lbStatus.Text = "CHARGING";
lbStatus.ForeColor = System.Drawing.Color.Blue;
break;
case 0x0002: // Discharging
lbStatus.Text = "DISCHARGING";
lbStatus.ForeColor = System.Drawing.Color.Magenta;
break;
case 0x0003: // Float Charging
lbStatus.Text = "FLOATING";
lbStatus.ForeColor = System.Drawing.Color.Black;
break;
case 0x0004: // Warming Up
lbStatus.Text = "WARMING UP";
lbStatus.ForeColor = System.Drawing.Color.Black;
break;
default:
lbStatus.Text = "UNKNOWN";
lbStatus.ForeColor = System.Drawing.Color.Black;
break;
}
// 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 = "COMM FAIL";
lbStatus.ForeColor = System.Drawing.Color.Red;
lbAlarm.Text = "COMM FAIL";
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;
}
// Charge Relay Status Display
}
private void DisplayAlarm()
{
bool[] aFault = csUtils.Int16ToBitArray(SystemData.StatusData.protect);
bool[] aWarining = csUtils.Int16ToBitArray(SystemData.StatusData.warning);
bool aCommfail;
if (Config.CommType == 0)
{
aCommfail = SystemData.ShelfCommFail;
}
else
{
aCommfail = SystemData.CommFail;
}
for (int i = 0; i < 6; i++)
{
if (aFault[i] == true)
alarmTrip[i].SetValue(2);
else if (aWarining[i] == true)
alarmTrip[i].SetValue(1);
else
alarmTrip[i].SetValue(0);
}
// High Temp
if (aFault[8] || aFault[9])
alarmTrip[6].SetValue(2);
else if (aWarining[8] || aWarining[9])
alarmTrip[6].SetValue(1);
else
alarmTrip[6].SetValue(0);
// Low Temp
if (aFault[10] || aFault[11])
alarmTrip[7].SetValue(2);
else if (aWarining[10] || aWarining[11])
alarmTrip[7].SetValue(1);
else
alarmTrip[7].SetValue(0);
// Low SOC
if (aWarining[12] == true)
alarmTrip[8].SetValue(1);
else
alarmTrip[8].SetValue(0);
// Cell Voltage Difference
if (aFault[14] == true)
alarmTrip[9].SetValue(2);
else if (aWarining[14] == true)
alarmTrip[9].SetValue(1);
else
alarmTrip[9].SetValue(0);
}
#endregion
#region BUTTON EVENT
private void btnParam_Click(object sender, EventArgs e)
{
foreach (Form frm in Application.OpenForms)
{
if (frm.Name == "fmxParamConfig")
{
frm.Activate();
return;
}
}
fmxParamConfig ParamConfigForm = new fmxParamConfig(SystemId, SystemData.ParamData);
ParamConfigForm.OnUpdate += UpdateParam;
ParamConfigForm.OnCommand += ParamSetCmd;
ParamConfigForm.Show();
}
private void btnCalibration_Click(object sender, EventArgs e)
{
foreach (Form frm in Application.OpenForms)
{
if (frm.Name == "fmxCalibration")
{
frm.Activate();
return;
}
}
fmxCalibration CalibrationForm = new fmxCalibration(SystemId, SystemData.CalibriationData);
CalibrationForm.OnUpdate += UpdateCalibration;
CalibrationForm.OnCommand += ParamSetCmd;
CalibrationForm.Show();
//VChart.ShowPrintPreview();
}
private void btnINV_Click(object sender, EventArgs e)
{
foreach (Form frm in Application.OpenForms)
{
if (frm.Name == "fmxInventoryConfig")
{
frm.Activate();
return;
}
}
fmxInventoryConfig InventoryConfigForm = new fmxInventoryConfig(Config, SystemId, ref SystemData);
InventoryConfigForm.OnUpdate += UpdateInformation;
InventoryConfigForm.OnCommand += InvDataSetCmd;
InventoryConfigForm.Show();
//VChart.ShowPrintPreview();
}
private void btnINV2_Click(object sender, EventArgs e)
{
foreach (Form frm in Application.OpenForms)
{
if (frm.Name == "fmxInventoryConfig2")
{
frm.Activate();
return;
}
}
fmxInventoryConfig2 InventoryConfig2Form = new fmxInventoryConfig2(Config, SystemId, ref SystemData, CellDivUnit);
InventoryConfig2Form.OnUpdate += UpdateInformation2;
InventoryConfig2Form.OnCommand += InvDataSetCmd2;
InventoryConfig2Form.ShowDialog();
//VChart.ShowPrintPreview();
}
int CbTestFlag = 0;
private void BtnCbTest_Click(object sender, EventArgs e)
{
if (CbTestFlag == 0)
{
CbTestFlag = 1;
}
else if (CbTestFlag == 1)
{
CbTestFlag = 2;
return;
}
else if (CbTestFlag == 2)
{
return;
}
BtnCbTest.Text = "Cancel";
Config.AppPath = Application.ExecutablePath;
Config.mSN = Encoding.Default.GetString(SystemData.Information.pcb_sn).Trim('\0');
string alog = string.Format("\r\nCB Data Start [{0}]: {1}", Application.ProductVersion, Config.mSN);
csLog.MakeCosoleStrLog(Config, alog);
OnMsgPrint?.Invoke(this, alog);
int CbTestGap = 0;
int CbTestGapMax = 0;
DeviceParamData aParam = SystemData.ParamData;
DeviceCalibration wCalib = SystemData.CalibriationData.DeepCopy();
// Auto Cell Balancing Disable
wCalib.ForcedBalancing.AutoB = false;
ParamSetCmd(SystemId, 1, 1, ref aParam, ref wCalib);
int CellNo = 0;
int CellVoltageBefore = 0;
int CellVoltageAfter = 0;
for (int i = 0; i < SystemData.cellQty; i++)
{
CellNo = i;
CellVoltageBefore = SystemData.ValueData.CellVoltage[i];
wCalib.ForcedBalancing.Control = 0;
wCalib.ForcedBalancing.CellNo = (short)0;
ParamSetCmd(SystemId, 12, 1, ref aParam, ref wCalib);
Application.DoEvents();
Thread.Sleep(100);
wCalib.ForcedBalancing.Control = 2;
wCalib.ForcedBalancing.CellNo = (short)(CellNo + 1);
ParamSetCmd(SystemId, 12, 1, ref aParam, ref wCalib);
CbTestGap = 0;
for (int j = 0; j < (Config.CbTestTime / 100); j++)
{
Application.DoEvents();
Thread.Sleep(100);
if (CbTestFlag == 2)
{
break;
}
if (CbTestGap < SystemData.AvgData.diffCellVoltage)
{
CbTestGap = SystemData.AvgData.diffCellVoltage;
}
if (CbTestGapMax < SystemData.AvgData.diffCellVoltage)
{
CbTestGapMax = SystemData.AvgData.diffCellVoltage;
}
}
CellVoltageAfter = SystemData.ValueData.CellVoltage[i];
alog = string.Format("CB Test [{0:00}]: {1:0.0000} - {2:0.0000}/{3:0.0000} - {4:0.0000}"
, CellNo
, Convert.ToDouble(CbTestGap) / CellDivUnit
, Convert.ToDouble(CellVoltageBefore) / CellDivUnit
, Convert.ToDouble(CellVoltageAfter) / CellDivUnit
, Convert.ToDouble(CellVoltageBefore - CellVoltageAfter) / CellDivUnit
);
csLog.MakeCosoleStrLog(Config, alog);
OnMsgPrint?.Invoke(this, alog);
int testGap;
if (Config.TargetModelIndex == 0)
{
testGap = Config.CbTestGap / 10;
}
else
{
testGap = Config.CbTestGap;
}
if (CbTestGap > testGap)
{
alog = string.Format("CB Test Fail - Cell No: {0}, V: {1:0.0000}", CellNo, Convert.ToDouble(CbTestGap) / CellDivUnit);
csLog.MakeCosoleStrLog(Config, alog);
OnMsgPrint?.Invoke(this, alog);
MessageBox.Show(string.Format("CB Test Fail - Cell No: {0}, V: {1:0.0000}", CellNo, Convert.ToDouble(CbTestGap) / CellDivUnit)
, "Exception"
, MessageBoxButtons.OK
, MessageBoxIcon.Error);
CbTestFlag = 2;
}
if (CbTestFlag == 2)
{
alog = string.Format("CB Test Cancel");
csLog.MakeCosoleStrLog(Config, alog);
OnMsgPrint?.Invoke(this, alog);
break;
}
}
wCalib.ForcedBalancing.Control = 0;
wCalib.ForcedBalancing.CellNo = (short)SystemData.cellQty;
ParamSetCmd(SystemId, 12, 1, ref aParam, ref wCalib);
// Auto Cell Balancing Enable
wCalib.ForcedBalancing.AutoB = true;
wCalib.ForcedBalancing.DCP = false;
ParamSetCmd(SystemId, 1, 1, ref aParam, ref wCalib);
if (CbTestFlag == 1)
{
alog = string.Format("CB Test Pass - V: {0:0.0000}", Convert.ToDouble(CbTestGapMax) / CellDivUnit);
csLog.MakeCosoleStrLog(Config, alog);
OnMsgPrint?.Invoke(this, alog);
MessageBox.Show(string.Format("CB Test Pass - Max. V: {0:0.0000}", Convert.ToDouble(CbTestGapMax) / CellDivUnit)
, "Exception"
, MessageBoxButtons.OK
, MessageBoxIcon.Information);
}
BtnCbTest.Text = "CB Test";
CbTestFlag = 0;
}
#endregion
#region COMPONENT EVENT FUNCTION
private void UpdateParam(object sendor)
{
((fmxParamConfig)sendor).UpdateData(SystemData.ParamData, SystemData.CalibriationData);
}
private void UpdateCalibration(object sendor)
{
((fmxCalibration)sendor).UpdateData(SystemData.ParamData, SystemData.CalibriationData, SystemData);
}
private void UpdateInformation(object sendor)
{
((fmxInventoryConfig)sendor).UpdateData(ref SystemData);
}
private void UpdateInformation2(object sendor)
{
((fmxInventoryConfig2)sendor).UpdateData(ref SystemData);
}
private void ParamSetCmd(int sId, int mode, int flag, ref DeviceParamData aParam, ref DeviceCalibration aCalib)
{
OnCommand?.Invoke(sId, mode, flag, ref aParam, ref aCalib);
}
private void InvDataSetCmd(int sId, int mode, int flag, ref DeviceInforation aInvData)
{
SystemData.CalibriationData.InvData = aInvData;
OnCommand?.Invoke(sId, mode, flag, ref SystemData.ParamData, ref SystemData.CalibriationData);
}
private void InvDataSetCmd2(int sId, int mode, int flag, ref DeviceInforation aInvData)
{
SystemData.CalibriationData.InvData = aInvData;
OnCommand?.Invoke(sId, mode, flag, ref SystemData.ParamData, ref SystemData.CalibriationData);
}
#endregion
}
}