lxw
2020-07-21 8a214b4adecbbcabd8ac69c0603cea271295111f
修改
1个文件已修改
929 ■■■■ 已修改文件
src/com/data/PowerArk_SocketCliet_Thread.java 929 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/com/data/PowerArk_SocketCliet_Thread.java
@@ -1,464 +1,465 @@
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 = 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);
                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 {
        }
        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();
        }
    }
}