package com.dev.fbs9600s;
|
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.io.OutputStream;
|
import java.net.InetSocketAddress;
|
import java.net.Socket;
|
import java.nio.ByteBuffer;
|
import java.nio.ByteOrder;
|
import java.util.Date;
|
|
import com.base.Com;
|
import com.battdata_rt.BattData_RT;
|
import com.battdata_rt.BattData_RT_Array;
|
import com.dev.fbs9100.ComFn;
|
import com.dev.fbs9100.FBS9100_ComBase;
|
import com.dev.fbs9100.FBS9100_SysState;
|
import com.dev.fbs9100.FBS9100_Task_Thread_SQL;
|
import com.sql.MysqlConnPool;
|
|
public class FBS9600S_SocketClient_Thread extends Thread{
|
private static final short MB_READ_REG_COUNT = 120;
|
private static final int FBS9600_Socket_Port = 9600;
|
|
public Socket socket;
|
public MysqlConnPool pool;
|
public BattData_RT_Array data;
|
|
public FBS9600S_SystemState systemState;
|
public FBS9600S_SystemParam systemParam;
|
private FBS9600S_Cmd m_cmd;
|
|
|
private ByteBuffer bytebuffer_for_socket_RX = ByteBuffer.allocate(1500);
|
private int m_BattMonCount = 0; //µ¥Ìå×ÜÊý
|
private int m_BattCount = 0; //µç³Ø×é×ÜÊý
|
|
|
private BattData_RT[] m_RTData = new BattData_RT[FBS9600S_ComBase.BattGroupCountMax];
|
|
public FBS9600S_SocketClient_Thread(FBS9600S_SystemState systemState,MysqlConnPool pool, BattData_RT_Array data) {
|
this.systemState = systemState;
|
this.pool = pool;
|
this.data = data;
|
|
|
int group_max = FBS9600S_ComBase.BattGroupCountMax;
|
for(int n=0; n<group_max; n++)
|
m_RTData[n] = null;
|
|
for(int i=0;i<data.getItemCount();i++) {
|
if(data.getItem(i).FBSDeviceId == systemState.dev_id) {
|
//System.out.println(AL_RTdata.getItem(n).GroupIndexInFBSDevice+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
|
m_RTData[data.getItem(i).GroupIndexInFBSDevice%group_max] = data.getItem(i);
|
m_BattMonCount += data.getItem(i).MonCount;
|
m_BattCount++;
|
}
|
}
|
if(m_BattMonCount > FBS9600S_ComBase.MonomerCountMax) {
|
m_BattMonCount = FBS9600S_ComBase.MonomerCountMax; //ÉèÖõ±Ç°µÄ×î´óµ¥ÌåÊýÄ¿
|
}
|
systemParam = new FBS9600S_SystemParam();
|
m_cmd = new FBS9600S_Cmd();
|
}
|
|
@Override
|
public void run() {
|
//System.out.println(" FBS9600S_SocketClient_Thread Start at " + Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms));
|
int monCount = 0; //µ¥ÌåË÷Òýϱê
|
int runCount = 0;
|
FBS9600S_SocketClient_Thread_SQL.insertOrUpdateFBS9600StateByDev_id(pool,systemState);
|
FBS9600S_SocketClient_Thread_SQL.insertOrUpdateFBS9600SetParamByDev_id(pool,systemState);
|
while(true) {
|
try {
|
if(runCount % 5 == 0) {
|
//¶Áȡϵͳ״̬ÒÔ¼°°æ±¾
|
{
|
m_cmd = new FBS9600S_Cmd(FBS9600S_ComBase.CMD_READ_MODBUS, FBS9600S_ComBase.CMD_SystemVersion_Addr, FBS9600S_SystemState.REG_DEVVERSION_COUNT);
|
SocketComm(m_cmd, m_cmd.createByteBuffer(m_cmd.reg_count));
|
}
|
|
|
//¶ÁÈ¡×é¶ËÊý¾Ý
|
{
|
m_cmd = new FBS9600S_Cmd(FBS9600S_ComBase.CMD_READ_MODBUS, FBS9600S_ComBase.CMD_SystemState_Addr, FBS9600S_SystemState.REG_DEVSTATE_COUNT);
|
SocketComm(m_cmd, m_cmd.createByteBuffer(m_cmd.reg_count));
|
}
|
|
|
//¶ÁÈ¡ÄÚ×è²âÊÔ´ÎÊý
|
{
|
m_cmd = new FBS9600S_Cmd(FBS9600S_ComBase.CMD_READ_MODBUS, FBS9600S_ComBase.CMD_BattResCount_Addr, FBS9600S_ComBase.CMD_ControlRegCount);
|
SocketComm(m_cmd, m_cmd.createByteBuffer(m_cmd.reg_count));
|
}
|
}
|
|
if(runCount %4 == 0) {
|
//System.out.println("¶ÁÈ¡µ¥ÌåÊý¾Ý");
|
int readCount = (int)Math.ceil((double)m_BattMonCount/100); //¸ù¾Ýµ¥ÌåÊýÅжϵ±Ç°¶ÁÈ¡µ¥ÌåÐÅÏ¢¶Á¶àÉÙ´Î
|
int regindex = (monCount%readCount)*100;
|
//¶ÁÈ¡µ¥ÌåÊý¾Ý
|
{
|
//¶ÁÈ¡µ¥Ìåµçѹ
|
m_cmd = new FBS9600S_Cmd(FBS9600S_ComBase.CMD_READ_MODBUS, FBS9600S_ComBase.CMD_MonVol_Start_Addr+regindex, FBS9600S_SystemState.REG_MONDATA_COUNT);
|
SocketComm(m_cmd, m_cmd.createByteBuffer(m_cmd.reg_count));
|
}
|
|
{
|
//¶ÁÈ¡µ¥ÌåζÈ
|
m_cmd = new FBS9600S_Cmd(FBS9600S_ComBase.CMD_READ_MODBUS, FBS9600S_ComBase.CMD_MonTMP_Start_Addr+regindex, FBS9600S_SystemState.REG_MONDATA_COUNT);
|
SocketComm(m_cmd, m_cmd.createByteBuffer(m_cmd.reg_count));
|
}
|
|
{
|
//¶ÁÈ¡µ¥ÌåÄÚ×è
|
m_cmd = new FBS9600S_Cmd(FBS9600S_ComBase.CMD_READ_MODBUS, FBS9600S_ComBase.CMD_MonRES_Start_Addr+regindex, FBS9600S_SystemState.REG_MONDATA_COUNT);
|
SocketComm(m_cmd, m_cmd.createByteBuffer(m_cmd.reg_count));
|
}
|
|
{
|
//¶ÁÈ¡µ¥Ìå¾ùºâµçÁ÷
|
m_cmd = new FBS9600S_Cmd(FBS9600S_ComBase.CMD_READ_MODBUS, FBS9600S_ComBase.CMD_MonJHCurr_Start_Addr+regindex, FBS9600S_SystemState.REG_MONDATA_COUNT);
|
SocketComm(m_cmd, m_cmd.createByteBuffer(m_cmd.reg_count));
|
}
|
monCount ++;
|
if(monCount > 99999990) {
|
monCount = 0;
|
}
|
}
|
FBS9600S_SystemState devState = FBS9600S_SocketClient_Thread_SQL.queryFBS9600SSysCmd(pool, systemState.dev_id);
|
if(devState.op_cmd >0) {
|
if(devState.op_cmd == FBS9600S_ComBase.CMD_StartResTest) {
|
//Æô¶¯ÄÚ×è²âÊÔ
|
m_cmd = new FBS9600S_Cmd(FBS9600S_ComBase.CMD_SINGL_WRITE_MODBUS, FBS9600S_ComBase.CMD_StartResTest_Addr, FBS9600S_ComBase.CMD_ControlRegCount);
|
if(SocketComm(m_cmd, m_cmd.createByteBuffer(m_cmd.reg_count))) {
|
devState.op_cmd = FBS9600S_ComBase.CMD_StartResTestAck;
|
}
|
devState.op_cmd = FBS9600S_ComBase.DataType_Null;
|
}
|
if(devState.op_cmd == FBS9600S_ComBase.CMD_ResetSystem) {
|
//ÖØÆôϵͳ
|
m_cmd = new FBS9600S_Cmd(FBS9600S_ComBase.CMD_SINGL_WRITE_MODBUS, FBS9600S_ComBase.CMD_SystemReStart_Addr, FBS9600S_ComBase.CMD_ControlRegCount);
|
if(SocketComm(m_cmd, m_cmd.createByteBuffer(m_cmd.reg_count))) {
|
devState.op_cmd = FBS9600S_ComBase.CMD_ResetSystemAck;
|
}
|
devState.op_cmd = FBS9600S_ComBase.DataType_Null;
|
}
|
|
FBS9600S_SocketClient_Thread_SQL.updateFbs9100StateCmdBydev_id(pool, devState);
|
}
|
|
|
FBS9600S_SystemState param = FBS9600S_SocketClient_Thread_SQL.queryFBS9600SSetParam(pool, systemState.dev_id);
|
if(param.op_cmd == FBS9600S_ComBase.CMD_GetJunHeng || param.op_cmd == FBS9600S_ComBase.CMD_SetJunHeng) {
|
//ÉèÖþùºâ¹¦ÄÜ
|
//System.out.println("¶ÁÈ¡¾ùºâ");
|
if(param.op_cmd == FBS9600S_ComBase.CMD_GetJunHeng) {
|
m_cmd = new FBS9600S_Cmd(FBS9600S_ComBase.CMD_READ_MODBUS, FBS9600S_ComBase.CMD_JunHengVol_Addr, FBS9600S_ComBase.CMD_ControlRegCount);
|
//¶ÁÈ¡¾ùºâµçѹ
|
if(SocketComm(m_cmd, m_cmd.createByteBuffer(m_cmd.reg_count))) {
|
param.junHengVol = systemState.junHengVol;
|
param.op_cmd = FBS9600S_ComBase.CMD_GetJunHengAck;
|
}
|
|
}
|
if(param.op_cmd == FBS9600S_ComBase.CMD_SetJunHeng) {
|
//ÉèÖþùºâµçѹ
|
m_cmd = new FBS9600S_Cmd(FBS9600S_ComBase.CMD_SINGL_WRITE_MODBUS, FBS9600S_ComBase.CMD_JunHengVol_Addr, FBS9600S_ComBase.CMD_ControlRegCount);
|
if(SocketComm(m_cmd, m_cmd.createByteBuffer((int)(param.junHengVol*1000)))) {
|
param.op_cmd = FBS9600S_ComBase.CMD_SetJunHengAck;
|
}
|
}
|
FBS9600S_SocketClient_Thread_SQL.updateFbs9100SetParamCmdBydev_id(pool, param);
|
}
|
|
//System.out.println("$$$$$$$$$$$$$$$");
|
FBS9600S_SocketClient_Thread_SQL.UpdateFBS9600StateByDev_id(pool, systemState);
|
|
runCount++;
|
if(runCount > 99999990) {
|
runCount = 0;
|
}
|
sleep(200);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
|
/**
|
* ÏòÖ¸¶¨µÄsocketͨµÀ·¢ËÍÊý¾Ý£¬ÒÔ¼°½ÓÊÕÊý¾Ý
|
* @param cmd
|
* @param bf
|
* @return
|
* @throws InterruptedException
|
*/
|
|
public boolean SocketComm(FBS9600S_Cmd data, ByteBuffer bf)
|
{
|
boolean res_t = false;
|
InputStream in = null;
|
OutputStream out = null;
|
try
|
{
|
if(data != null)
|
{
|
socket = new Socket();
|
socket.connect(new InetSocketAddress(systemState.dev_ip, FBS9600_Socket_Port), 5000);
|
socket.setSoTimeout(5000);
|
|
in = socket.getInputStream();
|
out = socket.getOutputStream();
|
//----------------- clear rx buff for tcp resend packet ----------------//
|
|
byte[] rx_buf_t = new byte[1024];
|
int buf_clr_read_count = 0;
|
while(in.available() > 0) {
|
int len = in.read(rx_buf_t);
|
if(++buf_clr_read_count >= 10) {
|
System.err.println("error_count:"+len);
|
res_t = false;
|
return res_t;
|
}
|
try {
|
sleep(50);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
//----------------------------------------------------------------------//
|
//--------------------- socket write -----------------------------------//
|
//byte[] cipher_tx_t = data.getByteBuffer().array();
|
byte[] cipher_tx_t = makeCommBuf(data, bf, false);
|
//=====================================================================//
|
Date d1 = new Date();
|
System.out.println("·¢ËÍÊý¾Ý:"+ComFn.bytesToHexString(cipher_tx_t, cipher_tx_t.length)+Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms));
|
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 > 15){
|
break;
|
}
|
if(rx_read_time_out > 500) {
|
break;
|
}
|
}
|
Thread.sleep(10);
|
}
|
|
bytebuffer_for_socket_RX.flip();
|
//byte[] plain_tx_t = bytebuffer_for_socket_RX.array();
|
//System.out.println("·¢ËÍÃüÁî:"+data.cmd+"\t¶ÁÈ¡Êý¾Ý"+ComFn.bytesToHexString(bytebuffer_for_socket_RX.array(), bytebuffer_for_socket_RX.limit()));
|
Date d2 = new Date();
|
long comm_tms = (d2.getTime() - d1.getTime());
|
if(comm_tms < 200) {
|
Thread.sleep(200 - comm_tms);
|
}
|
res_t = checkReciveData(bytebuffer_for_socket_RX,data);
|
}
|
} catch (IOException | InterruptedException e) {
|
System.err.println("¶ÁÈ¡Òì³£"+e);
|
res_t = false;
|
} finally {
|
if(!res_t){
|
//System.err.println(data.cmd+"===="+data.data_addr+"¶ÁÈ¡±¨´í");
|
systemState.addErrorcount();
|
}else{
|
systemState.addCommcount();
|
}
|
if(in != null) {
|
try {
|
in.close();
|
} catch (IOException e) {
|
//e.printStackTrace();
|
}
|
}
|
if(out != null) {
|
try {
|
out.close();
|
} catch (IOException e) {
|
//e.printStackTrace();
|
}
|
}
|
if(socket != null) {
|
try {
|
socket.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
|
}
|
return res_t;
|
}
|
|
public boolean checkReciveData(ByteBuffer bf,FBS9600S_Cmd cmd) {
|
boolean isSuccess = false;
|
FBS9600S_Cmd cmdData = new FBS9600S_Cmd();
|
if(cmdData.putByteBuffer(bf)) {
|
if(FBS9600S_ComBase.CMD_READ_MODBUS == cmdData.cmd && cmdData.cmd == cmd.cmd) {
|
//¶ÁÈ¡Êý¾Ý
|
if(FBS9600S_ComBase.CMD_SystemVersion_Addr == cmd.data_addr) {
|
//System.err.println("¶ÁÈ¡°æ±¾ºÅ");
|
//¶ÁÈ¡°æ±¾ºÅ
|
if(systemState.putSystemVersion(bf)) {
|
|
isSuccess = true;
|
}
|
}
|
|
if(FBS9600S_ComBase.CMD_SystemState_Addr == cmd.data_addr) {
|
//System.err.println("¶Áȡϵͳ״̬");
|
//¶ÁÈ¡É豸״̬ÐÅÏ¢
|
if(systemState.putSystemInfo(bf)) {
|
getFBS9600SGroupData(systemState);
|
|
isSuccess = true;
|
}
|
}
|
|
if(FBS9600S_ComBase.CMD_BattResCount_Addr == cmd.data_addr) {
|
//¶ÁÈ¡ÄÚ×è²âÊÔ´ÎÊý
|
if(systemState.putResTestCount(bf)) {
|
|
isSuccess = true;
|
}
|
//System.err.println("¶ÁÈ¡ÄÚ×è²âÊÔ´ÎÊý"+systemState.resTestCount);
|
}
|
|
if(FBS9600S_ComBase.CMD_JunHengVol_Addr == cmd.data_addr) {
|
//¶ÁÈ¡¾ùºâµçѹ
|
if(systemState.putJunHengVol(bf)) {
|
isSuccess = true;
|
//System.err.println("¶ÁÈ¡¾ùºâµçѹ³É¹¦"+systemState.junHengVol);
|
}
|
}
|
|
|
if(FBS9600S_ComBase.CMD_MonVol_Start_Addr <= cmd.data_addr && FBS9600S_ComBase.CMD_MonVol_End_Addr > cmd.data_addr) {
|
//¶ÁÈ¡µ¥Ìåµçѹ
|
if(systemState.putMonData(cmd.data_addr,bf)) {
|
getFBS9600SMonData(FBS9600S_ComBase.DataType_MonVol, systemState.mon_vol);
|
isSuccess = true;
|
}
|
}
|
|
if(FBS9600S_ComBase.CMD_MonTMP_Start_Addr <= cmd.data_addr && FBS9600S_ComBase.CMD_MonTMP_End_Addr > cmd.data_addr) {
|
//¶ÁÈ¡µ¥ÌåζÈ
|
if(systemState.putMonData(cmd.data_addr,bf)) {
|
getFBS9600SMonData(FBS9600S_ComBase.DataType_MonTmp, systemState.mon_tmp);
|
isSuccess = true;
|
}
|
}
|
|
if(FBS9600S_ComBase.CMD_MonRES_Start_Addr <= cmd.data_addr && FBS9600S_ComBase.CMD_MonRES_End_Addr > cmd.data_addr) {
|
//¶ÁÈ¡µ¥ÌåÄÚ×è
|
if(systemState.putMonData(cmd.data_addr,bf)) {
|
getFBS9600SMonData(FBS9600S_ComBase.DataType_MonRes, systemState.mon_res);
|
isSuccess = true;
|
}
|
}
|
|
if(FBS9600S_ComBase.CMD_MonJHCurr_Start_Addr <= cmd.data_addr && FBS9600S_ComBase.CMD_MonJHCurr_End_Addr > cmd.data_addr) {
|
//¶ÁÈ¡µ¥Ìå¾ùºâ
|
if(systemState.putMonData(cmd.data_addr,bf)) {
|
getFBS9600SMonData(FBS9600S_ComBase.DataType_MonJHCurr, systemState.mon_jhcurr);
|
isSuccess = true;
|
}
|
}
|
|
}else if(FBS9600S_ComBase.CMD_MULTI_WRITE_MODBUS == cmdData.cmd ||
|
FBS9600S_ComBase.CMD_SINGL_WRITE_MODBUS == cmdData.cmd) {
|
// if(cmdData.data_addr == FBS9600S_ComBase.CMD_JunHengVol_Addr) {
|
// System.err.println("ÉèÖþùºâµçѹ³É¹¦");
|
// }
|
// System.err.println("²Ù×÷³É¹¦");
|
isSuccess = true;
|
}
|
}
|
return isSuccess;
|
}
|
|
//¹¹Ôì·¢ËÍ×Ö½ÚÊý¾Ý
|
public byte[] makeCommBuf(FBS9600S_Cmd m_CMD, ByteBuffer bf, boolean aes_en)
|
{
|
ByteBuffer bbf = FBS9600S_ComBuf.makeFbs9600CommBuf(m_CMD, bf, aes_en);
|
byte byte_rest[] = new byte[bbf.limit()];
|
bbf.get(byte_rest);
|
return byte_rest;
|
}
|
|
|
|
public void getFBS9600SGroupData(FBS9600S_SystemState systemState) {
|
|
for(int n = 0;n<FBS9600S_ComBase.BattGroupCountMax;n++) {
|
if(null != m_RTData[n]) {
|
//--------------------- ÔÙ¶Áȡϵͳ״̬ ---------------------------------------//
|
int work_stat = m_RTData[n].mTestData.dev_FBS9100S_WorkState;
|
m_RTData[n].mTestData.setDevFBS9100S_WorkState(0,systemState.groupCurrState[n],
|
systemState.getWorkState(systemState.groupCurrState[n]));
|
|
//--------------------- ÔÙ¶ÁÈ¡¶Ëµçѹ -----------------------------------------//
|
m_RTData[n].mTestData.updateOnlineVolFrom_FBSDev((float) systemState.onlineVol[n]);
|
m_RTData[n].mTestData.updateGroupVolFrom_FBSDev((float) systemState.groupVol[n]);
|
//--------------------- ×îºó¶ÁÈ¡µçÁ÷ -----------------------------------------//
|
if(FBS9100_ComBase.BattState_Discharge == systemState.groupCurrState[n]) {
|
systemState.groupCurr[n] *= -1;
|
}
|
m_RTData[n].mTestData.updateCurrFrom_FBSDev((float) systemState.groupCurr[n]);
|
//---------------------------------------------------------------------------//
|
//ÉèÖÃÄÚ×è²âÊÔ´ÎÊý
|
m_RTData[n].mTestData.batt_res_test_cnt = systemState.resTestCount;
|
//--------------------- Ïȸüе¥ÌåÊý¾Ý,ÔÙ¸üÐÂµç³Ø×´Ì¬Êý¾Ý ----------------------//
|
m_RTData[n].updata_BattRtData_To_RamDb();
|
m_RTData[n].updata_BattRtSate_To_RamDb();
|
//---------------------------------------------------------------------------//
|
}
|
}
|
}
|
|
/**
|
*
|
* @param datatype
|
* @param mondata
|
*/
|
public void getFBS9600SMonData(int datatype,float[] mondata){
|
int mon_index = 0;
|
for(int n=0;n<FBS9600S_ComBase.BattGroupCountMax;n++) {
|
if(null != m_RTData[n]) {
|
for(int i=0;i<m_RTData[n].MonCount;i++) {
|
if(mon_index >= FBS9600S_ComBase.MonomerCountMax) {
|
return;
|
}
|
if(FBS9600S_ComBase.DataType_MonVol == datatype) {
|
//µ¥Ìåµçѹ
|
m_RTData[n].al_MonVol.get(i).monVol = mondata[mon_index++];
|
}else if(FBS9600S_ComBase.DataType_MonTmp == datatype) {
|
//µ¥ÌåζÈ
|
m_RTData[n].al_MonVol.get(i).monTmp = mondata[mon_index++];
|
}else if(FBS9600S_ComBase.DataType_MonRes == datatype) {
|
//µ¥ÌåÄÚ×è
|
m_RTData[n].al_MonVol.get(i).monRes = mondata[mon_index++];
|
}else if(FBS9600S_ComBase.DataType_MonJHCurr == datatype) {
|
//µ¥Ìå¾ùºâµçÁ÷
|
m_RTData[n].al_MonVol.get(i).monJHcurr = mondata[mon_index++];
|
}
|
|
}
|
}
|
}
|
}
|
}
|