Files
JP_KDDI_LFPS_48100/LFP_Manager/DataStructure/CsDeviceAlarmDefine.cs
2025-12-19 13:59:34 +09:00

176 lines
6.4 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.Threading.Tasks;
namespace LFP_Manager.DataStructure
{
internal class CsAlarmDefine
{
//0x0001Pack OV
//0x0002Cell OV
//0x0004Pack UV
//0x0008Cell UV
//0x0010Charge OC
//0x0020Discharge OC
//0x0040: 环境温度异常
//0x0080: MOS温度高
//0x0100Charge OT
//0x0200Discharge OT
//0x0400Charge UT
//0x0800Discharge UT
//0x1000Low capacity
//0x2000: 浮充停止/Float Stoped
//0x4000:
public enum eGuiWarningBit
{
PACK_OV = 0,
CELL_OV = 1,
PACK_UV = 2,
CELL_UV = 3,
CHG_OC = 4,
DCH_OC = 5,
AMB_OT = 6,
MOS_OT = 7,
CHG_OT = 8,
DCH_OT = 9,
CHG_UT = 10,
DCH_UT = 11,
LOW_SOC = 12,
DIFF_VOLT = 13,
CB_OFF = 14,
}
public enum eGuiProtectBit
{
PACK_OV = 0,
CELL_OV = 1,
PACK_UV = 2,
CELL_UV = 3,
CHG_OC = 4,
DCH_OC = 5,
AMB_OT = 6,
MOS_OT = 7,
CHG_OT = 8,
DCH_OT = 9,
CHG_UT = 10,
DCH_UT = 11,
LOW_SOC = 12,
SC = 13,
}
public enum eDevWarningBit
{
CELL_OV = 0,
CELL_UV = 1,
PACK_OV = 2,
PACK_UV = 3,
CHG_OC = 4,
DCH_OC = 5,
AMB_OT = 6,
AMB_UT = 7,
CHG_OT = 8,
CHG_UT = 9,
DCH_OT = 10,
DCH_UT = 11,
LOW_SOC = 12,
DIFF_VOLT = 13,
CB_OFF = 14,
}
public enum eDevProtectBit
{
CELL_OV = 0,
PACK_OV = 1,
CELL_UV = 2,
PACK_UV = 3,
CHG_OC1 = 4,
CHG_OC2 = 5,
DCH_OC1 = 6,
DCH_OC2 = 7,
SC_CB = 8,
CHG_OT = 9,
CHG_UT = 10,
DCH_OT = 11,
DCH_UT = 12,
}
private static bool HasBit(int value, int bitIndex) => (value & (1 << bitIndex)) != 0;
private static void SetBit(ref int value, int bitIndex) => value |= (1 << bitIndex);
private static void SetIf(int src, int srcBit, ref int dst, int dstBit)
{
if (HasBit(src, srcBit)) SetBit(ref dst, dstBit);
}
private static void SetIfAny(int src, int[] srcBits, ref int dst, int dstBit)
{
foreach (var b in srcBits)
{
if (HasBit(src, b)) { SetBit(ref dst, dstBit); break; }
}
}
/// <summary>
/// Device 경고 비트(eDevWarningBit) -> GUI 경고 비트(eGuiWarningBit)
/// AMB_UT는 GUI 경고에 대응 비트가 없어 미표시.
/// 새로 추가된 DIFF_VOLT, CB_OFF 매핑 포함.
/// </summary>
public static int DevWarningToGui(int devWarning)
{
int gui = 0;
SetIf(devWarning, (int)eDevWarningBit.PACK_OV, ref gui, (int)eGuiWarningBit.PACK_OV);
SetIf(devWarning, (int)eDevWarningBit.CELL_OV, ref gui, (int)eGuiWarningBit.CELL_OV);
SetIf(devWarning, (int)eDevWarningBit.PACK_UV, ref gui, (int)eGuiWarningBit.PACK_UV);
SetIf(devWarning, (int)eDevWarningBit.CELL_UV, ref gui, (int)eGuiWarningBit.CELL_UV);
SetIf(devWarning, (int)eDevWarningBit.CHG_OC, ref gui, (int)eGuiWarningBit.CHG_OC);
SetIf(devWarning, (int)eDevWarningBit.DCH_OC, ref gui, (int)eGuiWarningBit.DCH_OC);
SetIf(devWarning, (int)eDevWarningBit.AMB_OT, ref gui, (int)eGuiWarningBit.AMB_OT);
//SetIf(devWarning, (int)eDevWarningBit.MOS_OT, ref gui, (int)eGuiWarningBit.MOS_OT);
SetIf(devWarning, (int)eDevWarningBit.CHG_OT, ref gui, (int)eGuiWarningBit.CHG_OT);
SetIf(devWarning, (int)eDevWarningBit.DCH_OT, ref gui, (int)eGuiWarningBit.DCH_OT);
SetIf(devWarning, (int)eDevWarningBit.CHG_UT, ref gui, (int)eGuiWarningBit.CHG_UT);
SetIf(devWarning, (int)eDevWarningBit.DCH_UT, ref gui, (int)eGuiWarningBit.DCH_UT);
SetIf(devWarning, (int)eDevWarningBit.LOW_SOC, ref gui, (int)eGuiWarningBit.LOW_SOC);
SetIf(devWarning, (int)eDevWarningBit.DIFF_VOLT, ref gui, (int)eGuiWarningBit.DIFF_VOLT);
SetIf(devWarning, (int)eDevWarningBit.CB_OFF, ref gui, (int)eGuiWarningBit.CB_OFF);
// AMB_UT는 GUI에 해당 없음 → 미표시
return gui;
}
/// <summary>
/// Device 보호 비트(eDevProtectBit) -> GUI 보호 비트(eGuiProtectBit)
/// CHG_OC1/2 → CHG_OC 집계, DCH_OC1/2 → DCH_OC 집계
/// SC_CB(단락/차단기 트립) → SC(신규 GUI 비트) 매핑.
/// </summary>
public static int DevProtectToGui(int devProtect)
{
int gui = 0;
SetIf(devProtect, (int)eDevProtectBit.PACK_OV, ref gui, (int)eGuiProtectBit.PACK_OV);
SetIf(devProtect, (int)eDevProtectBit.CELL_OV, ref gui, (int)eGuiProtectBit.CELL_OV);
SetIf(devProtect, (int)eDevProtectBit.PACK_UV, ref gui, (int)eGuiProtectBit.PACK_UV);
SetIf(devProtect, (int)eDevProtectBit.CELL_UV, ref gui, (int)eGuiProtectBit.CELL_UV);
SetIfAny(devProtect, new[] { (int)eDevProtectBit.CHG_OC1, (int)eDevProtectBit.CHG_OC2 },
ref gui, (int)eGuiProtectBit.CHG_OC);
SetIfAny(devProtect, new[] { (int)eDevProtectBit.DCH_OC1, (int)eDevProtectBit.DCH_OC2 },
ref gui, (int)eGuiProtectBit.DCH_OC);
// 단락/차단기 트립 → SC
SetIf(devProtect, (int)eDevProtectBit.SC_CB, ref gui, (int)eGuiProtectBit.SC);
SetIf(devProtect, (int)eDevProtectBit.CHG_OT, ref gui, (int)eGuiProtectBit.CHG_OT);
SetIf(devProtect, (int)eDevProtectBit.CHG_UT, ref gui, (int)eGuiProtectBit.CHG_UT);
SetIf(devProtect, (int)eDevProtectBit.DCH_OT, ref gui, (int)eGuiProtectBit.DCH_OT);
SetIf(devProtect, (int)eDevProtectBit.DCH_UT, ref gui, (int)eGuiProtectBit.DCH_UT);
// AMB_OT, MOS_OT, LOW_SOC 보호 카테고리는 DevProtectBit에 정의되지 않아 미표시
return gui;
}
}
}