自动化立体仓库 - WCS系统
#
zjj
2024-04-25 5a3218fc35dd3e949bb017c77839aedda8c528c8
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -603,6 +603,7 @@
                        if (crn.getId() == 5){
                            continue;
                        }
                        this.crnStnToLoc(crn, crnProtocol); //  入库
                        crnProtocol.setLastIo("O");
                    }
@@ -2020,261 +2021,11 @@
    }
    //RGV搬运
    public synchronized void rgvIoExecute() {
        for (RgvSlave slave : slaveProperties.getRgv()) {
            ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getId());
            if (rgvThread == null) {
                return;
            }
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) {
                return;
            }
            // 判断RGV是否空闲
            if (rgvProtocol.getModeType() == RgvModeType.COMPUTER
                    && rgvProtocol.getStatusType() == RgvStatusType.IDLE) {
                // 如果最近一次是入库模式,则优先扫描出库站点
                if (rgvProtocol.getLastIo().equals("I")) {
                    this.rgvOutExecute(rgvThread, rgvProtocol);//出库
                    rgvProtocol.setLastIo("O");
                }else {
                    this.rgvInExecute(rgvThread, rgvProtocol);//入库
                    rgvProtocol.setLastIo("I");
                }
                //检查是否存在工位1任务超时没下发
                if (rgvProtocol.getTaskNo1() > 0 && rgvProtocol.getTaskNo2() == 0) {
                    if (System.currentTimeMillis() - rgvProtocol.getTask1SendTime() > (1000*60)) {
                        //工位1下发时间超过60s
                        RgvCommand rgvCommand = new RgvCommand();
                        rgvCommand.setRgvNo(rgvProtocol.getRgvNo());//RGV编号
                        rgvCommand.setCommand((short) 1);//工位1确认
                        if (!MessageQueue.offer(SlaveType.Rgv, rgvCommand.getRgvNo(), new Task(4, rgvCommand))) {
                            log.error("RGV确认命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                            return;
                        }
                        log.error("RGV确认命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                    }
                }
            }
        }
    }
    //rgv入库
    public synchronized void rgvInExecute(ZyRgvThread rgvThread, RgvProtocol rgvProtocol) {
        for (RgvSlave.Sta sta : rgvThread.getSlave().getInStn()) {
            if (rgvProtocol.getTaskNo1() > 0) {
                //检测rgv工位1是否为入库任务
                WrkMast wrkMast1 = wrkMastMapper.selectByWrkNo(rgvProtocol.getTaskNo1().intValue());
                if (wrkMast1.getWrkSts() > 100) {
                    continue;//出库任务跳过
                }
            }
            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, sta.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(sta.getSourceStaNo());
            //判断输送线是否自动、有物、可入、有工作号
            if (!(staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isOutEnable() && (staProtocol.getWorkNo() > 0))) {
                continue;
            }
            //搜索工作档
            WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo().intValue());
            if (wrkMast == null) {
                continue;//工作档不存在
            }
            //获取RGV放货站点
            Integer staNo = Utils.getRgvStaNo(rgvProtocol.getRgvNo(), sta.getSourceStaNo(), staProtocol.getStaNo().intValue(), true);
            if (staNo == null) {
                continue;//RGV放货站点不存在
            }
            //判断目标站是否自动、可入、无物、无工作号
            StaProtocol staProtocol1 = devpThread.getStation().get(staNo);
            if (!(staProtocol1.isAutoing() && staProtocol1.isInEnable() && !staProtocol1.isLoading() && (staProtocol1.getWorkNo() == 0))) {
                continue;
            }
            // 命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvProtocol.getRgvNo());//RGV编号
            rgvCommand.setAckFinish((short) 0);
            //判断rgv工位1是否可用
            if (rgvProtocol.getTaskNo1() == 0) {
                rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());//工作号
                rgvCommand.setTaskMode1(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货
                rgvCommand.setSourceStaNo1(staProtocol.getStaNo());//源站
                rgvCommand.setDestinationStaNo1(staNo.shortValue());//目标站
                rgvCommand.setCommand((short) 0);//工位1暂不确认
            } else if (rgvProtocol.getTaskNo2() == 0) {//判断rgv工位2是否可用
                rgvCommand.setTaskNo2(wrkMast.getWrkNo().shortValue());//工作号
                rgvCommand.setTaskMode2(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货
                rgvCommand.setSourceStaNo2(staProtocol.getStaNo());//源站
                rgvCommand.setDestinationStaNo2(staNo.shortValue());//目标站
                rgvCommand.setCommand((short) 1);//工位2确认
            }else {
                continue;//没有可用RGV工位
            }
            if (!MessageQueue.offer(SlaveType.Rgv, rgvCommand.getRgvNo(), new Task(2, rgvCommand))) {
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                continue;
            }
            log.error("RGV命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
        }
    }
    //rgv出库
    public synchronized void rgvOutExecute(ZyRgvThread rgvThread, RgvProtocol rgvProtocol) {
        for (RgvSlave.Sta sta : rgvThread.getSlave().getOutStn()) {
            if (rgvProtocol.getTaskNo1() > 0) {
                //检测rgv工位1是否为出库任务
                WrkMast wrkMast1 = wrkMastMapper.selectByWrkNo(rgvProtocol.getTaskNo1().intValue());
                if (wrkMast1.getWrkSts() < 100) {
                    continue;//入库任务跳过
                }
            }
            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, sta.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(sta.getSourceStaNo());
            //判断输送线是否自动、有物、可出、有工作号
            if (!(staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isOutEnable() && (staProtocol.getWorkNo() > 0))) {
                continue;
            }
            //搜索工作档
            WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo().intValue());
            if (wrkMast == null) {
                continue;//工作档不存在
            }
            //获取RGV放货站点
            Integer staNo = Utils.getRgvStaNo(rgvProtocol.getRgvNo(), sta.getSourceStaNo(), staProtocol.getStaNo().intValue(), false);
            if (staNo == null) {
                continue;//RGV放货站点不存在
            }
            //判断目标站是否自动、可出、无物、无工作号
            StaProtocol staProtocol1 = devpThread.getStation().get(staNo);
            if (!(staProtocol1.isAutoing() && staProtocol1.isOutEnable() && !staProtocol1.isLoading() && (staProtocol1.getWorkNo() == 0))) {
                continue;
            }
            // 命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvProtocol.getRgvNo());//RGV编号
            rgvCommand.setAckFinish((short) 0);
            //判断rgv工位1是否可用
            if (rgvProtocol.getTaskNo1() == 0) {
                rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());//工作号
                rgvCommand.setTaskMode1(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货
                rgvCommand.setSourceStaNo1(staProtocol.getStaNo());//源站
                rgvCommand.setDestinationStaNo1(staNo.shortValue());//目标站
                rgvCommand.setCommand((short) 0);//工位1暂不确认
            } else if (rgvProtocol.getTaskNo2() == 0) {//判断rgv工位2是否可用
                rgvCommand.setTaskNo2(wrkMast.getWrkNo().shortValue());//工作号
                rgvCommand.setTaskMode2(RgvTaskModeType.PICK_RELEASE);//工作模式 取放货
                rgvCommand.setSourceStaNo2(staProtocol.getStaNo());//源站
                rgvCommand.setDestinationStaNo2(staNo.shortValue());//目标站
                rgvCommand.setCommand((short) 1);//工位2确认
            }else {
                continue;//没有可用RGV工位
            }
            if (!MessageQueue.offer(SlaveType.Rgv, rgvCommand.getRgvNo(), new Task(2, rgvCommand))) {
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                continue;
            }
            log.error("RGV命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
        }
    }
    //RGV工作完成
    public synchronized void rgvFinished() {
        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
        for (RgvSlave slave : slaveProperties.getRgv()) {
            ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getId());
            if (rgvThread == null) {
                return;
            }
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) {
                return;
            }
            //  状态:等待确认
            if (rgvProtocol.getStatusType() == RgvStatusType.WAITING) {
                if (rgvProtocol.getTaskNo1() == 9999) {
                    // RGV复位
                    rgvThread.setResetFlag1(true);
                }else {
                    // 获取待确认工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep3(rgvProtocol.getTaskNo1().intValue());
                    if (wrkMast == null) {
                        log.error("RGV处于等待确认且任务完成状态,但未找到工作档。RGV号={},工作号={}", rgvProtocol.getRgvNo(), rgvProtocol.getTaskNo1());
                        continue;
                    }
                    if (rgvProtocol.getTaskNo1() > 0 && rgvProtocol.getTaskFinish1() == 1) {
                        //工位1任务完成
                        // RGV复位
                        rgvThread.setResetFlag1(true);
                        //给目标站输送线写入数据
                        Short destinationPos1 = rgvProtocol.getDestinationPos1();//获取工位1目标站
                        StaProtocol staProtocol = devpThread.getStation().get(destinationPos1.intValue()).clone();
                        staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());//写入工作号
                        staProtocol.setStaNo(wrkMast.getStaNo().shortValue());//写入目标站
                        if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))) {
                            log.info("{}任务,RGV搬运成功,写入输送数据失败{}", wrkMast.getWrkNo(), JSON.toJSONString(staProtocol));
                        }
                        //2号RGV和3号RGV工作完成后需要更新工作档状态
                        if (rgvProtocol.getRgvNo() == 2 || rgvProtocol.getRgvNo() == 3) {
                            if (wrkMast.getWrkSts() == 13) {//13.RGV搬运中 => 14.已出库
                                wrkMast.setWrkSts(14L);
                                wrkMast.setModiTime(new Date());
                                wrkMastMapper.updateById(wrkMast);
                            }
                        }
                    }
                    if (rgvProtocol.getTaskNo2() > 0 && rgvProtocol.getTaskFinish2() == 1) {
                        //工位2任务完成
                        // RGV复位
                        rgvThread.setResetFlag2(true);
                        //给目标站输送线写入数据
                        Short destinationPos2 = rgvProtocol.getDestinationPos2();//获取工位2目标站
                        StaProtocol staProtocol = devpThread.getStation().get(destinationPos2.intValue()).clone();
                        staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());//写入工作号
                        staProtocol.setStaNo(wrkMast.getStaNo().shortValue());//写入目标站
                        if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))) {
                            log.info("{}任务,RGV搬运成功,写入输送数据失败{}", wrkMast.getWrkNo(), JSON.toJSONString(staProtocol));
                        }
                        //2号RGV和3号RGV工作完成后需要更新工作档状态
                        if (rgvProtocol.getRgvNo() == 2 || rgvProtocol.getRgvNo() == 3) {
                            if (wrkMast.getWrkSts() == 13) {//13.RGV搬运中 => 14.已出库
                                wrkMast.setWrkSts(14L);
                                wrkMast.setModiTime(new Date());
                                wrkMastMapper.updateById(wrkMast);
                            }
                        }
                    }
                }
            }
        }
    }
    /**
     * 扫描碟盘机自动入库空托盘