L
2025-09-25 3cf23392ce90c0a99835afe2db3a81206e093819
Merge remote-tracking branch 'origin/jshdwcs' into jshdwcs
11个文件已修改
825 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/RgvController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 579 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvModeType.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/Task.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/RgvProtocol.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/RgvThread.java 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 74 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastStaMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/RgvController.java
@@ -89,7 +89,7 @@
            if (rgvProtocol == null) continue;
            vo.setStatusType(rgvProtocol.modeType.desc);   // 模式状态
            vo.setStatus(rgvProtocol.getStatusType().desc); // 状态
//            vo.setStatus(rgvProtocol.getMode().desc); // 状态
            vo.setWorkNo1(rgvProtocol.getTaskNo1());      // 工位1任务号
            vo.setStatus1(rgvProtocol.getStatusType1().desc); // 工位1状态
            vo.setLoading1(rgvProtocol.getLoaded1() ? "有物" : "无物"); // 工位1有物
src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java
@@ -35,6 +35,7 @@
    List<WrkMastSta> selectNoInterfereList(@Param("staStarts") List<Integer> staStarts, @Param("staEnds") List<Integer> staEnds);
    WrkMastSta selectByWorkSta(@Param("workSta") Integer workSta, @Param("rgvo") Integer rgvNo);
    List<WrkMastSta> selectByWorkStaList(@Param("workSta") Integer workSta, @Param("rgvNo") Short rgvNo);
    WrkMastSta selectByWorkSta(@Param("workSta") Integer workSta, @Param("rgvNo") Integer rgvNo);
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -2790,7 +2790,56 @@
//        }
//    }
    /**
     * 小车上工位左右移动
     *
     */
    public synchronized boolean rgvStaMove(Long workNo) {
        try {
            for (RgvSlave rgv : slaveProperties.getRgv()) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    continue;
                } else {
                    rgvProtocol = rgvProtocol.clone();
                }
                if(rgvProtocol.isLoaded2ing() && rgvProtocol.isLoaded1ing()){
                    continue;
                }
                if(rgvProtocol.isLoaded1ing() && !rgvProtocol.isLoaded2ing() && rgvProtocol.getTaskNo1() != 0){
                    WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo1());
                    Short moveSta =0;
                    if(wrkMastSta.getStaEnd()< 1036 || (2000 < wrkMastSta.getStaEnd() && wrkMastSta.getStaEnd()<2031)){
                        moveSta = 2;
                        boolean rgvComplete = rgvComplete3((int) rgvProtocol.getRgvNo(),7,wrkMastSta.getWrkNo(),moveSta);
                        if (!rgvComplete){
                            log.error("小车工位移动失败,小车号{}!",rgvProtocol.getRgvNo());
                            break;
                        }
                    }
                }
                if(!rgvProtocol.isLoaded1ing() && rgvProtocol.isLoaded2ing() && rgvProtocol.getTaskNo2() != 0){
                    WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo2());
                    Short moveSta =0;
                    if(wrkMastSta.getStaEnd()> 2030 || (1036 < wrkMastSta.getStaEnd() && wrkMastSta.getStaEnd()<2000)){
                        moveSta = 1;
                        boolean rgvComplete = rgvComplete3((int) rgvProtocol.getRgvNo(),8,wrkMastSta.getWrkNo(),moveSta);
                        if (!rgvComplete){
                            log.error("小车工位移动失败,小车号{}!",rgvProtocol.getRgvNo());
                            break;
                        }
                    }
                }
            }
        }catch (Exception e){
            log.error("小车复位线程报错!"+e);
        }
    }
    /**
     *  完成小车任务
     */
@@ -2811,14 +2860,26 @@
                    log.error("{}号RGV尚未在数据库进行维护!3", rgv.getId());
                    continue;
                }
                //放货确认
                if(rgvProtocol.getStatusType1()==RgvStatusType.FETCHWAITING && rgvProtocol.getModeType() == RgvModeType.AUTO){
                    boolean rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(), 3);
                    if (!rgvComplete){
                        log.error("小车放货复位失败,小车号{}!", rgvProtocol.getRgvNo());
                    }
                }
                if(rgvProtocol.getStatusType2()==RgvStatusType.FETCHWAITING && rgvProtocol.getModeType() == RgvModeType.AUTO){
                    boolean rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(), 6);
                    if (!rgvComplete){
                        log.error("小车放货复位失败,小车号{}!", rgvProtocol.getRgvNo());
                    }
                }
                // 只有当RGV工位1等待WCS确认、自动
                if ((rgvProtocol.getStatusType1() == RgvStatusType.WAITING || rgvProtocol.getStatusType1()==RgvStatusType.FETCHWAITING)
                if (rgvProtocol.getStatusType1() == RgvStatusType.WAITING
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && (rgvProtocol.getStatusType() == RgvStatusType.WORKING1)
                ){
                    log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol);
                    log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType1(),rgvProtocol);
                    if(rgvProtocol.getTaskNo1() == 9999){ // 预调度任务确认
                        BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                        Integer staNo = basRgvMap.getNowRoute();
@@ -2847,27 +2908,19 @@
                            }
                        }
                    }
                    if (rgvProtocol.getTaskNo1()!=0 && rgvProtocol.getTaskNo1()!=9999){
                    if ( rgvProtocol.getTaskNo1()!=9999){
                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo1());
                        if(null == wrkMastSta){
                            log.error("小车无任务");
                            continue;
                        }
                        if(wrkMastSta.getWrkSts() == 1){//取货确认
                            wrkMastSta.setWrkSts(4);  //行走状态
                            try{
                                wrkMastStaMapper.updateById(wrkMastSta);
                                log.error("更新小车任务成功");
                            }catch (Exception e){
                                log.error("更新小车任务失败");
                            if(!Objects.equals(rgvProtocol.getRgvPosI2(), wrkMastSta.getStaEnd())){
                                continue;
                            }
                            boolean rgvComplete = false;
                            rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),7);
                            if (!rgvComplete){
                                log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                                break;
                            }
                            break;
                        }
                        if(wrkMastSta.getWrkSts() == 4){//行走确认
                            wrkMastSta.setUpdateTime(new Date());
                            wrkMastSta.setWrkSts(2);
//                            wrkMastSta.setWorkSta(2);
                            try{
                                wrkMastStaMapper.updateById(wrkMastSta);
                                log.error("更新小车任务成功");
@@ -2876,59 +2929,76 @@
                            }
                            boolean rgvComplete = false;
                            rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),7);
                            rgvComplete = rgvStaMove(wrkMastSta.getWrkNo());
                            if (!rgvComplete){
                                log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                                break;
                            }
                            break;
                        }
                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getWrkSts()!=1){
                            log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta);
                            continue;
                        }
                        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                        StaProtocol staProtocol = devpThread.getStation().get(wrkMastSta.getStaEnd());
                        if (staProtocol == null) {
                            continue;
                        } else {
                            staProtocol = staProtocol.clone();
                        }
                        if (!staProtocol.isAutoing() || !staProtocol.isLoading()){
                            continue;
                        }
                        WrkMast wrkMast = wrkMastMapper.selectPakInStep3(wrkMastSta.getWrkNo().intValue());
                        if (!Cools.isEmpty(wrkMast)){
                            if (!staProtocol.isPakMk()){
                                continue;
                            }
                            // 下发站点信息
                            staProtocol.setWorkNo(wrkMast.getWrkNo());
                            staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            log.error("rgv任务完成给输送线下发命令:"+wrkMast.getWrkNo()+","+wrkMast.getStaNo());
                            if (!MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol))) {
                                continue;
                            }
                        }
                        boolean rgvComplete = false;
                        rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),3);
                        if (!rgvComplete){
                            log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                            break;
                        }
                        WrkMast wrkMast1 = wrkMastService.selectByWrkNo(rgvProtocol.getTaskNo1());
                        wrkMast1.setPdcType("Y");
                        wrkMastService.updateById(wrkMast1);
                        wrkMastSta.setWrkSts(3);
                        wrkMastStaMapper.updateById(wrkMastSta);
                        BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                        basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
                        rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute(),"2471");
//                        if(wrkMastSta.getWrkSts() == 4){//行走确认
//                            wrkMastSta.setWrkSts(2);
//                            try{
//                                wrkMastStaMapper.updateById(wrkMastSta);
//                                log.error("更新小车任务成功");
//                            }catch (Exception e){
//                                log.error("更新小车任务失败");
//                            }
//                            boolean rgvComplete = false;
//
//                            rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),7);
//                            if (!rgvComplete){
//                                log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
//                                break;
//                            }
//                            break;
//                        }
//                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getWrkSts()!=1){
//                            log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta);
//                            continue;
//                        }
//
//                        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
//                        StaProtocol staProtocol = devpThread.getStation().get(wrkMastSta.getStaEnd());
//                        if (staProtocol == null) {
//                            continue;
//                        } else {
//                            staProtocol = staProtocol.clone();
//                        }
//                        if (!staProtocol.isAutoing() || !staProtocol.isLoading()){
//                            continue;
//                        }
//                        WrkMast wrkMast = wrkMastMapper.selectPakInStep3(wrkMastSta.getWrkNo().intValue());
//                        if (!Cools.isEmpty(wrkMast)){
//                            if (!staProtocol.isPakMk()){
//                                continue;
//                            }
//                            // 下发站点信息
//                            staProtocol.setWorkNo(wrkMast.getWrkNo());
//                            staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
//                            devpThread.setPakMk(staProtocol.getSiteId(), false);
//                            log.error("rgv任务完成给输送线下发命令:"+wrkMast.getWrkNo()+","+wrkMast.getStaNo());
//                            if (!MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol))) {
//                                continue;
//                            }
//                        }
//                        boolean rgvComplete = false;
//
//                        rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),3);
//                        if (!rgvComplete){
//                            log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
//                            break;
//                        }
//                        WrkMast wrkMast1 = wrkMastService.selectByWrkNo(rgvProtocol.getTaskNo1());
//                        wrkMast1.setPdcType("Y");
//
//                        wrkMastService.updateById(wrkMast1);
//
//                        wrkMastSta.setWrkSts(3);
//                        wrkMastStaMapper.updateById(wrkMastSta);
//                        BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
//                        basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
//                        rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute(),"2471");
                    }
                    else {
@@ -2936,31 +3006,19 @@
                    }
                }
                // 只有当RGV工位2等待WCS确认、自动
                if ((rgvProtocol.getStatusType2() == RgvStatusType.WAITING || rgvProtocol.getStatusType2()==RgvStatusType.FETCHWAITING)
                if (rgvProtocol.getStatusType2() == RgvStatusType.WAITING
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && (rgvProtocol.getStatusType() == RgvStatusType.WORKING1)
                ){
                    log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol);
                    log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType2(),rgvProtocol);
                    if (rgvProtocol.getTaskNo2() !=0 ){
                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo1());
                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo2());
                        if(wrkMastSta.getWrkSts() == 1){//取货确认
                            wrkMastSta.setWrkSts(4);  //行走状态
                            try{
                                wrkMastStaMapper.updateById(wrkMastSta);
                                log.error("更新小车任务成功");
                            }catch (Exception e){
                                log.error("更新小车任务失败");
                            }
                            boolean rgvComplete = false;
                            rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),7);
                            rgvComplete = rgvComplete2((int) rgvProtocol.getRgvNo(),8,wrkMastSta.getWrkNo());
                            if (!rgvComplete){
                                log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                                break;
                            }
                            break;
                        }
                        if(wrkMastSta.getWrkSts() == 4){//行走后确认
                            wrkMastSta.setWrkSts(2);
                            try{
                                wrkMastStaMapper.updateById(wrkMastSta);
@@ -2968,67 +3026,65 @@
                            }catch (Exception e){
                                log.error("更新小车任务失败");
                            }
                            boolean rgvComplete = false;
                            rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),7);
                            if (!rgvComplete){
                                log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                                break;
                            }
                            break;
                        }
                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getWrkSts()!=1){
                            log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta);
                            continue;
                        }
//                        if(wrkMastSta.getWrkSts() == 4){//行走后确认
//                            wrkMastSta.setWrkSts(2);
//                            try{
//                                wrkMastStaMapper.updateById(wrkMastSta);
//                                log.error("更新小车任务成功");
//                            }catch (Exception e){
//                                log.error("更新小车任务失败");
//                            }
//                            boolean rgvComplete = false;
//
//                            rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),7);
//                            if (!rgvComplete){
//                                log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
//                                break;
//                            }
//                            break;
//                        }
//                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getWrkSts()!=1){
//                            log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta);
//                            continue;
//                        }
                        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                        StaProtocol staProtocol = devpThread.getStation().get(wrkMastSta.getStaEnd());
                        if (staProtocol == null) {
                            continue;
                        } else {
                            staProtocol = staProtocol.clone();
                        }
                        if (!staProtocol.isAutoing() || !staProtocol.isLoading()){
                            continue;
                        }
                        WrkMast wrkMast = wrkMastMapper.selectPakInStep3(wrkMastSta.getWrkNo().intValue());
                        if (!Cools.isEmpty(wrkMast)){
                            if (!staProtocol.isPakMk()){
                                continue;
                            }
                            // 下发站点信息
                            staProtocol.setWorkNo(wrkMast.getWrkNo());
                            staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            log.error("rgv任务完成给输送线下发命令:"+wrkMast.getWrkNo()+","+wrkMast.getStaNo());
                            if (!MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol))) {
                                continue;
                            }
                        }
                        int sourceSta = wrkMast.getSourceStaNo();
                        boolean rgvComplete = false;
//                        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
//                        StaProtocol staProtocol = devpThread.getStation().get(wrkMastSta.getStaEnd());
//                        if (staProtocol == null) {
//                            continue;
//                        } else {
//                            staProtocol = staProtocol.clone();
//                        }
//                        if (!staProtocol.isAutoing() || !staProtocol.isLoading()){
//                            continue;
//                        }
//                        WrkMast wrkMast = wrkMastMapper.selectPakInStep3(wrkMastSta.getWrkNo().intValue());
//
//                        int sourceSta = wrkMast.getSourceStaNo();
//                        boolean rgvComplete = false;
//
//                        //双工位出入库不同工位复位
//                        rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),6);
                        //双工位出入库不同工位复位
                        rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),6);
                        if (!rgvComplete){
                            log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                            break;
                        }
                        WrkMast wrkMast1 = wrkMastService.selectByWrkNo(rgvProtocol.getTaskNo1());
                        wrkMast1.setPdcType("Y");
                        wrkMastService.updateById(wrkMast1);
                        wrkMastSta.setWrkSts(3);
                        wrkMastStaMapper.updateById(wrkMastSta);
                        BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                        basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
                        rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute(),"2471");
//                        if (!rgvComplete){
//                            log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
//                            break;
//                        }
//                        WrkMast wrkMast1 = wrkMastService.selectByWrkNo(rgvProtocol.getTaskNo1());
//                        wrkMast1.setPdcType("Y");
//
//                        wrkMastService.updateById(wrkMast1);
//
//                        wrkMastSta.setWrkSts(3);
//                        wrkMastStaMapper.updateById(wrkMastSta);
//                        BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
//                        basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
//                        rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute(),"2471");
                    }
                    else {
                        log.error("小车复位失败,小车号{},等待wcs确认但是没有工作号!",rgvProtocol.getRgvNo());
                        log.error("小车复位失败,小车号{},等待wcs确认!",rgvProtocol.getRgvNo());
                    }
                }
                //当小车无任务时取消锁定
@@ -3061,9 +3117,9 @@
                continue;
            }
            //小车无任务时跳过
            if(rgvProtocol.getTaskNo1() ==0 && rgvProtocol.getTaskNo2() == 0){
                continue;
            }
//            if(rgvProtocol.getTaskNo1() ==0 && rgvProtocol.getTaskNo2() == 0){
//                continue;
//            }
            //入库放货
            if(rgvThread.isPakIn()){
                for(RgvSlave.RgvStn rgvStn : rgv.getRgvInPStn()){//入库放货站点
@@ -3084,7 +3140,7 @@
                        continue;
                    }
                    if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable()
                    if (staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.isInEnable()
                            && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
                        flag = true;
                    }
@@ -3096,31 +3152,40 @@
                        continue;
                    }
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
//                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                    Integer wrkNo = 0;
//                    Integer wrkNo = 0;
                    if(rgvProtocol.getTaskNo2() != 0){
                        wrkNo = rgvProtocol.getTaskNo2();
                    }else{
                        wrkNo = rgvProtocol.getTaskNo1();
                    }
                    WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(wrkNo));//根据站点工作号和小车工作范围检索任务档
//                    else{
//                        wrkNo = rgvProtocol.getTaskNo1();
//                    }
                    if(!rgvProtocol.isLoaded2ing()){
                        continue;
                    }
                    WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo2());//根据站点工作号和小车工作范围检索任务档
                    if( null == wrkMastSta ) {
                        News.infoNoLog( " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo());
                        continue;
                    }
                    boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,null); //命令下发
                    if(!Objects.equals(rgvProtocol.getRgvPosI2(), wrkMastSta.getStaEnd())){
                        continue;
                    }
                    boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,null,2); //命令下发
                    if (sign){
                        try{
                            wrkMastSta.setWrkSts(3);
                            wrkMastStaMapper.updateById(wrkMastSta);
                            log.error("更新小车任务成功");
                        }catch (Exception e){
                            log.error("更新小车任务失败");
                        }
                        boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd(),"2526");
                        if (!signMap){
                            log.error("货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                        }
//                        boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd(),"2526");
//                        if (!signMap){
//                            log.error("货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
//                        }
                    } else {
                        log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
                    }
@@ -3147,7 +3212,7 @@
                        continue;
                    }
                    if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isOutEnable()
                    if (staProtocol.isAutoing() && !staProtocol.isLoading()   && staProtocol.isOutEnable()
                            && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")) {
                        flag = true;
                    }
@@ -3159,32 +3224,34 @@
                        continue;
                    }
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                    Integer wrkNo = 0;
//                    Integer wrkNo = 0;
                    if(rgvProtocol.getTaskNo1() != 0){
                        wrkNo = rgvProtocol.getTaskNo1();
                    }else{
                        wrkNo = rgvProtocol.getTaskNo2();
                    }
                    WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(wrkNo));//根据站点工作号和小车工作范围检索任务档
//                    else{
//                        wrkNo = rgvProtocol.getTaskNo2();
//                    }
                    WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo1());//根据站点工作号和小车工作范围检索任务档
                    if( null == wrkMastSta ) {
                        News.infoNoLog( " - 1" + " - 4" + " - 查询无待出库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo());
                        News.infoNoLog( " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo());
                        continue;
                    }
                    wrkMastSta.setWrkSts(2);
                    boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,null); //命令下发
                    if(!Objects.equals(rgvProtocol.getRgvPosI2(), wrkMastSta.getStaEnd())){
                        continue;
                    }
                    Integer pos = 2;
                    boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,null,pos); //命令下发
                    if (sign){
                        try{
                            wrkMastSta.setWrkSts(3);
                            wrkMastStaMapper.updateById(wrkMastSta);
                            log.error("更新小车任务成功");
                        }catch (Exception e){
                            log.error("更新小车任务失败");
                        }
                        boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd(),"2526");
                        if (!signMap){
                            log.error("货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                        }
                    } else {
                        log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
                    }
@@ -3217,8 +3284,8 @@
            }
            // 只有当RGV空闲 并且 无任务时才继续执行
            if ((rgvProtocol.getStatusType1() == RgvStatusType.IDLE || rgvProtocol.getStatusType2() == RgvStatusType.IDLE)
//                    && rgvProtocol.getModeType() == RgvModeType.AUTO
            if ((rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getStatusType2() == RgvStatusType.IDLE)
                    && rgvProtocol.getModeType() == RgvModeType.AUTO
                    && rgvThread.isPakMk()) {
                News.warnNoLog(""+mark+" - 0"+" - 开始执行RGV入出库作业下发");
                // 如果最近一次是入库模式
@@ -3266,7 +3333,7 @@
    public synchronized void rgvRunWrkMastInTest(){
        BasRgvMap basRgvMap = basRgvMapMapper.selectById(1);
        List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
        basRgvMap.setNowRoute(1031); //更新小车当前位置站点号
        basRgvMap.setNowRoute(1021); //更新小车当前位置站点号
        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(342);//根据站点工作号和小车工作范围检索任务档
//        WrkMastSta wrkMastSta2 = wrkMastStaMapper.selectByWorkSta(2, 1);
@@ -3280,10 +3347,10 @@
//        }
        wrkMastSta.setWorkSta(1);
        wrkMastSta.setRgvNo(1);
        wrkMastSta.setStaStart(1031);
        wrkMastSta.setStaStart(1035);
        Short direction = 2;//双工位最终抵达位置
        boolean sign = false;
        sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,direction); //命令下发
//        sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,direction,); //命令下发
        if (sign){
            wrkMastSta.setWrkSts(1);
            try{
@@ -3343,7 +3410,7 @@
            }
            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable()
            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() != 0
                    && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
                flag = true;
            }
@@ -3355,9 +3422,10 @@
                continue;
            }
            BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
            List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
//            List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
            basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
            WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档
//            WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档
            WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(staProtocol.getWorkNo());//根据站点工作号和小车工作范围检索任务档
            if( null == wrkMastSta ) {
                News.infoNoLog("" + mark + " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo());
@@ -3372,20 +3440,14 @@
                rgvThread.setPakRgv(false);
                continue;
            }
            wrkMastSta.setWorkSta(wrkMastSta2 != null ? 1 : 2);
            wrkMastSta.setWorkSta(wrkMastSta2 !=null ? 1 : 2);
            wrkMastSta.setRgvNo((int) rgvProtocol.getRgvNo());
            Short direction = 2;//双工位最终抵达位置
            boolean sign = false;
            //若取货为工位2且取货口前一站点有物,给双工位同时下发指令
            if(wrkMastSta.getWorkSta() == 2 && staProtocol2 != null && staProtocol2.isLoading() && staProtocol2.getWorkNo() > 0 && sign){
                WrkMastSta wrkMastSta3 = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol2.getWorkNo()));//根据站点工作号和小车工作范围检索任务档
                wrkMastSta3.setWorkSta(1);
                wrkMastSta3.setRgvNo((int) rgvProtocol.getRgvNo());
                sign =  rgvTakeFullAll2(basRgvMap.getRgvNo(), wrkMastSta, wrkMastSta3);
            }else{
                sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,direction); //命令下发
            }
            if (sign){
//            if(!Objects.equals(rgvProtocol.getRgvPosI2(), wrkMastSta.getStaEnd())){
//                continue;
//            }
            if(Objects.equals(rgvProtocol.getRgvPosI2(), wrkMastSta.getStaEnd()) && wrkMastSta.getWrkSts() == 4){
                wrkMastSta.setWrkSts(1);
                try{
                    wrkMastStaMapper.updateById(wrkMastSta);
@@ -3393,11 +3455,18 @@
                }catch (Exception e){
                    log.error("更新小车任务失败");
                }
            }
            //若取货为工位2且取货口前一站点有物,给双工位同时下发指令
            if(wrkMastSta.getWorkSta() == 2 && staProtocol2 != null && staProtocol2.isLoading() && staProtocol2.getWorkNo() > 0 && sign){
//                WrkMastSta wrkMastSta3 = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol2.getWorkNo()));//根据站点工作号和小车工作范围检索任务档
//                wrkMastSta3.setWorkSta(1);
//                wrkMastSta3.setRgvNo((int) rgvProtocol.getRgvNo());
//                sign =  rgvTakeFullAll2(basRgvMap.getRgvNo(), wrkMastSta, wrkMastSta3);
            }else{
                sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,direction,1); //命令下发
            }
            if (sign){
                rgvThread.setPakOut(false);//出库不允许
                boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd(),"2526");
                if (!signMap){
                    log.error("货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                }
            } else {
                log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
            }
@@ -3436,6 +3505,7 @@
            } else {
                staProtocol = staProtocol.clone();
            }
            // 查询站点详细信息
            BasDevp staDetl = basDevpService.selectById(rgvStn.getStaNo());
            if (staDetl == null) {
@@ -3443,7 +3513,7 @@
                continue;
            }
            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isOutEnable()
            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0
                    && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")) {
                flag = true;
            }
@@ -3455,9 +3525,9 @@
                continue;
            }
            BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
            List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
//            List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
            basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
            WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档
            WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(staProtocol.getWorkNo());//根据站点工作号和小车工作范围检索任务档
            if( null == wrkMastSta ) {
                News.infoNoLog("" + mark + " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo());
                continue;
@@ -3472,20 +3542,12 @@
                continue;
            }
            WrkMastSta wrkMastSta1 = wrkMastStaMapper.selectByWorkSta(1, (int) rgvProtocol.getRgvNo());
            wrkMastSta.setWorkSta(wrkMastSta1 != null ? 2 : 1);//若1号工位有任务给2号工位
            wrkMastSta.setWorkSta(wrkMastSta1 !=null ? 2 : 1);//若1号工位有任务给2号工位
            wrkMastSta.setRgvNo((int) rgvProtocol.getRgvNo());
            boolean sign = false;
            Short direction = 1;//工位1方向
            //若取货为工位2且取货口前一站点有物,给双工位同时下发指令
            if(wrkMastSta.getWorkSta() == 1 && staProtocol2 != null && staProtocol2.isLoading() && staProtocol2.getWorkNo() > 0 && sign){
                WrkMastSta wrkMastSta3 = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol2.getWorkNo()));//根据站点工作号和小车工作范围检索任务档
                wrkMastSta3.setWorkSta(2);
                wrkMastSta3.setRgvNo((int) rgvProtocol.getRgvNo());
                sign =  rgvTakeFullAll2(basRgvMap.getRgvNo(), wrkMastSta, wrkMastSta3);
            }else{
                sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,direction); //命令下发
            }
            if (sign){
            if(Objects.equals(rgvProtocol.getRgvPosI2(), wrkMastSta.getStaEnd()) && wrkMastSta.getWrkSts() == 4){
                wrkMastSta.setWrkSts(1);
                try{
                    wrkMastStaMapper.updateById(wrkMastSta);
@@ -3493,11 +3555,17 @@
                }catch (Exception e){
                    log.error("更新小车任务失败");
                }
            }
            if(wrkMastSta.getWorkSta() == 1 && staProtocol2 != null && staProtocol2.isLoading() && staProtocol2.getWorkNo() > 0 && sign){
//                WrkMastSta wrkMastSta3 = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol2.getWorkNo()));//根据站点工作号和小车工作范围检索任务档
//                wrkMastSta3.setWorkSta(2);
//                wrkMastSta3.setRgvNo((int) rgvProtocol.getRgvNo());
//                sign =  rgvTakeFullAll2(basRgvMap.getRgvNo(), wrkMastSta, wrkMastSta3);
            }else{
                sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,direction,2); //命令下发
            }
            if (sign){
                rgvThread.setPakIn(false);//入库不允许
                boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd(),"2526");
                if (!signMap){
                    log.error("货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                }
            } else {
                log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
            }
@@ -3946,61 +4014,45 @@
    /*
     * 小车取货至工位任务
     * */
    public synchronized boolean rgvTakeFullAll(Integer rgvId,WrkMastSta wrkMastSta,Short direction){
    public synchronized boolean rgvTakeFullAll(Integer rgvId,WrkMastSta wrkMastSta,Short direction,Integer pos){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            boolean pakIn1 = true;
            boolean pakIn2 = true;
            rgvCommand.setRgvNo(rgvId); // RGV编号
            if(wrkMastSta.getWrkSts() == 0 || wrkMastSta.getWrkSts() == 4){//初始后行走
                if(wrkMastSta.getWorkSta() == 2){//出库RGV取货行走
                    rgvCommand.setAckFinish2(false);  // 工位2任务完成确认位
                    rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号
                    rgvCommand.setTaskStatus2(RgvTaskStatusType.X_MOVE); // 工位2任务模式:  取放货
                    rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd());   //工位2 放货后要去的位置
                    rgvCommand.setTargetPosition1(wrkMastSta.getStaStart());   //工位2目标站点
//                    rgvCommand.setDirection1((short) 2);
//                    rgvCommand.setWrkTaskMove2(direction);
                    rgvCommand.setCommand(true);   //工位1任务确认
                    pakIn1 = false;
                }else{  //入库RGV取货行走
            if(wrkMastSta.getWrkSts() == 0){//初始后行走
                    rgvCommand.setAckFinish1(false);  // 工位1任务完成确认位
                    rgvCommand.setTaskNo1(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位1工作号
                    rgvCommand.setTaskStatus1(RgvTaskStatusType.X_MOVE); // 工位1任务模式:  取放货
                    rgvCommand.setEndStaNo1(wrkMastSta.getWrkEnd());   //工位1 放货后要去的位置
                    rgvCommand.setTargetPosition1(wrkMastSta.getStaStart());   //工位1目标站点
//                    rgvCommand.setDirection1((short) 1);
//                    rgvCommand.setDirection1(direction);
                    rgvCommand.setCommand(true);   //工位1任务确认
//                }
                wrkMastSta.setWrkSts(4);
                try{
                    wrkMastStaMapper.updateById(wrkMastSta);
                    log.error("更新小车任务成功");
                }catch (Exception e){
                    log.error("更新小车任务失败");
                }
                if(!pakIn1){
                    if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                        //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                        log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                        return false;
                    } else {
                        return true;
                    }
                }else{
                    if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                        //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                        log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                        return false;
                    } else {
                        return true;
                    }
                if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                    //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                    log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                    return false;
                } else {
                    return true;
                }
            }
            if(wrkMastSta.getWrkSts() == 1){//取货
                if(wrkMastSta.getWorkSta() == 2){//出库RGV取货
                if(pos == 2){//出库RGV取货
                    rgvCommand.setAckFinish2(false);  // 工位2任务完成确认位
                    rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号
                    rgvCommand.setTaskStatus2(RgvTaskStatusType.FETCH); // 工位2任务模式:  取放货
                    rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd());   //工位2 放货后要去的位置
                    rgvCommand.setTargetPosition1(wrkMastSta.getStaStart());   //工位2目标站点
                    rgvCommand.setDirection1((short)2);
                    rgvCommand.setWrkTaskMove2(direction);
                    rgvCommand.setDirection2((short)2);
//                    rgvCommand.setWrkTaskMove2(direction);
                    rgvCommand.setCommand(true);   //工位1任务确认
                    pakIn1 = false;
                }else{  //入库RGV取货
@@ -4010,11 +4062,11 @@
                    rgvCommand.setEndStaNo1(wrkMastSta.getWrkEnd());   //工位1 放货后要去的位置
                    rgvCommand.setTargetPosition1(wrkMastSta.getStaStart());   //工位1目标站点
                    rgvCommand.setDirection1((short)1);
                    rgvCommand.setWrkTaskMove1(direction);
//                    rgvCommand.setWrkTaskMove1(direction);
                    rgvCommand.setCommand(true);   //工位1任务确认
                }
                if(!pakIn1){
                    if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                    if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                        //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                        log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                        return false;
@@ -4022,7 +4074,7 @@
                        return true;
                    }
                }else{
                    if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                    if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                        //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                        log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                        return false;
@@ -4032,13 +4084,13 @@
                }
            }
            if(wrkMastSta.getWrkSts() == 2) {//放货
                if((wrkMastSta.getWorkSta() == 2)){ //工位2任务放货
                if((pos == 2)){ //工位2任务放货
                    rgvCommand.setAckFinish2(false);  // 工位2任务完成确认位
                    rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号
                    rgvCommand.setTaskStatus2(RgvTaskStatusType.PUT); // 工位2任务模式:  放货
                    rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd());   //工位2 放货后要去的位置
                    rgvCommand.setTargetPosition1(wrkMastSta.getStaEnd());   //工位2目标站点
                    rgvCommand.setDirection1((short)2);
                    rgvCommand.setDirection2((short)2);
                    rgvCommand.setCommand(true);   //工位1任务确认
                    pakIn2 = false;
                }else{  //工位1任务放货
@@ -4050,7 +4102,7 @@
                    rgvCommand.setDirection1((short)1);
                    rgvCommand.setCommand(true);   //工位1任务确认
                }
                if(!pakIn2){
                if(pakIn2){
                    if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                        //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                        log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
@@ -4315,6 +4367,43 @@
        }
    }
    /*
     * 小车复位
     * */
    public synchronized boolean rgvComplete2(Integer rgvId,Integer step,Long workNo){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(step, new RgvCommand(),workNo))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={}",rgvId);
                return false;
            } else {
                log.info("RGV命令下发成功,RGV号={}",rgvId);
                return true;
            }
        }catch (Exception e){
            log.error("RGV命令下发失败,RGV号={}。异常:"+e,rgvId);
            return false;
        }
    }
    public synchronized boolean rgvComplete3(Integer rgvId,Integer step,Long workNo,Short moveSta){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(step, new RgvCommand(),workNo,moveSta))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={}",rgvId);
                return false;
            } else {
                log.info("RGV命令下发成功,RGV号={}",rgvId);
                return true;
            }
        }catch (Exception e){
            log.error("RGV命令下发失败,RGV号={}。异常:"+e,rgvId);
            return false;
        }
    }
src/main/java/com/zy/core/MainProcess.java
@@ -37,8 +37,8 @@
        thread = new Thread(this::crnAndDevRun);
        thread.start();
        armThread = new Thread(this::roboticArmDispatch);
        armThread.start();
//        armThread = new Thread(this::roboticArmDispatch);
//        armThread.start();
    }
    private void crnAndDevRun() {
        while (!Thread.currentThread().isInterrupted()) {
@@ -137,6 +137,9 @@
                }
                //完成小车任务
                mainService.rgvCompleteWrkMastSta();
                //工位移动
//                mainService.rgvStaMove();
                /////////////////////////////////////RGV调度/////////////////////////////////////
            } catch (Exception e) {
@@ -157,12 +160,12 @@
                    continue;
                }
//                //arm任务完成
//                mainService.armMissionAccomplished();
//                mainService.armMissionAccomplishedScanToCheckIn();
//
//                //arm任务下发
//                mainService.armTaskAssignment();
                //arm任务完成
                mainService.armMissionAccomplished();
                mainService.armMissionAccomplishedScanToCheckIn();
                //arm任务下发
                mainService.armTaskAssignment();
            } catch (Exception e) {
                e.printStackTrace();
src/main/java/com/zy/core/enums/RgvModeType.java
@@ -5,8 +5,8 @@
    NONE(-1, "离线"),
    STOP(0, "关机"),
    HAND(1, "手动"),
    HALF_AUTO(2, "半自动"),
    AUTO(3, "自动"),
//    HALF_AUTO(2, "半自动"),
    AUTO(2, "自动"),
    AUTO2(100, "其它"),
    ;
src/main/java/com/zy/core/model/Task.java
@@ -12,6 +12,10 @@
    private Object data;
    private Long workNo;
    private Short moveSta;
    public Task() {
    }
@@ -19,4 +23,17 @@
        this.step = step;
        this.data = data;
    }
    public Task(Integer step, Object data,Long workNo) {
        this.step = step;
        this.data = data;
        this.workNo = workNo;
    }
    public Task(Integer step, Object data,Long workNo,Short moveSta) {
        this.step = step;
        this.data = data;
        this.workNo = workNo;
        this.moveSta = moveSta;
    }
}
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -326,6 +326,35 @@
        return map.get(RgvPos);
    }
    public Integer getRgvPosI2() {
        if (RgvPos == null) return 0;
        // key: 站点号  value: 基准物理位置
        Map<Integer, Integer> posMap = new HashMap<>();
        posMap.put(1004, 6534);
        posMap.put(1007, 33634);
        posMap.put(1010, 75174);
        posMap.put(1014, 102124);
        posMap.put(1018, 138224);
        posMap.put(1021, 178034);
        posMap.put(1024, 219684);
        posMap.put(1028, 246724);
        posMap.put(1031, 288194);
        posMap.put(1035, 315204);
        int tolerance = 50; // 允许误差范围
        for (Map.Entry<Integer, Integer> entry : posMap.entrySet()) {
            int site = entry.getKey();
            int basePos = entry.getValue();
            if (Math.abs(RgvPos - basePos) <= tolerance) {
                return site;
            }
        }
        return 0; // 没匹配到站点
    }
    @Override
    public RgvProtocol clone() {
        try {
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -3,6 +3,9 @@
import com.zy.asrs.entity.BasDevp;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
/**
 * 输送线plc单个站点详细信息
 * Created by vincent on 2020/8/6
@@ -131,5 +134,32 @@
        }
        return null;
    }
//    public Integer getNearbySta() {
//        if (getNearbySta == null) return 0;
//
//        // key: 站点号  value: 基准物理位置
//        Map<Integer, Integer> posMap = new HashMap<>();
//        posMap.put(1004, 6534);
//        posMap.put(1007, 33634);
//        posMap.put(1010, 75174);
//        posMap.put(1014, 102124);
//        posMap.put(1018, 138224);
//        posMap.put(1021, 178034);
//        posMap.put(1024, 219684);
//        posMap.put(1028, 246724);
//        posMap.put(1031, 288194);
//        posMap.put(1035, 315204);
//        int tolerance = 50; // 允许误差范围
//
//        for (Map.Entry<Integer, Integer> entry : posMap.entrySet()) {
//            int site = entry.getKey();
//            int basePos = entry.getValue();
//            if (Math.abs(getNearbySta - basePos) <= tolerance) {
//                return site;
//            }
//        }
//
//        return 0; // 没匹配到站点
//    }
}
src/main/java/com/zy/core/thread/RgvThread.java
@@ -100,7 +100,7 @@
                        }
                        command.setRgvNo(slave.getId()); // RGV编号
                        command.setTaskNo1(0); // 工作号
                        command.setAckFinish1(true);  // 任务完成确认位
                        command.setAckFinish1(false);  // 任务完成确认位
                        command.setTaskStatus1(RgvTaskStatusType.NONE); // 任务模式
                        command.setTargetPosition1( 0);     // 源站
                        command.setEndStaNo1(0);     // 目标站
@@ -116,9 +116,9 @@
                        }
                        command2.setRgvNo(slave.getId()); // RGV编号
                        command2.setTaskNo2(0); // 工作号
                        command2.setAckFinish2(true);  // 任务完成确认位
                        command2.setAckFinish2(false);  // 任务完成确认位
                        command2.setTaskStatus2(RgvTaskStatusType.NONE); // 任务模式
                        command2.setTargetPosition2( 0);     // 源站
                        command2.setTargetPosition2(0);     // 源站
                        command2.setEndStaNo2(0);     // 目标站
                        command2.setWrkTaskPri((short)0);
                        command2.setWrkTaskMove2((short)0);
@@ -131,11 +131,13 @@
                            command3 = new RgvCommand();
                        }
                        command3.setRgvNo(slave.getId()); // RGV编号
                        command3.setAckFinish1(true);  // 任务完成确认位
                        command3.setAckFinish1(false);  // 任务完成确认位
                        command3.setTaskStatus1(RgvTaskStatusType.NONE); // 任务模式
                        command3.setTargetPosition1( 0);     // 源站
                        command3.setWrkTaskMove1(task.getMoveSta() !=null ? task.getMoveSta() : 0);
                        command3.setCommand(false);
                        command3.setWrkTaskPri((short)0);
                        command3.setTaskNo1(Math.toIntExact(task.getWorkNo()));
                        write1(command3);
                        break;
                    case 8 :
@@ -144,11 +146,13 @@
                            command4 = new RgvCommand();
                        }
                        command4.setRgvNo(slave.getId()); // RGV编号
                        command4.setAckFinish2(true);  // 任务完成确认位
                        command4.setAckFinish2(false);  // 任务完成确认位
                        command4.setTaskStatus2(RgvTaskStatusType.NONE); // 任务模式
                        command4.setTargetPosition2( 0);     // 小车目标站清零
                        command4.setTargetPosition2(0);     // 小车目标站清零
                        command4.setWrkTaskMove2(task.getMoveSta() !=null ? task.getMoveSta() : 0);
                        command4.setCommand(false);
                        command4.setWrkTaskPri((short)0);
                        command4.setTaskNo2(Math.toIntExact(task.getWorkNo()));
                        write2(command4);
                        break;
                    // 回原点  避让
@@ -539,7 +543,7 @@
            return false;
        }
        OperateResultExOne<byte[]> result1 = siemensNet.Read("DB100.0", (short) 34);
        OperateResultExOne<byte[]> result1 = siemensNet.Read("DB100.0", (short) 39);
//        OperateResultExOne<byte[]> result4 = siemensNet.Read("DB100.10", (short) 2);
        if (result1.IsSuccess){
            RgvCommand one = new RgvCommand();
@@ -549,13 +553,6 @@
            one.setTaskNo1(siemensNet.getByteTransform().TransInt32(result1.Content, 10));
            one.setDirection1(siemensNet.getByteTransform().TransInt16(result1.Content, 14));
            one.setWrkTaskMove1(siemensNet.getByteTransform().TransInt16(result1.Content, 36));
//                one.setAckFinish1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0));
//            one.setTaskNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 2));
//            one.setTaskMode1(siemensNet.getByteTransform().TransInt16(result3.Content, 4));
//            one.setSourceStaNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 6));
//            one.setDestinationStaNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 8));
//            one.setCommand(siemensNet.getByteTransform().TransInt16(result4.Content, 0));
            News.error("RGV命令下发前读取状态[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
        }
@@ -564,7 +561,7 @@
        if (result2.IsSuccess){
            News.error("下发前把车子确认位置为false");
        }
        byte[] writeBytes = new byte[34];
        byte[] writeBytes = new byte[40];
        command.setRgvNo(slave.getId());
        writeInt32(writeBytes, 0, command.getTargetPosition1());
@@ -573,7 +570,7 @@
        writeInt32(writeBytes, 10, command.getTaskNo1());
        writeInt16(writeBytes, 14, (short)command.getDirection1());
        writeBool(writeBytes, 32, 0, command.getAckFinish1());
        writeInt16(writeBytes, 36, (short)command.getWrkTaskMove1());
        writeInt16(writeBytes, 38, (short)command.getWrkTaskMove1());
        OperateResult result = siemensNet.Write("DB100.0", writeBytes);
@@ -589,10 +586,10 @@
        //RGV任务写入后,回读一次,看是否成功
        Thread.sleep(400);
        try {
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 34);
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 39);
            if (resultRead.IsSuccess){
                RgvCommand one = new RgvCommand();
                one.setWrkTaskMove1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 36));
                one.setWrkTaskMove1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 38));
                one.setDirection1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
                one.setTaskNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 10));
                one.setTaskStatus1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
@@ -628,7 +625,7 @@
            News.error("RGV命令地址写入后回读出错");
        }
        if (command.getAckFinish1()) {
        if (!command.getAckFinish1()) {
            if (result.IsSuccess) {
                Thread.sleep(300);
                //任务下发次数
@@ -636,7 +633,10 @@
                do {
                    writeCount2++;
                    boolean commandFinish = false;
                    boolean commandFinish = true;
                    if(command.getCommand()){
                        commandFinish = false;
                    }
                    result = siemensNet.Write("DB100.32.0", commandFinish);
                    if(result.IsSuccess){
                        //RGV任务写入后,回读一次,看是否成功
@@ -708,10 +708,10 @@
            return false;
        }
        OperateResultExOne<byte[]> result1 = siemensNet.Read("DB100.0", (short) 34);
        OperateResultExOne<byte[]> result1 = siemensNet.Read("DB100.0", (short) 40);
        if (result1.IsSuccess){
            RgvCommand one = new RgvCommand();
            one.setTargetPosition2(siemensNet.getByteTransform().TransInt32(result1.Content, 16));
            one.setTargetPosition1(siemensNet.getByteTransform().TransInt32(result1.Content, 0));
            one.setEndStaNo2(siemensNet.getByteTransform().TransInt32(result1.Content, 20));
            one.setTaskStatus2(siemensNet.getByteTransform().TransInt16(result1.Content, 24));
            one.setTaskNo2(siemensNet.getByteTransform().TransInt32(result1.Content, 26));
@@ -727,10 +727,10 @@
        }
        byte[] writeBytes = new byte[34];
        byte[] writeBytes = new byte[42];
        command.setRgvNo(slave.getId());
        writeInt32(writeBytes, 16, command.getTargetPosition1());
        writeInt32(writeBytes, 0, command.getTargetPosition1());
        writeInt32(writeBytes, 20, command.getEndStaNo2());
        writeInt16(writeBytes, 24, (short)command.getTaskStatus2());
        writeInt32(writeBytes, 26, command.getTaskNo2());
@@ -754,7 +754,7 @@
        //RGV任务写入后,回读一次,看是否成功
        Thread.sleep(400);
        try {
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 34);
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 42);
            if (resultRead.IsSuccess){
                RgvCommand one = new RgvCommand();
                one.setWrkTaskMove2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 38));
@@ -762,13 +762,13 @@
                one.setTaskNo2(siemensNet.getByteTransform().TransInt32(resultRead.Content, 26));
                one.setTaskStatus2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 24));
                one.setEndStaNo2(siemensNet.getByteTransform().TransInt32(resultRead.Content, 20));
                one.setTargetPosition2(siemensNet.getByteTransform().TransInt32(resultRead.Content, 16));
                one.setTargetPosition1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 0));
                if (
                        !command.getDirection2().equals(one.getDirection2()) ||
                                !command.getTaskNo2().equals(one.getTaskNo2()) ||
                                !command.getTaskStatus2().equals(one.getTaskStatus2()) ||
                                !command.getEndStaNo2().equals(one.getEndStaNo2()) ||
                                !command.getTargetPosition2().equals(one.getTargetPosition2()) ||
                                !command.getTargetPosition1().equals(one.getTargetPosition1()) ||
                                !command.getWrkTaskMove2().equals(one.getWrkTaskMove2())
                ) {
                    try{
@@ -793,7 +793,7 @@
            News.error("RGV命令地址写入后回读出错");
        }
        if (command.getAckFinish1()) {
        if (!command.getAckFinish2()) {
            if (result.IsSuccess) {
                Thread.sleep(300);
                //任务下发次数
@@ -801,7 +801,10 @@
                do {
                    writeCount2++;
                    boolean commandFinish = false;
                    boolean commandFinish = true;
                    if(command.getCommand()){
                        commandFinish = false;
                    }
                    result = siemensNet.Write("DB100.32.1", commandFinish);
                    if(result.IsSuccess){
                        //RGV任务写入后,回读一次,看是否成功
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -287,13 +287,13 @@
                Integer offset3 = getOffsetBySiteId2(siteId);
                staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2));     // 工作号
                staProtocol.setStaNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2 + 12));   // 目标站
                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, offset + offset2 + 12));   // 目标站
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, offset + offset3, 2);
                staProtocol.setAutoing(status[0]);  // 自动
                staProtocol.setAutoing(!status[0]);  // 自动
                boolean[] status1 = siemensS7Net.getByteTransform().TransBool(result.Content, offset + offset3 - 4, 3);
                staProtocol.setLoading(status1[0]);  // 有物
                staProtocol.setLoading(!status1[0]);  // 有物
                if(staProtocol.isLoading()){
                    staProtocol.setInEnable(false); // 可入
                    staProtocol.setOutEnable(false);// 可出
@@ -313,22 +313,41 @@
                }
            }
        }
//        BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class);
        //RGV小车1
        BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class);
//        RGV小车1
//        Thread.sleep(100);
//        OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB50.200",(short)10);
//        OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB101.",(short)27);
//        if (result3.IsSuccess) {
//            BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result3.Content, 0));
//            if (!Cools.isEmpty(basRgvMap)){
//                Integer siteId = 1;
//                StaProtocol staProtocol = station.get(siteId);
//                if (null == staProtocol) {
//                    staProtocol = new StaProtocol();
//                    staProtocol.setSiteId(siteId);
//                    station.put(siteId, staProtocol);
//                Integer siteId1 = 1;
//                Integer siteId2 = 2;
//                StaProtocol staProtocol1 = station.get(siteId1);
//                StaProtocol staProtocol2 = station.get(siteId1);
//
//                if (null == staProtocol1) {
//                    staProtocol1 = new StaProtocol();
//                    staProtocol1.setSiteId(siteId1);
//                    station.put(siteId1, staProtocol1);
//                }
//                staProtocol.setAutoing(true);
//                staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result3.Content, 8)));
//                if (null == staProtocol2) {
//                    staProtocol2 = new StaProtocol();
//                    staProtocol2.setSiteId(siteId2);
//                    station.put(siteId2, staProtocol2);
//
//                }
//                String pos = String.valueOf(getRgvPosI(siemensS7Net.getByteTransform().TransInt32(result.Content, 4)));
//                staProtocol1.setAutoing(siemensS7Net.getByteTransform().TransInt16(result.Content, 2) == 2);
//                staProtocol2.setAutoing(siemensS7Net.getByteTransform().TransInt16(result.Content, 2) == 2);
//                staProtocol1.setNearbySta(pos);
//                staProtocol1.setStaNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, 8));
//                staProtocol2.setStaNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, 8));
//                staProtocol1.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, 16));
//                staProtocol2.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, 20));
//                boolean[] status1 = siemensS7Net.getByteTransform().TransBool(result.Content, 24, 2);
//                staProtocol1.setLoading(status1[0]);
//                staProtocol2.setLoading(status1[1]);
//                //                staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result3.Content, 8)));
//            }
//        }
        //RGV小车2
@@ -547,6 +566,33 @@
            }
        }
    }
    public Integer getRgvPosI(Integer pos) {
        if (pos == null) return 0;
        // key: 站点号  value: 基准物理位置
        Map<Integer, Integer> posMap = new HashMap<>();
        posMap.put(1004, 6534);
        posMap.put(1007, 33634);
        posMap.put(1010, 75174);
        posMap.put(1014, 102124);
        posMap.put(1018, 138224);
        posMap.put(1021, 178034);
        posMap.put(1024, 219684);
        posMap.put(1028, 246724);
        posMap.put(1031, 288194);
        posMap.put(1035, 315204);
        int tolerance = 50; // 允许误差范围
        for (Map.Entry<Integer, Integer> entry : posMap.entrySet()) {
            int site = entry.getKey();
            int basePos = entry.getValue();
            if (Math.abs(pos - basePos) <= tolerance) {
                return site;
            }
        }
        return 0; // 没匹配到站点
    }
    /**
     * 心跳
src/main/resources/mapper/WrkMastStaMapper.xml
@@ -101,6 +101,13 @@
        and rgv_no = #{rgvNo}
    </select>
    <select id="selectByWorkStaList" resultMap="BaseResultMap">
        select * from asr_wrk_mast_sta
        where work_sta = #{workSta}
          and rgv_no = #{rgvNo}
        order by update_time
    </select>
    <select id="selectAllWrkCount" resultType="java.lang.Integer">
        select count(1) from asr_wrk_mast_sta
        where 1=1