package com.data;
|
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.io.OutputStream;
|
import java.net.InetSocketAddress;
|
import java.net.Socket;
|
import java.net.SocketException;
|
import java.nio.ByteBuffer;
|
import java.nio.ByteOrder;
|
import java.util.Date;
|
|
import com.base.ComFn;
|
import com.dev.base.data.Dynamicload_button;
|
import com.dev.base.data.Dynamicload_control;
|
import com.dev.base.data.Dynamicload_inf;
|
import com.dev.base.data.Dynamicload_state;
|
import com.modbus.util.BaseData;
|
import com.modbus.util.Modbus_ComBase;
|
import com.sql.MysqlConnPool;
|
|
public class PowerArk_SocketCliet_Thread implements Runnable{
|
public static final int CONTROL_ON = 1;
|
public static final int CONTROL_OFF = 0;
|
|
private ByteBuffer bytebuffer_for_socket_RX = ByteBuffer.allocate(1500);
|
public static int PowerArk_Port = 502;
|
public String dev_ip;
|
public MysqlConnPool conn_pool;
|
public Dynamicload_inf dyna_inf;
|
public Dynamicload_button button; //É豸°´Å¥
|
public Dynamicload_control control; //É豸¿ØÖÆ
|
public Dynamicload_state state; //É豸״̬
|
public int connerrCount = 0; //×Ü´íÎó¼ÆÊý
|
public int connCount = 0; //×ÜͨѶ¼ÆÊý
|
public int errCount = 0; //Á¬Ðø´íÎóͨѶ¼ÆÊý
|
public Socket socket;
|
public BaseData basedata;
|
|
|
public PowerArk_SocketCliet_Thread(MysqlConnPool conn_pool,Dynamicload_inf dyna_inf) {
|
this.conn_pool = conn_pool;
|
this.dyna_inf = dyna_inf;
|
|
dev_ip = dyna_inf.dev_ip;
|
button = dyna_inf.button;
|
control = dyna_inf.control;
|
state = dyna_inf.state;
|
}
|
|
|
@Override
|
public void run() {
|
int run_count = 0;
|
while(true) {
|
try {
|
/****************************************** ¶Á״̬ **********************************************/
|
/****************************************** ¶Á״̬ **********************************************/
|
{
|
if(run_count % 10 == 0) {
|
//¶ÁÈ¡·´À¡ÐÅÏ¢0x4013-0x4030ÐÅÏ¢
|
basedata = new BaseData(Modbus_ComBase.READ_COIL_STATUS, Modbus_ComBase.OverTmp_Start_Addr, 18);
|
if(SocketComm(basedata.createReadData(), socket)) {
|
//¶ÁÈ¡·´À¡ÐÅÏ¢³É¹¦
|
PowerArk_ServerSocket_Thread_SQL.updateDynamicload_StateTable(conn_pool, state);
|
}
|
}
|
|
if(run_count % 9 == 0) {
|
//¶Áȡ״̬ÐÅÏ¢ 0x01-0x12
|
basedata = new BaseData(Modbus_ComBase.READ_COIL_STATUS, Modbus_ComBase.AutoProcess1_Start_Addr, 12);
|
if(SocketComm(basedata.createReadData(), socket)) {
|
//MÇø×´Ì¬³É¹¦
|
PowerArk_ServerSocket_Thread_SQL.updateDynamicload_StateTable(conn_pool, state);
|
}
|
}
|
|
if(run_count % 8 == 0) {
|
//¶Áȡ״̬ÐÅÏ¢ 0x8000-8013
|
basedata = new BaseData(Modbus_ComBase.READ_COIL_STATUS, Modbus_ComBase.ButtonOutPut_Start_Addr, 14);
|
if(SocketComm(basedata.createReadData(), socket)) {
|
//¶ÁÈ¡QÇø×´Ì¬³É¹¦
|
PowerArk_ServerSocket_Thread_SQL.updateDynamicload_ButtonTable(conn_pool, button);
|
}
|
}
|
|
if(run_count % 10 ==0 ) {
|
//¶ÁÈ¡¸÷¸ö°´Å¥×´Ì¬ 0x40-x0160
|
basedata = new BaseData(Modbus_ComBase.READ_COIL_STATUS, Modbus_ComBase.LocalControl_Start_Addr, 121);
|
if(SocketComm(basedata.createReadData(), socket)) {
|
//¶ÁÈ¡QÇø×´Ì¬³É¹¦
|
PowerArk_ServerSocket_Thread_SQL.updateDynamicload_ButtonTable(conn_pool, button);
|
}
|
}
|
|
if(run_count % 10 ==0 ) {
|
//¶ÁÈ¡VÇø¸÷¸ö°´Å¥×´Ì¬ 0x02-x18
|
basedata = new BaseData(Modbus_ComBase.READ_HOLDING_REGISTER, Modbus_ComBase.LocalControl_Start_Addr, 17);
|
if(SocketComm(basedata.createReadData(), socket)) {
|
//¶ÁÈ¡VÇø×´Ì¬³É¹¦
|
PowerArk_ServerSocket_Thread_SQL.updateDynamicload_StateTable(conn_pool, state);
|
}
|
}
|
}
|
|
/****************************************** д״̬ **********************************************/
|
{
|
PowerArk_SocketClient_Thread_SQL.queryPowerArkControl(conn_pool, control);
|
if(control.FZ_b1 >= CONTROL_ON) {
|
//´ò¿ª°´Å¥1
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr, 1);
|
control.FZ_b1 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_b1)), socket);
|
}
|
|
if(control.FZ_b2 >= CONTROL_ON) {
|
//´ò¿ª°´Å¥2
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+1, 1);
|
control.FZ_b2 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_b2)), socket);
|
}
|
|
if(control.FZ_b3 >= CONTROL_ON) {
|
//´ò¿ª°´Å¥3
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+2, 1);
|
control.FZ_b3 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_b3)), socket);
|
}
|
|
if(control.FZ_b4 >= CONTROL_ON) {
|
//´ò¿ª°´Å¥4
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+3, 1);
|
control.FZ_b4 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_b4)), socket);
|
}
|
|
if(control.FZ_b5 >= CONTROL_ON) {
|
//´ò¿ª°´Å¥5
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+4, 1);
|
control.FZ_b5 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_b5)), socket);
|
}
|
|
if(control.FZ_b6 >= CONTROL_ON) {
|
//´ò¿ª°´Å¥6
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+5, 1);
|
control.FZ_b6 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_b6)), socket);
|
}
|
|
if(control.FZ_b7 >= CONTROL_ON) {
|
//´ò¿ª°´Å¥7
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+6, 1);
|
control.FZ_b7 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_b7)), socket);
|
}
|
|
if(control.FZ_b8 >= CONTROL_ON) {
|
//´ò¿ª°´Å¥8
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+7, 1);
|
control.FZ_b8 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_b8)), socket);
|
}
|
|
if(control.FZ_b9 >= CONTROL_ON) {
|
//´ò¿ª°´Å¥9
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+8, 1);
|
control.FZ_b9 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_b9)), socket);
|
}
|
|
if(control.FZ_b10 >= CONTROL_ON) {
|
//´ò¿ª°´Å¥10
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+9, 1);
|
control.FZ_b10 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_b10)), socket);
|
}
|
|
if(control.FZ_b11 >= CONTROL_ON) {
|
//´ò¿ª°´Å¥11
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+10, 1);
|
control.FZ_b11 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_b11)), socket);
|
}
|
|
if(control.start_auto >= CONTROL_ON) {
|
//Æô¶¯×Ô¶¯¼ÓÔØ
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.StartAutoLoad_Start_Addr, 1);
|
control.start_auto = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.start_auto)), socket);
|
}
|
|
if(control.stop_auto >= CONTROL_ON) {
|
//Í£Ö¹×Ô¶¯¼ÓÔØ
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.StopAutoLoad_Start_Addr, 1);
|
control.stop_auto = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.stop_auto)), socket);
|
}
|
|
if(control.sudden_crease >= CONTROL_ON) {
|
//Í»¼Óͻж
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.SuddenCrease_Start_Addr, 1);
|
control.sudden_crease = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.sudden_crease)), socket);
|
}
|
|
if(control.all_open >= CONTROL_ON) {
|
//È«²¿·ÖÕ¢
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.AllOpenBreak_Start_Addr, 1);
|
control.all_open = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.all_open)), socket);
|
}
|
|
if(control.FZ_autostate1 >= CONTROL_ON) {
|
//FZ×Ô¶¯×´Ì¬1
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.AutoProcess1_Start_Addr, 1);
|
control.FZ_autostate1 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_autostate1)), socket);
|
}
|
|
if(control.FZ_autostate2 >= CONTROL_ON) {
|
//FZ×Ô¶¯×´Ì¬2
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.AutoProcess2_Start_Addr, 1);
|
control.FZ_autostate2 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_autostate2)), socket);
|
}
|
|
if(control.FZ_autostate3 >= CONTROL_ON) {
|
//FZ×Ô¶¯×´Ì¬3
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.AutoProcess3_Start_Addr, 1);
|
control.FZ_autostate3 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_autostate3)), socket);
|
}
|
|
if(control.FZ_autostate4 >= CONTROL_ON) {
|
//FZ×Ô¶¯×´Ì¬4
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.AutoProcess4_Start_Addr, 1);
|
control.FZ_autostate4 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_autostate4)), socket);
|
}
|
|
if(control.FZ_autostate5 >= CONTROL_ON) {
|
//FZ×Ô¶¯×´Ì¬5
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.AutoProcess5_Start_Addr, 1);
|
control.FZ_autostate5 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_autostate5)), socket);
|
}
|
|
if(control.local_control >= CONTROL_ON) {
|
//¾ÍµØ¿ØÖÆ
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.LocalControl_Start_Addr, 1);
|
control.local_control = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.local_control)), socket);
|
}
|
|
if(control.back_control >= CONTROL_ON) {
|
//ºǫ́¿ØÖÆ
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.BackControl_Start_Addr, 1);
|
control.back_control = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.back_control)), socket);
|
}
|
|
if(control.central_control >= CONTROL_ON) {
|
//ÖпؿØÖÆ
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.CenterControl_Start_Addr, 1);
|
control.central_control = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.central_control)), socket);
|
}
|
|
if(control.inter_volume_M200 >= CONTROL_ON) {
|
//ÖпؿØÖÆ
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Middle_Start_Addr, 1);
|
control.inter_volume_M200 = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.inter_volume_M200)), socket);
|
}
|
|
if(control.fan_button >= CONTROL_ON) {
|
//·ç»ú°´Å¥
|
basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Fan_Button_Start_Addr, 1);
|
control.fan_button = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.fan_button)), socket);
|
}
|
|
if(control.set_power >= CONTROL_ON) {
|
//É趨¹¦ÂÊ
|
basedata = new BaseData(Modbus_ComBase.WRITE_MULTIPLE_REGISTER, Modbus_ComBase.SetPower_Start_Addr, 1);
|
control.set_power = CONTROL_OFF;
|
SocketComm(basedata.createWiriteData(BaseData.createFloatByte(control.set_power)), socket);
|
}
|
PowerArk_ServerSocket_Thread_SQL.updateDynamicload_ControlTable(conn_pool, control);
|
}
|
|
if(connerrCount >89999999) {
|
connerrCount = 0;
|
}
|
if(connCount > 8999999) {
|
connCount = 0;
|
}
|
run_count ++;
|
if(run_count > 8999999) {
|
run_count = 0;
|
}
|
Thread.sleep(50);
|
} catch (Exception e) {
|
//e.printStackTrace();
|
}
|
}
|
}
|
|
public boolean SocketComm(byte[] bytedata,Socket socket) throws InterruptedException
|
{
|
boolean res_t = false;
|
try
|
{
|
reConnectClient();
|
if(socket != null)
|
{
|
socket.setSoTimeout(3000);
|
InputStream in = socket.getInputStream();
|
OutputStream out = socket.getOutputStream();
|
//----------------- clear rx buff for tcp resend packet ----------------//
|
byte[] rx_buf_t = new byte[1024];
|
//----------------------------------------------------------------------//
|
bytebuffer_for_socket_RX.order(ByteOrder.BIG_ENDIAN);
|
bytebuffer_for_socket_RX.clear();
|
//--------------------- socket write -----------------------------------//
|
//byte[] b = makeCommBuf(cmd, bf);
|
System.err.println(ComFn.bytesToHexString(bytedata, bytedata.length));
|
Date d1 = new Date();
|
|
|
int rx_read_time_out = 0;
|
//int rx_len = 0;
|
//System.err.println("TX: " + ComFn.bytesToHexString(b, b.length));
|
out.write(bytedata);
|
out.flush();
|
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++;
|
if((bytebuffer_for_socket_RX.position()>8) && (rx_read_time_out>10)){
|
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);
|
}
|
byte[] buffer = new byte[bytebuffer_for_socket_RX.limit()];
|
bytebuffer_for_socket_RX.get(buffer);
|
if(true == getDataFromCommBuf(buffer)) {
|
connCount ++;
|
res_t = true;
|
} else {
|
errCount ++;
|
connerrCount ++;
|
res_t = false;
|
}
|
}
|
} catch (IOException e) {
|
errCount++;
|
connerrCount++;
|
} finally {
|
|
}
|
return res_t;
|
}
|
|
public boolean getDataFromCommBuf(byte[] bytes) {
|
boolean issuccess = false;
|
ByteBuffer bf = ByteBuffer.allocate(bytes.length);
|
bf.order(ByteOrder.BIG_ENDIAN);
|
bf.put(bytes);
|
bf.flip();
|
BaseData baseData = new BaseData();
|
if(baseData.putByteBuffer(bf)) {
|
//»ñÈ¡·µ»ØÊý¾Ý³É¹¦
|
if(baseData.funcode == Modbus_ComBase.READ_COIL_STATUS) {
|
//¶ÁÈ¡ÏßȦÊý¾Ý³É¹¦[4013-4030]
|
if(baseData.addrstart == Modbus_ComBase.OverTmp_Start_Addr) {
|
if(dyna_inf.putReadIBackByteBuffer(bf)) {
|
System.out.println("¶ÁÈ¡IÇøÊý¾Ý³É¹¦4013-4030");
|
issuccess = true;
|
}
|
}
|
|
//¶ÁÈ¡MÇø×´Ì¬³É¹¦[01 - 12]
|
if(baseData.addrstart == Modbus_ComBase.AutoProcess1_Start_Addr) {
|
if(dyna_inf.putReadMBackByteBuffer(bf)) {
|
System.out.println("¶ÁÈ¡MÇøÊý¾Ý³É¹¦01-12");
|
issuccess = true;
|
}
|
}
|
|
//¶ÁÈ¡QÇø×´Ì¬³É¹¦[8000-8013]
|
if(baseData.addrstart == Modbus_ComBase.ButtonOutPut_Start_Addr) {
|
if(dyna_inf.putReadQBackByteBuffer(bf)) {
|
System.out.println("¶ÁÈ¡QÇøÊý¾Ý³É¹¦8000-8013");
|
issuccess = true;
|
}
|
}
|
|
//¶ÁÈ¡MÇø¸÷¸ö¿ØÖƵÄ״̬[0040-0160]
|
if(baseData.addrstart == Modbus_ComBase.LocalControl_Start_Addr) {
|
if(dyna_inf.putReadMControlStateByteBuffer(bf)) {
|
System.out.println("¶ÁÈ¡MÇøÊý¾Ý³É¹¦0040-0160");
|
issuccess = true;
|
}
|
}
|
|
|
|
}else if(baseData.funcode == Modbus_ComBase.READ_HOLDING_REGISTER) {
|
if(baseData.addrstart == Modbus_ComBase.ActualSetPower_Start_Addr) {
|
//¶ÁÈ¡VÇø¸÷¸öÊý¾Ý״̬[02-18]
|
if(dyna_inf.putReadVBackByteBuffer(bf)) {
|
System.out.println("¶ÁÈ¡VÇøÊý¾Ý³É¹¦02-18");
|
issuccess = true;
|
}
|
}
|
|
}
|
|
|
|
}
|
return issuccess;
|
}
|
|
|
/**
|
* ÖØÐ»ñÈ¡Á¬½Ó¶ÔÏó
|
*/
|
public void reConnectClient() {
|
try {
|
if(socket == null || socket.isClosed() || errCount > 4) {
|
if(socket != null) {
|
socket.close();
|
}
|
socket = new Socket();
|
socket.connect(new InetSocketAddress(dev_ip, PowerArk_Port), 5000);
|
socket.setSoTimeout(5000);
|
errCount = 0;
|
}
|
} catch (SocketException e) {
|
e.printStackTrace();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|