自动化立体仓库 - WCS系统
#
lsh
2024-06-27 efad59da8921d93537fca47d6ec2512e312bc1c3
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -197,6 +197,15 @@
                        Thread.sleep(400);
                        write((StaProtocol)task.getData());
                        break;
                    case 9:
                        write9((StaProtocol)task.getData());
                        break;
                    case 10:
                        write10((StaProtocol)task.getData());
                        break;
                    case 11:
                        write11((StaProtocol)task.getData());
                        break;
                    default:
                        break;
                }
@@ -289,11 +298,13 @@
                staProtocol.setBarcodeErr(status[6]);// 扫码失败
            }
        }
        if (slave.getId()==2){
            Thread.sleep(200);
            int[] staNosRgv = {623,624,625,626};
            for (int i = 0; i < staNosRgv.length; i++) {
                OperateResultExOne<byte[]> resultRgv = siemensS7Net.Read("DB100."+(1800+i*6), (short) 5);
                OperateResultExOne<byte[]> resultRgv2 = siemensS7Net.Read("DB100."+(1824+i*10), (short) 8);
                if (resultRgv.IsSuccess) {
                    Integer siteId = staNosRgv[i]; // 站点编号
                    StaProtocol staProtocol = station.get(siteId);
@@ -302,41 +313,33 @@
                        staProtocol.setSiteId(siteId);
                        station.put(siteId, staProtocol);
                    }
                    staProtocol.setEndRow(siemensS7Net.getByteTransform().TransInt16(result.Content, 0));     // 小车目标位
                    try{
                        staProtocol.setEndRow(siemensS7Net.getByteTransform().TransInt16(resultRgv2.Content, 0));     // 小车目标位
                    staProtocol.setNowRow(siemensS7Net.getByteTransform().TransInt16(result.Content, 2));   // 目标站
                        staProtocol.setNowRow(siemensS7Net.getByteTransform().TransInt16(resultRgv.Content, 0));   // 当前位置
                    boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, 4, 1);
                    staProtocol.setRGV1(status[0]);  // 自动
                    staProtocol.setRGV2(status[1]);  // 有物
                    staProtocol.setRGV3(status[2]); // 可入
                    staProtocol.setRGV4(status[3]);// 可出
                    staProtocol.setRGV5(status[4]);  // 空板信号
                    staProtocol.setRGV6(status[5]);  // 满托盘
                        boolean[] status = siemensS7Net.getByteTransform().TransBool(resultRgv.Content, 4, 1);
                        staProtocol.setRGV1(status[0]);  // 小车无货空闲
                        staProtocol.setRGV2(status[1]);  // 小车输送线取货到位
                        staProtocol.setRGV3(status[2]); // 小车运行中
//                        staProtocol.setRGV11(siemensS7Net.getByteTransform().TransInt16(resultRgv.Content, 2));  // 小车无货空闲
//                        staProtocol.setRGV22(siemensS7Net.getByteTransform().TransInt16(resultRgv.Content, 2));  // 小车输送线取货到位
//                        staProtocol.setRGV33(siemensS7Net.getByteTransform().TransInt16(resultRgv.Content, 2)); //小车运行中
                        staProtocol.setRGV44(siemensS7Net.getByteTransform().TransInt16(resultRgv2.Content, 2));//小车改左侧货物目标站
                        staProtocol.setRGV55(siemensS7Net.getByteTransform().TransInt16(resultRgv2.Content, 4));  //小车改右侧货物目标站
                        staProtocol.setRGV66(siemensS7Net.getByteTransform().TransInt16(resultRgv2.Content, 6));  // 上位机清除平移车资料
                        staProtocol.setRGV4(staProtocol.getRGV44() != 0 && staProtocol.getRGV44() != 2);//小车改左侧货物目标站
                        staProtocol.setRGV5(staProtocol.getRGV55() != 0 && staProtocol.getRGV55() != 2);  //小车改右侧货物目标站
                        staProtocol.setRGV6(staProtocol.getRGV66() != 0 && staProtocol.getRGV66() != 2);  // 上位机清除平移车资料
                    }catch (Exception e){
                        log.error("读取RGV信息失败"+e.getMessage());
                    }
                }
            }
        }
//        Thread.sleep(200);
//        OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB100.100", (short) (staNoSize * 2));
//        if (result1.IsSuccess) {
//            for (int i = 0; i < staNoSize; i++) {
//                Integer siteId = staNos.get(i); // 站点编号
//                boolean[] status = siemensS7Net.getByteTransform().TransBool(result1.Content, i*2, 1);
//                StaProtocol staProtocol = station.get(siteId);
//                staProtocol.setAutoing(status[0]);  // 自动
//                staProtocol.setLoading(status[1]);  // 有物
//                staProtocol.setInEnable(status[2]); // 可入
//                staProtocol.setOutEnable(status[3]);// 可出
//                staProtocol.setEmptyMk(status[4]);  // 空板信号
//                staProtocol.setFullPlt(status[5]);  // 满托盘
//                staProtocol.setHigh(status[6]);     // 高库位
//                staProtocol.setLow(status[7]);      // 低库位
//
//                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
//                    staProtocol.setPakMk(true);
//                }
//            }
//        }
        //条码扫描器
        Thread.sleep(200);
@@ -555,6 +558,374 @@
            log.info("输送线命令下发码垛完成  给输送复位 [id:{}] >>>>> 命令下发: {}",  slave.getId(), JSON.toJSON(staProtocol));
        }
    }
    /**
     * 写入 ID+目标站 =====> 单站点写入
     */
    private void write11(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {
            return;
        }
        boolean rgv6 = staProtocol.isRGV6();
        OperateResult result1 = null;
        OperateResult result2 = null;
        String resultV1 = "";
        short resultS1 = 1;
        short resultS2 = 2;
        switch (staProtocol.getSiteId()){
            case 623:
                resultV1 = "DB100.1830";
                break;
            case 624:
                resultV1 = "DB100.1840";
                break;
            case 625:
                resultV1 = "DB100.1850";
                break;
            case 626:
                resultV1 = "DB100.1860";
                break;
            default:
                return;
        }
        result1 = siemensS7Net.Write(resultV1, resultS1);
        //硫化罐任务写入后,回读一次,看是否成功
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        int writeCount = 1;
        do {
            try{
                if(!result1.IsSuccess){
                    log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                    result1 = siemensS7Net.Write(resultV1, resultS1);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
                OperateResultExOne<byte[]> resultRead1 = siemensS7Net.Read(resultV1, (short) 2);
                if (resultRead1.IsSuccess) {
                    short status = siemensS7Net.getByteTransform().TransInt16(resultRead1.Content, 0);
                    if (status == 1){
                        break;
                    } else {
                        log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                        result1 = siemensS7Net.Write(resultV1, resultS1);
                        Thread.sleep(100);
                        writeCount++;
                        continue;
                    }
                } else {
                    log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                    result1 = siemensS7Net.Write(resultV1, resultS1);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
            }catch (Exception e){
                log.error("写入RGV数据后回读出错,异常:"+e);
            }
            writeCount++;
        } while (writeCount<6);
        result2 = siemensS7Net.Write(resultV1, resultS2);
        //硫化罐任务写入后,回读一次,看是否成功
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        writeCount = 1;
        do {
            try{
                if(!result2.IsSuccess){
                    log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                    result2 = siemensS7Net.Write(resultV1, resultS2);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
                OperateResultExOne<byte[]> resultRead1 = siemensS7Net.Read(resultV1, (short) 2);
                if (resultRead1.IsSuccess) {
                    short status = siemensS7Net.getByteTransform().TransInt16(resultRead1.Content, 0);
                    if (status == resultS2){
                        break;
                    } else {
                        log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                        result2 = siemensS7Net.Write(resultV1, resultS2);
                        Thread.sleep(100);
                        writeCount++;
                        continue;
                    }
                } else {
                    log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                    result2 = siemensS7Net.Write(resultV1, resultS2);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
            }catch (Exception e){
                log.error("写入RGV数据后回读出错,异常:"+e);
            }
            writeCount++;
        } while (writeCount<6);
    }
    private void write10(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {
            return;
        }
        boolean rgv4 = staProtocol.isRGV4();
        boolean rgv5 = staProtocol.isRGV5();
        OperateResult result1 = null;
        OperateResult result2 = null;
        String resultV1 = "";
        short resultS1 = 1;
        short resultS2 = 2;
        if (rgv4){
            switch (staProtocol.getSiteId()){
                case 623:
                    resultV1 = "DB100.1826";
                    break;
                case 624:
                    resultV1 = "DB100.1836";
                    break;
                case 625:
                    resultV1 = "DB100.1846";
                    break;
                case 626:
                    resultV1 = "DB100.1856";
                    break;
                default:
                    return;
            }
        } else if (rgv5){
            switch (staProtocol.getSiteId()){
                case 623:
                    resultV1 = "DB100.1828";
                    break;
                case 624:
                    resultV1 = "DB100.1838";
                    break;
                case 625:
                    resultV1 = "DB100.1848";
                    break;
                case 626:
                    resultV1 = "DB100.1858";
                    break;
                default:
                    return;
            }
        }
        result1 = siemensS7Net.Write(resultV1, resultS1);
        //硫化罐任务写入后,回读一次,看是否成功
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        int writeCount = 1;
        do {
            try{
                if(!result1.IsSuccess){
                    log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                    result1 = siemensS7Net.Write(resultV1, resultS1);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
                OperateResultExOne<byte[]> resultRead1 = siemensS7Net.Read(resultV1, (short) 2);
                if (resultRead1.IsSuccess) {
//                    boolean[] status = siemensS7Net.getByteTransform().TransBool(resultRead1.Content, 0, 1);
                    short statusR1 = siemensS7Net.getByteTransform().TransInt16(resultRead1.Content, 0);
                    if (statusR1 == resultS1){
                        break;
                    } else {
                        log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                        result1 = siemensS7Net.Write(resultV1, resultS1);
                        Thread.sleep(100);
                        writeCount++;
                        continue;
                    }
                } else {
                    log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                    result1 = siemensS7Net.Write(resultV1, resultS1);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
            }catch (Exception e){
                log.error("写入RGV数据后回读出错,异常:"+e);
            }
            writeCount++;
        } while (writeCount<6);
        result2 = siemensS7Net.Write(resultV1, resultS2);
        writeCount = 1;
        do {
            try{
                if(!result2.IsSuccess){
                    log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                    result2 = siemensS7Net.Write(resultV1, resultS2);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
                OperateResultExOne<byte[]> resultRead1 = siemensS7Net.Read(resultV1, (short) 2);
                if (resultRead1.IsSuccess) {
//                    boolean[] status = siemensS7Net.getByteTransform().TransBool(resultRead1.Content, 0, 1);
                    short statusR1 = siemensS7Net.getByteTransform().TransInt16(resultRead1.Content, 0);
                    if (statusR1 == resultS2){
                        break;
                    } else {
                        log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                        result2 = siemensS7Net.Write(resultV1, resultS2);
                        Thread.sleep(100);
                        writeCount++;
                        continue;
                    }
                } else {
                    log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                    result2 = siemensS7Net.Write(resultV1, resultS2);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
            }catch (Exception e){
                log.error("写入RGV数据后回读出错,异常:"+e);
            }
            writeCount++;
        } while (writeCount<6);
    }
    private void write9(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {
            return;
        }
        short resultS1 = staProtocol.getEndRow();
        OperateResult result1 = null;
        OperateResult result2 = null;
        String resultV1 = "";
        String resultV2 = "";
        switch (staProtocol.getSiteId()){
            case 623:
                resultV1 = "DB100.1824";
                resultV2 = "DB100.1828";
                break;
            case 624:
                resultV1 = "DB100.1828";
                resultV2 = "DB100.1824";
                break;
            case 625:
                resultV1 = "DB100.1832";
                resultV2 = "DB100.1836";
                break;
            case 626:
                resultV1 = "DB100.1836";
                resultV2 = "DB100.1832";
                break;
            default:
                return;
        }
        result1 = siemensS7Net.Write(resultV1, resultS1);
        result2 = siemensS7Net.Write(resultV2, resultS1);
        //硫化罐任务写入后,回读一次,看是否成功
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        int writeCount = 1;
        do {
            try{
                if(!result1.IsSuccess){
                    log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                    result1 = siemensS7Net.Write(resultV1, resultS1);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
                OperateResultExOne<byte[]> resultRead1 = siemensS7Net.Read(resultV1, (short) 2);
                if (resultRead1.IsSuccess) {
                    short transInt16 = siemensS7Net.getByteTransform().TransInt16(resultRead1.Content, 0);
                    if (transInt16 == resultS1){
                        break;
                    } else {
                        log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                        result1 = siemensS7Net.Write(resultV1, resultS1);
                        Thread.sleep(100);
                        writeCount++;
                        continue;
                    }
                } else {
                    log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                    result1 = siemensS7Net.Write(resultV1, resultS1);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
            }catch (Exception e){
                log.error("写入RGV数据后回读出错,异常:"+e);
            }
            writeCount++;
        } while (writeCount<6);
        writeCount = 1;
        do {
            try{
                if(!result2.IsSuccess){
                    log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                    result2 = siemensS7Net.Write(resultV2, resultS1);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
                OperateResultExOne<byte[]> resultRead2 = siemensS7Net.Read(resultV2, (short) 2);
                if (resultRead2.IsSuccess) {
                    short transInt16 = siemensS7Net.getByteTransform().TransInt16(resultRead2.Content, 0);
                    if (transInt16 == resultS1){
                        break;
                    } else {
                        log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                        result2 = siemensS7Net.Write(resultV2, resultS1);
                        Thread.sleep(100);
                        writeCount++;
                        continue;
                    }
                } else {
                    log.error("写入RGV数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(staProtocol),writeCount);
                    result2 = siemensS7Net.Write(resultV2, resultS1);
                    Thread.sleep(100);
                    writeCount++;
                    continue;
                }
            }catch (Exception e){
                log.error("写入RGV数据后回读出错,异常:"+e);
            }
            writeCount++;
        } while (writeCount<6);
        if (!result1.IsSuccess) {
            staProtocol = station.get(staProtocol.getSiteId());
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol)));
            log.error("写入输送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
            log.info("输送线命令下发码垛完成  给输送复位 [id:{}] >>>>> 命令下发: {}",  slave.getId(), JSON.toJSON(staProtocol));
        }
    }
    // 更新入出库模式
    private void updateIoMode() throws InterruptedException {
        if (this.ioModeOf2F != IoModeType.NONE) {