whyclj
2020-09-28 e23ca11a5424f723ba6d1fd5e3e76bea8a332b9d
添加电池组单体电压,温度,内阻告警
4个文件已添加
4个文件已修改
895 ■■■■■ 已修改文件
BattMonitor_FBS9600SMore/src/com/battmonitor/data/BattAlarmData.java 224 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/battmonitor/data/BattAlarmParam.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/battmonitor/data/BattData_RT.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/battmonitor/data/MonVolData.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/Batt_RealDataRecord_Thread_SQL.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/FBS9600S_BattAlarm_Thread.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/FBS9600S_BattAlarm_Thread_SQL.java 393 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/main/main_MonitorServer_FBS9600SMore.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/battmonitor/data/BattAlarmData.java
New file
@@ -0,0 +1,224 @@
package com.battmonitor.data;
import java.util.ArrayList;
import java.util.Date;
import java.util.UUID;
import com.battmonitor.data.BattAlarmParam.AlarmParamCell;
public class BattAlarmData {
    public final static int ALM_CLEARED_TYPE_NULL = 0;
    public final static int ALM_CLEARED_TYPE_AUTO = 1;
    public final static int ALM_CLEARED_TYPE_MANUAL = 2;
    public final static int ALM_TYPE_OnlineVol_ID = 119001;                            //在线电压告警
    public final static int ALM_TYPE_GroupVol_ID = 119002;                            //组端电压告警
    public final static int ALM_TYPE_BattChargeCurr_ID = 119003;                    //充电电流高
    public final static int ALM_TYPE_BattDisChargeCurr_ID = 119004;                    //放电电流告警
    public final static int ALM_TYPE_MonVol_ID = 119005;                            //单体电压告警
    public final static int ALM_TYPE_MonTmp_ID = 119006;                            //单体温度告警
    public final static int ALM_TYPE_MonRes_ID = 119007;                            //单体内阻告警
    public final static int ALM_TYPE_ConnRes_ID = 119008;                            //连接条阻抗告警
    public final static int ALM_TYPE_DisChargeMonVol_ID = 119009;                    //放电单体电压告警
    public final static int ALM_TYPE_MONCAP_ALMALARM_ID = 119010;                    //容量告警告警
    public final static int ALM_TYPE_MONCAP_CHANGEALARM_ID = 119011;                //容量更换告警
    public final static int ALM_SIGNAL_ID_Null = 0;
    public final static int ALM_SIGNAL_ID_OnlineVolHigh = 1;                        //在线电压高
    public final static int ALM_SIGNAL_ID_OnlineVolLow = 2;                            //在线电压低
    public final static int ALM_SIGNAL_ID_GroupVolHigh = 3;                            //组端电压高
    public final static int ALM_SIGNAL_ID_GroupVolLow = 4;                            //组端电压低
    public final static int ALM_SIGNAL_ID_ChargeCurrHigh = 5;                        //充电电流高
    public final static int ALM_SIGNAL_ID_ChargeCurrLow = 6;                        //充电电流低
    public final static int ALM_SIGNAL_ID_DisChargeCurrHigh = 7;                    //放电电流高
    public final static int ALM_SIGNAL_ID_DisChargeCurrLow = 8;                        //放电电流低
    public final static int ALM_SIGNAL_ID_MonVolHigh = 9;                            //单体电压高
    public final static int ALM_SIGNAL_ID_MonVolLow = 10;                            //单体电压低
    public final static int ALM_SIGNAL_ID_MonTmpHigh = 11;                            //单体温度高
    public final static int ALM_SIGNAL_ID_MonTmpLow = 12;                            //单体温度低
    public final static int ALM_SIGNAL_ID_MonResHigh = 13;                            //单体内阻高
    public final static int ALM_SIGNAL_ID_MonResLow = 14;                            //单体内阻低
    public final static int ALM_SIGNAL_ID_ConnResHigh = 15;                            //连接条阻抗高
    public final static int ALM_SIGNAL_ID_ConnResLow = 16;                            //连接条阻抗低
    public final static int ALM_SIGNAL_ID_DischargeMonVolHigh = 17;                    //放电单体电压高
    public final static int ALM_SIGNAL_ID_DischargeMonVolLow = 18;                    //放电单体电压低
    public final static int ALM_TYPE_MonVol_High_ID = 139001;        //单体电压高
    public final static int ALM_TYPE_MonVol_Low_ID = 139002;        //单体电压低
    public final static int ALM_TYPE_MonTmp_High_ID = 139003;        //单体温度高
    public final static int ALM_TYPE_MonTmp_Low_ID = 139004;        //单体温度低
    public final static int ALM_TYPE_MonRes_High_ID = 139005;        //单体内阻高
    public final static int ALM_TYPE_MonRes_Low_ID = 139006;        //单体内阻低
    private int ALM_TAG_DELAY_COUNT_MAX = 600;
    private int ALM_signal_id_high;
    private int ALM_signal_id_low;
    private int ALM_level_high;
    private int ALM_level_low;
    private int alarm_high_delay_count;
    private int alarm_low_delay_count;
    public int battgroup_id;
    public int mon_num;
    public long record_id;
    public int alm_id = 0;
    public int alm_signal_id = 0;
    public int alm_signal_level = 0;
    public Date alm_start_time = new Date();
    public Date alm_end_time = new Date();
    public float alm_value = 0;
    public boolean alm_is_confirmed = false;
    public Date alm_confirmed_Time = new Date();
    public int alm_cleared_type = ALM_CLEARED_TYPE_NULL;
    public int usr_id = 0;
    public BattAlarmData(int dt_count_max,
                        int bg_id_t, int mon_num_t, int alm_id_t,
                        int alm_signal_id_high_t, int alm_signal_id_low_t,
                        int alm_level_high_t, int alm_level_low_t)
    {
        ALM_TAG_DELAY_COUNT_MAX = dt_count_max;
        battgroup_id = bg_id_t;
        mon_num = mon_num_t;
        alm_id = alm_id_t;
        ALM_signal_id_high = alm_signal_id_high_t;
        ALM_signal_id_low = alm_signal_id_low_t;
        ALM_level_high = alm_level_high_t;
        ALM_level_low = alm_level_low_t;
    }
    public BattAlarmData() {
    }
    /**
     * 根据当前对象克隆一个当前对象(引用不同)
     * @return
     */
    private BattAlarmData cloneBattAlarmData()
    {
        BattAlarmData alm_data = new BattAlarmData(ALM_TAG_DELAY_COUNT_MAX,
                                                    battgroup_id, mon_num, alm_id,
                                                    ALM_signal_id_high, ALM_signal_id_low,
                                                    ALM_level_high, ALM_level_low);
        alm_data.record_id = record_id;
        alm_data.alm_signal_id = alm_signal_id;
        alm_data.alm_signal_level = alm_signal_level;
        alm_data.alm_value = alm_value;
        alm_data.alm_start_time.setTime(alm_start_time.getTime());
        alm_data.alm_end_time.setTime(alm_end_time.getTime());
        alm_data.alm_cleared_type = alm_cleared_type;
        alm_data.alm_is_confirmed = alm_is_confirmed;
        alm_data.alm_confirmed_Time.setTime(alm_confirmed_Time.getTime());
        alm_data.usr_id = usr_id;
        return alm_data;
    }
    /**
     *     将data_value的值与AlarmParamCell参数中的各种参数比较,并将满足条件的告警电池组添加到ArrayList<BattAlarmData>中
     * @param AL_alarmdata        所有的告警信息
     * @param param                  参数
     * @param data_value           告警值
     */
    public void makeAlarmData(ArrayList<BattAlarmData> AL_alarmdata, AlarmParamCell param, float data_value)
    {
        if(true == param.alm_High_EN)
        {
            if(data_value > param.alm_High)
            {
                if(ALM_signal_id_high != alm_signal_id && ALM_signal_id_low != alm_signal_id)
                {
                    //System.out.println("isNew:"+ALM_signal_id_high);
                    alm_signal_id = ALM_signal_id_high;
                    alarm_high_delay_count = 0;
                    alm_signal_level = param.alm_High_Level;
                    alm_value = data_value;
                    alm_start_time = new Date();
                    alm_cleared_type = ALM_CLEARED_TYPE_NULL;
                    alm_is_confirmed = false;
                    record_id = UUID.randomUUID().getLeastSignificantBits();
                    AL_alarmdata.add(cloneBattAlarmData());
                }
            } else {
                if(ALM_signal_id_high == alm_signal_id)
                {
                    //System.out.println("isOld:"+ALM_signal_id_high+"\t"+alarm_high_delay_count);
                    if(alarm_high_delay_count < (ALM_TAG_DELAY_COUNT_MAX+2))
                        alarm_high_delay_count += 1;
                    if(alarm_high_delay_count >= ALM_TAG_DELAY_COUNT_MAX)
                    {
                        alm_cleared_type = ALM_CLEARED_TYPE_AUTO;
                        alm_end_time = new Date();
                        AL_alarmdata.add(cloneBattAlarmData());
                        alm_signal_id = ALM_SIGNAL_ID_Null;
                        alarm_high_delay_count = 0;
                    }
                }
            }
        }
        if(true == param.alm_Low_EN)
        {
            int alm_id = this.alm_id +1;
            if(data_value < param.alm_Low)
            {
                if(ALM_signal_id_low != alm_signal_id && ALM_signal_id_high != alm_signal_id)
                {
                    alarm_high_delay_count = 0;
                    alm_signal_id = ALM_signal_id_low;
                    alm_signal_level = param.alm_Low_Level;
                    alm_value = data_value;
                    alm_start_time = new Date();
                    alm_cleared_type = ALM_CLEARED_TYPE_NULL;
                    alm_is_confirmed = false;
                    record_id = UUID.randomUUID().getLeastSignificantBits();
                    BattAlarmData alm = cloneBattAlarmData();
                    alm.alm_id = alm_id;
                    AL_alarmdata.add(alm);
                }
            } else {
                if(ALM_signal_id_low == alm_signal_id)
                {
                    if(alarm_low_delay_count < (ALM_TAG_DELAY_COUNT_MAX+2))
                        alarm_low_delay_count += 1;
                    if(alarm_low_delay_count >= ALM_TAG_DELAY_COUNT_MAX)
                    {
                        alm_cleared_type = ALM_CLEARED_TYPE_AUTO;
                        alm_end_time = new Date();
                        //AL_alarmdata.add(cloneBattAlarmData());
                        BattAlarmData alm = cloneBattAlarmData();
                        alm.alm_id = alm_id;
                        AL_alarmdata.add(alm);
                        alm_signal_id = ALM_SIGNAL_ID_Null;
                        alarm_low_delay_count = 0;
                    }
                }
            }
        }
    }
    @Override
    public String toString() {
        return "BattAlarmData [battgroup_id=" + battgroup_id + ", mon_num=" + mon_num + ", alm_id=" + alm_id
                + ", alm_signal_id=" + alm_signal_id + ", alm_signal_level=" + alm_signal_level + ", alm_start_time="
                + alm_start_time + ", alm_end_time=" + alm_end_time + ", alm_value=" + alm_value + ", alm_cleared_type="
                + alm_cleared_type + "]";
    }
}
BattMonitor_FBS9600SMore/src/com/battmonitor/data/BattAlarmParam.java
New file
@@ -0,0 +1,81 @@
package com.battmonitor.data;
public class BattAlarmParam {
    public AlarmParamCell alm_OnlineVol;
    public AlarmParamCell alm_GroupVol;
    public AlarmParamCell alm_BattChargeCurr;
    public AlarmParamCell alm_BattDisChargeCurr;
    public AlarmParamCell alm_MonVol;
    public AlarmParamCell alm_MonTmp;
    public AlarmParamCell alm_MonRes;
    public AlarmParamCell alm_ConnRes;
    public AlarmParamCell alm_DischargeMonVol;
    public boolean update_en = false;                        //判断告警参数是否有更新
    /**
     * 默认开启   组端电压(上下限) 单体电压(上下限)  充电电流(上限)  放电电流(上限)
     */
    public BattAlarmParam()
    {
        alm_OnlineVol = new AlarmParamCell((float)1.125, (float)1.10,  2, 2,  true, true);
        alm_GroupVol = new AlarmParamCell((float)1.17, (float)0.96,  2, 2,  true, true);
        alm_BattChargeCurr = new AlarmParamCell((float)3, (float)0,  2, 2,  true, false);
        alm_BattDisChargeCurr = new AlarmParamCell((float)3, (float)0,  2, 2,  true, false);
        alm_MonVol = new AlarmParamCell((float)1.2, (float)0.8,  3, 3,  true, true);
        alm_MonTmp = new AlarmParamCell((float)1.5, (float)0.5,  3, 3,  true, true);
        alm_MonRes = new AlarmParamCell((float)2, (float)0.5,  3, 3,  true, true);
        alm_ConnRes = new AlarmParamCell((float)2, (float)0.5,  3, 3,  false, false);
        alm_DischargeMonVol = new AlarmParamCell((float)1.2, (float)0.8,  3, 3,  false, false);
    }
    public void setAlarmParamCellValue(float std_value, AlarmParamCell apc_target, AlarmParamCell apc_param)
    {
        apc_target.alm_High = std_value * apc_param.alm_High;
        apc_target.alm_High_Level = apc_param.alm_High_Level;
        apc_target.alm_High_EN = apc_param.alm_High_EN;
        apc_target.alm_Low = std_value * apc_param.alm_Low;
        apc_target.alm_Low_Level = apc_param.alm_Low_Level;
        apc_target.alm_Low_EN = apc_param.alm_Low_EN;
    }
    public class AlarmParamCell {
        public int alm_Id = 0;
        public String alm_Name = "";
        public float alm_High = 0;
        public float alm_Low = 0;
        public int alm_High_Level = 1;
        public int alm_Low_Level = 1;
        public boolean alm_High_EN = true;
        public boolean alm_Low_EN = true;
        public AlarmParamCell(float high, float low)
        {
            alm_Id = 0;
            alm_Name = "";
            alm_High = high;
            alm_Low = low;
            alm_High_Level = 1;
            alm_Low_Level = 1;
            alm_High_EN = true;
            alm_Low_EN = true;
        }
        public AlarmParamCell(float high, float low, int high_lev,
                            int low_lev, boolean high_en, boolean low_en)
        {
            alm_Id = 0;
            alm_Name = "";
            alm_High = high;
            alm_Low = low;
            alm_High_Level = high_lev;
            alm_Low_Level = low_lev;
            alm_High_EN = high_en;
            alm_Low_EN = low_en;
        }
    }
}
BattMonitor_FBS9600SMore/src/com/battmonitor/data/BattData_RT.java
@@ -1,5 +1,6 @@
package com.battmonitor.data;
import java.util.ArrayList;
import java.util.Calendar;
import com.battmonitor.base.AppParam;
import com.battmonitor.base.ComBase;
@@ -58,6 +59,9 @@
    
    public BattStatData  mTestData;
    
    public BattAlarmParam m_AlarmParam = new BattAlarmParam();
    public BattAlarmParam m_BattAlarmParam = new BattAlarmParam();
    private int mCommTimeCoutCount = 0;
    public int mMaxMonNum = 0;
    public float mMaxMonVol = 0;
@@ -86,6 +90,65 @@
        
        initTestDataSaveRunable();
    }
    public void initAlarmParam(int dt_count_max, BattAlarmParam alm_param)
    {
        /***********************************************************************************/
//        float std_group_vol = MonStdVol * MonCount;
//        alm_param.setAlarmParamCellValue(std_group_vol, m_AlarmParam.alm_OnlineVol, alm_param.alm_OnlineVol);
//        alm_param.setAlarmParamCellValue(std_group_vol, m_AlarmParam.alm_GroupVol, alm_param.alm_GroupVol);
        /***********************************************************************************/
//        float std_curr = MonStdCap / 10;
//        alm_param.setAlarmParamCellValue(std_curr, m_AlarmParam.alm_BattChargeCurr, alm_param.alm_BattChargeCurr);
//        alm_param.setAlarmParamCellValue(std_curr, m_AlarmParam.alm_BattDisChargeCurr, alm_param.alm_BattDisChargeCurr);
        /***********************************************************************************/
        //float std_monvol = MonStdVol;
        float std_monvol = 1;
        alm_param.setAlarmParamCellValue(std_monvol, m_AlarmParam.alm_MonVol, alm_param.alm_MonVol);
        //alm_param.setAlarmParamCellValue(std_monvol, m_AlarmParam.alm_DischargeMonVol, alm_param.alm_DischargeMonVol);
        //float std_montmp = 25;
        float std_montmp = 1;
        alm_param.setAlarmParamCellValue(std_montmp, m_AlarmParam.alm_MonTmp, alm_param.alm_MonTmp);
        //float std_monres = (1*(MonStdVol/2)) / (MonStdCap/100);
        float std_monres = 1;
        alm_param.setAlarmParamCellValue(std_monres, m_AlarmParam.alm_MonRes, alm_param.alm_MonRes);
//        float std_connres = (float) 0.2;
//        alm_param.setAlarmParamCellValue(std_connres, m_AlarmParam.alm_ConnRes, alm_param.alm_ConnRes);
        //TestData.initAlarmData(dt_count_max, BattGroupId, m_AlarmParam);
        for(int n=0; n<al_MonVol.size(); n++)
        {
            al_MonVol.get(n).initAlarmData(dt_count_max, BattGroupId, n+1, m_AlarmParam);
        }
    }
    /**
     * 检查TestData对象是否满足告警条件
     * @return    满足告警条件的BattAlarmData对象集合
     */
    public ArrayList<BattAlarmData> makeAlarmData()
    {
        ArrayList<BattAlarmData> al_alm_data = new ArrayList<BattAlarmData>();
        //Date timetime = new Date(100,0,1);
        Calendar c = Calendar.getInstance();
        c.set(2000, 0, 1, 0, 0, 0);
//        if(TestData.recordTime.before(c.getTime())){
//            //System.out.println(Com.getDateTimeFormat(TestData.recordTime, Com.DTF_YMDhms)+"<"+Com.getDateTimeFormat(timetime, Com.DTF_YMDhms));
//            return al_alm_data;
//        }
        //判断设备是否通讯正常,通讯不正常则部检测电池组告警
        for(int n=0; n<al_MonVol.size(); n++)
        {
            MonVolData vol_data = al_MonVol.get(n);
            vol_data.monVol_AlarmData.makeAlarmData(al_alm_data, m_AlarmParam.alm_MonVol, vol_data.monVol);
            vol_data.monTmp_AlarmData.makeAlarmData(al_alm_data, m_AlarmParam.alm_MonTmp, vol_data.monTmp);
            vol_data.monRes_AlarmData.makeAlarmData(al_alm_data, m_AlarmParam.alm_MonRes, vol_data.monRes);
        }
        return al_alm_data;
    }
    /*********************************************************************************/
    public void initTestDataSaveRunable() {
        if(null != m_Conn_Pool) {
BattMonitor_FBS9600SMore/src/com/battmonitor/data/MonVolData.java
@@ -14,6 +14,11 @@
    public float connRes = 0;
    public float monJHcurr = 0;
    //--------------------------------//
    public BattAlarmData monVol_AlarmData;
    public BattAlarmData monTmp_AlarmData;
    public BattAlarmData monRes_AlarmData;
    //--------------------------------//
    //--------------------------------//
    public MonVolData()
    {
    /******************************/
@@ -27,6 +32,32 @@
    }
    
    /**
     * 初始化各类告警对象
     * @param dt_count_max
     * @param battgroup_id
     * @param mon_num
     * @param param
     */
    public void initAlarmData(int dt_count_max, int battgroup_id, int mon_num, BattAlarmParam param)
    {
        monVol_AlarmData = new BattAlarmData(dt_count_max,
                battgroup_id, mon_num, BattAlarmData.ALM_TYPE_MonVol_High_ID,
                BattAlarmData.ALM_SIGNAL_ID_MonVolHigh, BattAlarmData.ALM_SIGNAL_ID_MonVolLow,
                param.alm_MonVol.alm_High_Level, param.alm_MonVol.alm_Low_Level);
        monTmp_AlarmData = new BattAlarmData(dt_count_max,
                battgroup_id, mon_num, BattAlarmData.ALM_TYPE_MonTmp_High_ID,
                BattAlarmData.ALM_SIGNAL_ID_MonTmpHigh, BattAlarmData.ALM_SIGNAL_ID_MonTmpLow,
                param.alm_MonTmp.alm_High_Level, param.alm_MonTmp.alm_Low_Level);
        monRes_AlarmData = new BattAlarmData(dt_count_max,
                battgroup_id, mon_num, BattAlarmData.ALM_TYPE_MonRes_High_ID,
                BattAlarmData.ALM_SIGNAL_ID_MonResHigh, BattAlarmData.ALM_SIGNAL_ID_MonResLow,
                param.alm_MonRes.alm_High_Level, param.alm_MonRes.alm_Low_Level);
    }
    /**
     * 克隆当前对象并返回
     */
    public MonVolData clone()
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/Batt_RealDataRecord_Thread_SQL.java
@@ -95,7 +95,7 @@
    public static void insertBatt_RealDataTable(MysqlConnPool pool,BattData_RT batt,Date time) {
        String sql_str ="INSERT INTO "+Sql_Mysql.BattRealDataTable+batt.BattGroupId+"_"+Com.getDateTimeFormat(time, Com.DTF_Y_M_D)+"(BattGroupId,record_time,group_vol,online_vol,group_curr,batt_state) values("
                + ""+batt.BattGroupId
                + ",'"+Com.getDateTimeFormat(time, Com.DTF_Y_M_D)
                + ",'"+Com.getDateTimeFormat(time, Com.DTF_YMDhms)
                + "',"+batt.getGroupVol()
                + "," +batt.getOnlineVol() 
                + "," +batt.getTestCurr() 
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/FBS9600S_BattAlarm_Thread.java
New file
@@ -0,0 +1,95 @@
package com.dev_fbs9600s.data;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.battmonitor.base.Com;
import com.battmonitor.data.BattAlarmData;
import com.battmonitor.data.BattAlarmParam;
import com.battmonitor.data.BattData_RT;
import com.battmonitor.data.BattData_RT_Array;
import com.battmonitor.sql.MysqlConnPool;
public class FBS9600S_BattAlarm_Thread implements Runnable{
    public final static int BattAlarmClearedDelay = 30;
    public final static int ALM_TYPE_MonVol_High_ID = 139001;        //单体电压高
    public final static int ALM_TYPE_MonVol_Low_ID = 139002;        //单体电压低
    public final static int ALM_TYPE_MonTmp_High_ID = 139003;        //单体温度高
    public final static int ALM_TYPE_MonTmp_Low_ID = 139004;        //单体温度低
    public final static int ALM_TYPE_MonRes_High_ID = 139005;        //单体内阻高
    public final static int ALM_TYPE_MonRes_Low_ID = 139006;        //单体内阻低
    public BattData_RT_Array batts;
    public MysqlConnPool pool;
    public BattAlarmParam param;
    public FBS9600S_BattAlarm_Thread(MysqlConnPool pool,BattData_RT_Array batts) {
        this.pool = pool;
        this.batts = batts;
        param = new BattAlarmParam();
    }
    @Override
    public void run() {
        System.out.println("FBS9600S_BattAlarm_Thread Start at " + Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms));
        FBS9600S_BattAlarm_Thread_SQL.queryBattAlarmParam(pool,param);
        for(int n=0; n<batts.getItemCount(); n++)
        {
            //设置告警参数
            //m_AL_Data.getItem(n).initAlarmParam(m_AppCfg.getBattAlarmClearedDelay(), m_AlarmParam_COE);
            //设置各个告警参数
            batts.getItem(n).initAlarmParam(BattAlarmClearedDelay, param);
            //查询历史实时告警记录,并设值
            FBS9600S_BattAlarm_Thread_SQL.searchLastHistoryBattAlarm(pool,batts.getItem(n));                //录入线程启动之前的告警数据
        }
        while(true) {
            try {
                param.update_en = false;
                //每隔指定时间更新一次告警记录
                FBS9600S_BattAlarm_Thread_SQL.queryBattAlarmParam(pool,param);
                ArrayList<BattAlarmData> al_alm = null;
                //更新告警参数
                for(int i=0;i<batts.getItemCount();i++) {
                    if(param.update_en) {
                        //当电池组的告警参数变化时需要更新所有的告警对象
                        batts.getItem(i).initAlarmParam(BattAlarmClearedDelay, param);
                    }
                    BattData_RT rt_data = batts.getItem(i);
                    al_alm = rt_data.makeAlarmData();
                    System.err.println("电池告警个数:"+al_alm.size()+"");
                    for(int cnt=0; cnt<al_alm.size(); cnt++) {
                        FBS9600S_BattAlarm_Thread_SQL.insertOrUpdateBattAlarmDataToTable(pool, al_alm.get(cnt));
                    }
                    al_alm.clear();
                    for(int k = 0;k<rt_data.al_MonVol.size();k++) {
                        rt_data.al_MonVol.get(k).monVol += Math.random();
                        //System.out.println(k+"=="+rt_data.al_MonVol.get(k).monVol);
                        rt_data.al_MonVol.get(k).monTmp += Math.random();
                        rt_data.al_MonVol.get(k).monRes += Math.random();
                    }
                }
                List<BattAlarmData> alarms = FBS9600S_BattAlarm_Thread_SQL.searchAllHistAlarmFromReal(pool);   //查询电池实时告警表中的电池历史告警记录
                if(alarms.size() >0) {
                    System.out.println("告警消失数目"+alarms.size());
                    for(int i =0 ;i<alarms.size();i++) {
                        FBS9600S_BattAlarm_Thread_SQL.checkBattAlarmData(pool,alarms.get(i));                    //删除之前的告警记录,并存入历史告警表中
                    }
                }
                alarms.clear();
                Thread.sleep(2000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/FBS9600S_BattAlarm_Thread_SQL.java
New file
@@ -0,0 +1,393 @@
package com.dev_fbs9600s.data;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.battmonitor.base.Com;
import com.battmonitor.data.BattAlarmData;
import com.battmonitor.data.BattAlarmParam;
import com.battmonitor.data.BattData_RT;
import com.battmonitor.sql.MysqlConnPool;
import com.battmonitor.sql.Sql_Mysql;
public class FBS9600S_BattAlarm_Thread_SQL {
    public final static String BattAlarmParamTableName = "tb_alarm_param";            //电池告警参数表
    public final static String BattAlarmDataTableName = "tb_battalarm_data";        //电池告警数据表
    public final static String DevAlarmDataTableName = "tb_dev_param";
    /**
     * 读取电池组的告警参数
     * @param pool
     * @param param
     */
    public static void queryBattAlarmParam(MysqlConnPool pool, BattAlarmParam param) {
        String sql_str = "SELECT * from "+Sql_Mysql.Batt_Alm_Param_Table+" WHERE param_id = 2020001";
        ResultSet res = null;
        Sql_Mysql sql = new Sql_Mysql(pool.getConn());
        try {
            res = sql.sqlMysqlQuery(sql_str);
            if(res.next()) {
                float val_pam = param.alm_MonVol.alm_High;
                param.alm_MonVol.alm_High = res.getFloat("mon_vol_high");
                if(val_pam != param.alm_MonVol.alm_High) {
                    param.update_en = true;
                }
                val_pam = param.alm_MonVol.alm_Low;
                param.alm_MonVol.alm_Low = res.getFloat("mon_vol_low");
                if(val_pam != param.alm_MonVol.alm_Low) {
                    param.update_en = true;
                }
                val_pam = param.alm_MonTmp.alm_High;
                param.alm_MonTmp.alm_High = res.getFloat("mon_vol_high");
                if(val_pam != param.alm_MonTmp.alm_High) {
                    param.update_en = true;
                }
                val_pam = param.alm_MonTmp.alm_Low;
                param.alm_MonTmp.alm_Low = res.getFloat("mon_vol_low");
                if(val_pam != param.alm_MonTmp.alm_Low) {
                    param.update_en = true;
                }
                val_pam = param.alm_MonRes.alm_High;
                param.alm_MonRes.alm_High = res.getFloat("mon_vol_high");
                if(val_pam != param.alm_MonRes.alm_High) {
                    param.update_en = true;
                }
                val_pam = param.alm_MonRes.alm_Low;
                param.alm_MonRes.alm_Low = res.getFloat("mon_vol_low");
                if(val_pam != param.alm_MonRes.alm_Low) {
                    param.update_en = true;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(null != res) {
                try {
                    res.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            sql.close_con();
        }
    }
    /**
     *    查询启动前当前电池组的实时告警(录入程序启动前的告警记录)
     * @return
     */
    public static void searchLastHistoryBattAlarm(MysqlConnPool pool,BattData_RT battdata){
        List<BattAlarmData> alarms = new ArrayList<BattAlarmData>();
        String sql_str = " SELECT * FROM " + BattAlarmDataTableName + " "
                       + " WHERE (alm_cleared_type = 0 OR alm_cleared_type = 2) AND alm_id NOT IN(119010,119011) AND BattGroupId= " + battdata.BattGroupId;
        Sql_Mysql sql = new Sql_Mysql(pool.getConn());
        try {
            sql.sqlMysqlUseDB(Sql_Mysql.DB_ALARM);
            ResultSet rs = sql.sqlMysqlQuery(sql_str);
            BattAlarmData alarm = null;
            while(rs.next()) {
                alarm = new BattAlarmData();
                alarm.battgroup_id = rs.getInt("BattGroupId");
                alarm.alm_id = rs.getInt("alm_id");
                alarm.alm_signal_id = rs.getInt("alm_signal_id");
                alarm.alm_cleared_type = rs.getInt("alm_cleared_type");
                alarm.mon_num = rs.getInt("monnum");
                alarm.record_id = rs.getLong("Record_Id");
                alarms.add(alarm);
                //System.out.println(alarm.record_id);
            }
            System.out.println("历史实时告警数:"+alarms.size()+"##################");
            if(alarms.size()>0) {
                for(int i=0;i<alarms.size();i++) {
                    alarm = alarms.get(i);
                    switch(alarm.alm_id) {
                        //电池单体电压
                        case FBS9600S_BattAlarm_Thread.ALM_TYPE_MonVol_High_ID:
                        case FBS9600S_BattAlarm_Thread.ALM_TYPE_MonVol_Low_ID:{
                            if(alarm.mon_num > battdata.al_MonVol.size()) {
                                continue;
                            }
                            battdata.al_MonVol.get(alarm.mon_num-1).monVol_AlarmData.alm_id = alarm.alm_id;
                            battdata.al_MonVol.get(alarm.mon_num-1).monVol_AlarmData.alm_cleared_type = alarm.alm_cleared_type;
                            battdata.al_MonVol.get(alarm.mon_num-1).monVol_AlarmData.alm_signal_id = alarm.alm_signal_id;
                        }break;
                        //电池单体温度
                        case FBS9600S_BattAlarm_Thread.ALM_TYPE_MonTmp_High_ID:
                        case FBS9600S_BattAlarm_Thread.ALM_TYPE_MonTmp_Low_ID:{
                            if(alarm.mon_num > battdata.al_MonVol.size()) {
                                continue;
                            }
                            battdata.al_MonVol.get(alarm.mon_num-1).monVol_AlarmData.alm_id = alarm.alm_id;
                            battdata.al_MonVol.get(alarm.mon_num-1).monTmp_AlarmData.alm_cleared_type = alarm.alm_cleared_type;
                            battdata.al_MonVol.get(alarm.mon_num-1).monTmp_AlarmData.alm_signal_id = alarm.alm_signal_id;
                        }break;
                        //单体内阻
                        case FBS9600S_BattAlarm_Thread.ALM_TYPE_MonRes_High_ID:
                        case FBS9600S_BattAlarm_Thread.ALM_TYPE_MonRes_Low_ID:{
                            if(alarm.mon_num > battdata.al_MonVol.size()) {
                                continue;
                            }
                            battdata.al_MonVol.get(alarm.mon_num-1).monVol_AlarmData.alm_id = alarm.alm_id;
                            battdata.al_MonVol.get(alarm.mon_num-1).monRes_AlarmData.alm_cleared_type = alarm.alm_cleared_type;
                            battdata.al_MonVol.get(alarm.mon_num-1).monRes_AlarmData.alm_signal_id = alarm.alm_signal_id;
                        }break;
                    }
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            sql.close_con();
        }
    }
    /**
     * 根据告警对象添加新的告警记录或者取消告警记录
     * @param m_Conn_Pool.getConn()
     * @param alm_data
     */
    public static void insertOrUpdateBattAlarmDataToTable(MysqlConnPool m_Conn_Pool, BattAlarmData alm_data)
    {
        Sql_Mysql sql = new Sql_Mysql(m_Conn_Pool.getConn());
        try {
            sql.sqlMysqlUseDB(Sql_Mysql.DB_ALARM);
            if(true == sql.sqlMysqlCheckIfTableExist(BattAlarmDataTableName))
            {
                //System.out.println("alm_id:"+alm_data.alm_id+"\t alm_signal_id:"+alm_data.alm_signal_id+"\t clear_type:"+alm_data.alm_cleared_type);
                //新产生的告警记录
                if(BattAlarmData.ALM_CLEARED_TYPE_NULL == alm_data.alm_cleared_type)
                {
                    BattAlarmData last_alarm = searchBattLastHistory(m_Conn_Pool,alm_data);
                    if(last_alarm != null && last_alarm.alm_id == alm_data.alm_id && last_alarm.mon_num == alm_data.mon_num && last_alarm.alm_cleared_type == BattAlarmData.ALM_CLEARED_TYPE_NULL) {
                        //当前告警记录已经在电池实时告警表中存在
                        if(last_alarm.alm_signal_id != alm_data.alm_signal_id ) {
                            //如果存在相同种类不同类型的告警    (告警名称一致;告警上下限不同)
                            //System.out.println("取消之前的告警,添加新的告警");
                            //System.out.println("电池组id"+alm_data.battgroup_id+"\t告警值:"+alm_data.alm_value);
                            last_alarm.alm_cleared_type = BattAlarmData.ALM_CLEARED_TYPE_AUTO;
                            chageRealToHistoryAlarm(m_Conn_Pool, last_alarm);            //将之前相同种类不同类型的告警变成历史告警
                            insertNewBattRealAlarm(m_Conn_Pool, alm_data);                //插入当前新的告警
                        }
                    }else{
                        //System.out.println("新告警记录"+alm_data.alm_cleared_type);
                        insertNewBattRealAlarm(m_Conn_Pool, alm_data);                    //插入新的告警记录
                        //System.out.println("直接添加新的告警记录"+alm_data.alm_cleared_type+"\t告警值:"+alm_data.alm_value+"\t record_id"+alm_data.record_id);
                    }
                } else {
                    //告警延迟结束的告警记录
                    if(BattAlarmData.ALM_CLEARED_TYPE_AUTO == alm_data.alm_cleared_type) {
                        //System.out.println("正常告警消失");
                        chageRealToHistoryAlarm(m_Conn_Pool, alm_data);                    //将实时告警变成历史告警
                    }
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            sql.close_con();
            //System.out.println("sql.close_con()");
        }
    }
    /**
     *    查询当前电池组之前是否存在当前种类的告警
     * @param alm_data
     * @return
     */
    public static BattAlarmData searchBattLastHistory(MysqlConnPool conn_pool,BattAlarmData alm_data) {
        BattAlarmData battalarm = null;
        String sql_str = " SELECT * FROM db_alarm.tb_battalarm_data WHERE BattGroupId = " +alm_data.battgroup_id+ " AND alm_id = " + alm_data.alm_id + " AND alm_cleared_type != 1 AND MonNum = "+alm_data.mon_num;
        Sql_Mysql sql = new Sql_Mysql(conn_pool.getConn());
        ResultSet rs = null;
        try {
            rs = sql.sqlMysqlQuery(sql_str);
            if(rs.next()){
                battalarm = new BattAlarmData();
                battalarm.battgroup_id = rs.getInt("BattGroupId");
                battalarm.mon_num = rs.getInt("MonNum");
                battalarm.record_id = rs.getLong("Record_Id");
                battalarm.alm_id = rs.getInt("alm_id");
                battalarm.alm_signal_id = rs.getInt("alm_signal_id");
                battalarm.alm_signal_level = rs.getInt("alm_level");
                battalarm.alm_start_time = rs.getTimestamp("alm_start_time");
                battalarm.alm_end_time = rs.getTimestamp("alm_end_time");
                battalarm.alm_value = rs.getFloat("alm_value");
                battalarm.alm_is_confirmed = rs.getBoolean("alm_is_confirmed");
                battalarm.alm_confirmed_Time = rs.getTimestamp("alm_confirmed_time");
                battalarm.alm_cleared_type = rs.getInt("alm_cleared_type");
                battalarm.usr_id = rs.getInt("usr_Id");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            sql.close_con();
        }
        return battalarm;
    }
    /**
     *     将当前告警变成历史告警
     * @param m_Conn_Pool
     * @param alm_data
     */
    public static void chageRealToHistoryAlarm(MysqlConnPool m_Conn_Pool, BattAlarmData alm_data) {
        String sql_str = " UPDATE " + BattAlarmDataTableName
                + " SET "
                + " alm_end_time='" + Com.getDateTimeFormat(alm_data.alm_end_time, Com.DTF_YMDhms) + "', "
                + " alm_cleared_type=" + alm_data.alm_cleared_type
                + " WHERE MonNum ="+alm_data.mon_num+" AND BattGroupId ="+alm_data.battgroup_id+" AND alm_id ="+alm_data.alm_id + " AND alm_signal_id = " + alm_data.alm_signal_id;
        Sql_Mysql sql = new Sql_Mysql(m_Conn_Pool.getConn());
        try {
            sql.sqlMysqlUseDB(Sql_Mysql.DB_ALARM);
            sql.sqlMysqlExecute(sql_str);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            sql.close_con();
        }
    }
    public static void insertNewBattRealAlarm(MysqlConnPool m_Conn_Pool, BattAlarmData alm_data) {
        Sql_Mysql sql = new Sql_Mysql(m_Conn_Pool.getConn());
        String sql_str = " INSERT INTO " + BattAlarmDataTableName + " "
                + "(BattGroupId, "
                + "MonNum, "
                + "Record_Id, "
                + "alm_id, "
                + "alm_signal_id, "
                + "alm_level, "
                + "alm_start_time, "
                + "alm_end_time, "
                + "alm_value, "
                + "alm_is_confirmed, "
                + "alm_confirmed_time, "
                + "alm_cleared_type, "
                + "usr_Id) "
                + " VALUES "
                + "("
                + alm_data.battgroup_id + ", "
                + alm_data.mon_num + ", "
                + alm_data.record_id + ", "
                + alm_data.alm_id + ", "
                + alm_data.alm_signal_id + ", "
                + alm_data.alm_signal_level + ", "
                + "'" + Com.getDateTimeFormat(alm_data.alm_start_time, Com.DTF_YMDhms) + "', "
                + "'" + Com.getDateTimeFormat(alm_data.alm_end_time, Com.DTF_YMDhms) + "', "
                + alm_data.alm_value + ", "
                + alm_data.alm_is_confirmed + ", "
                + "'" + Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms) + "', "
                + alm_data.alm_cleared_type + ", "
                + alm_data.usr_id
                + ")";
        try {
            sql.sqlMysqlUseDB(Sql_Mysql.DB_ALARM);
            sql.sqlMysqlExecute(sql_str);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            sql.close_con();
        }
    }
    /**
     *    查询实时告警表中的所有变成历史告警的记录
     * @param alm_data
     * @return
     */
    public static List<BattAlarmData> searchAllHistAlarmFromReal(MysqlConnPool conn_pool) {
        List<BattAlarmData> alarms = new ArrayList<BattAlarmData>();
        String sql_str = " SELECT * FROM db_alarm.tb_battalarm_data WHERE alm_id NOT IN(119010,119011) AND alm_cleared_type = 1";
        Sql_Mysql sql = new Sql_Mysql(conn_pool.getConn());
        ResultSet rs = null;
        try {
            rs = sql.sqlMysqlQuery(sql_str);
            BattAlarmData battalarm;
            if(rs.next()){
                battalarm = new BattAlarmData();
                battalarm.battgroup_id = rs.getInt("BattGroupId");
                battalarm.mon_num = rs.getInt("MonNum");
                battalarm.record_id = rs.getLong("Record_Id");
                battalarm.alm_id = rs.getInt("alm_id");
                battalarm.alm_signal_id = rs.getInt("alm_signal_id");
                battalarm.alm_signal_level = rs.getInt("alm_level");
                battalarm.alm_start_time = rs.getTimestamp("alm_start_time");
                battalarm.alm_end_time = rs.getTimestamp("alm_end_time");
                battalarm.alm_value = rs.getFloat("alm_value");
                battalarm.alm_is_confirmed = rs.getBoolean("alm_is_confirmed");
                battalarm.alm_confirmed_Time = rs.getTimestamp("alm_confirmed_time");
                battalarm.alm_cleared_type = rs.getInt("alm_cleared_type");
                battalarm.usr_id = rs.getInt("usr_Id");
                alarms.add(battalarm);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            sql.close_con();
        }
        return alarms;
    }
    /**
     * 判断当前告警之前是否存在当前电池组当前中类的告警,存在则取消当前的实时告警,变成历史告警
     * @param m_Conn_Pool.getConn()
     * @param alm_data
     */
    public static void checkBattAlarmData(MysqlConnPool m_Conn_Pool, BattAlarmData alm_data)
    {
        //查询实时记录表中是否存在当前种类的实时告警记录
        String sql_str0 = "SELECT * FROM tb_battalarm_data "
                + " WHERE alm_id NOT IN(119010,119011) AND MonNum ="+alm_data.mon_num+" "
                + " AND BattGroupId ="+alm_data.battgroup_id+" AND alm_cleared_type != 0 "
                + " AND alm_id ="+alm_data.alm_id;
        //将当前的电池实时告警变成历史告警
        String sql_str1 = " UPDATE tb_battalarm_data "
                + " SET alm_cleared_type = 1, "
                + " alm_end_time='" + Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms) + "' "
                + " WHERE alm_id NOT IN(119010,119011) AND MonNum ="+alm_data.mon_num+" AND alm_cleared_type = 1"
                + " AND BattGroupId ="+alm_data.battgroup_id+" AND alm_id ="+alm_data.alm_id;
        //将当前的实时告警记录插入到历史告警表中  (不包括容量告警记录)
        String sql_str2 = "INSERT INTO tb_battalarm_data_history"
                        + "(BattGroupId,MonNum,Record_Id,alm_id,alm_signal_id,alm_level,alm_start_time,alm_end_time,alm_value,alm_is_confirmed,alm_confirmed_time,alm_cleared_type,usr_Id) "
                        + "(SELECT BattGroupId,MonNum,Record_Id,alm_id,alm_signal_id,alm_level,alm_start_time,alm_end_time,alm_value,alm_is_confirmed,alm_confirmed_time,alm_cleared_type,usr_Id from tb_battalarm_data "
                            + " WHERE alm_id NOT IN(119010,119011) AND MonNum ="+alm_data.mon_num+" AND BattGroupId ="+alm_data.battgroup_id+" "
                            + " AND alm_cleared_type = 1 AND alm_id ="+alm_data.alm_id+ " AND alm_signal_id = " + alm_data.alm_signal_id
                        + ")";
        //将实时告警表中的告警记录清空(不包括容量告警记录)
        String sql_str3 = "DELETE FROM tb_battalarm_data "
                + " WHERE alm_id NOT IN(119010,119011) AND MonNum ="+alm_data.mon_num + " "
                + " AND BattGroupId ="+alm_data.battgroup_id+" AND alm_cleared_type =1 "
                + " AND alm_id ="+alm_data.alm_id + " AND alm_signal_id = " + alm_data.alm_signal_id;
        Sql_Mysql sql = new Sql_Mysql(m_Conn_Pool.getConn());
        try {
            sql.sqlMysqlUseDB(Sql_Mysql.DB_ALARM);
            //ResultSet rs = sql.sqlMysqlQuery(sql_str0);
            //if(rs.next()){
                //System.out.println("告警类型:"+alm_data.alm_id+"\t电池组id"+alm_data.battgroup_id+"\t 单体编号"+alm_data.mon_num);
                //如果存在当前电池组,当前种类的告警记录,就将之前的告警记录存入历史告警记录,并删除实时告警中的告警记录
                ArrayList<String> sql_strs = new ArrayList<String>();
                //sql_strs.add(sql_str1);
                sql_strs.add(sql_str2);
                sql_strs.add(sql_str3);
                sql.makeManualCommit(sql_strs);
                //sql.sqlMysqlExecute(sql_str1);
                //sql.sqlMysqlExecute(sql_str2);
                //sql.sqlMysqlExecute(sql_str3);
            //}
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            sql.close_con();
        }
    }
}
BattMonitor_FBS9600SMore/src/main/main_MonitorServer_FBS9600SMore.java
@@ -12,6 +12,7 @@
import com.dev_fbs9600.data.FBS9600_ServerSocket_Thread;
import com.dev_fbs9600.data.FBS9600_Task_Thread;
import com.dev_fbs9600s.data.Batt_RealDataRecord_Thread;
import com.dev_fbs9600s.data.FBS9600S_BattAlarm_Thread;
import com.dev_fbs9600s.data.FBS9600S_ServerSocket_Thread;
import com.dev_fbs9600s.data.FBS9600S_SocketClient_Thread_SQL;
@@ -206,6 +207,11 @@
            batt_test.start();
        }
        
        {
            FBS9600S_BattAlarm_Thread alm_thread = new FBS9600S_BattAlarm_Thread(GB_MysqlConnPool, GB_DataArray);
            new Thread(alm_thread).start();
        }
        //更新以及创建tb_BattResData_id表 以及创建tb_battresdata_inf表和添加数据
        if(true == m_AppConfig.getBattResStoreFnEn()) 
        {