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(); } } }