whyclj
2020-10-26 bdda55c79398d4bb836b50d155828cca2b9efb99
添加速采汇集器读取以及霍尔量程和电流变化阀值读取设置功能
6个文件已添加
10个文件已修改
885 ■■■■■ 已修改文件
BattMonitor_FBS9600SMore/bin/com/battmonitor/data/BattData_RT_Array.class 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/battmonitor/base/Com.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/battmonitor/base/ComBase.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/battmonitor/data/BattData_RT.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/battmonitor/data/BattData_RT_Array.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/battmonitor/sql/Sql_Mysql.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/FBS9600S_Cmd.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/FBS9600S_ComBase.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/FBS9600S_ComBuf.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/dev_speedcollect/CurrData.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/dev_speedcollect/FBS9600S_SpeedCollect_ServerSocket_Thread.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/dev_speedcollect/FBS9600S_SpeedCollect_SocketClient_Thread.java 342 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/dev_speedcollect/FBS9600S_SpeedCollect_Task_SQL.java 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/com/dev_speedcollect/SpeedCollectParam.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/log4j2.xml 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/src/main/main_MonitorServer_FBS9600SMore.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
BattMonitor_FBS9600SMore/bin/com/battmonitor/data/BattData_RT_Array.class
Binary files differ
BattMonitor_FBS9600SMore/src/com/battmonitor/base/Com.java
@@ -12,6 +12,7 @@
    final public static int UploadData_ClientType_CS_SVR = 2;
    
    final public static String DTF_YMDhms = "yyyy-MM-dd HH:mm:ss";
    final public static String DTF_YMDhmsS = "yyyy-MM-dd HH:mm:ss.SSS";            //毫秒格式
    final public static String DTF_YMDhm = "yyyy-MM-dd HH:mm";
    final public static String DTF_YMDh = "yyyy-MM-dd HH";
    final public static String DTF_YMD = "yyyy-MM-dd";
@@ -157,4 +158,17 @@
            System.out.println(e.getMessage());
        }
    }
//    public static void main(String[] args) {
//        Date d = null;
//        for(int i=0;i<10000;i++) {
//            d = new Date();
//            System.err.println(getDateTimeFormat(d, DTF_YMDhmsS));
//            try {
//                Thread.sleep(1);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }
//    }
}
BattMonitor_FBS9600SMore/src/com/battmonitor/base/ComBase.java
@@ -32,6 +32,12 @@
        int tmp = data;
        return (tmp & 0xFFFF);
    }
    public static int changeShortToSingleInt(short data)
    {
        //System.out.println("******"+data);
        int tmp = data;
        return (tmp);
    }
    //------------------------------------------------------------------------------
    public static double changeShortToDouble(short data)
    {
@@ -164,6 +170,7 @@
        
        return rest_time;
    }
    //----------------------------------------------------------------------------------
}
/***************************************************************************************
BattMonitor_FBS9600SMore/src/com/battmonitor/data/BattData_RT.java
@@ -24,6 +24,7 @@
    private boolean Lock_Data_Stat = false;
    
    public int StationId;
    public String StationIp;
    public boolean Station_Event_poff = false;
    public boolean Station_Event_xuhang = false;
    public boolean Station_Event_diaozhan = false;
BattMonitor_FBS9600SMore/src/com/battmonitor/data/BattData_RT_Array.java
@@ -100,7 +100,7 @@
            
            String sql_str = "SELECT DISTINCT "
                            + " FBSDeviceId,FBSDeviceIp,BattGroupName6,GroupIndexInFBSDevice,"
                            + " BattGroupId,BattGroupNum,MonCount,BattFloatCurrent,FloatVolLevel,MonCapStd,MonVolStd"
                            + " BattGroupId,StationIP,BattGroupNum,MonCount,BattFloatCurrent,FloatVolLevel,MonCapStd,MonVolStd"
                            + " FROM " + Sql_Mysql.BattInf_Table
                            + " ORDER BY BattGroupId ASC";
            
@@ -163,9 +163,9 @@
                    continue;
                } else {
                    BattData_RT rtdata = new BattData_RT(m_Param, m_Conn_Pool);
                    rtdata.FBSDeviceId = res.getInt("FBSDeviceId");
                    rtdata.FBSDeviceIp = res.getString("FBSDeviceIp").trim();
                    rtdata.StationIp = res.getString("StationIP").trim();
                    rtdata.setDevRegCode(res.getString("BattGroupName6").trim());
                    rtdata.GroupIndexInFBSDevice = res.getInt("GroupIndexInFBSDevice");
                    if(rtdata.GroupIndexInFBSDevice > 3) {
BattMonitor_FBS9600SMore/src/com/battmonitor/sql/Sql_Mysql.java
@@ -101,6 +101,9 @@
    public final static String BattResData_Table = DB_BATT_TESTDATA + ".`tb_BattResData`";
    public final static String BattResDataInf_Table = DB_BATT_TESTDATA + ".`tb_battresdata_inf`";
    
    public final static String BattCurrDataInf_Table = DB_BATT_TESTDATA + ".`tb_battcurrdata_inf`";
    public final static String BattCurrData_Table = DB_BATT_TESTDATA + ".tb_battcurrdata_";
    public final static String UserInfTable = DB_USER + ".`tb_user_inf`";
    public final static String UserLogTable = DB_USER + ".`tb_user_log`";
    public final static String UserBattGroup_BaoJiGroup_Table = DB_USER + ".`tb_user_battgroup_baojigroup`";
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/FBS9600S_Cmd.java
@@ -75,6 +75,44 @@
        return true;
    }
    
    public boolean putNewByteBuffer(final ByteBuffer bf)
    {
        if(bf.limit() < BYTE_LEN)
            return false;
        ByteBuffer tmpbuf = bf;
        //dev_id = ComBase.changeShortToInt(tmpbuf.getShort());
        //System.err.println(dev_id);
        //tmpbuf.compact();
        //tmpbuf.flip();
        int crc0 = tmpbuf.getShort(tmpbuf.limit() - 2)& 0xFFFF;
        int crc1 = Crc16.CalCRC16(tmpbuf, tmpbuf.limit()-2)& 0xFFFF;
        //crc1 = ((crc1<<8) + (crc1>>8)) & 0xffff;
        if(crc0 != crc1) {
            System.err.println(crc0+"!=="+crc1);
            return false;
        }
        tmpbuf.position(0);
        this.dev_addr = ComBase.changeByteToInt(tmpbuf.get());
        this.cmd = ComBase.changeByteToInt(tmpbuf.get());
        if(FBS9600S_ComBase.CMD_READ_MODBUS == this.cmd){
            this.data_result = ComBase.changeShortToInt(tmpbuf.getShort());
            this.reg_count = this.data_result/2;                //数据区字节数
        } else {
            this.data_addr = ComBase.changeShortToInt(tmpbuf.getShort());            //数据地址
            this.data_result = ComBase.changeShortToInt(tmpbuf.getShort());            //操作结果
            if(FBS9600S_ComBase.RESULT_OPERAT_SUCCESS != this.data_result) {
                System.err.println("操作失败");
                return false;
            }
        }
        tmpbuf.compact();
        tmpbuf.flip();
        return true;
    }
    public ByteBuffer createByteBuffer(int value){
        ByteBuffer bf = ByteBuffer.allocate(2);
        bf.order(ByteOrder.BIG_ENDIAN);
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/FBS9600S_ComBase.java
@@ -19,6 +19,12 @@
    public static final int CMD_SystemParam_Addr                =     0x1001;                    //系统参数的寄存器地址
    public static final int CMD_SystemState_Addr                =   0x2001;                    //系统状态的寄存器地址
    
    public static final int CMD_DeviceParam_Addr                =     0x1002;                    //速采汇集器参数
    public static final int CMD_SystemVersion_Addr                =   0x2001;                    //系统状态的寄存器地址
    public static final int CMD_SystemMark_Addr                    =   0x2002;                    //系统状态的寄存器地址
    public static final int CMD_SystemCurrData_Addr                =     0x2003;                    //系统速采电流寄存器地址
    public static final int CMD_BattMonVolStart_Addr            =   0x201B;                    //单体电压起始地址
    public static final int CMD_BattMonVolEnd_Addr                =     0x2146;                    //单体电压终止地址
    
@@ -78,4 +84,12 @@
    public static final int     ResTestType_SingleDis            =  0x00;                    //单节放电法
    public static final int     ResTestType_MutilDis            =  0x01;                    //广播放电法
    public static final int     ResTestType_WaveReco            =  0x02;                    //录波法
    //------------ 设置速采汇集器参数 -----------------------------------------------------------------------------------------------
    public static final int     OP_CMD_GetSpeedParam            =  0xF1;                    //读取速采参数
    public static final int     OP_CMD_GetSpeedParam_ACK        =  0xF2;                    //读取速采参数成功
    public static final int     OP_CMD_SetSpeedParam            =  0xF3;                    //设置速采参数
    public static final int     OP_CMD_SetSpeedParam_ACK        =  0xF4;                    //设置速采参数成功
}
BattMonitor_FBS9600SMore/src/com/dev_fbs9600s/data/FBS9600S_ComBuf.java
@@ -58,4 +58,29 @@
        buffer.flip();        
        return buffer;
    }
    /**
     * 构造发送构造数据
     * @param addr
     * @param cmd
     * @param bf
     * @param aes_en
     * @return
     */
    public static ByteBuffer makeFbs9600CommBuf(FBS9600S_Cmd m_CMD, ByteBuffer bf)
    {
        ByteBuffer basebuff = m_CMD.getByteBuffer();
        ByteBuffer buffer = ByteBuffer.allocate(basebuff.limit() + bf.limit() + 32);
        buffer.order(ByteOrder.BIG_ENDIAN);            //设置ByteBuffer的字节序
        buffer.put(basebuff);
        buffer.put(bf);
        int CRC = Crc16.CalCRC16(buffer, buffer.position()) & 0xFFFF;
        buffer.putShort((short) (CRC));                //交换高低位
        buffer.flip();
        return buffer;
    }
}
BattMonitor_FBS9600SMore/src/com/dev_speedcollect/CurrData.java
New file
@@ -0,0 +1,69 @@
package com.dev_speedcollect;
import java.nio.ByteBuffer;
import java.util.Date;
import com.battmonitor.base.ComBase;
public class CurrData {
    public static final int RegCount = 1;
    public static final int EveRegCount = 1000;
    public static final int MaxRegCount = 6000;
    public int BattGroupId;            //电池组id
    public int SysVersion;            //系统版本
    public int IsCurrUpdate;        //更新状态[是否更新1:需要更新      0:不需要更新]
    public float currs[] = new float[MaxRegCount];
    public Date record_time;
    private int ErrCommCount;
    private int CommCount;
    public CurrData(int BattGroupId) {
        this.BattGroupId = BattGroupId;
    }
    public void addErrCommCount() {
        this.ErrCommCount ++;
        if(this.ErrCommCount > 99999990) {
            this.ErrCommCount = 1;
        }
    }
    public void addCommCount() {
        this.CommCount++;
        if(this.CommCount > 999999990) {
            this.CommCount = 1;
        }
    }
    public boolean putUpdateState(ByteBuffer bf) {
        if(bf.limit() < RegCount*2) {
            return false;
        }
        this.IsCurrUpdate = ComBase.changeShortToInt(bf.getShort());
        if(this.IsCurrUpdate == 1) {
            this.record_time = new Date();
        }
        return true;
    }
    public boolean putSystemVersion(ByteBuffer bf) {
        if(bf.limit() < RegCount*2) {
            return false;
        }
        this.SysVersion = ComBase.changeShortToInt(bf.getShort());
        return true;
    }
    public boolean putCurrData(ByteBuffer bf,int index) {
        if(bf.limit() < EveRegCount*2) {
            return false;
        }
        //System.out.println("index:"+index);
        for(int i=index;i<index+EveRegCount;i++) {
            this.currs[i] = ComBase.changeShortToSingleInt(bf.getShort())/10;
        }
        return true;
    }
}
BattMonitor_FBS9600SMore/src/com/dev_speedcollect/FBS9600S_SpeedCollect_ServerSocket_Thread.java
New file
@@ -0,0 +1,54 @@
package com.dev_speedcollect;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import com.battmonitor.data.BattData_RT_Array;
import com.battmonitor.sql.Com;
import com.battmonitor.sql.MysqlConnPool;
import com.dev.btse.comm.FBS9100_Task_Thread_SQL;
public class FBS9600S_SpeedCollect_ServerSocket_Thread implements Runnable{
    public MysqlConnPool m_ConnPool = null;
    public BattData_RT_Array m_Data;
    public ServerSocket m_ServerSocket = null;
    public final static int Col_Port = 8686;
    public FBS9600S_SpeedCollect_ServerSocket_Thread(MysqlConnPool m_ConnPool,BattData_RT_Array m_Data) {
        this.m_ConnPool = m_ConnPool;
        this.m_Data = m_Data;
    }
    @Override
    public void run() {
        System.out.println(" FBS9600S_SpeedCollect_ServerSocket_Thread Start at "+Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms));
        FBS9600S_SpeedCollect_Task_SQL.createBattCurrDataInf(m_ConnPool);
        while(true) {
            try {
                m_ServerSocket = new ServerSocket(Col_Port);
                m_ServerSocket.setSoTimeout(60000);
                while(true) {
                    Socket socket = m_ServerSocket.accept();
                    FBS9600S_SpeedCollect_SocketClient_Thread client = new FBS9600S_SpeedCollect_SocketClient_Thread(m_ConnPool, m_Data, socket);
                    new Thread(client).start();
                }
            } catch (Exception e) {
                //e.printStackTrace();
            } finally {
                try {
                    Thread.sleep(1000);
                    if(null != m_ServerSocket) {
                        m_ServerSocket.close();
                    }
                } catch (InterruptedException | IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
BattMonitor_FBS9600SMore/src/com/dev_speedcollect/FBS9600S_SpeedCollect_SocketClient_Thread.java
New file
@@ -0,0 +1,342 @@
package com.dev_speedcollect;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Date;
import com.battmonitor.data.BattData_RT;
import com.battmonitor.data.BattData_RT_Array;
import com.battmonitor.sql.MysqlConnPool;
import com.dev.btse.data.ComFn;
import com.dev.btse.data.FBS9100_ComBase;
import com.dev_fbs9600s.data.FBS9600S_Cmd;
import com.dev_fbs9600s.data.FBS9600S_ComBase;
import com.dev_fbs9600s.data.FBS9600S_ComBuf;
import com.dev_fbs9600s.data.FBS9600S_SystemState;
public class FBS9600S_SpeedCollect_SocketClient_Thread implements Runnable{
    private MysqlConnPool m_ConnPool = null;
    private BattData_RT_Array battData;
    private Socket socket;
    public int BattGroupId;
    public String station_ip;
    public BattData_RT[] BattData_RT = new BattData_RT[FBS9600S_ComBase.BattGroupCountMax];
    public FBS9600S_SystemState sysState;
    public SpeedCollectParam param;
    public boolean S_thread_run_flag = false;
    public boolean is_success_dev = false;
    private int rx_errcount_for_live_of_thread = 0;        //用于统计socket通信中的异常次数统计
    private ByteBuffer bytebuffer_for_socket_RX = ByteBuffer.allocate(3000);
    public CurrData currdata;
    public int Curr_index = 0;
    public FBS9600S_SpeedCollect_SocketClient_Thread(MysqlConnPool m_ConnPool,BattData_RT_Array m_Data,Socket socket) {
        this.m_ConnPool = m_ConnPool;
        this.battData = m_Data;
        this.socket = socket;
        int group_max = FBS9100_ComBase.BattGroupCountMax;
        for(int n=0; n<group_max; n++) {
            BattData_RT[n] = null;
        }
        String ip_str = this.socket.getInetAddress().getHostAddress();
        System.err.println("ip_str:"+ip_str+"电池组总数:"+battData.getItemCount());
        S_thread_run_flag = false;
        for(int i=0;i<battData.getItemCount();i++) {
            BattData_RT rdData = battData.getItem(i);
            if(rdData.FBSDeviceId /10000000 == 96) {
                //9600设备
                //if(rdData.FBSDeviceIp.equals(ip_str)) {
                if(ip_str.endsWith(rdData.StationIp)) {
                    BattGroupId = rdData.BattGroupId;
                    BattData_RT[rdData.GroupIndexInFBSDevice%group_max] = rdData;
                    S_thread_run_flag = true;
                    is_success_dev = true;
                }
            }
        }
        //创建当前电池组的电池组id记录表
        FBS9600S_SpeedCollect_Task_SQL.createBattCurrData(m_ConnPool, BattGroupId);
        currdata = new CurrData(BattGroupId);
    }
    @Override
    public void run() {
        int dev_addr = 1;                                //开始的汇集器地址
        boolean readEventOk = false;
        if(is_success_dev) {
            param = new SpeedCollectParam(BattData_RT[0].FBSDeviceId);
            FBS9600S_SpeedCollect_Task_SQL.InsertOrUpdateSpeedCollectParam(m_ConnPool, param);
        }
        while(S_thread_run_flag && is_success_dev) {
            try {
                FBS9600S_Cmd cmd = null;
                currdata.IsCurrUpdate = 0;
                //读取汇集器的设备状态
                cmd = new FBS9600S_Cmd(dev_addr,FBS9600S_ComBase.CMD_READ_MODBUS,FBS9600S_ComBase.CMD_SystemMark_Addr,CurrData.RegCount);
                SocketComm(cmd,cmd.createByteBuffer(CurrData.RegCount));
                if(currdata.IsCurrUpdate == 1) {
                    readEventOk = false;
                    int errcount = 0;
                    for(int i=0;i<6;) {
                        Curr_index = i*1000;            //当前读取寄存器的位置
                        //读取汇集器的设备状态
                        cmd = new FBS9600S_Cmd(dev_addr,FBS9600S_ComBase.CMD_READ_MODBUS,FBS9600S_ComBase.CMD_SystemCurrData_Addr+Curr_index,CurrData.EveRegCount);
                        System.err.println("开始读取索引"+i);
                        if(SocketComm(cmd,cmd.createByteBuffer(CurrData.MaxRegCount))) {
                            i++;
                        }else {
                            errcount ++;
                        }
                        if(errcount > 4) {
                            break;
                        }
                        if(i == 6) {
                            readEventOk = true;
                        }
                    }
                    if(readEventOk) {
                        cmd = new FBS9600S_Cmd(dev_addr,FBS9600S_ComBase.CMD_READ_MODBUS,FBS9600S_ComBase.CMD_SystemVersion_Addr,CurrData.RegCount);
                        SocketComm(cmd,cmd.createByteBuffer(CurrData.RegCount));
                        //插入历史实时数据
                        FBS9600S_SpeedCollect_Task_SQL.insertBattCurrData(m_ConnPool, currdata);
                    }
                }
                /************************ 速采汇集器参数读取设置 *******************************************/
                {
                    FBS9600S_SpeedCollect_Task_SQL.querySpeedCollectParam(m_ConnPool, param);
                    if(param.op_cmd == FBS9600S_ComBase.OP_CMD_GetSpeedParam) {
                        cmd = new FBS9600S_Cmd(dev_addr,FBS9600S_ComBase.CMD_READ_MODBUS,FBS9600S_ComBase.CMD_DeviceParam_Addr,SpeedCollectParam.RegCount);
                        if(SocketComm(cmd,cmd.createByteBuffer(SpeedCollectParam.RegCount))) {
                            param.op_cmd = FBS9600S_ComBase.OP_CMD_GetSpeedParam_ACK;
                            FBS9600S_SpeedCollect_Task_SQL.updateSpeedCollectParam(m_ConnPool, param);
                        }
                    }
                    if(param.op_cmd == FBS9600S_ComBase.OP_CMD_SetSpeedParam) {
                        cmd = new FBS9600S_Cmd(dev_addr,FBS9600S_ComBase.CMD_MULTI_WRITE_MODBUS,FBS9600S_ComBase.CMD_DeviceParam_Addr,SpeedCollectParam.RegCount);
                        if(SocketComm(cmd,param.getByteBuffer())) {
                            param.op_cmd = FBS9600S_ComBase.OP_CMD_SetSpeedParam_ACK;
                            FBS9600S_SpeedCollect_Task_SQL.updateSpeedCollectParam(m_ConnPool, param);
                        }
                    }
                }
                Thread.sleep(10);
            } catch (Exception e) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
                e.printStackTrace();
            } finally {
            }
        }
        //System.out.println("设备ID:"+BattData_RT[0].FBSDeviceId+"  通讯结束");
        if(this.socket != null) {
            try {
                socket.close();
            } catch (IOException e) {
                //e.printStackTrace();
            }
        }
    }
    public boolean SocketComm(FBS9600S_Cmd m_CMD, ByteBuffer bf)
    {
        boolean res_t = false;
        try {
            socket.setSoTimeout(3000);
            if(S_thread_run_flag) {
                InputStream in = socket.getInputStream();
                OutputStream out = socket.getOutputStream();
                //----------------- clear rx buff for tcp resend packet ----------------//
                byte[] rx_buf_t = new byte[1024];
//                while(in.available() > 0) {
//                    //System.out.println("99999999999");
//                    in.read(rx_buf_t);
//                    if(buf_clr_read_count >= 10) {
//                        System.out.println(ComFn.bytesToHexString(rx_buf_t, rx_buf_t.length));
//                        S_thread_run_flag = false;
//                        System.err.println(this.getName()
//                                            + " dev_id: " + m_StatAndParam.dev_id
//                                            + " socket rx_buff clear error......");
//                        res_t = false;
//                        return res_t;
//                    }
//                }
                //----------------------------------------------------------------------//
                //--------------------- socket write -----------------------------------//
                byte[] cipher_tx_t = null;
                cipher_tx_t = makeCommBuf(m_CMD, bf, false);
                //System.err.println("发送数据:"+ComFn.bytesToHexString(cipher_tx_t, cipher_tx_t.length));
                //=====================================================================//
//                Date d1 = new Date();
                int rx_read_time_out = 0;
                out.write(cipher_tx_t);
                out.flush();
                bytebuffer_for_socket_RX.order(ByteOrder.BIG_ENDIAN);
                bytebuffer_for_socket_RX.clear();
                while(true) {
                    if(in.available() > 0) {
                        rx_read_time_out = 0;
                        int rx_len_t = in.read(rx_buf_t);
                        if((bytebuffer_for_socket_RX.position()+rx_len_t)
                                < (bytebuffer_for_socket_RX.capacity()-1)) {
                            bytebuffer_for_socket_RX.put(rx_buf_t, 0, rx_len_t);
                        }
                    } else {
                        rx_read_time_out += 1;
                        if((bytebuffer_for_socket_RX.position()>=7) && (rx_read_time_out>20)){
                            res_t = true;
                            break;
                        }
                        if(rx_read_time_out > 220) {
                            break;
                        }
                    }
                    Thread.sleep(10);
                }
                bytebuffer_for_socket_RX.flip();
//                Date d2 = new Date();
//                long comm_tms = (d2.getTime() - d1.getTime());
//                if(comm_tms < 200) {
//                    Thread.sleep(200 - comm_tms);
//                }
                /*
                System.out.println(this.getName()
                                    + "  dev_id:" + m_StatAndParam.dev_id
                                    + "  cmd:" + cmd
                                    + "  d2-d1:" + (comm_tms)+"ms"
                                    + "  rx_len:" + bytebuffer_for_socket_RX.limit()
                                    //+ "  tx_count:" + m_StatAndParam.m_FBS_VCData.m_SysState.CommCount
                                    //+ "  rx_err_sum:" + m_StatAndParam.m_FBS_VCData.m_SysState.ErrCommCount
                                    //+ "  rx_err_count:" + rx_errcount_for_live_of_thread
                                    + Com.getNowTimeWithAt());
                */
                byte[] cipher_buf = new byte[bytebuffer_for_socket_RX.limit()];
                byte[] plain_buf = new byte[bytebuffer_for_socket_RX.limit()];
                bytebuffer_for_socket_RX.get(plain_buf);
                //System.out.println("接收数据:"+ComFn.bytesToHexString(plain_buf, plain_buf.length));
                if((cipher_buf.length >= 7) && (true == getDataFromCommBuf(plain_buf,m_CMD))) {
                    rx_errcount_for_live_of_thread = 0;
                    res_t = true;
                } else {
                    res_t = false;
                    rx_errcount_for_live_of_thread++;
                    //m_StatAndParam.m_SysState.setErrCommCountInc(bytebuffer_for_socket_RX.limit());
                }
            } else {
                S_thread_run_flag = false;
                currdata.addErrCommCount();
            }
        } catch (IOException | InterruptedException e) {
            //e.printStackTrace();
            res_t = false;
            S_thread_run_flag = false;
        } finally {
            //System.out.println(m_CMD.data_addr+""+res_t+"===="+rx_errcount_for_live_of_thread+"$$$$"+S_thread_run_flag);
            if(res_t) {
                currdata.addCommCount();
            }else {
                currdata.addErrCommCount();
            }
            //若在通信的过程中出现连续5次通信异常关闭连接
            if(rx_errcount_for_live_of_thread >= 5){
                S_thread_run_flag = false;
            }
        }
        return res_t;
    }
    /**
     *     解析读取的数据
     * @param plain_buf
     * @param m_CMD
     * @return
     */
    private boolean getDataFromCommBuf(byte[] plain_buf, FBS9600S_Cmd m_CMD) {
        boolean isSuccess = false;
        ByteBuffer bf = ByteBuffer.allocate(plain_buf.length);
        bf.order(ByteOrder.BIG_ENDIAN);
        bf.put(plain_buf);
        bf.flip();
        FBS9600S_Cmd  cmd = new FBS9600S_Cmd();
        if(cmd.putNewByteBuffer(bf)) {
            if(FBS9600S_ComBase.CMD_READ_MODBUS == cmd.cmd) {
                //读取设备状态
                if(m_CMD.data_addr == FBS9600S_ComBase.CMD_SystemVersion_Addr) {
                    if(currdata.putSystemVersion(bf)) {
                        //System.out.println("系统版本成功");
                        isSuccess = true;
                    }
                }
                if(m_CMD.data_addr == FBS9600S_ComBase.CMD_DeviceParam_Addr) {
                    if(param.putByteBuffer(bf)) {
                        //System.out.println("速采参数读取成功");
                        isSuccess = true;
                    }
                }
                //读取设备状态
                if(m_CMD.data_addr == FBS9600S_ComBase.CMD_SystemMark_Addr) {
                    if(currdata.putUpdateState(bf)) {
                        //System.out.println("系统电流状态");
                        isSuccess = true;
                    }
                }
                //读取电流数据
                if(cmd.reg_count == CurrData.EveRegCount) {
                    if(currdata.putCurrData(bf, Curr_index)) {
                        //System.out.println("读取系统电流成功");
                        isSuccess = true;
                    }
                }
            }else if(FBS9600S_ComBase.CMD_MULTI_WRITE_MODBUS == cmd.cmd) {
                if(cmd.data_addr == FBS9600S_ComBase.CMD_DeviceParam_Addr) {
                    //System.err.println("设置速采参数设置成功");
                    isSuccess = true;
                }
            }
        }
        return isSuccess;
    }
    /*
     *    构造发送数据
     */
    private byte[] makeCommBuf(FBS9600S_Cmd m_CMD, ByteBuffer bf, boolean aes_en) {
        ByteBuffer bbf = FBS9600S_ComBuf.makeFbs9600CommBuf(m_CMD, bf);
        byte byte_rest[] = new byte[bbf.limit()];
        bbf.get(byte_rest);
        return byte_rest;
    }
}
BattMonitor_FBS9600SMore/src/com/dev_speedcollect/FBS9600S_SpeedCollect_Task_SQL.java
New file
@@ -0,0 +1,203 @@
package com.dev_speedcollect;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import com.battmonitor.base.Com;
import com.battmonitor.sql.MysqlConnPool;
import com.battmonitor.sql.Sql_Mysql;
import com.dev_fbs9600s.data.FBS9600S_ComBase;
public class FBS9600S_SpeedCollect_Task_SQL {
    /**
     *     创建历史数据信息表
     * @param pool
     */
    public static void createBattCurrDataInf(MysqlConnPool pool) {
        String sql_str = "CREATE TABLE IF NOT EXISTS "+Sql_Mysql.BattCurrDataInf_Table+" (" +
                "  num bigint(20) NOT NULL AUTO_INCREMENT," +
                "  BattGroupId int(11) NOT NULL DEFAULT '100001' COMMENT '电池组id'," +
                "  test_record_count int(11) NOT NULL DEFAULT '1' COMMENT '记录笔数'," +
                "  test_starttime datetime(3) NOT NULL DEFAULT '2000-01-01 00:00:00.000' COMMENT '记录时间'," +
                "  record_num int(11) NOT NULL DEFAULT '0' COMMENT '记录笔数'," +
                "  start_curr float NOT NULL DEFAULT '0' COMMENT '开始电流'," +
                "  end_curr float NOT NULL DEFAULT '0' COMMENT '结束电流'," +
                "  note varchar(64) NOT NULL DEFAULT ''," +
                "  PRIMARY KEY (num)," +
                "  KEY index_battgroupid (BattGroupId) USING BTREE," +
                "  KEY index_test_record_count (test_record_count) USING BTREE" +
                ") 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();
        }
    }
    /**
     *     创建历史详细信息表
     * @param pool
     */
    public static void createBattCurrData(MysqlConnPool pool,int BattGroupId) {
        String sql_str = "CREATE TABLE IF NOT EXISTS "+Sql_Mysql.BattCurrData_Table+BattGroupId+" (" +
                "  num bigint(20) NOT NULL AUTO_INCREMENT," +
                "  BattGroupId int(11) NOT NULL DEFAULT '10001' COMMENT '电池组id'," +
                "  group_curr float NOT NULL DEFAULT '0' COMMENT '组端电流'," +
                "  test_record_count int(11) NOT NULL DEFAULT '1' COMMENT '记录笔数'," +
                "  test_start_time datetime(3) NOT NULL DEFAULT '2000-01-01 00:00:00.000' COMMENT '测试开始时间'," +
                "  record_time datetime(3) NOT NULL DEFAULT '2000-01-01 00:00:00.000' COMMENT '记录时间'," +
                "  record_num int(11) NOT NULL DEFAULT '1' COMMENT '当前记录笔数'," +
                "  note varchar(32) NOT NULL DEFAULT '' COMMENT '备用'," +
                "  PRIMARY KEY (num)," +
                "  KEY index_battgroupid (BattGroupId) USING BTREE," +
                "  KEY index_test_record_count (test_record_count) USING BTREE" +
                ") 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();
        }
    }
    /**
     *     插入电流历史事件数据
     * @param pool
     * @param data
     */
    public static void insertBattCurrData(MysqlConnPool pool,CurrData data) {
        //查询历史事件次数
        String sql_str_sel = "SELECT MAX(test_record_count) as test_record_count  FROM db_batt_testdata.tb_battcurrdata_inf WHERE BattGroupId = " + data.BattGroupId + " FOR UPDATE ";
        ResultSet res = null;
        Sql_Mysql sql = new Sql_Mysql(pool.getConn());
        res = sql.sqlMysqlQuery(sql_str_sel);
        int max_test_record_count = 1;
        try {
            if(res.next()) {
                max_test_record_count = res.getInt("test_record_count")+1;
            }
            Date test_starttime = new Date(data.record_time.getTime()-3000);
            System.out.println("test_record_count :"+max_test_record_count);
            String sql_str_inf = "INSERT INTO "+Sql_Mysql.BattCurrDataInf_Table+"(BattGroupId,test_record_count,test_starttime,record_num,start_curr,end_curr) VALUES("+data.BattGroupId+","+max_test_record_count+",'"+Com.getDateTimeFormat(test_starttime, Com.DTF_YMDhmsS)+"',"+6000+","+data.currs[0]+","+data.currs[data.currs.length-1]+");";
            String sql_str_id = " INSERT INTO " + Sql_Mysql.BattCurrData_Table + data.BattGroupId+"(BattGroupId,group_curr,test_record_count,test_start_time,record_time,record_num) VALUES ";
            for(int i = 0;i<data.currs.length;i++) {
                if(i>0) {
                    sql_str_id += ",";
                }
                Date now = new Date(test_starttime.getTime() + i*50);
                sql_str_id +="("+data.BattGroupId+","+data.currs[i]+","+max_test_record_count+",'"+Com.getDateTimeFormat(test_starttime, Com.DTF_YMDhmsS)+"','"+Com.getDateTimeFormat(now, Com.DTF_YMDhmsS)+"',"+(i+1)+")";
            }
            ArrayList<String> sql_strs = new ArrayList<String>();
            sql_strs.add(sql_str_inf);
            sql_strs.add(sql_str_id);
            sql.makeManualCommit(sql_strs);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if(null != res) {
                try {
                    res.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            sql.close_con();
        }
    }
    /**
     *     查询速采汇集器的参数
     * @param pool
     * @param param
     */
    public static void querySpeedCollectParam(MysqlConnPool pool,SpeedCollectParam param) {
        String sql_str = "SELECT * FROM " + Sql_Mysql.FBS9100SetParam_Table + " WHERE dev_id =  " + param.dev_id;
        ResultSet res = null;
        Sql_Mysql sql = new Sql_Mysql(pool.getConn());
        res = sql.sqlMysqlQuery(sql_str);
        try {
            if(res.next()) {
                param.op_cmd = res.getInt("op_cmd");
                param.CurrClampRange = res.getInt("MonomerLowCount");            //霍尔量程
                param.DeltaCurrLimit = res.getInt("MonomerVol_LOW");            //电流变化阀值
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if(null != res) {
                try {
                    res.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            sql.close_con();
        }
    }
    /**
     *     修改速采汇集器的参数
     * @param pool
     * @param param
     */
    public static void updateSpeedCollectParam(MysqlConnPool pool,SpeedCollectParam param) {
        if(
           param.op_cmd == FBS9600S_ComBase.OP_CMD_GetSpeedParam ||
           param.op_cmd == FBS9600S_ComBase.OP_CMD_GetSpeedParam_ACK ||
           param.op_cmd == FBS9600S_ComBase.OP_CMD_SetSpeedParam ||
           param.op_cmd == FBS9600S_ComBase.OP_CMD_SetSpeedParam_ACK
        ) {
            String sql_str = "UPDATE " + Sql_Mysql.FBS9100SetParam_Table + " SET op_cmd = "+param.op_cmd+",MonomerLowCount = "+param.CurrClampRange+",MonomerVol_LOW ="+param.DeltaCurrLimit+" WHERE dev_id = " + param.dev_id;
            Sql_Mysql sql = new Sql_Mysql(pool.getConn());
            try {
                sql.sqlMysqlExecute(sql_str);
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                sql.close_con();
            }
        }
    }
    /**
     *     插入或更新速采汇集器的参数
     * @param pool
     * @param param
     */
    public static void InsertOrUpdateSpeedCollectParam(MysqlConnPool pool,SpeedCollectParam param) {
        String sql_str_sel = " SELECT * FROM " + Sql_Mysql.FBS9100SetParam_Table + " WHERE dev_id =  " + param.dev_id;
        String sql_str_upd = " UPDATE " + Sql_Mysql.FBS9100SetParam_Table + " SET op_cmd = "+param.op_cmd+",MonomerLowCount = "+param.CurrClampRange+",MonomerVol_LOW ="+param.DeltaCurrLimit+" WHERE dev_id = " + param.dev_id;;
        String sql_str_ins = " INSERT INTO " + Sql_Mysql.FBS9100SetParam_Table + "(dev_id) VALUE("+param.dev_id+")";
        ResultSet res = null;
        Sql_Mysql sql = new Sql_Mysql(pool.getConn());
        res = sql.sqlMysqlQuery(sql_str_sel);
        try {
            if(res.next()) {
                sql.sqlMysqlExecute(sql_str_upd);
            }else {
                sql.sqlMysqlExecute(sql_str_ins);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if(null != res) {
                try {
                    res.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            sql.close_con();
        }
    }
}
BattMonitor_FBS9600SMore/src/com/dev_speedcollect/SpeedCollectParam.java
New file
@@ -0,0 +1,50 @@
package com.dev_speedcollect;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import com.battmonitor.base.ComBase;
public class SpeedCollectParam {
    public static final int RegCount = 2;
    public int dev_id;                    //设备id
    public int op_cmd;                    //参数设置
    public int DeviceAddr;                 //设备地址
    public int CurrClampRange;            //电流钳量程
    public float DeltaCurrLimit;        //电流变化阀值(0.1)
    public int[] Reserved;                //备用
    public int CRC;
    public SpeedCollectParam(int dev_id) {
        this.dev_id = dev_id;
    }
    public boolean putByteBuffer(ByteBuffer bf) {
        if(bf.limit() < RegCount*2) {
            return false;
        }
        this.CurrClampRange = ComBase.changeShortToInt(bf.getShort());
        this.DeltaCurrLimit = (float)ComBase.changeShortToInt(bf.getShort())/10;
        return true;
    }
    /**
     *    获取设置参数的数据集
     * @return
     */
    public ByteBuffer getByteBuffer() {
        ByteBuffer bf = ByteBuffer.allocate(RegCount*3+1);
        bf.order(ByteOrder.BIG_ENDIAN);
        bf.putShort(ComBase.changeIntToShort(RegCount));
        bf.put(ComBase.changeIntToByte(RegCount*2));
        bf.putShort(ComBase.changeIntToShort(CurrClampRange));
        bf.putShort(ComBase.changeIntToShort((int)DeltaCurrLimit*10));
        bf.flip();
        return bf;
    }
}
BattMonitor_FBS9600SMore/src/log4j2.xml
New file
@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <properties>
        <Property name="PATTERN_LAYOUT">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%level] %logger{36} - %msg%n</Property>
        <property name="LOG_HOME">batt_61850_dev_x64_logs</property>
    </properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="${PATTERN_LAYOUT}" />
        </Console>
        <!--warn及以下日志-->
        <RollingFile name="INFO" fileName="${LOG_HOME}/info.log" filePattern="${LOG_HOME}/info-%d{yyyyMMdd}-%i.log.gz">
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
            <Filters>
                <!--如果是error级别拒绝-->
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <!--如果是info\warn输出-->
                <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <Policies>
                <TimeBasedTriggeringPolicy />
                <!--单个文件大小-->
                <SizeBasedTriggeringPolicy size="20MB"/>
            </Policies>
            <!--保存日志文件个数-->
            <DefaultRolloverStrategy max="9"/>
        </RollingFile>
        <!--error级别日志输出-->
        <RollingFile name="ERROR" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/error-%d{yyyyMMdd}-%i.log.gz">
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
            <Filters>
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="20MB"/>
            </Policies>
            <DefaultRolloverStrategy max="9"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="trace">
            <AppenderRef ref="Console" />
            <appenderRef ref="INFO" />
            <appenderRef ref="ERROR" />
        </Root>
    </Loggers>
</Configuration>
BattMonitor_FBS9600SMore/src/main/main_MonitorServer_FBS9600SMore.java
@@ -15,6 +15,8 @@
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;
import com.dev_speedcollect.FBS9600S_SpeedCollect_ServerSocket_Thread;
import com.dev_speedcollect.FBS9600S_SpeedCollect_SocketClient_Thread;
public class main_MonitorServer_FBS9600SMore {
    /**************************************************************************/
@@ -192,6 +194,12 @@
            task_9600_server.start();
            */
        }
        {
            FBS9600S_SpeedCollect_ServerSocket_Thread speed_thread = new FBS9600S_SpeedCollect_ServerSocket_Thread(GB_MysqlConnPool, GB_DataArray);
            new Thread(speed_thread).start();
        }
        {
            Batt_RealDataRecord_Thread record_thread = new Batt_RealDataRecord_Thread(GB_MysqlConnPool, GB_DataArray);
            new Thread(record_thread).start();