添加历史上实时数据记录线程以及修复数据更新缓慢bug
| | |
| | | |
| | | <root> |
| | | <mysql_ramdb_recreate_en>false</mysql_ramdb_recreate_en> |
| | | <mysql_server_ip>118.89.139.230</mysql_server_ip> |
| | | <mysql_server_ip>127.0.0.1</mysql_server_ip> |
| | | <!--SOURCE_BATTDATA_TYPE_FBSDEV = 0--> |
| | | <!--SOURCE_BATTDATA_TYPE_SQLSERVER = 1--> |
| | | <!--SOURCE_BATTDATA_TYPE_C_INTERFACE = 2--> |
New file |
| | |
| | | package com.electrical.FourKW;
|
| | |
|
| | | import java.util.Date;
|
| | | import java.util.HashMap;
|
| | | import java.util.List;
|
| | | import java.util.Map;
|
| | | import com.base.Com;
|
| | | import com.config.AppConfig;
|
| | | import com.sql.MysqlConnPool;
|
| | |
|
| | | public class Electric_4KW_HistoryData_Thread implements Runnable{
|
| | | public static final int SaveDataTimeInterval = 3;
|
| | | |
| | | public MysqlConnPool pool;
|
| | | public AppConfig config;
|
| | | public List<Electric_inf> elects;
|
| | | public Map<Integer,Electric_Record_Thread> threads = new HashMap<Integer,Electric_Record_Thread>();
|
| | | |
| | | |
| | | public Electric_4KW_HistoryData_Thread(MysqlConnPool pool,AppConfig config,List<Electric_inf> elects) {
|
| | | this.config = config;
|
| | | this.pool = pool;
|
| | | this.elects = elects;
|
| | | }
|
| | | |
| | | @Override
|
| | | public void run() {
|
| | | System.out.println("Electric_4KW_HistoryData_Thread Start at " + Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms));
|
| | | for(int i = 0;i<elects.size();i++) {
|
| | | Electric_Record_Thread thread = new Electric_Record_Thread(elects.get(i), pool, config);
|
| | | threads.put(elects.get(i).electric_id, thread);
|
| | | new Thread(thread).start();
|
| | | }
|
| | | while(true) {
|
| | | try {
|
| | | Thread.sleep(10000);
|
| | | for(int i = 0;i<elects.size();i++) {
|
| | | Electric_Record_Thread thread = threads.get(elects.get(i).electric_id);
|
| | | if(thread == null) {
|
| | | thread = new Electric_Record_Thread(elects.get(i), pool, config);
|
| | | threads.put(elects.get(i).electric_id, thread);
|
| | | new Thread(thread).start();
|
| | | }
|
| | | }
|
| | | } catch (Exception e) {
|
| | | try {
|
| | | Thread.sleep(5000);
|
| | | } catch (InterruptedException e1) {
|
| | | e1.printStackTrace();
|
| | | }
|
| | | e.printStackTrace();
|
| | | }
|
| | | }
|
| | | }
|
| | | |
| | | |
| | | class Electric_Record_Thread implements Runnable{
|
| | | public Electric_inf elect;
|
| | | public MysqlConnPool pool;
|
| | | public AppConfig cfg;
|
| | | public Electric_Rt rt;
|
| | | |
| | | public Electric_Record_Thread(Electric_inf elect,MysqlConnPool pool,AppConfig cfg) {
|
| | | this.elect = elect;
|
| | | this.pool = pool;
|
| | | this.cfg = cfg;
|
| | | this.rt = new Electric_Rt(elect.electric_id);
|
| | | }
|
| | |
|
| | | @Override
|
| | | public void run() { |
| | | //创建历史数据表
|
| | | Electrical_Task_SQL.createTb_Electric_Readhist_DataTable(pool,elect.electric_id);
|
| | | while(true) {
|
| | | try {
|
| | | //System.out.println(elect.lose_conn+"##########");
|
| | | Thread.sleep(SaveDataTimeInterval*1000);
|
| | | if(elect.lose_conn) {
|
| | | //断开连接的停止记录
|
| | | continue;
|
| | | }
|
| | | //获取当前状态值
|
| | | Electrical_Task_SQL.queryElectric_RtById(rt,pool);
|
| | | |
| | | Electrical_Task_SQL.recordHistoryData(pool,rt);
|
| | | |
| | | } catch (Exception e) {
|
| | | try {
|
| | | Thread.sleep(3000);
|
| | | } catch (InterruptedException e1) {
|
| | | //e1.printStackTrace();
|
| | | }
|
| | | e.printStackTrace();
|
| | | }
|
| | | }
|
| | | }
|
| | | }
|
| | | }
|
| | |
| | | public int electric_type; |
| | | public String electric_ip; |
| | | public String note; |
| | | public boolean lose_conn = true; //是否失去连接 |
| | | |
| | | |
| | | public Electric_Rt rt; |
| | | public Electric_State state; |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | @Override |
| | | public void run() { |
| | | int runCount = 0; |
| | | Date last = new Date(); |
| | | while(true) { |
| | | try { |
| | | Electrical_Task_SQL.queryElectric_Control_Single(conn_pool, ecs); |
| | |
| | | //System.out.println((end.getTime()-start.getTime())/1000); |
| | | } |
| | | |
| | | //System.out.println(einf.electric_id+"====="+((new Date()).getTime()-last.getTime())/1000); |
| | | last = new Date(); |
| | | |
| | | //判断当前设备是否断开连接 |
| | | if(master.getTotalerr() >3) { |
| | | einf.lose_conn = true; |
| | | }else { |
| | | einf.lose_conn = false; |
| | | } |
| | | |
| | | if(runCount%10 == 0) { |
| | | //更新当前设备ip |
| | | master.setTarget_ip(einf.electric_ip); |
| | |
| | | import java.security.interfaces.RSAKey; |
| | | import java.sql.ResultSet; |
| | | import java.sql.SQLException; |
| | | import java.util.Date; |
| | | import java.util.Iterator; |
| | | import java.util.List; |
| | | |
| | | import com.base.Com; |
| | | import com.mysql.jdbc.EscapeTokenizer; |
| | | import com.sql.MysqlConnPool; |
| | | import com.sql.Sql_Mysql; |
| | |
| | | } |
| | | //插入或更新电源实时信息表 |
| | | public static void replace_Electric_Rt(MysqlConnPool pool,Electric_Rt ert) { |
| | | String sql_str = " replace into "+ Sql_Mysql.Tb_Electric_Rt +"(electric_id,upsetcurr,upsetvol,convolcontrol,concurrcontrol,othermodes,parallelmodes,startposition,stopposition,resetposition,fanstart,fanstop,dcvol,dccurr,controlangle,loopflag,remoteflag,orderflag,consvolcurrflag,powerstartflag,workmodelflag) " |
| | | + " values("+ert.electric_id+","+ert.upsetcurr+","+ert.upsetvol+","+ert.convolcontrol+","+ert.concurrcontrol+","+ert.othermodes+","+ert.parallelmodes+","+ert.startposition+","+ert.stopposition+","+ert.resetposition+","+ert.fanstart+","+ert.fanstop+","+ert.dcvol+","+ert.dccurr+","+ert.controlangle+","+ert.loopflag+","+ert.remoteflag+","+ert.orderflag+","+ert.consvolcurrflag+","+ert.powerstartflag+","+ert.workmodelflag+")"; |
| | | String sql_str = " replace into "+ Sql_Mysql.Tb_Electric_Rt +"(electric_id,upsetcurr,upsetvol,convolcontrol,concurrcontrol,othermodes,parallelmodes,startposition,stopposition,resetposition,fanstart,fanstop,dcvol,dccurr,controlangle,loopflag,remoteflag,orderflag,consvolcurrflag,powerstartflag,workmodelflag,switchon_1,switchoff_1,switchon_2,switchoff_2) " |
| | | + " values("+ert.electric_id+","+ert.upsetcurr+","+ert.upsetvol+","+ert.convolcontrol+","+ert.concurrcontrol+","+ert.othermodes+","+ert.parallelmodes+","+ert.startposition+","+ert.stopposition+","+ert.resetposition+","+ert.fanstart+","+ert.fanstop+","+ert.dcvol+","+ert.dccurr+","+ert.controlangle+","+ert.loopflag+","+ert.remoteflag+","+ert.orderflag+","+ert.consvolcurrflag+","+ert.powerstartflag+","+ert.workmodelflag+","+ert.switchon_1+","+ert.switchoff_1+","+ert.switchon_2+","+ert.switchoff_2+")"; |
| | | Sql_Mysql sql = new Sql_Mysql(pool.getConn()); |
| | | try { |
| | | sql.sqlMysqlExecute(sql_str); |
| | |
| | | sql.close_con(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 创建历史实时数据表 |
| | | * @param pool |
| | | * @param electric_id |
| | | */ |
| | | public static void createTb_Electric_Readhist_DataTable(MysqlConnPool pool,int electric_id) { |
| | | String sql_str = "CREATE TABLE IF NOT EXISTS " + Sql_Mysql.Tb_Electric_Readhist_Data + electric_id + " (" + |
| | | " num bigint(20) NOT NULL AUTO_INCREMENT," + |
| | | " electric_id int(11) NOT NULL DEFAULT '0' COMMENT '电源id'," + |
| | | " record_time datetime NOT NULL DEFAULT '2000-01-01 00:00:00' COMMENT '记录时间'," + |
| | | " dcvol float NOT NULL DEFAULT '0' COMMENT '直流电压'," + |
| | | " dccurr float NOT NULL DEFAULT '0' COMMENT '直流电流'," + |
| | | " controlangle int(11) NOT NULL DEFAULT '0' COMMENT '控制角'," + |
| | | " note varchar(255) NOT NULL DEFAULT '' COMMENT '备用'," + |
| | | " PRIMARY KEY (num)" + |
| | | ") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;"; |
| | | Sql_Mysql sql = new Sql_Mysql(pool.getConn()); |
| | | try { |
| | | sql.sqlMysqlExecute(sql_str); |
| | | } catch (SQLException e) { |
| | | e.printStackTrace(); |
| | | } finally { |
| | | sql.close_con(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 读取当前设备的状态信息 |
| | | */ |
| | | public static void queryElectric_RtById(Electric_Rt rt,MysqlConnPool pool) { |
| | | String sql_str = " SELECT * FROM db_electricsystem.tb_electric_rt WHERE electric_id = " + rt.electric_id; |
| | | Sql_Mysql sql = new Sql_Mysql(pool.getConn()); |
| | | ResultSet res = null; |
| | | try { |
| | | res = sql.sqlMysqlQuery(sql_str); |
| | | while(res.next()) { |
| | | rt.upsetcurr = res.getFloat("upsetcurr"); //上位机设定电流 |
| | | rt.upsetvol = res.getFloat("upsetvol"); //上位机设定电压 |
| | | rt.convolcontrol = res.getInt("convolcontrol"); //恒压控制 |
| | | rt.concurrcontrol = res.getInt("concurrcontrol"); //恒流控制 |
| | | rt.othermodes = res.getInt("othermodes"); //其他模式运行 |
| | | rt.parallelmodes = res.getInt("parallelmodes"); //并联稳压运行 |
| | | rt.startposition = res.getInt("startposition"); //启动位 |
| | | rt.stopposition = res.getInt("stopposition"); //ֹͣλ |
| | | rt.resetposition = res.getInt("resetposition"); //复位 |
| | | rt.fanstart = res.getInt("fanstart"); //风机启动 |
| | | rt.fanstop = res.getInt("fanstop"); //风机停止 |
| | | rt.dcvol = res.getFloat("dcvol"); //直流电压 |
| | | rt.dccurr = res.getFloat("dccurr"); //直流电流 |
| | | rt.controlangle = res.getInt("controlangle"); //控制角 |
| | | rt.loopflag = res.getInt("loopflag"); //开闭环标志位【0开环;1闭环】 |
| | | rt.remoteflag = res.getInt("remoteflag"); //就地远程标志位【0远程;1就地】 |
| | | rt.orderflag = res.getInt("orderflag"); //正序逆序标志位【0正序;1逆序】 |
| | | rt.consvolcurrflag = res.getInt("consvolcurrflag"); //恒压横流标志位【0恒压;1恒流】 |
| | | rt.powerstartflag = res.getInt("powerstartflag"); //电源启动标志位【0停止;1启动】 |
| | | rt.workmodelflag = res.getInt("workmodelflag"); //工作模式标志位【0其他模式;1并联稳压】 |
| | | rt.switchon_1 = res.getInt("switchon_1"); //开关1 |
| | | rt.switchoff_1 = res.getInt("switchoff_1"); //开关1 |
| | | rt.switchon_2 = res.getInt("switchon_2"); //开关2 |
| | | rt.switchoff_2 = res.getInt("switchoff_2"); //开关2 |
| | | } |
| | | } catch (SQLException e) { |
| | | e.printStackTrace(); |
| | | } finally { |
| | | if(res != null) { |
| | | try { |
| | | res.close(); |
| | | } catch (SQLException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | sql.close_con(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 记录历史实时数据 |
| | | * @param pool |
| | | * @param rt |
| | | */ |
| | | public static void recordHistoryData(MysqlConnPool pool, Electric_Rt rt) { |
| | | String sql_str = " INSERT INTO " + Sql_Mysql.Tb_Electric_Readhist_Data + rt.electric_id + "(electric_id,record_time,dcvol,dccurr,controlangle) VALUES("+rt.electric_id+",'"+Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms)+"',"+rt.dcvol+","+rt.dccurr+","+rt.controlangle+");"; |
| | | Sql_Mysql sql = new Sql_Mysql(pool.getConn()); |
| | | try { |
| | | sql.sqlMysqlExecute(sql_str); |
| | | } catch (SQLException e) { |
| | | e.printStackTrace(); |
| | | } finally { |
| | | sql.close_con(); |
| | | } |
| | | } |
| | | } |
| | |
| | | // modbusFactory.createUdpMaster(params); //UDP 协议
|
| | | // modbusFactory.createAsciiMaster(wrapper); //ASCII 协议
|
| | | params.setPort(SERVER_PORT);
|
| | | ModbusMaster master = modbusFactory.createTcpMaster(params, false);// TCP 协议
|
| | | ModbusMaster master = modbusFactory.createTcpMaster(params, true);// TCP 协议
|
| | | try {
|
| | | master.setTimeout(2000);
|
| | | //设置超时时间
|
| | | master.setTimeout(1000);
|
| | | //设置重连次数
|
| | | master.setRetries(3);
|
| | | //初始化
|
| | | master.init();
|
| | | } catch (ModbusInitException e) {
|
| | | e.printStackTrace();
|
| | | //e.printStackTrace();
|
| | | }
|
| | | return master;
|
| | | }
|
| | |
| | | public final static int MAX_ERROR_COUNT = 2; //最大连续错误计数
|
| | | private ModbusMaster master;
|
| | | private int errcount; //错误计数 错误连续超过三个时重新获取master
|
| | | private int totalerr; //总的错误计数 //用于判别设备是否掉线
|
| | | private String target_ip; //目标ip
|
| | | private int slaveId; //设备ID
|
| | |
|
| | |
| | | if(this.errcount > MAX_ERROR_COUNT) {
|
| | | reConnect();
|
| | | }
|
| | | if(this.totalerr > 99999999) {
|
| | | this.totalerr = 5;
|
| | | }
|
| | | this.totalerr ++;
|
| | | }
|
| | | |
| | | //清空错误计数
|
| | | public void clearError() {
|
| | | errcount = 0;
|
| | | totalerr = 0;
|
| | | }
|
| | |
|
| | | public void reConnect() {
|
| | |
| | |
|
| | | }
|
| | |
|
| | | public int getTotalerr() {
|
| | | return totalerr;
|
| | | }
|
| | |
|
| | | public void setTotalerr(int totalerr) {
|
| | | this.totalerr = totalerr;
|
| | | }
|
| | |
|
| | | public ModbusMaster getMaster() {
|
| | | return master;
|
| | | }
|
| | |
| | | public static Boolean readCoilStatus(int offset,MyModbusMaster master){
|
| | | // 01 Coil Status
|
| | | BaseLocator<Boolean> loc = BaseLocator.coilStatus(master.getSlaveId(), offset);
|
| | | Boolean value = null;;
|
| | | Boolean value = null;
|
| | | boolean isSuccess = true;
|
| | | try {
|
| | | value = master.getMaster().getValue(loc);
|
| | | } catch (ModbusTransportException | ErrorResponseException e) {
|
| | | master.addErrorCount();
|
| | | //e.printStackTrace();
|
| | | isSuccess = false;
|
| | | } finally {
|
| | | if(isSuccess) {
|
| | | master.clearError();
|
| | | }else {
|
| | | master.addErrorCount();
|
| | | }
|
| | | }
|
| | | return value;
|
| | | }
|
| | |
| | | // 02 Input Status
|
| | | BaseLocator<Boolean> loc = BaseLocator.inputStatus(master.getSlaveId(), offset);
|
| | | Boolean value = null;;
|
| | | boolean isSuccess = true;
|
| | | try {
|
| | | value = master.getMaster().getValue(loc);
|
| | | } catch (ModbusTransportException | ErrorResponseException e) {
|
| | | master.addErrorCount();
|
| | | //e.printStackTrace();
|
| | | isSuccess = false;
|
| | | } finally {
|
| | | if(isSuccess) {
|
| | | master.clearError();
|
| | | }else {
|
| | | master.addErrorCount();
|
| | | }
|
| | | }
|
| | | return value;
|
| | | }
|
| | |
| | | // 03 Holding Register类型数据读取
|
| | | BaseLocator<Number> loc = BaseLocator.holdingRegister(master.getSlaveId(), offset, dataType);
|
| | | Number value = null;
|
| | | boolean isSuccess = true;
|
| | | try {
|
| | | value = master.getMaster().getValue(loc);
|
| | | } catch (ModbusTransportException | ErrorResponseException e) {
|
| | | //e.printStackTrace();
|
| | | master.addErrorCount();
|
| | | |
| | | isSuccess = false;
|
| | | } finally {
|
| | | if(isSuccess) {
|
| | | master.clearError();
|
| | | }else {
|
| | | master.addErrorCount();
|
| | | }
|
| | | }
|
| | | return value;
|
| | | }
|
| | |
| | | // 04 Input Registers类型数据读取
|
| | | BaseLocator<Number> loc = BaseLocator.inputRegister(master.getSlaveId(), offset, dataType);
|
| | | Number value = null;
|
| | | boolean isSuccess = true;
|
| | | try {
|
| | | value = master.getMaster().getValue(loc);
|
| | | } catch (ModbusTransportException | ErrorResponseException e) {
|
| | | //e.printStackTrace();
|
| | | master.addErrorCount();
|
| | | isSuccess = false;
|
| | | } finally {
|
| | | if(isSuccess) {
|
| | | master.clearError();
|
| | | }else {
|
| | | master.addErrorCount();
|
| | | }
|
| | | }
|
| | | return value;
|
| | | }
|
| | |
| | | master.addErrorCount();
|
| | | return false;
|
| | | } else {
|
| | | master.clearError();
|
| | | return true;
|
| | | }
|
| | | }
|
| | |
| | | master.addErrorCount();
|
| | | return false;
|
| | | } else {
|
| | | master.clearError();
|
| | | return true;
|
| | | }
|
| | |
|
| | |
| | | master.addErrorCount();
|
| | | return false;
|
| | | } else {
|
| | | master.clearError();
|
| | | return true;
|
| | | }
|
| | |
|
| | |
| | | master.addErrorCount();
|
| | | return false;
|
| | | } else {
|
| | | master.clearError();
|
| | | return true;
|
| | | }
|
| | | }
|
| | |
| | | ModbusMaster tcpMaster = master.getMaster();
|
| | | // 类型
|
| | | BaseLocator<Number> locator = BaseLocator.holdingRegister(master.getSlaveId(), offset, dataType);
|
| | | boolean isSuccess = true;
|
| | | try {
|
| | | tcpMaster.setValue(locator, value);
|
| | | } catch (ModbusTransportException | ErrorResponseException e) {
|
| | | e.printStackTrace();
|
| | | //e.printStackTrace();
|
| | | isSuccess = true;
|
| | | } finally {
|
| | | if(isSuccess) {
|
| | | master.clearError();
|
| | | }else {
|
| | | master.addErrorCount();
|
| | | }
|
| | | }
|
| | | }
|
| | | }
|
| | |
| | | public final static String Tb_Electric_alarm_history = DB_ElectricSystem + ".tb_electric_alarm_history"; |
| | | public final static String Tb_Electric_Control_Conn = DB_ElectricSystem + ".tb_electric_control_conn"; |
| | | |
| | | public final static String Tb_Electric_Readhist_Data = DB_ElectricSystem + ".tb_electric_realhist_data_"; |
| | | |
| | | //--------------------------------------------------------------------------------------------// |
| | | public Connection mysql_con; |
| | |
| | | import com.base.Com; |
| | | import com.config.AppConfig; |
| | | import com.config.AppParam; |
| | | import com.electrical.FourKW.Electric_4KW_HistoryData_Thread; |
| | | import com.electrical.FourKW.Electric_4Kw_ServerSocket_Thread; |
| | | import com.electrical.FourKW.Electric_All_ServerSocket_Thread; |
| | | import com.electrical.FourKW.Electric_inf; |
| | |
| | | Electric_4Kw_ServerSocket_Thread server = new Electric_4Kw_ServerSocket_Thread(GB_MysqlConnPool,einfs); |
| | | new Thread(server).start(); |
| | | |
| | | //记录历史实时数据线程 |
| | | { |
| | | Electric_4KW_HistoryData_Thread record_thread = new Electric_4KW_HistoryData_Thread(GB_MysqlConnPool, m_AppConfig, einfs); |
| | | new Thread(record_thread).start();; |
| | | } |
| | | |
| | | |
| | | //System.out.println("PLC_ip:"+PLC_ip); |
| | | //读取4套电源总信息和开关信息//读取每套电源系统的信息 |
| | | /*Electric_All_ServerSocket_Thread serverALL = new Electric_All_ServerSocket_Thread(GB_MysqlConnPool,PLC_ip); |
| | |
| | | System.out.println("检测数据库连接成功"); |
| | | break; |
| | | } |
| | | Thread.sleep(500); |
| | | } catch (Exception e) { |
| | | try { |
| | | Thread.sleep(1000); |