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