BattMonitor_FBS9600SMore/src/com/battmonitor/data/BattAlarmData.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
BattMonitor_FBS9600SMore/src/com/battmonitor/data/BattAlarmParam.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
BattMonitor_FBS9600SMore/src/com/battmonitor/data/BattData_RT.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
BattMonitor_FBS9600SMore/src/com/battmonitor/data/MonVolData.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/Batt_RealDataRecord_Thread_SQL.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/FBS9600S_BattAlarm_Thread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/FBS9600S_BattAlarm_Thread_SQL.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
BattMonitor_FBS9600SMore/src/main/main_MonitorServer_FBS9600SMore.java | ●●●●● 补丁 | 查看 | 原始文档 | 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()) {