whyclj
2020-08-20 4dbd3ce69274c1b48ed569c4e23de63b9f9586b8
添加历史上实时数据记录线程以及修复数据更新缓慢bug
1个文件已添加
9个文件已修改
306 ■■■■■ 已修改文件
ElectricalSystem_MonitorServer_4KW/config.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ElectricalSystem_MonitorServer_4KW/src/com/electrical/FourKW/Electric_4KW_HistoryData_Thread.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ElectricalSystem_MonitorServer_4KW/src/com/electrical/FourKW/Electric_inf.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ElectricalSystem_MonitorServer_4KW/src/com/electrical/FourKW/Electrical_4KW_SocketClient_Thread.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ElectricalSystem_MonitorServer_4KW/src/com/electrical/FourKW/Electrical_Task_SQL.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ElectricalSystem_MonitorServer_4KW/src/com/modbus/data/MyModbusFactory.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ElectricalSystem_MonitorServer_4KW/src/com/modbus/data/MyModbusMaster.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ElectricalSystem_MonitorServer_4KW/src/com/modbus/data/MyModbusUtils.java 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ElectricalSystem_MonitorServer_4KW/src/com/sql/Sql_Mysql.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ElectricalSystem_MonitorServer_4KW/src/main/main_ElectricalSystem_MonitorServer_4KW.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ElectricalSystem_MonitorServer_4KW/config.xml
@@ -2,7 +2,7 @@
<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-->
ElectricalSystem_MonitorServer_4KW/src/com/electrical/FourKW/Electric_4KW_HistoryData_Thread.java
New file
@@ -0,0 +1,98 @@
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();
                }
            }
        }
    }
}
ElectricalSystem_MonitorServer_4KW/src/com/electrical/FourKW/Electric_inf.java
@@ -6,6 +6,8 @@
    public int electric_type;
    public String electric_ip;
    public String note;
    public boolean lose_conn = true;        //是否失去连接
    
    public Electric_Rt rt;
    public Electric_State state;
ElectricalSystem_MonitorServer_4KW/src/com/electrical/FourKW/Electrical_4KW_SocketClient_Thread.java
@@ -41,12 +41,10 @@
    }
        
    @Override
    public void run() {
        int runCount = 0;
        Date last = new Date();
        while(true) {
            try {
                Electrical_Task_SQL.queryElectric_Control_Single(conn_pool, ecs);
@@ -87,6 +85,16 @@
                    //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);
ElectricalSystem_MonitorServer_4KW/src/com/electrical/FourKW/Electrical_Task_SQL.java
@@ -3,9 +3,11 @@
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;
@@ -431,8 +433,8 @@
    }
    //插入或更新电源实时信息表
    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);
@@ -616,4 +618,96 @@
            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();
        }
    }
}
ElectricalSystem_MonitorServer_4KW/src/com/modbus/data/MyModbusFactory.java
@@ -27,12 +27,16 @@
        // 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;
    }
ElectricalSystem_MonitorServer_4KW/src/com/modbus/data/MyModbusMaster.java
@@ -12,6 +12,7 @@
    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
    
@@ -28,6 +29,16 @@
        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() {
@@ -74,6 +85,14 @@
        
    }
    
    public int getTotalerr() {
        return totalerr;
    }
    public void setTotalerr(int totalerr) {
        this.totalerr = totalerr;
    }
    public ModbusMaster getMaster() {
        return master;
    }
ElectricalSystem_MonitorServer_4KW/src/com/modbus/data/MyModbusUtils.java
@@ -27,12 +27,19 @@
    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;
    }
@@ -48,11 +55,18 @@
        // 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;
    }
@@ -72,12 +86,18 @@
        // 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;
    }
@@ -103,11 +123,18 @@
        // 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;
    }
@@ -160,6 +187,7 @@
            master.addErrorCount();
            return false;
        } else {
            master.clearError();
            return true;
        }
    }
@@ -192,6 +220,7 @@
            master.addErrorCount();
            return false;
        } else {
            master.clearError();
            return true;
        }
 
@@ -221,6 +250,7 @@
            master.addErrorCount();
            return false;
        } else {
            master.clearError();
            return true;
        }
 
@@ -256,6 +286,7 @@
            master.addErrorCount();
            return false;
        } else {
            master.clearError();
            return true;
        }
    }
@@ -275,10 +306,18 @@
        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();
            }
        }
    }
}
ElectricalSystem_MonitorServer_4KW/src/com/sql/Sql_Mysql.java
@@ -183,6 +183,7 @@
    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;
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.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;
@@ -64,6 +65,13 @@
        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);
@@ -94,6 +102,7 @@
                    System.out.println("检测数据库连接成功");
                    break;
                }
                Thread.sleep(500);
            } catch (Exception e) {
                try {
                    Thread.sleep(1000);