Files
DT_BR_GUI/LFP_Manager/Function/csMakeDataFunction.cs
2025-12-17 12:40:51 +09:00

309 lines
20 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using LFP_Manager.DataStructure;
using LFP_Manager.Utils;
namespace LFP_Manager.Function
{
class csMakeDataFunction
{
private static DeviceSystemData MakeAlarmTripData(int id, short ndata, DeviceSystemData rSystemData)
{
bool[] aData = csUtils.Int16ToBitArray(ndata);
short bFault = rSystemData.StatusData.protection;
short bWarning = rSystemData.StatusData.warning;
int i = 0;
switch (id)
{
case 0: // Warning
if (aData[i++]) bWarning |= (1 << 2); // Bit 0 : Over voltage warning
else bWarning &= ~(1 << 2);
if (aData[i++]) bWarning |= (1 << 4); // Bit 1 : Cell Over voltage warning
else bWarning &= ~(1 << 4);
if (aData[i++]) bWarning |= (1 << 3); // Bit 2 : Low voltage warning
else bWarning &= ~(1 << 3);
if (aData[i++]) bWarning |= (1 << 5); // Bit 3 : Low cell voltage warning
else bWarning &= ~(1 << 5);
if (aData[i++]) bWarning |= (1 << 6); // Bit 4 : Charge over current warning
else bWarning &= ~(1 << 6);
if (aData[i++]) bWarning |= (1 << 7); // Bit 5 : Discharge over current warning
else bWarning &= ~(1 << 7);
i++; // 06 Abnormal balancing current
i++; // 07 Reserved
if ((aData[8]) || (aData[9])) bWarning |= (1 << 0); // Bit 8 : Charge over temperature warning, Bit 9 : Discharge over temperature warning
else bWarning &= ~(1 << 0);
i++; // 08
i++; // 09
if ((aData[10]) || (aData[11])) bWarning |= (1 << 1); // Bit 10 : Charge low temperature warning, Bit 11 : Discharge low temperature warning
else bWarning &= ~(1 << 1);
i++; // 10
i++; // 11
if (aData[i++]) bWarning |= (1 << 11); // 12 : Low capacity warning
else bWarning &= ~(1 << 11);
i++; // 13
if (aData[i++]) bWarning |= (1 << 9); // 14 Cell Voltage Difference Warning
else bWarning &= ~(1 << 9);
break;
case 1: // Status Code 2
if (aData[i++]) bFault |= (1 << 2); // Bit 0 : Over voltage warning
else bFault &= ~(1 << 2);
if (aData[i++]) bFault |= (1 << 4); // Bit 1 : Cell Over voltage warning
else bFault &= ~(1 << 4);
if (aData[i++]) bFault |= (1 << 3); // Bit 2 : Low voltage warning
else bFault &= ~(1 << 3);
if (aData[i++]) bFault |= (1 << 5); // Bit 3 : Low cell voltage warning
else bFault &= ~(1 << 5);
if (aData[i++]) bFault |= (1 << 6); // Bit 4 : Charge over current warning
else bFault &= ~(1 << 6);
if (aData[i++]) bFault |= (1 << 7); // Bit 5 : Discharge over current warning
else bFault &= ~(1 << 7);
i++; // 06 Abnormal balancing current
i++; // 07 Reserved
if ((aData[8]) || (aData[9])) bFault |= (1 << 0); // Bit 8 : Charge over temperature warning, Bit 9 : Discharge over temperature warning
else bFault &= ~(1 << 0);
i++; // 08
i++; // 09
if ((aData[10]) || (aData[11])) bFault |= (1 << 1); // Bit 10 : Charge low temperature warning, Bit 11 : Discharge low temperature warning
else bFault &= ~(1 << 1);
i++; // 10
i++; // 11
i++; // 12
i++; // 13
if (aData[i++]) bFault |= (1 << 9); // 14 Cell Voltage Difference Warning
else bFault &= ~(1 << 9);
break;
}
rSystemData.StatusData.protection = bFault;
rSystemData.StatusData.warning = bWarning;
return rSystemData;
}
public static void SetData(int index, double sdata, ref DeviceSystemData aSystemData)
{
switch (index)
{
case 0: aSystemData.ValueData.voltageOfPack = (short)(sdata / 100); break; // voltageOfPack
case 1: aSystemData.ValueData.current = (short)(sdata / 10); break; // current
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16: aSystemData.ValueData.CellVoltage[index - 2] = (ushort)(sdata / 1); break; // CellVoltage14
case 17: aSystemData.ValueData.CellTemperature[0] = (short)(sdata / 1); break; // CellTemperature0
case 18: aSystemData.ValueData.CellTemperature[1] = (short)(sdata / 1); break; // CellTemperature1
case 19: aSystemData.ValueData.CellTemperature[2] = (short)(sdata / 1); break; // CellTemperature2
case 20: aSystemData.ValueData.CellTemperature[3] = (short)(sdata / 1); break; // CellTemperature3
case 21: aSystemData.ValueData.rSOC = (short)(sdata / 1); break; // Relatvie State Of Charge
case 22: aSystemData.ValueData.remainingCapacity = (short)(sdata / 1); break; // Remaining Capacity
case 23: aSystemData.ValueData.stateOfHealth = (short)(sdata / 1); break; // stateOfHealth
case 24: aSystemData.ValueData.cycleCount = (short)(sdata / 1); break; // cycleCount
case 25: aSystemData.AvgData.maxCellVoltage = (short)(sdata / 1); break; // maxCellVoltage
case 26: aSystemData.AvgData.minCellVoltage = (short)(sdata / 1); break; // minCellVoltage
case 27: aSystemData.AvgData.avgCellVoltage = (short)(sdata / 1); break; // avgCellVoltage
case 28: aSystemData.AvgData.diffCellVoltage = (short)(sdata / 1); break; // diffCellVoltage
case 29: aSystemData.StatusData.batteryStatus = (short)(sdata / 1); break; // batteryStatus
//case 37: aSystemData.StatusData.warning = (short)(sdata / 1); break; // warning
case 30: aSystemData = MakeAlarmTripData(0, (short)(sdata / 1), aSystemData); break; // warning
//case 38: aSystemData.StatusData.protection = (short)(sdata / 1); break; // OID-44 protection
case 31: aSystemData = MakeAlarmTripData(1, (short)(sdata / 1), aSystemData); break; // OID-44 protection
case 32: aSystemData.StatusData.status = (short)(sdata / 1); break; // status
case 33: aSystemData.StatusData.relayStatus = (short)(sdata / 1); break; // relayStatus
case 34: aSystemData.StatusData.cellBallanceStatus = (short)(sdata / 1); break; // cellBallanceStatus
case 35: aSystemData.StatusData.cellBalanceValue = (short)(sdata / 1); break; // cellBalanceValue
case 36: aSystemData.StatusData.cellBalanceFlag = (short)(sdata / 1); break; // cellBalanceFlag
case 37: aSystemData.AvgData.maxCellNum = (short)(sdata / 1); break; // maxCellNum
case 38: aSystemData.AvgData.minCellNum = (short)(sdata / 1); break; // minCellNum
//case 46: aSystemData.AvgData.maxTemp = (short)(sdata / 1); break; // maxTemp
//case 47: aSystemData.AvgData.minTemp = (short)(sdata / 1); break; // minTemp
//case 48: aSystemData.AvgData.maxTempNum = (short)(sdata / 1); break; // maxTempNum
//case 49: aSystemData.AvgData.minTempNum = (short)(sdata / 1); break; // minTempNum
}
}
public static void SetSnmpData(int index, object sdata, ref DeviceSystemData aSystemData)
{
switch (index)
{
case 1: aSystemData.ValueData.voltageOfPack = (short)(Convert.ToDouble(sdata) / 10); break; // voltageOfPack - 0.01V
case 2: aSystemData.ValueData.current = (short)(Convert.ToDouble(sdata) - 10000); break; // current - 0.1A, Offset: 10000
case 3: // Cell Voltage #1
case 4: // Cell Voltage #2
case 5: // Cell Voltage #3
case 6: // Cell Voltage #4
case 7: // Cell Voltage #5
case 8: // Cell Voltage #6
case 9: // Cell Voltage #7
case 10: // Cell Voltage #8
case 11: // Cell Voltage #9
case 12: // Cell Voltage #10
case 13: // Cell Voltage #11
case 14: // Cell Voltage #12
case 15: // Cell Voltage #13
case 16: // Cell Voltage #14
case 17: aSystemData.ValueData.CellVoltage[index - 3] = (ushort)(Convert.ToDouble(sdata) / 1);
csUtils.MakeMaxAvgMinCellVoltage(ref aSystemData, 15);
break; // Cell Voltage #16
case 19: aSystemData.ValueData.Ext1Temperature = (short)(Convert.ToDouble(sdata) * 10); break; // Temp of PCB - C
case 20: aSystemData.ValueData.Ext2Temperature = (short)(Convert.ToDouble(sdata) * 10); break; // Temp of Ambient - C
case 21: aSystemData.AvgData.maxTemp = (short)(Convert.ToDouble(sdata) * 10); break; // Max. Temp
case 22: aSystemData.ValueData.remainingCapacity = (short)(Convert.ToDouble(sdata) * 1); break; // Remaining Capacity
case 24: aSystemData.ValueData.stateOfHealth = (short)(Convert.ToDouble(sdata) / 10); break; // stateOfHealth
case 25: aSystemData.ValueData.rSOC = (short)(Convert.ToDouble(sdata) / 10); break; // Relatvie State Of Charge
case 26: aSystemData.StatusData.status = (short)(Convert.ToDouble(sdata) / 1); break; // Status
case 27: aSystemData.StatusData.warning = MakeSnmpWarningData((short)Convert.ToDouble(sdata)); break; // warning
case 28: aSystemData.StatusData.protection = MakeSnmpTripData((short)Convert.ToDouble(sdata)); break; // Protection
case 29: // FaultAndStatus
aSystemData.StatusData.faultAndStatus = (short)(Convert.ToDouble(sdata) / 1);
//aSystemData.StatusData.status = (short)(((short)Convert.ToDouble(sdata) >> 8) & 0x0003);
MakeAlarm(ref aSystemData);
break;
case 30: aSystemData.ValueData.cycleCount = (short)(Convert.ToDouble(sdata) / 1); break; // cycleCount
case 31: // Temperature #1
case 32: // Temperature #2
case 33: // Temperature #3
case 34: // Temperature #4
csUtils.MakeMaxAvgMinCellVoltage(ref aSystemData, 4);
break;
case 37: aSystemData.cellQty = (short)(Convert.ToDouble(sdata) * 1); break; // Cell Number
case 38: aSystemData.ValueData.designedCapacity = (short)(Convert.ToDouble(sdata) * 1); break; // Cell Number
case 40: aSystemData.ValueData.MaxBattChargeCurr = (short)(Convert.ToDouble(sdata) * 1); break; // Max. Charge Current - A
case 41: aSystemData.ntcQty = (short)(Convert.ToDouble(sdata) * 1); break; // NTC Number
case 42: aSystemData.BmsDateTime.year = (short)(Convert.ToDouble(sdata) * 1); break; // BMS DateTime - Year
case 43: aSystemData.BmsDateTime.month = (short)(Convert.ToDouble(sdata) * 1); break; // BMS DateTime - Month
case 44: aSystemData.BmsDateTime.day = (short)(Convert.ToDouble(sdata) * 1); break; // BMS DateTime - Day
case 45: aSystemData.BmsDateTime.hour = (short)(Convert.ToDouble(sdata) * 1); break; // BMS DateTime - Hour
case 46: aSystemData.BmsDateTime.minute = (short)(Convert.ToDouble(sdata) * 1); break; // BMS DateTime - Minute
case 47: aSystemData.BmsDateTime.second = (short)(Convert.ToDouble(sdata) * 1); // BMS DateTime - Second
aSystemData.BmsDateTime.DateTimeStr = string.Format("{0:0000}-{1:00}-{2:00} {3:00}:{4:00}:{5:00}"
, aSystemData.BmsDateTime.year
, aSystemData.BmsDateTime.month
, aSystemData.BmsDateTime.day
, aSystemData.BmsDateTime.hour
, aSystemData.BmsDateTime.minute
, aSystemData.BmsDateTime.second
);
break;
case 48: aSystemData.FloatVoltage = (int)Convert.ToDouble(sdata); break; // Float Voltage - 0.01V
case 49: aSystemData.BoostVoltage = (int)Convert.ToDouble(sdata); break; // Boost Voltage - 0.01V
case 50: aSystemData.MinChargeTemp = (int)Convert.ToDouble(sdata); break; // Min. Charge Temp - C
case 51: aSystemData.MaxChargeTemp = (int)Convert.ToDouble(sdata); break; // Max. Charge Temp - C
case 60: aSystemData.Information.ModelName = (string)sdata; break; // Model - string
case 61: aSystemData.Information.SwProductRev = (string)sdata; break; // BMS Fw Version - string
case 62: aSystemData.Information.HwSerialNumber = (string)sdata; break; // Pack Serial Number - string
case 63: aSystemData.Information.VendorName = (string)sdata; break; // Vendor Name - string
case 64: aSystemData.Information.ProductCode = (string)sdata; break; // Product Code - string
case 65: aSystemData.Information.MajorMinorRev = (string)sdata; break; // Major Minor Revision - string
case 66: aSystemData.Information.HwProductRev = (string)sdata; break; // Hardware Product Revision - string
case 67: aSystemData.Information.ManufacturingDate = (string)sdata; break; // Manufacturing Date - string
default:
break;
}
}
public static void MakeAlarm(ref DeviceSystemData rSystemData)
{
if (((rSystemData.StatusData.faultAndStatus >> 14) & 0x0001) == 0x0001)
{
rSystemData.StatusData.batteryStatus = 4; // Anti-theft Gyroscope
}
else if (((rSystemData.StatusData.faultAndStatus >> 15) & 0x0001) == 0x0001)
{
rSystemData.StatusData.batteryStatus = 5; // Anti-theft Comm.
}
else if (rSystemData.StatusData.protection != 0x0000)
{
rSystemData.StatusData.batteryStatus = 2;
}
else if (rSystemData.StatusData.warning != 0x0000)
{
rSystemData.StatusData.batteryStatus = 1;
}
else
{
rSystemData.StatusData.batteryStatus = 0;
}
}
public static short MakeSnmpTripData(short rdata)
{
short result = 0;
bool[] bAlarm = csUtils.Int16ToBitArray(rdata);
if (bAlarm[0] == true) result |= (short)(1 << 4); // 0x0001Cell OV
if (bAlarm[1] == true) result |= (short)(1 << 2); // 0x0002Pack OV
if (bAlarm[2] == true) result |= (short)(1 << 5); // 0x0004Cell UV
if (bAlarm[3] == true) result |= (short)(1 << 3); // 0x0008Pack UV
if (bAlarm[4] == true) result |= (short)(1 << 6); // 0x0010Charging OC1
if (bAlarm[5] == true) result |= (short)(1 << 6); // 0x0020Charging OC2
if (bAlarm[6] == true) result |= (short)(1 << 7); // 0x0010Discharging OC1
if (bAlarm[7] == true) result |= (short)(1 << 7); // 0x0020Discharging OC2
if (bAlarm[8] == true) result |= (short)(1 << 9); // 0x0200Short Circuit Protection
if (bAlarm[9] == true) result |= (short)(1 << 0); // 0x0080: Charging Over Tempratuer
if (bAlarm[10] == true) result |= (short)(1 << 1); // 0x0080: Charging Under Tempratuer
if (bAlarm[11] == true) result |= (short)(1 << 0); // 0x0040: Discharging Over Tempratuer
if (bAlarm[12] == true) result |= (short)(1 << 1); // 0x0040: Discharging Under Tempratuer
return result;
}
public static short MakeSnmpWarningData(short rdata)
{
short result = 0;
bool[] bAlarm = csUtils.Int16ToBitArray(rdata);
if (bAlarm[0] == true) result |= (short)(1 << 4); // 0x0001Cell OV
if (bAlarm[1] == true) result |= (short)(1 << 5); // 0x0002Cell UV
if (bAlarm[2] == true) result |= (short)(1 << 2); // 0x0004Pack OV
if (bAlarm[3] == true) result |= (short)(1 << 3); // 0x0008Pack UV
if (bAlarm[4] == true) result |= (short)(1 << 6); // 0x0010Charging OC
if (bAlarm[5] == true) result |= (short)(1 << 7); // 0x0020Discharging OC
if (bAlarm[6] == true) result |= (short)(1 << 8); // 0x0040ENV OT
if (bAlarm[7] == true) result |= (short)(1 << 9); // 0x0080ENV UT
if (bAlarm[8] == true) result |= (short)(1 << 0); // 0x0100: Charging Over Temprature
if (bAlarm[9] == true) result |= (short)(1 << 1); // 0x0200: Charging Under Temprature
if (bAlarm[10] == true) result |= (short)(1 << 0); // 0x0400: Discharging Over Temprature
if (bAlarm[11] == true) result |= (short)(1 << 1); // 0x0800: Discharging Under Temprature
if (bAlarm[12] == true) result |= (short)(1 << 11); // 0x1000SOC Low
if (bAlarm[13] == true) result |= (short)(1 << 13); // 0x2000Diff Volt
if (bAlarm[14] == true) result |= (short)(1 << 14); // 0x4000CB Off
return result;
}
}
}