BattMonitor_FBS9600SMore/bin/com/battmonitor/data/BattData_RT_Array.classBinary 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();