whyclj
2020-10-15 95c0c2e94d390650d3954c30c6a7c805fe9c714c
src/com/data/PowerArk_SocketCliet_Thread.java
@@ -1,464 +1,684 @@
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();
      }
   }
}
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 = 0xFF00;         //启动
   public static final int CONTROL_OFF = 0x0000;         //ֹͣ
   public static final int CMD_Start = 1;               //启动
   public static final int CMD_Stop = 2;               //ֹͣ
   public static final int CMD_SUCCESS = -1;            //成功
   public static final int CMD_FAIL = 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 % 2 == 0) {
                  //读取反馈信息4013-4030信息
                  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 % 2 == 0) {
                  //读取状态信息      01-12
                  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 % 2 == 0) {
                  //读取状态信息      8000-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 % 2 ==0 ) {
                  //读取各个按钮状态  40-0160
                  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 % 2 ==0 ) {
                  int startaddr = Modbus_ComBase.ActualSetPower_Start_Addr;
                  //读取V区各个按钮状态  02-18
                  if(dyna_inf.getFZ_button_num() == 11) {
                     startaddr = Modbus_ComBase.ActualSetPower_Start_Addr-2;
                  }
                  basedata = new BaseData(Modbus_ComBase.READ_HOLDING_REGISTER, startaddr, 17);
                  if(SocketComm(basedata.createReadData(), socket)) {
                     //读取V区状态成功
                  }
               }
               PowerArk_ServerSocket_Thread_SQL.updateDynamicload_StateTable(conn_pool, state);
               PowerArk_ServerSocket_Thread_SQL.updateDynamicload_ButtonTable(conn_pool, button);
            }
            /******************************************  д״̬   **********************************************/
            {
               PowerArk_SocketClient_Thread_SQL.queryPowerArkControl(conn_pool, control);
               if(control.FZ_b1 >= CMD_Start) {
                  //打开按钮1
                  int code_value = CONTROL_OFF;
                  if(control.FZ_b1 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr, 1);
                  control.FZ_b1 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.FZ_b1 = CMD_SUCCESS;
                  }
               }
               if(control.FZ_b2 >= CMD_Start) {
                  //打开按钮2
                  int code_value = CONTROL_OFF;
                  if(control.FZ_b2 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+1, 1);
                  control.FZ_b2 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.FZ_b2 = CMD_SUCCESS;
                  }
               }
               if(control.FZ_b3 >= CMD_Start) {
                  //打开按钮3
                  int code_value = CONTROL_OFF;
                  if(control.FZ_b3 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+2, 1);
                  control.FZ_b3 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.FZ_b3 = CMD_SUCCESS;
                  }
               }
               if(control.FZ_b4 >= CMD_Start) {
                  //打开按钮4
                  int code_value = CONTROL_OFF;
                  if(control.FZ_b4 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+3, 1);
                  control.FZ_b4 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.FZ_b4 = CMD_SUCCESS;
                  }
               }
               if(control.FZ_b5 >= CMD_Start) {
                  //打开按钮5
                  int code_value = CONTROL_OFF;
                  if(control.FZ_b5 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+4, 1);
                  control.FZ_b5 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.FZ_b5 = CMD_SUCCESS;
                  }
               }
               if(control.FZ_b6 >= CMD_Start) {
                  //打开按钮6
                  int code_value = CONTROL_OFF;
                  if(control.FZ_b6 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+5, 1);
                  control.FZ_b6 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.FZ_b6 = CMD_SUCCESS;
                  }
               }
               if(control.FZ_b7 >= CMD_Start) {
                  //打开按钮7
                  int code_value = CONTROL_OFF;
                  if(control.FZ_b7 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+6, 1);
                  control.FZ_b7 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.FZ_b7 = CMD_SUCCESS;
                  }
               }
               if(control.FZ_b8 >= CMD_Start) {
                  //打开按钮8
                  int code_value = CONTROL_OFF;
                  if(control.FZ_b8 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+7, 1);
                  control.FZ_b8 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.FZ_b8 = CMD_SUCCESS;
                  }
               }
               if(control.FZ_b9 >= CMD_Start) {
                  //打开按钮9
                  int code_value = CONTROL_OFF;
                  if(control.FZ_b9 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+8, 1);
                  control.FZ_b9 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)){
                     control.FZ_b9 = CMD_SUCCESS;
                  }
               }
               if(control.FZ_b10 >= CMD_Start) {
                  //打开按钮10
                  int code_value = CONTROL_OFF;
                  if(control.FZ_b10 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+9, 1);
                  control.FZ_b10 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.FZ_b10 = CMD_FAIL;
                  }
               }
               if(control.FZ_b11 >= CMD_Start) {
                  //打开按钮11
                  int code_value = CONTROL_OFF;
                  if(control.FZ_b11 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Button_Start_Addr+10, 1);
                  control.FZ_b11 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.FZ_b11 = CMD_SUCCESS;
                  }
               }
               if(control.start_auto >= CMD_Start) {
                  //启动自动加载
                  int code_value = CONTROL_OFF;
                  if(control.start_auto == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.StartAutoLoad_Start_Addr, 1);
                  control.start_auto = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.start_auto = CMD_FAIL;
                  }
               }
               if(control.stop_auto >= CMD_Start) {
                  //停止自动加载
                  int code_value = CONTROL_OFF;
                  if(control.stop_auto == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.StopAutoLoad_Start_Addr, 1);
                  control.stop_auto = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.stop_auto = CMD_SUCCESS;
                  }
               }
               if(control.sudden_crease >= CMD_Start) {
                  //突加突卸
                  int code_value = CONTROL_OFF;
                  if(control.sudden_crease == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.SuddenCrease_Start_Addr, 1);
                  control.sudden_crease = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.sudden_crease = CMD_SUCCESS;
                  }
               }
               if(control.all_open >= CMD_Start) {
                  //全部分闸
                  int code_value = CONTROL_OFF;
                  if(control.all_open == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.AllOpenBreak_Start_Addr, 1);
                  control.all_open = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.all_open = CMD_FAIL;
                  }
               }
               if(control.FZ_autostate1 >= CMD_Start) {
                  int code_value = CONTROL_OFF;
                  if(control.FZ_autostate1 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  //FZ自动状态1
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.AutoProcess1_Start_Addr, 1);
                  control.FZ_autostate1 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.FZ_autostate1 = CMD_SUCCESS;
                  }
               }
               if(control.FZ_autostate2 >= CMD_Start) {
                  int code_value = CONTROL_OFF;
                  if(control.FZ_autostate2 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  //FZ自动状态2
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.AutoProcess2_Start_Addr, 1);
                  control.FZ_autostate2 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.FZ_autostate2 = CMD_SUCCESS;
                  }
               }
               if(control.FZ_autostate3 >= CMD_Start) {
                  //FZ自动状态3
                  int code_value = CONTROL_OFF;
                  if(control.FZ_autostate3 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.AutoProcess3_Start_Addr, 1);
                  control.FZ_autostate3 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.FZ_autostate3 = CMD_SUCCESS;
                  }
               }
               if(control.FZ_autostate4 >= CMD_Start) {
                  //FZ自动状态4
                  int code_value = CONTROL_OFF;
                  if(control.FZ_autostate4 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.AutoProcess4_Start_Addr, 1);
                  control.FZ_autostate4 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.FZ_autostate4 = CMD_SUCCESS;
                  }
               }
               if(control.FZ_autostate5 >= CMD_Start) {
                  //FZ自动状态5
                  int code_value = CONTROL_OFF;
                  if(control.FZ_autostate5 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.AutoProcess5_Start_Addr, 1);
                  control.FZ_autostate5 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.FZ_autostate5 = CMD_SUCCESS;
                  }
               }
               if(control.local_control >= CMD_Start) {
                  //就地控制
                  int code_value = CONTROL_OFF;
                  if(control.local_control == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.LocalControl_Start_Addr, 1);
                  control.local_control = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.local_control = CMD_SUCCESS;
                  }
               }
               if(control.back_control >= CMD_Start) {
                  //后台控制
                  int code_value = CONTROL_OFF;
                  if(control.back_control == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.BackControl_Start_Addr, 1);
                  control.back_control = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.back_control = CMD_SUCCESS;
                  }
               }
               if(control.central_control >= CMD_Start) {
                  //中控控制
                  int code_value = CONTROL_OFF;
                  if(control.central_control == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.CenterControl_Start_Addr, 1);
                  control.central_control = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.central_control = CMD_SUCCESS;
                  }
               }
               if(control.inter_volume_M200 >= CMD_Start) {
                  //中控控制
                  int code_value = CONTROL_OFF;
                  if(control.inter_volume_M200 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Middle_Start_Addr, 1);
                  control.inter_volume_M200 = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.inter_volume_M200 = CMD_SUCCESS;
                  }
               }
               if(control.fan_button >= CMD_Start) {
                  //风机按钮
                  int code_value = CONTROL_OFF;
                  if(control.inter_volume_M200 == CMD_Start) {
                     code_value = CONTROL_ON;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_SINGLE_COIL, Modbus_ComBase.Fan_Button_Start_Addr, 1);
                  control.fan_button = CMD_FAIL;
                  if(SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket)) {
                     control.fan_button = CMD_SUCCESS;
                  }
               }
               if(control.set_power >= CMD_Start) {
                  //设定功率
                  int addr = Modbus_ComBase.SetPower_Start_Addr;
                  if(dyna_inf.getFZ_button_num() ==11) {
                     addr = 4;
                     basedata = new BaseData(Modbus_ComBase.WRITE_MULTIPLE_REGISTER, addr, 1);
                     if(SocketComm(basedata.createWiriteData(BaseData.createIntByte((int)control.set_power)), socket)) {
                        control.set_power = CMD_SUCCESS;
                     }
                  }else {
                     basedata = new BaseData(Modbus_ComBase.WRITE_MULTIPLE_REGISTER, addr, 2);
                     if(SocketComm(basedata.createWiriteData(BaseData.createFloatByte(control.set_power)), socket)) {
                        control.set_power = CMD_SUCCESS;
                     }
                  }
                  control.set_power = CMD_FAIL;
               }
               if(control.interval_time >= CMD_Start) {
                  //间隔时间
                  int addr = Modbus_ComBase.InterTime_Start_Addr;
                  if(dyna_inf.getFZ_button_num() == 11) {
                     addr = 6;
                  }
                  basedata = new BaseData(Modbus_ComBase.WRITE_MULTIPLE_REGISTER, addr, 1);
                  if(SocketComm(basedata.createWiriteData(BaseData.createIntByte(control.interval_time)), socket)) {
                     control.interval_time = CMD_SUCCESS;
                  }
                  control.interval_time = CMD_FAIL;
               }
               //System.out.println(control);
               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(10);
         } catch (Exception e) {
            //e.printStackTrace();
         }
      }
   }
   public boolean SocketComm(byte[] bytedata,Socket socket) throws InterruptedException
    {
      boolean res_t = false;
      InputStream in = null;
      OutputStream out = null;
      try
      {
         //reConnectClient();
         socket = new Socket();
         socket.connect(new InetSocketAddress(dev_ip, PowerArk_Port), 5000);
         socket.setSoTimeout(3000);
           if(socket != null)
           {
              in = socket.getInputStream();
              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 < 50) {
                 Thread.sleep(50 - comm_tms);
              }
              //System.err.println("通讯时长:" + comm_tms);
              byte[] buffer = new byte[bytebuffer_for_socket_RX.limit()];
              bytebuffer_for_socket_RX.get(buffer);
              //System.err.println("接收数据"+ComFn.bytesToHexString(buffer, buffer.length));
              if(true == getDataFromCommBuf(buffer)) {
                 connCount ++;
                 res_t = true;
              } else {
                 errCount ++;
                 connerrCount ++;
                 res_t = false;
              }
           }
       } catch (IOException e) {
           errCount++;
           connerrCount++;
       } finally {
          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 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) {
                 //System.out.println("%%%%%%%%%%%%%%%%%%%%");
                 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;
                 }
              }else if(baseData.addrstart == Modbus_ComBase.ActualSetPower_Start_Addr-2) {
                 //读取V区各个数据状态[01-8]
                 if(dyna_inf.putReadVLongBackByteBuffer(bf)) {
                    //System.out.println("读取V区数据成功01-08");
                    issuccess = true;
                 }
              }
           }else if(baseData.funcode == Modbus_ComBase.WRITE_SINGLE_COIL) {
              //单点写入成功
              if(baseData.funcode == BaseData.SINGLEWRITE_BYTECOUNT) {
                 issuccess = true;
                 //System.out.println("写入成功");
              }
           }
        }
      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(3000);
            errCount = 0;
         }
      } catch (SocketException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}