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) { StringBuilder sb = new StringBuilder(); sb.Append("DATETIME,OPERATING,ALARM,SYSTEM VOLTAGE,SYSTEM CURRENT,SYSTEM SOC,TRIP,WARNING,"); for (int i = 0; i < sData.ModuleQuantity; i++) { sb.AppendFormat("VOLTAGE_{0:00},", i + 1); } for (int i = 0; i < sData.ModuleQuantity; i++) { sb.AppendFormat("CURRENT_{0:00},", i + 1); } for (int i = 0; i < sData.ModuleQuantity; i++) { sb.AppendFormat("SOC_{0:00},", i + 1); } for (int i = 0; i < sData.ModuleQuantity; i++) { sb.AppendFormat("MAX_TEMP_{0:00},", i + 1); } for (int i = 0; i < sData.ModuleQuantity; i++) { sb.AppendFormat("MIN_TEMP_{0:00},", i + 1); } for (int i = 0; i < sData.ModuleQuantity; i++) { sb.AppendFormat("MAX_CVOLT_{0:00},", i + 1); } for (int i = 0; i < sData.ModuleQuantity; i++) { sb.AppendFormat("MIN_CVOLT_{0:00},", i + 1); } sb.Append("\r\n"); return new UTF8Encoding(true).GetBytes(sb.ToString()); } #endregion #region WriteData private byte[] WriteData(DeviceDataSystem sData, DeviceDataTray[] tData) { StringBuilder sb = new StringBuilder(); DateTime aLog = DateTime.Now; sb.AppendFormat("{0:yyyy-MM-dd HH:mm:ss},{1},{2},{3:#0.0},{4:#0.0},{5:#0.0}," , aLog , StatusStr.operating[sData.OpStatus] , StatusStr.alarm[sData.AlarmStatus] , Convert.ToDouble(sData.BatVoltage) / 100 , Convert.ToDouble(sData.Current) / 10 , Convert.ToDouble(sData.RelativeStateOfCharge) / 10 ); sb.AppendFormat("0x{0:X4},", sData.Protection); sb.AppendFormat("0x{0:X4},", sData.Warning); for (int i = 0; i < sData.ModuleQuantity; i++) { sb.AppendFormat("{0:#0.0},", Convert.ToDouble(tData[i].BatVoltage) / 100); } for (int i = 0; i < sData.ModuleQuantity; i++) { sb.AppendFormat("{0:#0.0},", Convert.ToDouble(tData[i].Current) / 10); } for (int i = 0; i < sData.ModuleQuantity; i++) { sb.AppendFormat("{0:#0},", Convert.ToDouble(tData[i].RelativeStateOfCharge) / 10); } for (int i = 0; i < sData.ModuleQuantity; i++) { sb.AppendFormat("{0:#0.0},", Convert.ToDouble(tData[i].MaxTemp) / 10); } for (int i = 0; i < sData.ModuleQuantity; i++) { sb.AppendFormat("{0:#0.0},", Convert.ToDouble(tData[i].MinTemp) / 10); } for (int i = 0; i < sData.ModuleQuantity; i++) { sb.AppendFormat("{0:#0.000},", Convert.ToDouble(tData[i].MaxCellVoltage) / 1000); } for (int i = 0; i < sData.ModuleQuantity; i++) { sb.AppendFormat("{0:#0.000},", Convert.ToDouble(tData[i].MinCellVoltage) / 1000); } sb.Append("\r\n"); return new UTF8Encoding(true).GetBytes(sb.ToString()); } #endregion public void LoggingData(DeviceDataSystem sData, DeviceDataTray[] tData) { DateTime aLog = DateTime.Now; string filename = String.Format("{0}log{1}.csv", LoggingFilePath, aLog.ToString("yyyyMMdd")); string path = System.IO.Path.GetDirectoryName(filename); try { if (Directory.Exists(path) == false) Directory.CreateDirectory(path); bool fileExists = File.Exists(filename); FileMode mode = fileExists ? FileMode.Open : FileMode.CreateNew; using (FileStream fStream = new FileStream(filename, mode, FileAccess.ReadWrite)) { fStream.Seek(0, SeekOrigin.End); if (!fileExists) { byte[] logHeader = WriteDataHeader(sData); fStream.Write(logHeader, 0, logHeader.Length); } byte[] logData = WriteData(sData, tData); fStream.Write(logData, 0, logData.Length); } } catch (Exception) { } } public void InitPasswordData() { string filepath = PasswordFilePath; using (FileStream fStream = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { BMS_PASSWORD = "0000"; byte[] bData = Encoding.ASCII.GetBytes(BMS_PASSWORD); fStream.Seek(0, SeekOrigin.Begin); fStream.Write(bData, 0, bData.Length); } } public void SaveNewPasswordData(string new_password) { string filepath = PasswordFilePath; using (FileStream fStream = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { BMS_PASSWORD = new_password; byte[] bData = Encoding.ASCII.GetBytes(BMS_PASSWORD); fStream.Seek(0, SeekOrigin.Begin); fStream.Write(bData, 0, bData.Length); } } private void LoadPasswordData() { string filepath = PasswordFilePath; if (File.Exists(filepath)) { using (FileStream fStream = new FileStream(filepath, FileMode.Open, FileAccess.Read)) { long fsize = fStream.Length; byte[] bData = new byte[fsize]; fStream.Seek(0, SeekOrigin.Begin); fStream.Read(bData, 0, Convert.ToInt32(fsize)); BMS_PASSWORD = Encoding.ASCII.GetString(bData, 0, Convert.ToInt32(fsize)); } } else { using (FileStream fStream = new FileStream(filepath, FileMode.CreateNew, FileAccess.ReadWrite)) { BMS_PASSWORD = "0000"; byte[] bData = Encoding.ASCII.GetBytes(BMS_PASSWORD); fStream.Seek(0, SeekOrigin.Begin); fStream.Write(bData, 0, bData.Length); } } } private void LoadAlarmData() { string filepath = AlarmHistPath; byte[] bData = new byte[Marshal.SizeOf(AlarmList)]; if (File.Exists(AlarmHistPath)) { using (FileStream fStream = new FileStream(filepath, FileMode.Open, FileAccess.ReadWrite)) { long fsize = fStream.Length; if (Marshal.SizeOf(AlarmList) != fsize) { fStream.Close(); File.Delete(filepath); using (FileStream newStream = new FileStream(filepath, FileMode.CreateNew, FileAccess.ReadWrite)) { newStream.SetLength(Marshal.SizeOf(AlarmList)); newStream.Seek(0, SeekOrigin.Begin); newStream.Write(bData, 0, Marshal.SizeOf(AlarmList)); newStream.Seek(0, SeekOrigin.Begin); newStream.Read(bData, 0, Marshal.SizeOf(AlarmList)); AlarmList = ConvertTo.ByteToStruct(bData); } } else { fStream.Read(bData, 0, Marshal.SizeOf(AlarmList)); AlarmList = ConvertTo.ByteToStruct(bData); } } } else { using (FileStream fStream = new FileStream(filepath, FileMode.CreateNew, FileAccess.ReadWrite)) { 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(bData); } } Make_Run_History(EventID.EVENT_INFO, AlarmID.POWER_ON_RESET, 0, 0, 0); } private void SaveAlarmData() { long fsize = Marshal.SizeOf(AlarmList); string filepath = AlarmHistPath; byte[] bData = ConvertTo.StructureToByte(AlarmList); using (FileStream fStream = new FileStream(filepath, FileMode.Open, FileAccess.ReadWrite)) { fStream.Seek(0, SeekOrigin.Begin); fStream.Write(bData, 0, Convert.ToInt32(fsize)); } } public void DeleteAlarmData() { long fsize = Marshal.SizeOf(AlarmList); string filepath = AlarmHistPath; byte[] bData = new byte[fsize]; System.Array.Clear(bData, 0, Convert.ToInt32(fsize)); using (FileStream fStream = new FileStream(filepath, FileMode.Open, FileAccess.ReadWrite)) { fStream.Seek(0, SeekOrigin.Begin); fStream.Write(bData, 0, Convert.ToInt32(fsize)); AlarmList = ConvertTo.ByteToStruct(bData); } Make_Run_History(EventID.EVENT_INFO, AlarmID.HIST_DELETE, 0, 0, 0); // History Delete } public long GetFileSize(string FilePath) { long fsize = 0; if (File.Exists(FilePath)) { using (FileStream fStream = new FileStream(FilePath, FileMode.Open, FileAccess.ReadWrite)) { fsize = fStream.Length; } } else { using (FileStream fStream = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { fsize = fStream.Length; } } 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() { StringBuilder sb = new StringBuilder(); sb.Append("DateTime,Event,Alarm Name,Position,Parameter,\r\n"); return new UTF8Encoding(true).GetBytes(sb.ToString()); } public void Save_HistoryCsv(TAlarm hdata) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("{0:yyyy-MM-dd HH:mm:ss},", hdata.aTime); sb.AppendFormat("{0},", EventID.event_name[hdata.aFlag]); sb.AppendFormat("{0},", AlarmID.name[hdata.aNameNo]); switch (hdata.aNameNo) { case AlarmID.COV_PROTECTION: case AlarmID.COV_WARNING: case AlarmID.CUV_PROTECTION: case AlarmID.CUV_WARNING: sb.AppendFormat("'{0}-{1},", PosID.pos[hdata.aPos], hdata.ctno); sb.AppendFormat("{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: sb.AppendFormat("'{0}-{1},", PosID.pos[hdata.aPos], hdata.ctno); sb.AppendFormat("{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: sb.AppendFormat("'{0},", PosID.pos[hdata.aPos]); sb.AppendFormat("{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: sb.AppendFormat("'{0},", PosID.pos[hdata.aPos]); sb.AppendFormat("{0:#0.0},", Convert.ToDouble(hdata.aParam) / 10); break; default: sb.AppendFormat("'{0},", PosID.pos[hdata.aPos]); sb.Append(","); break; } sb.Append("\r\n"); byte[] bAlm = new UTF8Encoding(true).GetBytes(sb.ToString()); 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); bool fileExists = File.Exists(filename); FileMode mode = fileExists ? FileMode.Open : FileMode.CreateNew; using (FileStream fStream = new FileStream(filename, mode, FileAccess.ReadWrite)) { fStream.Seek(0, SeekOrigin.End); if (!fileExists) { byte[] hdr = MakeHistoryCsvHeader(); fStream.Write(hdr, 0, hdr.Length); } fStream.Write(bAlm, 0, bAlm.Length); } } 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 } }