whyclj
2020-07-21 1fe34bd9cd779c67beece43b4016e2a0192157c9
改成改单个寄存器
2个文件已修改
183 ■■■■■ 已修改文件
src/com/data/PowerArk_SocketCliet_Thread.java 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/com/modbus/util/BaseData.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/com/data/PowerArk_SocketCliet_Thread.java
@@ -20,8 +20,11 @@
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;
    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;                    //ֹͣ
    
    private ByteBuffer bytebuffer_for_socket_RX = ByteBuffer.allocate(1500);
    public static int PowerArk_Port = 502;
@@ -75,14 +78,14 @@
                        }
                    }*/
                    
                    if(run_count % 8 == 0) {
                    /*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
@@ -106,187 +109,228 @@
                /******************************************  д״̬   **********************************************/
                {
                    PowerArk_SocketClient_Thread_SQL.queryPowerArkControl(conn_pool, control);
                    if(control.FZ_b1 >= CONTROL_ON) {
                    if(control.FZ_b1 >= CMD_Start) {
                        //打开按钮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);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(control.FZ_b1)), socket);
                    }
                    
                    if(control.FZ_b2 >= CONTROL_ON) {
                    if(control.FZ_b2 >= CMD_Start) {
                        //打开按钮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);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(control.FZ_b2)), socket);
                    }
                    
                    if(control.FZ_b3 >= CONTROL_ON) {
                    if(control.FZ_b3 >= CMD_Start) {
                        //打开按钮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);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(control.FZ_b3)), socket);
                    }
                    
                    if(control.FZ_b4 >= CONTROL_ON) {
                    if(control.FZ_b4 >= CMD_Start) {
                        //打开按钮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);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(control.FZ_b4)), socket);
                    }
                    
                    if(control.FZ_b5 >= CONTROL_ON) {
                    if(control.FZ_b5 >= CMD_Start) {
                        //打开按钮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);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(control.FZ_b5)), socket);
                    }
                    
                    if(control.FZ_b6 >= CONTROL_ON) {
                    if(control.FZ_b6 >= CMD_Start) {
                        //打开按钮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);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(control.FZ_b6)), socket);
                    }
                    
                    if(control.FZ_b7 >= CONTROL_ON) {
                    if(control.FZ_b7 >= CMD_Start) {
                        //打开按钮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);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(control.FZ_b7)), socket);
                    }
                    
                    if(control.FZ_b8 >= CONTROL_ON) {
                    if(control.FZ_b8 >= CMD_Start) {
                        //打开按钮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);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(control.FZ_b8)), socket);
                    }
                    
                    if(control.FZ_b9 >= CONTROL_ON) {
                    if(control.FZ_b9 >= CMD_Start) {
                        //打开按钮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);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(control.FZ_b9)), socket);
                    }
                    
                    if(control.FZ_b10 >= CONTROL_ON) {
                    if(control.FZ_b10 >= CMD_Start) {
                        //打开按钮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);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(control.FZ_b10)), socket);
                    }
                    
                    if(control.FZ_b11 >= CONTROL_ON) {
                    if(control.FZ_b11 >= CMD_Start) {
                        //打开按钮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);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(control.FZ_b11)), socket);
                    }
                    
                    if(control.start_auto >= CONTROL_ON) {
                    if(control.start_auto >= CMD_Start) {
                        //启动自动加载
                        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);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(control.start_auto)), socket);
                    }
                    
                    if(control.stop_auto >= CONTROL_ON) {
                    if(control.stop_auto >= CMD_Start) {
                        //停止自动加载
                        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);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(control.stop_auto)), socket);
                    }
                    
                    if(control.sudden_crease >= CONTROL_ON) {
                    if(control.sudden_crease >= CMD_Start) {
                        //突加突卸
                        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);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(control.sudden_crease)), socket);
                    }
                    
                    if(control.all_open >= CONTROL_ON) {
                    if(control.all_open >= CMD_Start) {
                        //全部分闸
                        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);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(control.all_open)), socket);
                    }
                    
                    if(control.FZ_autostate1 >= CONTROL_ON) {
                    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);                        
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket);
                        control.FZ_autostate1 = CONTROL_OFF;
                        SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_autostate1)), socket);
                    }
                    
                    if(control.FZ_autostate2 >= CONTROL_ON) {
                    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);                        
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket);
                        control.FZ_autostate2 = CONTROL_OFF;
                        SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_autostate2)), socket);
                    }
                    
                    if(control.FZ_autostate3 >= CONTROL_ON) {
                    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 = CONTROL_OFF;
                        SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_autostate3)), socket);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket);
                    }
                    
                    if(control.FZ_autostate4 >= CONTROL_ON) {
                    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 = CONTROL_OFF;
                        SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_autostate4)), socket);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket);
                    }
                    
                    if(control.FZ_autostate5 >= CONTROL_ON) {
                    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 = CONTROL_OFF;
                        SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.FZ_autostate5)), socket);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket);
                    }
                    
                    if(control.local_control >= CONTROL_ON) {
                    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 = CONTROL_OFF;
                        SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.local_control)), socket);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket);
                    }
                    
                    if(control.back_control >= CONTROL_ON) {
                    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 = CONTROL_OFF;
                        SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.back_control)), socket);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket);
                    }
                    
                    if(control.central_control >= CONTROL_ON) {
                    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 = CONTROL_OFF;
                        SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.central_control)), socket);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket);
                    }
                    
                    if(control.inter_volume_M200 >= CONTROL_ON) {
                    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 = CONTROL_OFF;
                        SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.inter_volume_M200)), socket);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket);
                    }
                    
                    if(control.fan_button >= CONTROL_ON) {
                    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 = CONTROL_OFF;
                        SocketComm(basedata.createWiriteData(BaseData.createButtonByte(control.fan_button)), socket);
                        SocketComm(basedata.createSingleCollWiriteData(BaseData.createButtonByte(code_value)), socket);
                    }
                    
                    if(control.set_power >= CONTROL_ON) {
                    if(control.set_power >= CMD_Start) {
                        //设定功率
                        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);
                    }
                    //System.out.println(control);
                    PowerArk_ServerSocket_Thread_SQL.updateDynamicload_ControlTable(conn_pool, control);                    
                }
                
@@ -325,7 +369,7 @@
                bytebuffer_for_socket_RX.clear();
                //--------------------- socket write -----------------------------------//
                //byte[] b = makeCommBuf(cmd, bf);
                System.err.println(ComFn.bytesToHexString(bytedata, bytedata.length));
                System.err.println("发送数据:"+ComFn.bytesToHexString(bytedata, bytedata.length));
                Date d1 = new Date();
              
                
@@ -361,7 +405,7 @@
                }
                byte[] buffer = new byte[bytebuffer_for_socket_RX.limit()];
                bytebuffer_for_socket_RX.get(buffer);
                System.err.println(ComFn.bytesToHexString(buffer, buffer.length));
                System.err.println("接收数据"+ComFn.bytesToHexString(buffer, buffer.length));
                if(true == getDataFromCommBuf(buffer)) {
                    connCount ++;
                    res_t = true;
src/com/modbus/util/BaseData.java
@@ -4,6 +4,7 @@
import java.nio.ByteOrder;
import com.base.ComBase;
import com.base.ComFn;
public class BaseData {
@@ -54,6 +55,28 @@
    }
    
    /**
     *     构造单点写入数据
     * @param value
     * @return
     */
    public byte[] createSingleCollWiriteData(byte[] data) {
        ByteBuffer bf = ByteBuffer.allocate(ReadByteCount+regcount*2+1);
        bf.order(ByteOrder.BIG_ENDIAN);
        bf.putShort(ComBase.changeIntToShort(addrstart));        //接收标识          将寄存器起始地址放在标识中[2个字节]
        bf.putShort(ComBase.changeIntToShort(0x0000));            //协议标识符
        bf.putShort(ComBase.changeIntToShort(7+regcount*2));    //下面字节长度
        bf.put(ComBase.changeIntToByte(unitident));                //单元标识符(设备ID)
        bf.put(ComBase.changeIntToByte(funcode));                //功能码
        bf.putShort(ComBase.changeIntToShort(addrstart));        //寄存器起始地址
        bf.put(data);                                            //目标值
        bf.flip();
        byte[] databyte = new byte[bf.limit()];
        bf.get(databyte);
        return databyte;
    }
    /**
     *     构造多点写入数据
     * @param value
     * @return
@@ -71,7 +94,7 @@
        bf.put(ComBase.changeIntToByte(regcount*2));            //写字节数量
        bf.put(data);                                            //目标值
        bf.flip();
        byte[] databyte = new byte[ReadByteCount];
        byte[] databyte = new byte[bf.limit()];
        bf.get(databyte);
        return databyte;
    }