1018 lines
41 KiB
C#
1018 lines
41 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.IO;
|
|
using System.Data.SqlServerCe;
|
|
using System.Runtime.InteropServices;
|
|
|
|
using BMS_D1000H.BMSConstData;
|
|
using BMS_D1000H.DataStructs;
|
|
using BMS_D1000H.Utils.Functions;
|
|
|
|
namespace BMS_D1000H.Utils.Functions
|
|
{
|
|
public class AlarmFile
|
|
{
|
|
public string BMS_PASSWORD;
|
|
TAlarmList AlarmList;
|
|
DeviceDataSystem bMainData;
|
|
DeviceDataTray[] bTrayData;
|
|
|
|
static readonly string AlarmFilePath = PathHelper.GetFullPath("alarmlist.sdf");
|
|
static readonly string AlarmHistPath = PathHelper.GetFullPath("AlarmHistory.db");
|
|
static readonly string AlarmHistCsvPath = PathHelper.GetFullPath(@"Alarm\");
|
|
|
|
static readonly string PasswordFilePath = PathHelper.GetFullPath("password.db");
|
|
static readonly string LoggingFilePath = PathHelper.GetFullPath(@"Log\");
|
|
//static readonly string SdCardPath = @"SD Card\";
|
|
//static readonly string SdLoggingFilePath = @"SD Card\Run\Log\";
|
|
|
|
//public static void SystemDataLog(int RackID, CommConfig sConfig, DeviceSystemData sData, DateTime aTime, string AppPath)
|
|
//{
|
|
// SYSTEMLOG_FILE_DIR = String.Format("{0}\\SHELF{1}\\{2}", "\\log\\systemlog", RackID, String.Format("{0:yyyyMM}", aTime));
|
|
|
|
// FileStream logFile = null;
|
|
// string path = System.IO.Path.GetDirectoryName(AppPath);
|
|
// string FileName = String.Format(path + SYSTEMLOG_FILE_DIR + "\\SHELF{0}_LOG_{1}.csv", RackID, String.Format("{0:yyMMdd}", aTime));
|
|
// byte[] logData;
|
|
|
|
// if (Directory.Exists(path + SYSTEMLOG_FILE_DIR) == false)
|
|
// Directory.CreateDirectory(path + SYSTEMLOG_FILE_DIR);
|
|
|
|
// if (File.Exists(FileName) == false)
|
|
// {
|
|
// logFile = new FileStream(FileName, FileMode.CreateNew, FileAccess.ReadWrite);
|
|
// logData = WriteDataHeader(aTime);
|
|
// logFile.Write(logData, 0, logData.Length);
|
|
// logFile.Close();
|
|
// }
|
|
|
|
// logFile = null;
|
|
// //logFile = new FileStream(FileName, FileMode.Open, FileAccess.ReadWrite);
|
|
// logFile = new FileStream(FileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
|
|
|
|
// if (logFile != null)
|
|
// {
|
|
// logFile.Seek(0, SeekOrigin.End);
|
|
// logData = WriteData(aTime, sConfig, sData);
|
|
// logFile.Write(logData, 0, logData.Length);
|
|
// logFile.Close();
|
|
// }
|
|
//}
|
|
|
|
public AlarmFile()
|
|
{
|
|
bTrayData = new DeviceDataTray[SystemID.MAX_MODULE_SIZE];
|
|
|
|
AlarmList = new TAlarmList();
|
|
AlarmList.aData = new TAlarm[1000];
|
|
|
|
AlarmList.front = 0;
|
|
AlarmList.rear = 0;
|
|
AlarmList.count = 0;
|
|
|
|
LoadAlarmData();
|
|
LoadPasswordData();
|
|
}
|
|
|
|
#region WriteDataHeader
|
|
|
|
private byte[] WriteDataHeader(DeviceDataSystem sData)
|
|
{
|
|
string tt;
|
|
string sdata;
|
|
DateTime aLog = DateTime.Now;
|
|
|
|
tt = aLog.ToString("yyyy-MM-dd HH:mm:ss");
|
|
sdata = String.Format(
|
|
"{0},{1},{2},{3},{4},{5},{6},{7},"
|
|
, "DATETIME" // 0
|
|
, "OPERATING" // 1
|
|
, "ALARM" // 2
|
|
, "SYSTEM VOLTAGE" // 3
|
|
, "SYSTEM CURRENT" // 4
|
|
, "SYSTEM SOC" // 5
|
|
, "TRIP" // 6
|
|
, "WARNING" // 7
|
|
);
|
|
|
|
for (int i = 0; i < sData.ModuleQuantity; i++)
|
|
{
|
|
sdata += String.Format("VOLTAGE_{0:00},", i + 1);
|
|
}
|
|
|
|
for (int i = 0; i < sData.ModuleQuantity; i++)
|
|
{
|
|
sdata += String.Format("CURRENT_{0:00},", i + 1);
|
|
}
|
|
|
|
for (int i = 0; i < sData.ModuleQuantity; i++)
|
|
{
|
|
sdata += String.Format("SOC_{0:00},", i + 1);
|
|
}
|
|
|
|
for (int i = 0; i < sData.ModuleQuantity; i++)
|
|
{
|
|
sdata += String.Format("MAX_TEMP_{0:00},", i + 1);
|
|
}
|
|
|
|
for (int i = 0; i < sData.ModuleQuantity; i++)
|
|
{
|
|
sdata += String.Format("MIN_TEMP_{0:00},", i + 1);
|
|
}
|
|
|
|
for (int i = 0; i < sData.ModuleQuantity; i++)
|
|
{
|
|
sdata += String.Format("MAX_CVOLT_{0:00},", i + 1);
|
|
}
|
|
|
|
for (int i = 0; i < sData.ModuleQuantity; i++)
|
|
{
|
|
sdata += String.Format("MIN_CVOLT_{0:00},", i + 1);
|
|
}
|
|
sdata += "\r\n";
|
|
|
|
Byte[] info =
|
|
new UTF8Encoding(true).GetBytes(sdata);
|
|
|
|
return info;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region WriteData
|
|
|
|
private byte[] WriteData(DeviceDataSystem sData, DeviceDataTray[] tData)
|
|
{
|
|
string tt;
|
|
string sdata;
|
|
DateTime aLog = DateTime.Now;
|
|
|
|
tt = aLog.ToString("yyyy-MM-dd HH:mm:ss");
|
|
sdata = String.Format(
|
|
"{0},{1},{2},{3},{4},{5},"
|
|
, tt // {0} DATETIME
|
|
, String.Format("{0}", StatusStr.operating[sData.OpStatus]) // {1} OPERATING
|
|
, String.Format("{0}", StatusStr.alarm[sData.AlarmStatus]) // {2} ALARM
|
|
, String.Format("{0:#0.0}", Convert.ToDouble(sData.BatVoltage) / 100) // {3} SYSTEM VOLTAGE
|
|
, String.Format("{0:#0.0}", Convert.ToDouble(sData.Current) / 10) // {4} SYSTEM CURRENT
|
|
, String.Format("{0:#0.0}", Convert.ToDouble(sData.RelativeStateOfCharge) / 10) // {5} SYSTEM SOC
|
|
);
|
|
|
|
sdata += String.Format("0x{0:X4},", sData.Protection); // Protection
|
|
sdata += String.Format("0x{0:X4},", sData.Warning); // Warning
|
|
|
|
for (int i = 0; i < sData.ModuleQuantity; i++)
|
|
{
|
|
sdata += String.Format("{0:#0.0},", Convert.ToDouble(tData[i].BatVoltage) / 100); // Module Voltage
|
|
}
|
|
|
|
for (int i = 0; i < sData.ModuleQuantity; i++)
|
|
{
|
|
sdata += String.Format("{0:#0.0},", Convert.ToDouble(tData[i].Current) / 10); // Module Current
|
|
}
|
|
|
|
for (int i = 0; i < sData.ModuleQuantity; i++)
|
|
{
|
|
sdata += String.Format("{0:#0},", Convert.ToDouble(tData[i].RelativeStateOfCharge) / 10); // Module SOC
|
|
}
|
|
|
|
for (int i = 0; i < sData.ModuleQuantity; i++)
|
|
{
|
|
sdata += String.Format("{0:#0.0},", Convert.ToDouble(tData[i].MaxTemp) / 10); // Module Max Temp
|
|
}
|
|
|
|
for (int i = 0; i < sData.ModuleQuantity; i++)
|
|
{
|
|
sdata += String.Format("{0:#0.0},", Convert.ToDouble(tData[i].MinTemp) / 10); // Module Min Temp
|
|
}
|
|
|
|
for (int i = 0; i < sData.ModuleQuantity; i++)
|
|
{
|
|
sdata += String.Format("{0:#0.000},", Convert.ToDouble(tData[i].MaxCellVoltage) / 1000); // Cell Max Volage
|
|
}
|
|
|
|
for (int i = 0; i < sData.ModuleQuantity; i++)
|
|
{
|
|
sdata += String.Format("{0:#0.000},", Convert.ToDouble(tData[i].MinCellVoltage) / 1000); // Cell Max Volage
|
|
}
|
|
sdata += "\r\n";
|
|
|
|
Byte[] info =
|
|
new UTF8Encoding(true).GetBytes(sdata);
|
|
|
|
return info;
|
|
}
|
|
#endregion
|
|
|
|
public void LoggingData(DeviceDataSystem sData, DeviceDataTray[] tData)
|
|
{
|
|
string filename;
|
|
string path;
|
|
DateTime aLog = DateTime.Now;
|
|
FileStream fStream = null;
|
|
byte[] logData;
|
|
|
|
filename = String.Format("{0}log{1}.csv", LoggingFilePath, aLog.ToString("yyyyMMdd"));
|
|
|
|
path = System.IO.Path.GetDirectoryName(filename);
|
|
|
|
//if (Directory.Exists(SdCardPath) == true)
|
|
//{
|
|
try
|
|
{
|
|
if (Directory.Exists(path) == false)
|
|
Directory.CreateDirectory(path);
|
|
|
|
if (File.Exists(filename))
|
|
{
|
|
fStream = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite);
|
|
if (fStream != null)
|
|
{
|
|
fStream.Seek(0, SeekOrigin.End);
|
|
logData = WriteData(sData, tData);
|
|
//logData = WriteData(sData, tDataA, tDataB);
|
|
|
|
fStream.Write(logData, 0, logData.Length);
|
|
fStream.Close();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
fStream = new FileStream(filename, FileMode.CreateNew, FileAccess.ReadWrite);
|
|
|
|
if (fStream != null)
|
|
{
|
|
fStream.Seek(0, SeekOrigin.End);
|
|
logData = WriteDataHeader(sData);
|
|
//logData = WriteDataHeader(sData, tDataA, tDataB);
|
|
fStream.Write(logData, 0, logData.Length);
|
|
logData = WriteData(sData, tData);
|
|
//logData = WriteData(sData, tDataA, tDataB);
|
|
fStream.Write(logData, 0, logData.Length);
|
|
fStream.Close();
|
|
}
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
}
|
|
//}
|
|
}
|
|
|
|
public void InitPasswordData()
|
|
{
|
|
string filepath = PasswordFilePath;
|
|
FileStream fStream = null;
|
|
byte[] bData;
|
|
|
|
fStream = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
|
|
|
|
if (fStream != null)
|
|
{
|
|
BMS_PASSWORD = "0000";
|
|
bData = Encoding.ASCII.GetBytes(BMS_PASSWORD);
|
|
|
|
fStream.Seek(0, SeekOrigin.Begin);
|
|
fStream.Write(bData, 0, bData.Length);
|
|
fStream.Close();
|
|
}
|
|
}
|
|
|
|
public void SaveNewPasswordData(string new_password)
|
|
{
|
|
string filepath = PasswordFilePath;
|
|
FileStream fStream = null;
|
|
byte[] bData;
|
|
|
|
fStream = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
|
|
|
|
if (fStream != null)
|
|
{
|
|
BMS_PASSWORD = new_password;
|
|
bData = Encoding.ASCII.GetBytes(BMS_PASSWORD);
|
|
|
|
fStream.Seek(0, SeekOrigin.Begin);
|
|
fStream.Write(bData, 0, bData.Length);
|
|
fStream.Close();
|
|
}
|
|
}
|
|
|
|
private void LoadPasswordData()
|
|
{
|
|
long fsize = 0;
|
|
string filepath = PasswordFilePath;
|
|
FileStream fStream = null;
|
|
byte[] bData;
|
|
|
|
if (File.Exists(filepath))
|
|
{
|
|
fStream = new FileStream(filepath, FileMode.Open, FileAccess.Read);
|
|
|
|
if (fStream != null)
|
|
{
|
|
fsize = fStream.Length;
|
|
bData = new byte[fsize];
|
|
|
|
fStream.Seek(0, SeekOrigin.Begin);
|
|
fStream.Read(bData, 0, Convert.ToInt32(fsize));
|
|
fStream.Close();
|
|
|
|
BMS_PASSWORD = Encoding.ASCII.GetString(bData, 0, Convert.ToInt32(fsize));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
fStream = new FileStream(filepath, FileMode.CreateNew, FileAccess.ReadWrite);
|
|
|
|
if (fStream != null)
|
|
{
|
|
BMS_PASSWORD = "0000";
|
|
bData = Encoding.ASCII.GetBytes(BMS_PASSWORD);
|
|
|
|
fStream.Seek(0, SeekOrigin.Begin);
|
|
fStream.Write(bData, 0, bData.Length);
|
|
fStream.Close();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void LoadAlarmData()
|
|
{
|
|
long fsize = 0;
|
|
string filepath = AlarmHistPath;
|
|
FileStream fStream = null;
|
|
byte[] bData = new byte[Marshal.SizeOf(AlarmList)];
|
|
|
|
if (File.Exists(AlarmHistPath))
|
|
{
|
|
fStream = new FileStream(filepath, FileMode.Open, FileAccess.ReadWrite);
|
|
|
|
if (fStream != null)
|
|
{
|
|
fsize = fStream.Length;
|
|
|
|
if (Marshal.SizeOf(AlarmList) != fsize)
|
|
{
|
|
fStream.Close();
|
|
fStream = null;
|
|
|
|
File.Delete(filepath);
|
|
|
|
fStream = new FileStream(filepath, FileMode.CreateNew, FileAccess.ReadWrite);
|
|
|
|
if (fStream != null)
|
|
{
|
|
fStream.SetLength(Marshal.SizeOf(AlarmList));
|
|
fStream.Seek(0, SeekOrigin.Begin);
|
|
fStream.Write(bData, 0, Marshal.SizeOf(AlarmList));
|
|
|
|
fStream.Seek(0, SeekOrigin.Begin);
|
|
fStream.Read(bData, 0, Marshal.SizeOf(AlarmList));
|
|
AlarmList = ConvertTo.ByteToStruct<TAlarmList>(bData);
|
|
fStream.Close();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
fStream.Read(bData, 0, Marshal.SizeOf(AlarmList));
|
|
fStream.Close();
|
|
|
|
AlarmList = ConvertTo.ByteToStruct<TAlarmList>(bData);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
fStream = new FileStream(filepath, FileMode.CreateNew, FileAccess.ReadWrite);
|
|
|
|
if (fStream != null)
|
|
{
|
|
fStream.SetLength(Marshal.SizeOf(AlarmList));
|
|
fStream.Seek(0, SeekOrigin.Begin);
|
|
fStream.Write(bData, 0, Marshal.SizeOf(AlarmList));
|
|
|
|
fStream.Seek(0, SeekOrigin.Begin);
|
|
fStream.Read(bData, 0, Marshal.SizeOf(AlarmList));
|
|
AlarmList = ConvertTo.ByteToStruct<TAlarmList>(bData);
|
|
fStream.Close();
|
|
}
|
|
}
|
|
Make_Run_History(EventID.EVENT_INFO, AlarmID.POWER_ON_RESET, 0, 0, 0);
|
|
}
|
|
|
|
private void SaveAlarmData()
|
|
{
|
|
long fsize = Marshal.SizeOf(AlarmList);
|
|
string filepath = AlarmHistPath;
|
|
FileStream fStream = null;
|
|
byte[] bData = new byte[fsize];
|
|
|
|
bData = ConvertTo.StructureToByte(AlarmList);
|
|
|
|
fStream = new FileStream(filepath, FileMode.Open, FileAccess.ReadWrite);
|
|
|
|
if (fStream != null)
|
|
{
|
|
fStream.Seek(0, SeekOrigin.Begin);
|
|
fStream.Write(bData, 0, Convert.ToInt32(fsize));
|
|
fStream.Close();
|
|
}
|
|
}
|
|
|
|
public void DeleteAlarmData()
|
|
{
|
|
long fsize = Marshal.SizeOf(AlarmList);
|
|
string filepath = AlarmHistPath;
|
|
FileStream fStream = null;
|
|
byte[] bData = new byte[fsize];
|
|
|
|
System.Array.Clear(bData, 0, Convert.ToInt32(fsize));
|
|
|
|
fStream = new FileStream(filepath, FileMode.Open, FileAccess.ReadWrite);
|
|
|
|
if (fStream != null)
|
|
{
|
|
fStream.Seek(0, SeekOrigin.Begin);
|
|
fStream.Write(bData, 0, Convert.ToInt32(fsize));
|
|
fStream.Close();
|
|
|
|
AlarmList = ConvertTo.ByteToStruct<TAlarmList>(bData);
|
|
}
|
|
|
|
Make_Run_History(EventID.EVENT_INFO, AlarmID.HIST_DELETE, 0, 0, 0); // History Delete
|
|
}
|
|
|
|
public long GetFileSize(string FilePath)
|
|
{
|
|
long fsize = 0;
|
|
FileStream fStream = null;
|
|
|
|
if (File.Exists(FilePath))
|
|
{
|
|
// Found
|
|
fStream = new FileStream(FilePath, FileMode.Open, FileAccess.ReadWrite);
|
|
|
|
fsize = fStream.Length;
|
|
|
|
fStream.Close();
|
|
}
|
|
else
|
|
{
|
|
// No File
|
|
fStream = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
|
|
|
|
fsize = fStream.Length;
|
|
|
|
fStream.Close();
|
|
}
|
|
|
|
return fsize;
|
|
}
|
|
|
|
public void CreateDatabase()
|
|
{
|
|
if (File.Exists(AlarmFilePath))
|
|
File.Delete(AlarmFilePath);
|
|
|
|
string connstr = @String.Format("Data Source = '{0}'; LCID=1033; Password='1111'; Encrypt = TRUE;", AlarmFilePath);
|
|
|
|
SqlCeEngine engine = new SqlCeEngine(connstr);
|
|
engine.CreateDatabase();
|
|
engine.Dispose();
|
|
|
|
SqlCeConnection conn = null;
|
|
|
|
|
|
try
|
|
{
|
|
conn = new SqlCeConnection(connstr);
|
|
conn.Open();
|
|
|
|
SqlCeCommand cmd = conn.CreateCommand();
|
|
cmd.CommandText = "CREATE TABLE AlarmList(col1 int, con2 ntext)";
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
finally
|
|
{
|
|
conn.Close();
|
|
}
|
|
}
|
|
|
|
public bool TableExists(SqlCeConnection connection, string tableName)
|
|
{
|
|
using (var command = new SqlCeCommand())
|
|
{
|
|
command.Connection = connection;
|
|
var sql = String.Format("SELECT COUNT(*) FROM information_schema.tables WHERE table_name = '{0}'", tableName);
|
|
command.CommandText = sql;
|
|
var count = Convert.ToInt32(command.ExecuteScalar());
|
|
|
|
return (count > 0);
|
|
}
|
|
}
|
|
|
|
public int GetAlarmCount()
|
|
{
|
|
return AlarmList.count;
|
|
}
|
|
|
|
public TAlarmList GetAlarmList()
|
|
{
|
|
return AlarmList;
|
|
}
|
|
|
|
public void Save_History(TAlarm hdata)
|
|
{
|
|
int nFront = AlarmList.front;
|
|
int nRear = AlarmList.rear;
|
|
int nCount = AlarmList.count;
|
|
|
|
Save_HistoryCsv(hdata); // History Save - CSV type
|
|
|
|
AlarmList.aData[nFront] = hdata;
|
|
|
|
nCount++;
|
|
|
|
nFront++;
|
|
nFront %= AlarmID.MAX_ALARM_COUNT;
|
|
|
|
if (nFront == nRear)
|
|
{
|
|
nRear++;
|
|
nRear %= AlarmID.MAX_ALARM_COUNT;
|
|
|
|
nCount = AlarmID.MAX_ALARM_COUNT;
|
|
}
|
|
if (nCount > AlarmID.MAX_ALARM_COUNT)
|
|
nCount = AlarmID.MAX_ALARM_COUNT;
|
|
|
|
AlarmList.front = nFront;
|
|
AlarmList.rear = nRear;
|
|
AlarmList.count = nCount;
|
|
|
|
SaveAlarmData();
|
|
}
|
|
|
|
public byte[] MakeHistoryCsvHeader()
|
|
{
|
|
string str = "";
|
|
byte[] result;
|
|
|
|
str += String.Format("DateTime,");
|
|
str += String.Format("Event,");
|
|
str += String.Format("Alarm Name,");
|
|
str += String.Format("Position,");
|
|
str += String.Format("Parameter,");
|
|
str += "\r\n";
|
|
|
|
result = new UTF8Encoding(true).GetBytes(str);
|
|
|
|
return result;
|
|
}
|
|
|
|
public void Save_HistoryCsv(TAlarm hdata)
|
|
{
|
|
string wStr = "";
|
|
|
|
wStr = String.Format("{0:yyyy-MM-dd HH:mm:ss},", hdata.aTime); // DateTime - nHist.aTime.ToString("yyyy-MM-dd HH:mm:ss");
|
|
wStr += String.Format("{0},", EventID.event_name[hdata.aFlag]); // Event type - EventID.event_name[nHist.aFlag];
|
|
wStr += String.Format("{0},", AlarmID.name[hdata.aNameNo]); // Alarm name - hAlarmName[hNo].Text = AlarmID.name[nHist.aNameNo];
|
|
//wStr += String.Format("{0}-{1},", PosID.pos[hdata.aPos], hdata.ctno); // Alarm position
|
|
|
|
switch (hdata.aNameNo)
|
|
{
|
|
case AlarmID.COV_PROTECTION:
|
|
case AlarmID.COV_WARNING:
|
|
case AlarmID.CUV_PROTECTION:
|
|
case AlarmID.CUV_WARNING:
|
|
wStr += String.Format("'{0}-{1},", PosID.pos[hdata.aPos], hdata.ctno);
|
|
wStr += String.Format("{0:#0.000},", Convert.ToDouble(hdata.aParam) / 1000);
|
|
break;
|
|
case AlarmID.OTC_PROTECTION:
|
|
case AlarmID.OTC_WARNING:
|
|
case AlarmID.OTD_PROTECTION:
|
|
case AlarmID.OTD_WARNING:
|
|
wStr += String.Format("'{0}-{1},", PosID.pos[hdata.aPos], hdata.ctno);
|
|
wStr += String.Format("{0:#0.0},", Convert.ToDouble(hdata.aParam) / 10);
|
|
break;
|
|
case AlarmID.SOV_PROTECTION:
|
|
case AlarmID.SOV_WARNING:
|
|
case AlarmID.SUV_PROTECTION:
|
|
case AlarmID.SUV_WARNING:
|
|
wStr += String.Format("'{0},", PosID.pos[hdata.aPos]);
|
|
wStr += String.Format("{0:#0.0},", Convert.ToDouble(hdata.aParam) / 100);
|
|
break;
|
|
case AlarmID.OCC_PROTECTION:
|
|
case AlarmID.OCC_WARNING:
|
|
case AlarmID.OCD_PROTECTION:
|
|
case AlarmID.OCD_WARNING:
|
|
wStr += String.Format("'{0},", PosID.pos[hdata.aPos]);
|
|
wStr += String.Format("{0:#0.0},", Convert.ToDouble(hdata.aParam) / 10);
|
|
break;
|
|
default:
|
|
wStr += String.Format("'{0},", PosID.pos[hdata.aPos]);
|
|
wStr += String.Format(",");
|
|
break;
|
|
}
|
|
wStr += "\r\n";
|
|
|
|
byte[] bAlm = new UTF8Encoding(true).GetBytes(wStr);
|
|
|
|
string filename = String.Format("{0}Alm_{1}.csv", AlarmHistCsvPath, DateTime.Now.ToString("yyyyMMdd"));
|
|
string path = System.IO.Path.GetDirectoryName(filename);
|
|
|
|
try
|
|
{
|
|
if (Directory.Exists(path) == false)
|
|
Directory.CreateDirectory(path);
|
|
|
|
if (File.Exists(filename))
|
|
{
|
|
FileStream fStream = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite);
|
|
if (fStream != null)
|
|
{
|
|
fStream.Seek(0, SeekOrigin.End);
|
|
fStream.Write(bAlm, 0, bAlm.Length);
|
|
fStream.Close();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
FileStream fStream = new FileStream(filename, FileMode.CreateNew, FileAccess.ReadWrite);
|
|
|
|
if (fStream != null)
|
|
{
|
|
fStream.Seek(0, SeekOrigin.End);
|
|
|
|
byte[] hdr = MakeHistoryCsvHeader();
|
|
fStream.Write(hdr, 0, hdr.Length);
|
|
fStream.Write(bAlm, 0, bAlm.Length);
|
|
|
|
fStream.Close();
|
|
}
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
}
|
|
}
|
|
|
|
public void Make_Run_History(int status // Alarm Status (0 = Normal, 1 = Alarm)
|
|
, int name_id // Alarm Name
|
|
, int pos // Tray Number
|
|
, int cno // Temp Number or Cell Number
|
|
, int param // Alarm Value
|
|
)
|
|
{
|
|
TAlarm his;
|
|
|
|
his.aFlag = Convert.ToByte(status);
|
|
his.aTime = DateTime.Now;
|
|
his.aNameNo = Convert.ToByte(name_id);
|
|
his.aPos = Convert.ToByte(pos);
|
|
his.ctno = Convert.ToByte(cno);
|
|
his.aParam = param;
|
|
|
|
Save_History(his);
|
|
}
|
|
|
|
#region Check Main Alarm History
|
|
public void CheckAlarmHistory(DeviceDataSystem nSys)
|
|
{
|
|
// BMCU Communication Fail Alarm
|
|
if (bMainData.MainCommState != nSys.MainCommState)
|
|
{
|
|
if (nSys.MainCommState != 0)
|
|
// Alarm
|
|
Make_Run_History(EventID.EVENT_WARNING, AlarmID.BMS_COMM_FAIL, 0, 0, 0);
|
|
else
|
|
// Recovery
|
|
Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.BMS_COMM_FAIL, 0, 0, 0);
|
|
|
|
bMainData.MainCommState = nSys.MainCommState;
|
|
}
|
|
|
|
//if (ConvertTo.GetBit(bMainData.TrayCommState, 0) != ConvertTo.GetBit(nSys.TrayCommState, 0))
|
|
//{
|
|
// if (ConvertTo.GetBit(nSys.TrayCommState, 0))
|
|
// // Alarm
|
|
// Make_Run_History(EventID.EVENT_WARNING, AlarmID.BMU_COMM_FAIL, 1, 0, 0);
|
|
// else
|
|
// // Recovery
|
|
// Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.BMU_COMM_FAIL, 1, 0, 0);
|
|
|
|
//}
|
|
//if (ConvertTo.GetBit(bMainData.TrayCommState, 1) != ConvertTo.GetBit(nSys.TrayCommState, 1))
|
|
//{
|
|
// if (ConvertTo.GetBit(nSys.TrayCommState, 1))
|
|
// // Alarm
|
|
// Make_Run_History(EventID.EVENT_WARNING, AlarmID.BMU_COMM_FAIL, 2, 0, 0);
|
|
// else
|
|
// // Recovery
|
|
// Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.BMU_COMM_FAIL, 2, 0, 0);
|
|
|
|
//}
|
|
//if (ConvertTo.GetBit(bMainData.TrayCommState, 2) != ConvertTo.GetBit(nSys.TrayCommState, 2))
|
|
//{
|
|
// if (ConvertTo.GetBit(nSys.TrayCommState, 2))
|
|
// // Alarm
|
|
// Make_Run_History(EventID.EVENT_WARNING, AlarmID.BMU_COMM_FAIL, 3, 0, 0);
|
|
// else
|
|
// // Recovery
|
|
// Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.BMU_COMM_FAIL, 3, 0, 0);
|
|
|
|
//}
|
|
bMainData.TrayCommState = nSys.TrayCommState;
|
|
|
|
CheckStatusHistory(nSys);
|
|
}
|
|
#endregion
|
|
|
|
#region Check Status History
|
|
public void CheckStatusHistory(DeviceDataSystem nSys)
|
|
{
|
|
if (bMainData.OpStatus != nSys.OpStatus)
|
|
{
|
|
switch (nSys.OpStatus)
|
|
{
|
|
case 0: Make_Run_History(EventID.EVENT_INFO, AlarmID.STS_STAND_BY, 0, 0, 0); break; // Status Stand by
|
|
case 1: Make_Run_History(EventID.EVENT_INFO, AlarmID.STS_CHARGING, 0, 0, 0); break; // Status Charging
|
|
case 2: Make_Run_History(EventID.EVENT_INFO, AlarmID.STS_DISCHARGING, 0, 0, 0); break; // Status Stand by
|
|
case 3: Make_Run_History(EventID.EVENT_INFO, AlarmID.STS_FLOATING, 0, 0, 0); break; // Status Stand by
|
|
}
|
|
bMainData.OpStatus = nSys.OpStatus;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
public void CheckAlarmHistory(DeviceDataTray nTray, int tno)
|
|
{
|
|
CheckAlarmWarningHistory(nTray, tno);
|
|
CheckAlarmProtectionHistory(nTray, tno);
|
|
}
|
|
|
|
#region Check Alarm Warning History
|
|
public void CheckAlarmWarningHistory(DeviceDataTray nTray, int tno)
|
|
{
|
|
int bit_no;
|
|
|
|
// Module Commfail Alarm
|
|
if (ConvertTo.GetBit(bTrayData[tno].Commfail, 0) != ConvertTo.GetBit(nTray.Commfail, 0))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Commfail, 0))
|
|
// Warning Alarm
|
|
Make_Run_History(EventID.EVENT_WARNING, AlarmID.BMU_COMM_FAIL, tno + 1, 0, 0);
|
|
else
|
|
// Warning Recovery
|
|
Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.BMU_COMM_FAIL, tno + 1, 0, 0);
|
|
|
|
bTrayData[tno].Commfail = nTray.Commfail;
|
|
}
|
|
|
|
// System Over Voltage Warning Check
|
|
if (ConvertTo.GetBit(bTrayData[tno].Warning, 0) != ConvertTo.GetBit(nTray.Warning, 0))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Warning, 0))
|
|
// Warning Alarm
|
|
Make_Run_History(EventID.EVENT_WARNING, AlarmID.SOV_WARNING, tno + 1, 0, nTray.BatVoltage);
|
|
else
|
|
// Warning Recovery
|
|
Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.SOV_WARNING, tno + 1, 0, nTray.BatVoltage);
|
|
}
|
|
// Cell Over Voltage Warning Check
|
|
if (ConvertTo.GetBit(bTrayData[tno].Warning, 1) != ConvertTo.GetBit(nTray.Warning, 1))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Warning, 1))
|
|
// Warning Alarm
|
|
Make_Run_History(EventID.EVENT_WARNING, AlarmID.COV_WARNING, tno + 1, nTray.MaxCellNo, nTray.MaxCellVoltage);
|
|
else
|
|
// Warning Recovery
|
|
Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.COV_WARNING, tno + 1, nTray.MaxCellNo, nTray.MaxCellVoltage);
|
|
}
|
|
// System Under Voltage Warning Check
|
|
bit_no = 2;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Warning, bit_no) != ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
// Warning Alarm
|
|
Make_Run_History(EventID.EVENT_WARNING, AlarmID.SUV_WARNING, tno + 1, 0, nTray.BatVoltage);
|
|
else
|
|
// Warning Recovery
|
|
Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.SUV_WARNING, tno + 1, 0, nTray.BatVoltage);
|
|
}
|
|
// Cell Under Voltage Warning Check
|
|
bit_no = 3;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Warning, bit_no) != ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
// Warning Alarm
|
|
Make_Run_History(EventID.EVENT_WARNING, AlarmID.CUV_WARNING, tno + 1, nTray.MinCellNo, nTray.MinCellVoltage);
|
|
else
|
|
// Warning Recovery
|
|
Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.CUV_WARNING, tno + 1, nTray.MinCellNo, nTray.MinCellVoltage);
|
|
}
|
|
// Charge Over Current Warning Check
|
|
bit_no = 4;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Warning, bit_no) != ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
// Warning Alarm
|
|
Make_Run_History(EventID.EVENT_WARNING, AlarmID.OCC_WARNING, tno + 1, 0, nTray.Current);
|
|
else
|
|
// Warning Recovery
|
|
Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.OCC_WARNING, tno + 1, 0, nTray.Current);
|
|
}
|
|
// Discharge Over Current Warning Check
|
|
bit_no = 5;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Warning, bit_no) != ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
// Warning Alarm
|
|
Make_Run_History(EventID.EVENT_WARNING, AlarmID.OCD_WARNING, tno + 1, 0, nTray.Current);
|
|
else
|
|
// Warning Recovery
|
|
Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.OCD_WARNING, tno + 1, 0, nTray.Current);
|
|
}
|
|
// Charge Over Temperature Warning Check
|
|
bit_no = 8;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Warning, bit_no) != ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
// Warning Alarm
|
|
Make_Run_History(EventID.EVENT_WARNING, AlarmID.OTC_WARNING, tno + 1, nTray.MaxTempNo, nTray.MaxTemp);
|
|
else
|
|
// Warning Recovery
|
|
Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.OTC_WARNING, tno + 1, nTray.MaxTempNo, nTray.MaxTemp);
|
|
}
|
|
// Discharge Over Temperature Warning Check
|
|
bit_no = 9;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Warning, bit_no) != ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
// Warning Alarm
|
|
Make_Run_History(EventID.EVENT_WARNING, AlarmID.OTD_WARNING, tno + 1, nTray.MaxTempNo, nTray.MaxTemp);
|
|
else
|
|
// Warning Recovery
|
|
Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.OTD_WARNING, tno + 1, nTray.MaxTempNo, nTray.MaxTemp);
|
|
}
|
|
// Charge Low Temperature Warning Check
|
|
bit_no = 10;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Warning, bit_no) != ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
// Warning Alarm
|
|
Make_Run_History(EventID.EVENT_WARNING, AlarmID.LTC_WARNING, tno + 1, nTray.MinTempNo, nTray.MinTemp);
|
|
else
|
|
// Warning Recovery
|
|
Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.LTC_WARNING, tno + 1, nTray.MinTempNo, nTray.MinTemp);
|
|
}
|
|
// Discharge Low Temperature Warning Check
|
|
bit_no = 11;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Warning, bit_no) != ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
// Warning Alarm
|
|
Make_Run_History(EventID.EVENT_WARNING, AlarmID.LTD_WARNING, tno + 1, nTray.MinTempNo, nTray.MinTemp);
|
|
else
|
|
// Warning Recovery
|
|
Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.LTD_WARNING, tno + 1, nTray.MinTempNo, nTray.MinTemp);
|
|
}
|
|
// SOC Low Warning Check
|
|
bit_no = 12;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Warning, bit_no) != ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Warning, bit_no))
|
|
// Warning Alarm
|
|
Make_Run_History(EventID.EVENT_WARNING, AlarmID.SOC_WARNING, tno + 1, 0, nTray.RelativeStateOfCharge);
|
|
else
|
|
// Warning Recovery
|
|
Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.SOC_WARNING, tno + 1, 0, nTray.RelativeStateOfCharge);
|
|
}
|
|
bTrayData[tno].Warning = nTray.Warning;
|
|
}
|
|
#endregion
|
|
|
|
#region Check Alarm Protection History
|
|
public void CheckAlarmProtectionHistory(DeviceDataTray nTray, int tno)
|
|
{
|
|
int bit_no;
|
|
|
|
// System Over Voltage Protection Check
|
|
if (ConvertTo.GetBit(bTrayData[tno].Protection, 0) != ConvertTo.GetBit(nTray.Protection, 0))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Protection, 0))
|
|
// Warning Alarm
|
|
Make_Run_History(EventID.EVENT_PROTECTION, AlarmID.SOV_PROTECTION, tno + 1, 0, nTray.BatVoltage);
|
|
//else
|
|
// // Warning Recovery
|
|
// Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.SOV_PROTECTION, tno + 1, 0, nTray.BatVoltage);
|
|
}
|
|
// Cell Over Voltage Warning Check
|
|
if (ConvertTo.GetBit(bTrayData[tno].Protection, 1) != ConvertTo.GetBit(nTray.Protection, 1))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Protection, 1))
|
|
// Protection Alarm
|
|
Make_Run_History(EventID.EVENT_PROTECTION, AlarmID.COV_WARNING, tno + 1, nTray.MaxCellNo, nTray.MaxCellVoltage);
|
|
//else
|
|
// // Protection Recovery
|
|
// Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.COV_WARNING, tno + 1, nTray.MaxCellNo, nTray.MaxCellVoltage);
|
|
}
|
|
// System Under Voltage Protection Check
|
|
bit_no = 2;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Protection, bit_no) != ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
// Protection Alarm
|
|
Make_Run_History(EventID.EVENT_PROTECTION, AlarmID.SUV_WARNING, tno + 1, 0, nTray.BatVoltage);
|
|
//else
|
|
// // Protection Recovery
|
|
// Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.SUV_WARNING, tno + 1, 0, nTray.BatVoltage);
|
|
}
|
|
// Cell Under Voltage Protection Check
|
|
bit_no = 3;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Protection, bit_no) != ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
// Protection Alarm
|
|
Make_Run_History(EventID.EVENT_PROTECTION, AlarmID.CUV_WARNING, tno + 1, nTray.MinCellNo, nTray.MinCellVoltage);
|
|
//else
|
|
// // Protection Recovery
|
|
// Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.CUV_WARNING, tno + 1, nTray.MinCellNo, nTray.MinCellVoltage);
|
|
}
|
|
// Charge Over Current Protection Check
|
|
bit_no = 4;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Protection, bit_no) != ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
// Protection Alarm
|
|
Make_Run_History(EventID.EVENT_PROTECTION, AlarmID.OCC_WARNING, tno + 1, 0, nTray.Current);
|
|
//else
|
|
// // Protection Recovery
|
|
// Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.OCC_WARNING, tno + 1, 0, nTray.Current);
|
|
}
|
|
// Discharge Over Current Protection Check
|
|
bit_no = 5;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Protection, bit_no) != ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
// Protection Alarm
|
|
Make_Run_History(EventID.EVENT_PROTECTION, AlarmID.OCD_WARNING, tno + 1, 0, nTray.Current);
|
|
//else
|
|
// // Protection Recovery
|
|
// Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.OCD_WARNING, tno + 1, 0, bTrayData[tno].Current);
|
|
}
|
|
// Charge Over Temperature Protection Check
|
|
bit_no = 8;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Protection, bit_no) != ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
// Protection Alarm
|
|
Make_Run_History(EventID.EVENT_PROTECTION, AlarmID.OTC_WARNING, tno + 1, nTray.MaxTempNo, nTray.MaxTemp);
|
|
//else
|
|
// // Protection Recovery
|
|
// Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.OTC_WARNING, tno + 1, nTray.MaxTempNo, nTray.MaxTemp);
|
|
}
|
|
// Discharge Over Temperature Protection Check
|
|
bit_no = 9;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Protection, bit_no) != ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
// Protection Alarm
|
|
Make_Run_History(EventID.EVENT_PROTECTION, AlarmID.OTD_WARNING, tno + 1, nTray.MaxTempNo, nTray.MaxTemp);
|
|
//else
|
|
// // Protection Recovery
|
|
// Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.OTD_WARNING, tno + 1, nTray.MaxTempNo, nTray.MaxTemp);
|
|
}
|
|
// Charge Low Temperature Protection Check
|
|
bit_no = 10;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Protection, bit_no) != ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
// Protection Alarm
|
|
Make_Run_History(EventID.EVENT_PROTECTION, AlarmID.LTC_WARNING, tno + 1, nTray.MinTempNo, nTray.MinTemp);
|
|
//else
|
|
// // Protection Recovery
|
|
// Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.LTC_WARNING, tno + 1, nTray.MinTempNo, nTray.MinTemp);
|
|
}
|
|
// Discharge Low Temperature Protection Check
|
|
bit_no = 11;
|
|
if (ConvertTo.GetBit(bTrayData[tno].Protection, bit_no) != ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
{
|
|
if (ConvertTo.GetBit(nTray.Protection, bit_no))
|
|
// Protection Alarm
|
|
Make_Run_History(EventID.EVENT_PROTECTION, AlarmID.LTD_WARNING, tno + 1, nTray.MinTempNo, nTray.MinTemp);
|
|
//else
|
|
// // Protection Recovery
|
|
// Make_Run_History(EventID.EVENT_RECOVERY, AlarmID.LTD_WARNING, tno + 1, nTray.MinTempNo, nTray.MinTemp);
|
|
}
|
|
bTrayData[tno].Protection = nTray.Protection;
|
|
}
|
|
#endregion
|
|
}
|
|
}
|