package com.dev_fbs9600.data;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.io.OutputStream;
|
import java.net.InetSocketAddress;
|
import java.net.Socket;
|
|
import com.battmonitor.data.BattData_RT;
|
import com.battmonitor.data.BattData_RT_Array;
|
import com.battmonitor.data.MonVolData;
|
import com.battmonitor.sql.MysqlConnPool;
|
|
public class FBS9600_SocketClient extends Thread{
|
|
private static final short MB_READ_REG_COUNT = 120;
|
private static final int FBS9600_Socket_Port = 9600;
|
|
MysqlConnPool m_ConnPool = null;
|
private String socketServerIp = "127.0.0.1";
|
private FBS9600_State m_FBS9600_State;
|
private FBS9600_CommData m_CommDataOut = new FBS9600_CommData();
|
private FBS9600_CommData m_CommDataIn = new FBS9600_CommData();
|
|
private BattData_RT[] m_RTData = new BattData_RT[FBS9600_CommData.BATT_GROUP_COUNT_MAX];
|
private long m_FBSDevId = 0;
|
private final boolean m_IsTcpModbus;
|
private int m_BattMonCount = 0;
|
|
private byte m_ModbusCmd_Usr = FBS9600_CommData.MB_CMD_NULL;
|
private short m_ReadRegAddr_Usr = FBS9600_CommData.REGADDR_NULL;
|
|
private short m_ReadRegAddr = FBS9600_CommData.GROUPVOL_REGADDR_START;
|
private short m_ReadRegCount = 0;
|
|
public FBS9600_SocketClient(MysqlConnPool conn_pool, FBS9600_State f_stat, BattData_RT_Array AL_RTdata)
|
{
|
m_ConnPool = conn_pool;
|
m_FBS9600_State = f_stat;
|
m_FBSDevId = m_FBS9600_State.dev_id;
|
socketServerIp = m_FBS9600_State.ip_addr;
|
|
System.out.println("FBS9600_DEV"
|
+ " Id: " + m_FBSDevId
|
+ ", Ip: " + socketServerIp);
|
|
if(9610 == (m_FBSDevId/10000)) {
|
m_IsTcpModbus = true;
|
} else {
|
m_IsTcpModbus = false;
|
}
|
|
int group_max = FBS9600_CommData.BATT_GROUP_COUNT_MAX;
|
for(int n=0; n<group_max; n++)
|
m_RTData[n] = null;
|
|
for(int n=0; n<AL_RTdata.getItemCount(); n++)
|
{
|
if(AL_RTdata.getItem(n).FBSDeviceId == m_FBSDevId)
|
{
|
//System.out.println(AL_RTdata.getItem(n).GroupIndexInFBSDevice+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
|
m_RTData[AL_RTdata.getItem(n).GroupIndexInFBSDevice%group_max] = AL_RTdata.getItem(n);
|
m_BattMonCount += AL_RTdata.getItem(n).MonCount;
|
}
|
}
|
|
if(m_BattMonCount > (FBS9600_CommData.BATT_MON_COUNT_MAX-120))
|
{
|
m_BattMonCount = (FBS9600_CommData.BATT_MON_COUNT_MAX-120);
|
}
|
m_ReadRegAddr = FBS9600_CommData.GROUPVOL_REGADDR_START;
|
m_ReadRegCount = 0;
|
}
|
|
private void checkAndSetUsrCmdAndRegAddr()
|
{
|
if((FBS9600_State.UsrCmdTestRes == m_FBS9600_State.getFBS9600Cmd())
|
&& (false == m_FBS9600_State.getFBS9600CmdAckFromDev()))
|
{
|
m_ModbusCmd_Usr = FBS9600_CommData.MB_CMD_WRITE; //5
|
m_ReadRegAddr_Usr = FBS9600_CommData.TEST_MONRES_REGADDR; //16385
|
}
|
}
|
|
private void clearInputStream(InputStream is) throws InterruptedException, IOException
|
{
|
for(int n=0; n<20; n++)
|
{
|
Thread.sleep(10);
|
while(is.available() > 0)
|
{
|
is.read();
|
}
|
}
|
}
|
|
private boolean read_data(InputStream is, byte[] buf, final int rx_cnt)
|
throws InterruptedException, IOException
|
{
|
int rx_sum = rx_cnt;
|
if(rx_sum > buf.length)
|
rx_sum = buf.length;
|
|
int rx_count = 0;
|
|
boolean comm_ok = true;
|
for(rx_count=0; rx_count < rx_sum ; rx_count++)
|
{
|
int time_out_count = 0;
|
while(is.available() < 1)
|
{
|
Thread.sleep(40);
|
time_out_count++;
|
if(time_out_count > 100)
|
{
|
comm_ok = false;
|
break;
|
}
|
}
|
|
if(false == comm_ok)
|
break;
|
|
buf[rx_count] = (byte) is.read();
|
}
|
|
return comm_ok;
|
}
|
|
/**
|
* ¸ù¾ÝÖ¸¶¨µÄÉ豸ipµØÖ·Ê¹ÓÃsocketÁ¬½Ó¸ÃµØÖ·µÄ9600¶Ë¿Ú·¢ËÍÊý¾Ý²¢ÇÒ½ÓÊÕÊý¾Ý
|
* @param cmd_t
|
* @param reg_count
|
* @param rx_datacount
|
* @return
|
*/
|
public boolean lanchSocket(byte cmd_t, short reg_count, short rx_datacount) {
|
boolean comm_ok = false;
|
for(int cnt=0; cnt<10; cnt++)
|
{
|
Socket socket = new Socket();
|
InputStream mInStream = null;
|
OutputStream mOutStream = null;
|
try {
|
socket.connect(new InetSocketAddress(socketServerIp, FBS9600_Socket_Port), 5000);
|
socket.setSoTimeout(5000);
|
mInStream = socket.getInputStream();
|
mOutStream = socket.getOutputStream();
|
//--------------------------------------------------------//
|
byte[] tx_buf = m_CommDataOut.makeDataToByteArray(m_IsTcpModbus, (byte)(m_FBSDevId%256),
|
cmd_t, m_ReadRegAddr , reg_count);
|
mOutStream.write(tx_buf);
|
mOutStream.flush();
|
//System.out.println("TX: " + ComFn.bytesToHexString(tx_buf, tx_buf.length));
|
if(true == read_data(mInStream, m_CommDataIn.data_byte_rx , rx_datacount)) {
|
comm_ok = m_CommDataIn.getDataFromByteArray(m_IsTcpModbus, m_ReadRegAddr , reg_count , rx_datacount);
|
} else {
|
comm_ok = false;
|
}
|
clearInputStream(mInStream);
|
//System.out.println("RX: " + ComFn.bytesToHexString(m_CommDataIn.data_byte_rx, rx_datacount));
|
} catch (IOException | InterruptedException e) {
|
//e.printStackTrace();
|
comm_ok = false;
|
} finally {
|
try {
|
socket.close();
|
mInStream.close();
|
mOutStream.close();
|
} catch (IOException e) {
|
//e.printStackTrace();
|
}
|
|
if(true == comm_ok) {
|
break;
|
} else {
|
try {
|
Thread.sleep(1000);
|
} catch (InterruptedException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
}
|
return comm_ok;
|
}
|
|
public void run()
|
{
|
while (true)
|
{
|
try
|
{
|
FBS9600_State_SQL.queryFbs9600UsrCmd_ByID(m_ConnPool, m_FBS9600_State);
|
FBS9600_State_SQL.updateFbs9600UsrCmdAck_ByID(m_ConnPool, m_FBS9600_State);
|
checkAndSetUsrCmdAndRegAddr();
|
//--------------------------------------------------------//
|
byte cmd_t = FBS9600_CommData.MB_CMD_READ;
|
short reg_count = m_ReadRegCount;//MB_READ_REG_COUNT;
|
if(FBS9600_CommData.ResTestState_REGADDR == m_ReadRegAddr) {
|
reg_count = 1;
|
} else if(FBS9600_CommData.GROUPVOL_REGADDR_START == m_ReadRegAddr) {
|
reg_count = 30;
|
}
|
short rx_datacount = (short) (reg_count*2 + 3 + 2);
|
if(true == m_IsTcpModbus) {
|
rx_datacount = (short) (reg_count*2 + 11);
|
}
|
if(m_ModbusCmd_Usr != FBS9600_CommData.MB_CMD_NULL)
|
{
|
cmd_t = m_ModbusCmd_Usr;
|
m_ReadRegAddr = m_ReadRegAddr_Usr;
|
|
reg_count = 1;
|
rx_datacount = 8;
|
if(true == m_IsTcpModbus) {
|
rx_datacount = 14;
|
}
|
}
|
//--------------------------------------------------------//
|
if(true == lanchSocket(cmd_t, reg_count, rx_datacount)) {
|
m_FBS9600_State.setComCountInc();
|
} else {
|
m_FBS9600_State.setComErrCountInc();
|
}
|
//--------------------------------------------------------//
|
|
if(FBS9600_CommData.TEST_MONRES_REGADDR == m_ReadRegAddr)
|
{
|
if(true == m_CommDataIn.getUsrWriteCmdAck())
|
{
|
m_FBS9600_State.setFBS9600CmdAckFromDev(true);
|
m_ModbusCmd_Usr = FBS9600_CommData.MB_CMD_NULL;
|
m_ReadRegAddr_Usr = FBS9600_CommData.REGADDR_NULL;
|
}
|
m_ReadRegAddr = FBS9600_CommData.ResTestState_REGADDR;
|
m_ReadRegCount = 0;
|
}
|
else if(FBS9600_CommData.ResTestState_REGADDR == m_ReadRegAddr)
|
{
|
m_ReadRegAddr = FBS9600_CommData.GROUPVOL_REGADDR_START;
|
m_ReadRegCount = 0;
|
}
|
/*
|
else if(FBS9600_CommData.GROUPVOL_REGADDR_START == m_ReadRegAddr)
|
{
|
m_ReadRegAddr = FBS9600_CommData.MONVOL_REGADDR_START;
|
}*/
|
else
|
{/*
|
m_ReadRegAddr += MB_READ_REG_COUNT;
|
//m_ReadRegCount += MB_READ_REG_COUNT;
|
|
//if(m_ReadRegCount >= m_BattMonCount)
|
{
|
//m_ReadRegCount = 0;
|
|
if((m_ReadRegAddr >= FBS9600_CommData.MONVOL_REGADDR_START)
|
&& (m_ReadRegAddr <= FBS9600_CommData.MONVOL_REGADDR_END))
|
m_ReadRegAddr = FBS9600_CommData.MONTMP_REGADDR_START;
|
else if((m_ReadRegAddr >= FBS9600_CommData.MONTMP_REGADDR_START)
|
&& (m_ReadRegAddr <= FBS9600_CommData.MONTMP_REGADDR_END))
|
m_ReadRegAddr = FBS9600_CommData.MONRES_REGADDR_START;
|
else if((m_ReadRegAddr >= FBS9600_CommData.MONRES_REGADDR_START)
|
&& (m_ReadRegAddr <= FBS9600_CommData.MONRES_REGADDR_END))
|
{
|
m_ReadRegAddr = FBS9600_CommData.ResTestState_REGADDR;
|
getFBS9600MonData(m_CommDataIn);
|
}
|
}*/
|
m_ReadRegAddr += m_ReadRegCount;
|
m_ReadRegCount = (short) m_BattMonCount;
|
|
if(FBS9600_CommData.GROUPVOL_REGADDR_START == m_ReadRegAddr) {
|
m_ReadRegAddr = FBS9600_CommData.MONVOL_REGADDR_START;
|
}
|
|
if((m_ReadRegAddr >= FBS9600_CommData.MONVOL_REGADDR_START)
|
&& (m_ReadRegAddr < FBS9600_CommData.MONVOL_REGADDR_END)) {
|
if(m_ReadRegAddr < (FBS9600_CommData.MONVOL_REGADDR_START+m_BattMonCount)) {
|
m_ReadRegCount = (short) ((FBS9600_CommData.MONVOL_REGADDR_START+m_BattMonCount)-m_ReadRegAddr);
|
} else {
|
m_ReadRegAddr = FBS9600_CommData.MONTMP_REGADDR_START;
|
}
|
}
|
|
if((m_ReadRegAddr >= FBS9600_CommData.MONTMP_REGADDR_START)
|
&& (m_ReadRegAddr < FBS9600_CommData.MONTMP_REGADDR_END)) {
|
if(m_ReadRegAddr < (FBS9600_CommData.MONTMP_REGADDR_START+m_BattMonCount)) {
|
m_ReadRegCount = (short) ((FBS9600_CommData.MONTMP_REGADDR_START+m_BattMonCount)-m_ReadRegAddr);
|
} else {
|
m_ReadRegAddr = FBS9600_CommData.MONRES_REGADDR_START;
|
}
|
}
|
|
if((m_ReadRegAddr >= FBS9600_CommData.MONRES_REGADDR_START)
|
&& (m_ReadRegAddr < FBS9600_CommData.MONRES_REGADDR_END)) {
|
if(m_ReadRegAddr < (FBS9600_CommData.MONRES_REGADDR_START+m_BattMonCount)) {
|
m_ReadRegCount = (short) ((FBS9600_CommData.MONRES_REGADDR_START+m_BattMonCount)-m_ReadRegAddr);
|
} else {
|
m_ReadRegAddr = FBS9600_CommData.MONJHcurr_REGADDR_START;
|
}
|
}
|
|
if((m_ReadRegAddr >= FBS9600_CommData.MONJHcurr_REGADDR_START)
|
&& (m_ReadRegAddr < FBS9600_CommData.MONJHcurr_REGADDR_END)) {
|
if(m_ReadRegAddr < (FBS9600_CommData.MONJHcurr_REGADDR_START+m_BattMonCount)) {
|
m_ReadRegCount = (short) ((FBS9600_CommData.MONJHcurr_REGADDR_START+m_BattMonCount)-m_ReadRegAddr);
|
} else {
|
m_ReadRegAddr = FBS9600_CommData.ResTestState_REGADDR;
|
getFBS9600MonData(m_CommDataIn);
|
}
|
}
|
|
if(m_ReadRegCount > MB_READ_REG_COUNT) {
|
m_ReadRegCount = MB_READ_REG_COUNT;
|
}
|
}
|
|
Thread.sleep(250);
|
}
|
catch (Exception e)
|
{
|
//e.printStackTrace();
|
m_FBS9600_State.setComErrCountInc();
|
try {
|
Thread.sleep(1000);
|
} catch (InterruptedException e1) {
|
//e1.printStackTrace();
|
}
|
}
|
}
|
}
|
|
private void getFBS9600MonData(FBS9600_CommData c_data)
|
{
|
int mon_index = 0;
|
|
if(true == c_data.battres_test_state)
|
{
|
m_FBS9600_State.setWorkState();
|
}
|
|
if(FBS9600_State.WorkStateRes == m_FBS9600_State.getWorkState())
|
{
|
if(false == c_data.battres_test_state)
|
{
|
m_FBS9600_State.clearWorkState();
|
for(int n=0; n<FBS9600_CommData.BATT_GROUP_COUNT_MAX; n++) {
|
if(null != m_RTData[n]) {
|
m_RTData[n].setStoreBattRes_DataEnStat(true);
|
}
|
}
|
}
|
}
|
|
for(int n=0; n<FBS9600_CommData.BATT_GROUP_COUNT_MAX; n++)
|
{
|
try {
|
if(null != m_RTData[n]) {
|
float curr = c_data.battcurr[n];
|
if(FBS9600_CommData.CURR_DIR_DISCHARGE == c_data.battcurrdir[n])
|
{
|
curr *= -1;
|
}
|
|
m_RTData[n].mTestData.updateCurrFrom_FBSDev(curr);
|
m_RTData[n].mTestData.updateGroupVolFrom_FBSDev(c_data.groupvol[n]);
|
for(int index=0; index<m_RTData[n].MonCount; index++)
|
{
|
if(mon_index >= FBS9600_CommData.BATT_MON_COUNT_MAX)
|
break;
|
MonVolData tmp_m_data = m_RTData[n].al_MonVol.get(index);
|
if(false == m_RTData[n].getIdce8200ComState())
|
{
|
tmp_m_data.monVol = c_data.battvol[mon_index];
|
}
|
tmp_m_data.monTmp = c_data.batttmp[mon_index];
|
tmp_m_data.monRes = c_data.battres[mon_index];
|
tmp_m_data.connRes = c_data.battres[mon_index];
|
|
if((tmp_m_data.monRes>0.01) && (tmp_m_data.monVol>0.1) && (m_RTData[n].MonStdVol>0.1)) {
|
tmp_m_data.monSer = (1000/tmp_m_data.monRes) * (m_RTData[n].MonStdVol/2);
|
} else {
|
tmp_m_data.monSer = 0;
|
}
|
|
tmp_m_data.monJHcurr = c_data.battjhcurr[mon_index];
|
|
mon_index++;
|
}
|
|
for(int index=0; index<m_RTData[n].MonCount; index++)
|
{
|
m_RTData[n].al_MonVol.get(index).connRes = 0;
|
/*
|
if(0 == index)
|
m_RTData[n].al_MonVol.get(index).connRes = 0;
|
else
|
{
|
m_RTData[n].al_MonVol.get(index).connRes
|
= (m_RTData[n].al_MonVol.get(index-1).monRes + m_RTData[n].al_MonVol.get(index).monRes)/10;
|
}*/
|
}
|
|
//--------------------- Ïȸüе¥ÌåÊý¾Ý,ÔÙ¸üÐÂµç³Ø×´Ì¬Êý¾Ý ----------------------//
|
m_RTData[n].updata_BattRtData_To_RamDb();
|
m_RTData[n].updata_BattRtSate_To_RamDb();
|
//---------------------------------------------------------------------------//
|
}
|
} catch (Exception e) {
|
System.err.println("FBS9600_SocketClient.getFBS9600MonData():" + e.getMessage());
|
}
|
}
|
|
FBS9600_State_SQL.updateFbs9600State_ByID(m_ConnPool, m_FBS9600_State);
|
}
|
}
|