package com.dev.fbs9600;
|
|
import java.nio.ByteBuffer;
|
import java.nio.ByteOrder;
|
import java.util.Date;
|
|
import com.base.Com;
|
import com.base.Crc16;
|
|
public class FBS9600_CommData {
|
//------------------------------------------------------------------------//
|
final public static short REGADDR_NULL = 0x0000;
|
|
final public static short ResTestState_REGADDR = 0x1040;
|
|
final public static short GROUPVOL_REGADDR_START = 0x2001;
|
final public static short GROUPVOL_REGADDR_END = 0x2004;
|
|
final public static short ONLINEVOL_REGADDR_START = 0x2005;
|
final public static short ONLINEVOL_REGADDR_END = 0x2008;
|
|
final public static short GROUPCUR_REGADDR_START = 0x200A;
|
final public static short GROUPCUR_REGADDR_END = 0x200D;
|
|
final public static short BATTSTATE_REGADDR_START = 0x200E;
|
final public static short BATTSTATE_REGADDR_END = 0x2011;
|
|
final public static short GROUPTMP_REGADDR_START = 0x2016;
|
final public static short GROUPTMP_REGADDR_END = 0x2019;
|
//------------------------------------------------------------------------//
|
final public static short MONVOL_REGADDR_START = 0x201D;
|
final public static short MONVOL_REGADDR_END = 0x2210;
|
|
final public static short MONTMP_REGADDR_START = 0x2265;
|
final public static short MONTMP_REGADDR_END = 0x2458;
|
|
final public static short MONRES_REGADDR_START = 0x24AD;
|
final public static short MONRES_REGADDR_END = 0x26A0;
|
//------------------------------------------------------------------------//
|
final public static short TEST_MONRES_REGADDR = 0x4001;
|
//------------------------------------------------------------------------//
|
final public static byte MB_CMD_NULL = 0x00;
|
final public static byte MB_CMD_READ = 0x03;
|
final public static byte MB_CMD_WRITE = 0x05;
|
//------------------------------------------------------------------------//
|
final public static int CURR_DIR_CHARGE = 0;
|
final public static int CURR_DIR_DISCHARGE = 1;
|
//------------------------------------------------------------------------//
|
final public static int BATTSTATE_NULL = 0;
|
final public static int BATTSTATE_FLOAT = 1;
|
final public static int BATTSTATE_CHARGE = 2;
|
final public static int BATTSTATE_DISCHARGE = 3;
|
|
final public static int CMD_GET_BATT_VOL = 1;
|
final public static int CMD_GET_BATT_STATE = 2;
|
//------------------------------------------------------------------------//
|
final public static int BATT_GROUP_COUNT_MAX = 4;
|
final public static int BATT_MON_COUNT_MAX = 512;
|
//------------------------------------------------------------------------//
|
private boolean m_UsrWriteCmdAck = false;
|
//------------------------------------------------------------------------//
|
boolean battres_test_state = false;
|
//------------------------------------------------------------------------//
|
float[] groupvol = new float[BATT_GROUP_COUNT_MAX];
|
float[] onlinevol = new float[BATT_GROUP_COUNT_MAX];
|
float[] battcurr = new float[BATT_GROUP_COUNT_MAX];
|
int[] battstate = new int[BATT_GROUP_COUNT_MAX];
|
int[] battcurrdir = new int[BATT_GROUP_COUNT_MAX];
|
float[] grouptmp = new float[BATT_GROUP_COUNT_MAX];
|
|
float[] battvol = new float[BATT_MON_COUNT_MAX];
|
float[] batttmp = new float[BATT_MON_COUNT_MAX];
|
float[] battres = new float[BATT_MON_COUNT_MAX];
|
//------------------------------------------------------------------------//
|
byte[] data_byte_rx;
|
ByteBuffer data_bf;
|
//------------------------------------------------------------------------//
|
public FBS9600_CommData()
|
{
|
data_byte_rx = new byte[256];
|
data_bf = ByteBuffer.allocate(512);
|
data_bf.order(ByteOrder.BIG_ENDIAN);
|
}
|
//------------------------------------------------------------------------//
|
public boolean getUsrWriteCmdAck()
|
{
|
return m_UsrWriteCmdAck;
|
}
|
//------------------------------------------------------------------------//
|
/**
|
* ½«Êý¾Ý´ò°üΪbyteÊý×é
|
* @param tcp_modbus
|
* @param addr
|
* @param cmd
|
* @param reg_addr
|
* @param reg_count
|
* @return
|
*/
|
public byte[] makeDataToByteArray(boolean tcp_modbus,
|
byte addr, byte cmd, short reg_addr, short reg_count)
|
{
|
data_bf.clear();
|
|
if(true == tcp_modbus) {
|
data_bf.putShort((short)0xAAAA);
|
data_bf.putShort(reg_addr);
|
data_bf.putShort((short)8);
|
data_bf.put((byte) 0);
|
data_bf.put(cmd);
|
data_bf.putShort(reg_addr);
|
} else {
|
data_bf.put(addr);
|
data_bf.put(cmd);
|
data_bf.putShort(reg_addr);
|
}
|
|
if(MB_CMD_READ == cmd) {
|
data_bf.putShort(reg_count);
|
} else if(MB_CMD_WRITE == cmd) {
|
m_UsrWriteCmdAck = false;
|
data_bf.putShort((short) 1);
|
}
|
int crc = Crc16.CalCRC16(data_bf, data_bf.position())&0xFFFF;
|
data_bf.putShort((short) ((crc<<8) + (crc>>8)));
|
|
byte[] d_byte_tx = new byte[data_bf.position()];
|
|
data_bf.position(0);
|
data_bf.get(d_byte_tx);
|
|
return d_byte_tx;
|
}
|
//------------------------------------------------------------------------//
|
boolean getDataFromByteArray(boolean tcp_modbus, short reg_addr, short reg_count, short packet_len)
|
{
|
data_bf.clear();
|
data_bf.put(data_byte_rx);
|
data_bf.flip();
|
|
/*********************************************************/
|
data_bf.position(0);
|
int crc = Crc16.CalCRC16(data_bf, packet_len-2) & 0xFFFF;
|
crc = ((crc<<8) + (crc>>8)) & 0xffff;
|
|
data_bf.position(packet_len-2);
|
int tmp_crc = data_bf.getShort() & 0xffff;
|
|
if(crc != tmp_crc) {
|
return false;
|
}
|
/*********************************************************/
|
/*********************************************************/
|
data_bf.position(0);
|
byte cmd = 0;
|
if(true == tcp_modbus) {
|
if((short)0xAAAA != data_bf.getShort()) {
|
return false;
|
}
|
if(data_bf.getShort() != reg_addr) {
|
return false;
|
}
|
data_bf.getShort();
|
data_bf.get();
|
cmd = data_bf.get();
|
data_bf.get();
|
} else {
|
data_bf.get();
|
cmd = data_bf.get();
|
data_bf.get();
|
}
|
|
/*********************************************************/
|
if(MB_CMD_READ == cmd)
|
{
|
if(ResTestState_REGADDR == reg_addr)
|
{
|
battres_test_state = (1 == (data_bf.getShort()&0xFFFF));
|
}
|
else if(GROUPVOL_REGADDR_START == reg_addr)
|
{
|
for(int n=0; n<BATT_GROUP_COUNT_MAX; n++)
|
groupvol[n] = (float)(data_bf.getShort()&0xFFFF) / 10;
|
for(int n=0; n<BATT_GROUP_COUNT_MAX; n++)
|
onlinevol[n] = (float)(data_bf.getShort()&0xFFFF) / 10;
|
|
data_bf.getShort();
|
|
for(int n=0; n<BATT_GROUP_COUNT_MAX; n++)
|
battcurr[n] = (float)(data_bf.getShort()&0xFFFF) / 10;
|
for(int n=0; n<BATT_GROUP_COUNT_MAX; n++)
|
battstate[n] = (data_bf.getShort()&0xFFFF);
|
for(int n=0; n<BATT_GROUP_COUNT_MAX; n++)
|
battcurrdir[n] = (data_bf.getShort()&0xFFFF);
|
for(int n=0; n<BATT_GROUP_COUNT_MAX; n++)
|
grouptmp[n] = (float)(data_bf.getShort()&0xFFFF) / 10;
|
/*
|
for(int n=0; n<BATT_GROUP_COUNT_MAX; n++)
|
{
|
System.out.println("groupvol#"+(n+1) + ": " + groupvol[n]);
|
System.out.println("onlinevol#"+(n+1) + ": " + onlinevol[n]);
|
System.out.println("battcurr#"+(n+1) + ": " + battcurr[n]);
|
System.out.println("battstate#"+(n+1) + ": " + battstate[n]);
|
System.out.println("battcurrdir#"+(n+1) + ": " + battcurrdir[n]);
|
System.out.println("grouptmp#"+(n+1) + ": " + grouptmp[n]);
|
}
|
*/
|
}
|
else if((reg_addr>=MONVOL_REGADDR_START) && (reg_addr<=MONVOL_REGADDR_END))
|
{
|
//String str = Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms) + " - ";
|
for(int n=0; n<reg_count; n++)
|
{
|
battvol[reg_addr-MONVOL_REGADDR_START+n] = (float)(data_bf.getShort()&0xFFFF) / 1000;
|
/*
|
if(n < 54) {
|
str += "#" + (n+1) + ": " + String.format("%1.3f; ", battvol[reg_addr-MONVOL_REGADDR_START+n]);
|
}*/
|
}
|
//System.out.println(str);
|
}
|
else if((reg_addr>=MONTMP_REGADDR_START) && (reg_addr<=MONTMP_REGADDR_END))
|
{
|
for(int n=0; n<reg_count; n++)
|
{
|
batttmp[reg_addr-MONTMP_REGADDR_START+n] = (float)(data_bf.getShort()&0xFFFF) / 10 - 10;
|
//System.out.println("tmp#"+(n+1) + ": " + batttmp[reg_addr-MONTMP_REGADDR_START+n]);
|
}
|
}
|
else if((reg_addr>=MONRES_REGADDR_START) && (reg_addr<=MONRES_REGADDR_END))
|
{
|
for(int n=0; n<reg_count; n++)
|
{
|
battres[reg_addr-MONRES_REGADDR_START+n] = (float)(data_bf.getShort()&0xFFFF) / 1000;
|
//System.out.println("res#"+(n+1) + ": " + battres[reg_addr-MONRES_REGADDR_START+n]);
|
}
|
}
|
}
|
else if(MB_CMD_WRITE == cmd)
|
{
|
if(TEST_MONRES_REGADDR == reg_addr)
|
{
|
m_UsrWriteCmdAck = true;
|
System.out.println(Thread.currentThread().getName()
|
+ " - FBS9600_CommData: FBSDev res_test_started - "
|
+ Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms));
|
}
|
}
|
|
return true;
|
}
|
//------------------------------------------------------------------------//
|
}
|