ElectricalSystem_MonitorServer_4KW/src/com/electrical/FourKW/DeviceAlarm.java
New file @@ -0,0 +1,24 @@ package com.electrical.FourKW; import java.util.Date; public class DeviceAlarm { public int dev_id; //设备id public int alarm_id; //告警id public Date alarm_starttime; //告警开始时间 public Date alarm_endtime; //告警结束时间 public int alarm_confirm; //告警确认 public Date alarm_confirmtime; //告警确认时间 public String note; public DeviceAlarm(int dev_id,int alarm_id) { Date time = new Date(); this.dev_id = dev_id; this.alarm_id = alarm_id; this.alarm_starttime = time; this.alarm_endtime = time; this.alarm_confirmtime = time; } } ElectricalSystem_MonitorServer_4KW/src/com/electrical/FourKW/DeviceAlarm_Thread.java
New file @@ -0,0 +1,71 @@ package com.electrical.FourKW; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.base.Com; import com.sql.MysqlConnPool; public class DeviceAlarm_Thread implements Runnable{ public MysqlConnPool pool; public List<Electric_inf> einfs; public List<Electric_alarm> last_alarms; //上一次的告警对象 public DeviceAlarm_Thread(MysqlConnPool pool,List<Electric_inf> einfs) { this.pool = pool; this.einfs = einfs; last_alarms = new ArrayList<>(); init(); } public void init() { for(int i = 0;i<einfs.size();i++) { Electric_alarm alarm = new Electric_alarm(einfs.get(i).electric_id); //加载之前的告警记录 DeviceAlarm_Thread_SQL.searchLastDeviceAlarm(pool, alarm); last_alarms.add(alarm); } } @Override public void run() { System.out.println("DeviceAlarm_Thread Start at "+Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms)); List<DeviceAlarm> addalarm = new ArrayList<DeviceAlarm>(); //新出现的告警 List<DeviceAlarm> delalarm = new ArrayList<DeviceAlarm>(); //消失的告警 while(true) { try { for(int i = 0;i < einfs.size();i ++) { //读取过当前设备的告警才检测告警 if(einfs.get(i).alarm.isReadOk) { einfs.get(i).alarm.checkAlarm(last_alarms.get(i),addalarm,delalarm); last_alarms.set(i, einfs.get(i).alarm.clone()); } } if(addalarm.size() > 0) { //新出现的告警记录 DeviceAlarm_Thread_SQL.insertNewAlarm(pool,addalarm); addalarm.clear(); } if(delalarm.size() > 0) { //取消的告警记录 for(int k = 0;k<delalarm.size();k++) { DeviceAlarm_Thread_SQL.makeRealToHistory(pool,delalarm.get(k)); } delalarm.clear(); } Thread.sleep(1000); } catch (Exception e) { try { Thread.sleep(5000); } catch (InterruptedException e1) { e1.printStackTrace(); } e.printStackTrace(); } } } } ElectricalSystem_MonitorServer_4KW/src/com/electrical/FourKW/DeviceAlarm_Thread_SQL.java
New file @@ -0,0 +1,105 @@ package com.electrical.FourKW; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.base.Com; import com.sql.MysqlConnPool; import com.sql.Sql_Mysql; public class DeviceAlarm_Thread_SQL { /** * 插入新的告警记录 * @param pool * @param addalarm */ public static void insertNewAlarm(MysqlConnPool pool, List<DeviceAlarm> addalarm) { String sql_str = "INSERT INTO "+Sql_Mysql.Tb_Electric_alarm+"(electric_id,alarm_id,alarm_starttime,alarm_endtime,alarm_confirmtime) VALUES "; for(int i=0;i<addalarm.size();i++) { DeviceAlarm alarm = addalarm.get(i); if(i > 0) { sql_str += ","; } sql_str += "(" + alarm.dev_id +"," + alarm.alarm_id + ",'" + Com.getDateTimeFormat(alarm.alarm_starttime, Com.DTF_YMDhms) +"','" + Com.getDateTimeFormat(alarm.alarm_endtime, Com.DTF_YMDhms) +"','" + Com.getDateTimeFormat(alarm.alarm_confirmtime, Com.DTF_YMDhms) +"'" + ")"; } Sql_Mysql sql = null; try { sql = new Sql_Mysql(pool.getConn()); sql.sqlMysqlExecute(sql_str); } catch (SQLException e) { e.printStackTrace(); } finally { sql.close_con(); } } /** * 将实时告警变成历史告警记录 * @param pool * @param delalarm */ public static void makeRealToHistory(MysqlConnPool pool, DeviceAlarm delalarm) { String sql_str_upd = "UPDATE "+Sql_Mysql.Tb_Electric_alarm+" SET alarm_endtime = '"+Com.getDateTimeFormat(delalarm.alarm_endtime, Com.DTF_YMDhms)+"'" + " WHERE electric_id = "+delalarm.dev_id+" AND alarm_id = " +delalarm.alarm_id; //更新当前告警的结束时间 Sql_Mysql sql = new Sql_Mysql(pool.getConn()); try { sql.sqlMysqlExecute(sql_str_upd); //插入历史告警 String sql_str_ins = "INSERT INTO "+Sql_Mysql.Tb_Electric_alarm_history+"(electric_id,alarm_id,alarm_starttime,alarm_endtime,alarm_confirm,alarm_confirmtime) " + " (SELECT electric_id,alarm_id,alarm_starttime,alarm_endtime,alarm_confirm,alarm_confirmtime " + " FROM "+Sql_Mysql.Tb_Electric_alarm + " WHERE electric_id = "+delalarm.dev_id+" AND alarm_id = "+delalarm.alarm_id + " )"; //删除实时告警记录 String sql_str_del = "DELETE FROM "+Sql_Mysql.Tb_Electric_alarm+" WHERE electric_id = "+delalarm.dev_id+" AND alarm_id = "+delalarm.alarm_id; ArrayList<String> sql_strs = new ArrayList<String>(); sql_strs.add(sql_str_ins); sql_strs.add(sql_str_del); sql.makeManualCommit(sql_strs); } catch (SQLException e) { e.printStackTrace(); } finally { sql.close_con(); } } /** * 查询当前设备上一次的历史告警记录表 * @param pool * @param alarm */ public static void searchLastDeviceAlarm(MysqlConnPool pool,Electric_alarm alarm) { String sql_str = "SELECT * FROM "+Sql_Mysql.Tb_Electric_alarm+" WHERE electric_id = " + alarm.electric_id; ResultSet res = null; Sql_Mysql sql = new Sql_Mysql(pool.getConn()); try { res = sql.sqlMysqlQuery(sql_str); while(res.next()) { //加载当前设备之前的实时告警记录 alarm.setAlarmStateByAlarm_id(res.getInt("alarm_id")); } } catch (SQLException e) { e.printStackTrace(); } finally { if(res != null) { try { res.close(); } catch (SQLException e) { e.printStackTrace(); } } sql.close_con(); } } } ElectricalSystem_MonitorServer_4KW/src/com/electrical/FourKW/Electric_alarm.java
@@ -1,13 +1,12 @@ package com.electrical.FourKW; import java.util.Date; import java.util.List; import com.base.Com; import com.modbus.data.MyModbusMaster; import com.modbus.data.MyModbusUtils; import com.serotonin.modbus4j.BatchRead; import com.serotonin.modbus4j.BatchResults; import com.serotonin.modbus4j.code.DataType; public class Electric_alarm { public int num ;//'主键', @@ -19,22 +18,41 @@ public Date alarm_confirmtime ;//'告警确认时间', public String note ;// '', public int dcover_curr; public int synchro_lose; public int dcover_vol; public int case_pulse_block; public int case_transA_overcurr; public int case_transB_overcurr; public int case_transC_overcurr; public int case_cuurfeedback_lose; public int case_synchro_cycle_fault; public int main_cabinet_fault_one; public int main_cabinet_fault_two; public int dcover_curr; //直流过流 public int synchro_lose; //同步丢失 public int dcover_vol; //直流过压 public int case_pulse_block; //机箱脉冲封锁 public int case_transA_overcurr; //机箱变压器A相过流 public int case_transB_overcurr; //机箱变压器B相过流 public int case_transC_overcurr; //机箱变压器C相过流 public int case_cuurfeedback_lose; //机箱直流反馈丢失 public int case_synchro_cycle_fault; //机箱同步周期故障 public int main_cabinet_fault_one; //1号主柜快熔故障 public int main_cabinet_fault_two; //2号主柜快熔故障 public boolean isReadOk = false; //是否更新过告警状态 public Electric_alarm(int electric_id) { super(); this.electric_id=electric_id; } public Electric_alarm clone() { Electric_alarm alarm = new Electric_alarm(this.electric_id); alarm.dcover_curr = this.dcover_curr; //直流过流 alarm.synchro_lose = this.synchro_lose; //同步丢失 alarm.dcover_vol = this.dcover_vol; //直流过压 alarm.case_pulse_block = this.case_pulse_block; //机箱脉冲封锁 alarm.case_transA_overcurr = this.case_transA_overcurr; //机箱变压器A相过流 alarm.case_transB_overcurr = this.case_transB_overcurr; //机箱变压器B相过流 alarm.case_transC_overcurr = this.case_transC_overcurr; //机箱变压器C相过流 alarm.case_cuurfeedback_lose = this.case_cuurfeedback_lose; //机箱直流反馈丢失 alarm.case_synchro_cycle_fault = this.case_synchro_cycle_fault; //机箱同步周期故障 alarm.main_cabinet_fault_one = this.main_cabinet_fault_one; //1号主柜快熔故障 alarm.main_cabinet_fault_two = this.main_cabinet_fault_two; //2号主柜快熔故障 return alarm; } public int getNum() { return num; } @@ -130,5 +148,164 @@ this.main_cabinet_fault_one = MyModbusUtils.readBooleanToInt(res.getValue(9)); //1号主柜快熔故障 this.main_cabinet_fault_two = MyModbusUtils.readBooleanToInt(res.getValue(10)); //2号主柜快熔故障 } } /** * 根据当前的设备id设置当前告警值 * @param alarm_id */ public void setAlarmStateByAlarm_id(int alarm_id) { switch(alarm_id) { case 119001:this.dcover_curr = 1;break; case 119002:this.synchro_lose = 1;break; case 119003:this.dcover_vol = 1;break; case 119004:this.case_pulse_block = 1;break; case 119005:this.case_transA_overcurr = 1;break; case 119006:this.case_transB_overcurr = 1;break; case 119007:this.case_transC_overcurr = 1;break; case 119008:this.case_cuurfeedback_lose = 1;break; case 119009:this.case_synchro_cycle_fault = 1;break; case 119010:this.main_cabinet_fault_one = 1;break; case 119011:this.main_cabinet_fault_two = 1;break; } } /** * 根据当前的设备id设置当前告警值 * @param alarm_id */ public int getAlarmIdByStr(String str) { switch(str) { case "dcover_curr":return 119001; case "synchro_lose":return 119002; case "dcover_vol":return 119003; case "case_pulse_block":return 119004; case "case_transA_overcurr":return 119005; case "case_transB_overcurr":return 119006; case "case_transC_overcurr":return 119007; case "case_cuurfeedback_lose":return 119008; case "case_synchro_cycle_fault":return 119009; case "main_cabinet_fault_one":return 119010; case "main_cabinet_fault_two":return 119011; } return 0; } /** * 检测告警触发和消失 * @param electric_alarm * @param addalarm * @param delalarm */ public void checkAlarm(Electric_alarm last_alarm, List<DeviceAlarm> addalarm, List<DeviceAlarm> delalarm) { if(this.dcover_curr > last_alarm.dcover_curr) { //出现新的告警记录 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("dcover_curr")); addalarm.add(alarm); }else if(this.dcover_curr < last_alarm.dcover_curr) { //告警消失 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("dcover_curr")); delalarm.add(alarm); } if(this.synchro_lose > last_alarm.synchro_lose) { //出现新的告警记录 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("synchro_lose")); addalarm.add(alarm); }else if(this.synchro_lose < last_alarm.synchro_lose) { //告警消失 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("synchro_lose")); delalarm.add(alarm); } if(this.dcover_vol > last_alarm.dcover_vol) { //出现新的告警记录 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("dcover_vol")); addalarm.add(alarm); }else if(this.dcover_vol < last_alarm.dcover_vol) { //告警消失 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("dcover_vol")); delalarm.add(alarm); } if(this.case_pulse_block > last_alarm.case_pulse_block) { //出现新的告警记录 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("case_pulse_block")); addalarm.add(alarm); }else if(this.case_pulse_block < last_alarm.case_pulse_block) { //告警消失 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("case_pulse_block")); delalarm.add(alarm); } if(this.case_transA_overcurr > last_alarm.case_transA_overcurr) { //出现新的告警记录 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("case_transA_overcurr")); addalarm.add(alarm); }else if(this.case_transA_overcurr < last_alarm.case_transA_overcurr) { //告警消失 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("case_transA_overcurr")); delalarm.add(alarm); } if(this.case_transB_overcurr > last_alarm.case_transB_overcurr) { //出现新的告警记录 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("case_transB_overcurr")); addalarm.add(alarm); }else if(this.case_transB_overcurr < last_alarm.case_transB_overcurr) { //告警消失 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("case_transB_overcurr")); delalarm.add(alarm); } if(this.case_transC_overcurr > last_alarm.case_transC_overcurr) { //出现新的告警记录 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("case_transC_overcurr")); addalarm.add(alarm); }else if(this.case_transC_overcurr < last_alarm.case_transC_overcurr) { //告警消失 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("case_transC_overcurr")); delalarm.add(alarm); } if(this.case_cuurfeedback_lose > last_alarm.case_cuurfeedback_lose) { //出现新的告警记录 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("case_cuurfeedback_lose")); addalarm.add(alarm); }else if(this.case_cuurfeedback_lose < last_alarm.case_cuurfeedback_lose) { //告警消失 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("case_cuurfeedback_lose")); delalarm.add(alarm); } if(this.case_synchro_cycle_fault > last_alarm.case_synchro_cycle_fault) { //出现新的告警记录 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("case_synchro_cycle_fault")); addalarm.add(alarm); }else if(this.case_synchro_cycle_fault < last_alarm.case_synchro_cycle_fault) { //告警消失 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("case_synchro_cycle_fault")); delalarm.add(alarm); } if(this.main_cabinet_fault_one > last_alarm.main_cabinet_fault_one) { //出现新的告警记录 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("main_cabinet_fault_one")); addalarm.add(alarm); }else if(this.main_cabinet_fault_one < last_alarm.main_cabinet_fault_one) { //告警消失 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("main_cabinet_fault_one")); delalarm.add(alarm); } if(this.main_cabinet_fault_two > last_alarm.main_cabinet_fault_two) { //出现新的告警记录 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("main_cabinet_fault_two")); addalarm.add(alarm); }else if(this.main_cabinet_fault_two < last_alarm.main_cabinet_fault_two) { //告警消失 DeviceAlarm alarm = new DeviceAlarm(this.electric_id, getAlarmIdByStr("main_cabinet_fault_two")); delalarm.add(alarm); } } } ElectricalSystem_MonitorServer_4KW/src/com/electrical/FourKW/Electric_inf.java
@@ -13,6 +13,7 @@ public Electric_State state; public Electric_Control_Single control; public Electric_Control_Single control_joint; //联动控制 public Electric_alarm alarm; public Electric_inf(int electric_id) { this.electric_id = electric_id; @@ -20,6 +21,7 @@ this.state = new Electric_State(electric_id); this.control = new Electric_Control_Single(electric_id); this.control_joint = new Electric_Control_Single(electric_id); this.alarm = new Electric_alarm(electric_id); } public int getElectric_id() { ElectricalSystem_MonitorServer_4KW/src/com/electrical/FourKW/Electrical_4KW_SocketClient_Thread.java
@@ -35,13 +35,22 @@ this.conn_pool = conn_pool; this.einf = einf; ert = new Electric_Rt(einf.getElectric_id()); estate = new Electric_State(einf.getElectric_id()); ecs = new Electric_Control_Single(einf.getElectric_id()); eAlarm=new Electric_alarm(einf.getElectric_id()); listAlarm=new ArrayList<Electric_alarm>(); master = new MyModbusMaster(einf.getElectric_ip(), MyModbusMaster.SLAVEID_DEFAULT); ert = einf.rt; estate = einf.state; eAlarm = einf.alarm; /* ert = new Electric_Rt(einf.getElectric_id()); estate = new Electric_State(einf.getElectric_id()); eAlarm=new Electric_alarm(einf.getElectric_id()); */ econn=new Electric_control_conn(einf.electric_id); ecs = new Electric_Control_Single(einf.getElectric_id()); listAlarm=new ArrayList<Electric_alarm>(); master = new MyModbusMaster(einf.getElectric_ip(), MyModbusMaster.SLAVEID_DEFAULT); } @@ -91,7 +100,7 @@ //*************************** 读取故障状态信息 ******************************//* //Date start = new Date(); readMutilElectricalAlarmData(master,eAlarm); Electrical_Task_SQL.insertOrUpdateElectrical_alarmTable(conn_pool, listAlarm); //Electrical_Task_SQL.insertOrUpdateElectrical_alarmTable(conn_pool, listAlarm); //Date end = new Date(); //System.out.println((end.getTime()-start.getTime())/1000); } @@ -486,8 +495,9 @@ BatchResults<Integer> res = MyModbusUtils.readMutilRegisters(batch, master); eAlarm.putBatchResult(res); eAlarm.isReadOk = true; //筛选告警信息 if(res != null) { /*if(res != null) { if(eAlarm.dcover_curr>0) { Electric_alarm alarm=new Electric_alarm(eAlarm.electric_id); alarm.setAlarm_id(119001); @@ -589,7 +599,7 @@ alarm.setAlarm_confirmtime(new Date()); listAlarm.add(alarm); } } }*/ } /** ElectricalSystem_MonitorServer_4KW/src/main/main_ElectricalSystem_MonitorServer_4KW.java
@@ -8,6 +8,7 @@ import com.base.Com; import com.config.AppConfig; import com.config.AppParam; import com.electrical.FourKW.DeviceAlarm_Thread; import com.electrical.FourKW.Electric_4KW_HistoryData_Thread; import com.electrical.FourKW.Electric_4Kw_ServerSocket_Thread; import com.electrical.FourKW.Electric_All_ServerSocket_Thread; @@ -72,6 +73,11 @@ } { DeviceAlarm_Thread alm_thread = new DeviceAlarm_Thread(GB_MysqlConnPool, einfs); new Thread(alm_thread).start(); } //System.out.println("PLC_ip:"+PLC_ip); //读取4套电源总信息和开关信息//读取每套电源系统的信息 /*Electric_All_ServerSocket_Thread serverALL = new Electric_All_ServerSocket_Thread(GB_MysqlConnPool,PLC_ip);