*
lsh
2 天以前 98ba81630f3192aaa4b7fbb67596c3154d05d7d3
src/main/java/com/zy/core/thread/RgvThread.java
@@ -48,6 +48,7 @@
     * 工位2复位信号
     */
    private boolean resetFlag2 = false;
    private boolean connectRgv = false;
    public RgvThread(RgvSlave slave) {
        this.slave = slave;
@@ -56,9 +57,41 @@
    @Override
    @SuppressWarnings("InfiniteLoopStatement")
    public void run() {
        this.connect();
        connectRgv = this.connect();
        while(!connectRgv){
            try {
                connectRgv = this.connect();
                Thread.sleep(100);
            } catch (Exception e){
            }
        }
        // 启动线程自动重连
        new Thread(this::rgvConnect).start();
        // 启动读数据线程
        new Thread(this::readStatusRgv).start();
        // 启动任务下发线程
        new Thread(this::taskIssued).start();
    }
    /**
     * 任务下发
     */
    private void taskIssued() {
        while (true) {
            try {
                if(!connectRgv){
                    try {
                        Thread.sleep(1000L);
                    } catch (Exception e){
                    }
                    continue;
                }
                int step = 1;
                Task task = MessageQueue.poll(SlaveType.Rgv, slave.getId());
                if (task != null) {
@@ -67,7 +100,7 @@
                switch (step) {
                    // 读数据
                    case 1:
                        readStatus();
//                        readStatus();
                        break;
                    //工位1写入数据
                    case 2:
@@ -87,15 +120,82 @@
                        command.setDestinationStaNo1((short)0);     // 目标站
                        write3(command);
                        break;
                    // 复位
                    case 4:
                        RgvCommand command4 = (RgvCommand) task.getData();
                        if (null == command4) {
                            command4 = new RgvCommand();
                        }
                        command4.setRgvNo(slave.getId()); // RGV编号
                        command4.setTaskNo1((short) 0); // 工作号
                        command4.setAckFinish1((short) 1);  // 任务完成确认位
                        command4.setTaskMode1(RgvTaskModeType.X_MOVE); // 任务模式
                        command4.setSourceStaNo1((short)0);     // 源站
                        command4.setDestinationStaNo1((short)0);     // 目标站
                        write3(command4);
                        break;
                    // 漫游
                    case 5:
                        write5();
                        break;
                    default:
                        break;
                }
                Thread.sleep(500);
                Thread.sleep(100);
            } catch (Exception e) {
                log.error("RGV写线程异常"+e.getMessage());
//                e.printStackTrace();
            }
        }
    }
    private void rgvConnect() {
        while (true) {
            try {
                Thread.sleep(1000);
                if(!connectRgv){
                    try {
                        connectRgv = this.connect();
                        Thread.sleep(100);
                    } catch (Exception e){
                    }
                }
            } catch (Exception e) {
                log.error("rgv连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
                initRgv();
//                e.printStackTrace();
            }
        }
    }
    private void readStatusRgv() {
        while (true) {
            try {
                if(!connectRgv){
                    try {
                        Thread.sleep(1000L);
                    } catch (Exception e){
                    }
                    initRgv();
                    continue;
                }
                Thread.sleep(40);
                readStatus();
            } catch (Exception e) {
                log.error("RGV读线程异常"+e.getMessage());
                log.error("RGV数据读取线程异常!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
                initRgv();
//                e.printStackTrace();
            }
        }
    }
    /**
@@ -150,7 +250,7 @@
            OperateResultExOne<byte[]> result = siemensNet.Read("DB100.0", (short) 20);
            OperateResultExOne<byte[]> resultV = siemensNet.Read("DB20.16", (short) 2);
            OperateResultExOne<byte[]> resultE = siemensNet.Read("DB20.26", (short) 2);
            if (result.IsSuccess) {
            if (result.IsSuccess && resultV.IsSuccess && resultE.IsSuccess) {
                if (null == rgvProtocol) {
                    rgvProtocol = new RgvProtocol();
                    rgvProtocol.setRgvNo(slave.getId());
@@ -223,7 +323,7 @@
        if (command.getAckFinish1().equals((short)0)) {
//            Thread.sleep(100L);
            siemensNet.Write("DB24.10.7", command.getRgvSome() == 1);
            Thread.sleep(100L);
            Thread.sleep(20L);
            result = siemensNet.Write("DB24.10.0", true);
        } else {
            siemensNet.Write("DB24.10.1", true);
@@ -250,8 +350,8 @@
        } catch (Exception ignore) {}
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
            this.readStatus();
//            Thread.sleep(200);
//            this.readStatus();
            log.info("RGV 工位1命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSONString(command));
            OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 工位1命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSONString(command)));
            return true;
@@ -260,6 +360,11 @@
            log.error("写入RGV plc工位1数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }
    private void write5(){
        try {
            siemensNet.Write("DB24.10.0", false);
        } catch (Exception ignore) {}
    }
    private boolean write3(RgvCommand command) throws InterruptedException {
        if (null == command) {
@@ -281,7 +386,7 @@
//        OperateResult result = siemensNet.Write("DB24.0", array);
        OperateResult result = null;
        if (command.getAckFinish1().equals((short)0)) {
            Thread.sleep(100L);
            Thread.sleep(20L);
            result = siemensNet.Write("DB24.10.0", true);
        } else {
            siemensNet.Write("DB24.10.1", true);
@@ -308,8 +413,8 @@
        } catch (Exception ignore) {}
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
            this.readStatus();
//            Thread.sleep(200);
//            this.readStatus();
            log.info("RGV 工位1命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSONString(command));
            OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 工位1命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSONString(command)));
            return true;
@@ -328,18 +433,18 @@
    /******************************************************************************************/
    /**************************************** 测试专用 *****************************************/
    /*****************************************************************************************/
    public static void main(String[] args) throws InterruptedException {
        RgvSlave slave = new RgvSlave();
        slave.setId(1);
        slave.setIp("192.168.6.9");
        slave.setRack(0);
        slave.setSlot(0);
        RgvThread rgvThread = new RgvThread(slave);
        rgvThread.connect();
        rgvThread.readStatus();
        System.out.println(JSON.toJSONString(rgvThread.rgvProtocol));
        Thread.sleep(3000L);
    }
//    public static void main(String[] args) throws InterruptedException {
//        RgvSlave slave = new RgvSlave();
//        slave.setId(1);
//        slave.setIp("192.168.6.9");
//        slave.setRack(0);
//        slave.setSlot(0);
//        RgvThread rgvThread = new RgvThread(slave);
//        rgvThread.connect();
//        rgvThread.readStatus();
//        System.out.println(JSON.toJSONString(rgvThread.rgvProtocol));
//        Thread.sleep(3000L);
//
//    }
}