lty
2025-08-21 924d0d98c49c324669ba9dc5158b2141416447cc
#rgv同时下发工位1和工位2任务,标记优先级
9个文件已修改
530 ■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/BasRgvOpt.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 223 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/RgvSlave.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/RgvCommand.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/RgvProtocol.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/RgvThread.java 268 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgvOpt.java
@@ -165,6 +165,13 @@
        this.updateBy = updateBy;
        this.memo = memo;
    }
    public  BasRgvOpt(Integer wrkNo1, Integer wrkNo2, Integer rgvNo, Date sendTime, Integer posSta){
        this.wrkNo1 = wrkNo1;
        this.wrkNo2 = wrkNo2;
        this.rgvNo = rgvNo;
        this.sendTime = sendTime;
        this.posSta = posSta;
    }
    public BasRgvOpt(Integer wrkNo1, Integer wrkNo2, Integer rgvNo, Date sendTime, String mode, Integer sourceSta, Integer posSta, Integer sourceRow, Integer posRow, Integer response, Date updateTime, Long updateBy) {
        this.wrkNo1 = wrkNo1;
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -113,4 +113,5 @@
    WrkMast selectPickStep3(@Param("barcode")String barcode);
    WrkMast selectByWrkNo(@Param("wrkNo")Integer wrkNo);
    Integer countPakOutEmpty(@Param("staNo")Integer outSite);
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -2535,16 +2535,20 @@
    public synchronized void autoEmptyOut() {
        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
        List<Integer> list = new ArrayList<>();
        list.add(1108);list.add(112);
        Map<Integer,Integer> map = new HashMap<>();
        map.put(101,102);map.put(112,111);
        list.add(1108);list.add(2031);
        for (Integer site:list){
            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("sta_no", map.get(site)));
            if (!Cools.isEmpty(wrkMast)){
            Integer emptyCount = wrkMastMapper.countPakOutEmpty(site);
            StaProtocol staProtocol = null;
            if(emptyCount >= 2 && site == 1108){
                continue;
            }else if(emptyCount == 1 && site == 2031){
                continue;
            }
            //如果站点可出禁用,则不生成空盘出库任务
            StaProtocol staProtocol = devpThread.getStation().get(site);
            switch (site){
                case 1108:staProtocol = devpThread.getStation().get(site - 2);break;
                case 2031:staProtocol = devpThread.getStation().get(site);break;
            }
            if (staProtocol == null) {
                return;
            } else {
@@ -2555,10 +2559,6 @@
                    && staProtocol.isOutEnable()  //可出信号
                    && staProtocol.getWorkNo() == 0
            ) {
                WrkMast pakoutEmpty = wrkMastMapper.selectPakoutEmpty(site);
                if (null != pakoutEmpty) {
                    return;
                }
                Short loctype1 = 1;
                LocTypeDto locTypeDto = new LocTypeDto(loctype1, (short) 1, (short) 1);
                locTypeDto.setSiteId(site);
@@ -2799,17 +2799,16 @@
                        StaProtocol staProtocol = devpThread.getStation().get(staNo);
                        boolean rgvComplete = false;
                        long now = System.currentTimeMillis();
                        if (staProtocol.isLoading()) {
                            rgvProtocol.setLoadingStartTime(null); // 已到位,清空时间戳
                        } else {
                            if (rgvProtocol.getLoadingStartTime() == null) {
                                rgvProtocol.setLoadingStartTime(now);
                            }
                        }
//                        long now = System.currentTimeMillis();
//                        if (staProtocol.isLoading()) {
//                            rgvProtocol.setLoadingStartTime(null); // 已到位,清空时间戳
//                        } else {
//                            if (rgvProtocol.getLoadingStartTime() == null) {
//                                rgvProtocol.setLoadingStartTime(now);
//                            }
//                        }
                        if (staProtocol.isLoading() ||
                                (rgvProtocol.getLoadingStartTime() != null && now - rgvProtocol.getLoadingStartTime() > 10000)) {
                        if (staProtocol.isLoading()) {
                            rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(), 3);
                            if (!rgvComplete){
                                log.error("小车复位失败,小车号{}!等待入库取货", rgvProtocol.getRgvNo());
@@ -3062,7 +3061,7 @@
                }
            }
            //入库放货
            //出库放货
            if(  rgvThread.isPakOut()){
                for(RgvSlave.RgvStn rgvStn : rgv.getRgvOutPStn()){//入库放货站点
                    boolean flag = false;
@@ -3070,7 +3069,7 @@
                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, rgvStn.getDevpPlcId());
                    StaProtocol staProtocol = devpThread.getStation().get(rgvStn.getStaNo());
                    if (staProtocol == null) {
                        News.infoNoLog( " - 1" + " - 1" + " - Rgv入库放货站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
                        News.infoNoLog( " - 1" + " - 1" + " - Rgv出库放货站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
@@ -3078,7 +3077,7 @@
                    // 查询站点详细信息
                    BasDevp staDetl = basDevpService.selectById(rgvStn.getStaNo());
                    if (staDetl == null) {
                        News.error( " - 1" + " - 2" + " - 入库 ===>>Rgv放货站点在数据库不存在, 站点编号={}", rgvStn.getStaNo());
                        News.error( " - 1" + " - 2" + " - 出库 ===>>Rgv放货站点在数据库不存在, 站点编号={}", rgvStn.getStaNo());
                        continue;
                    }
@@ -3087,7 +3086,7 @@
                        flag = true;
                    }
                    if (!flag) {
                        News.errorNoLog( " - 1" + " - 3" + " - Rgv入库放货站信息(以下需要全true):"
                        News.errorNoLog( " - 1" + " - 3" + " - Rgv出库放货站信息(以下需要全true):"
                                + "自动信号" + staProtocol.isAutoing() + "有物信号" + staProtocol.isLoading()
                                + "工作号>0" + staProtocol.getWorkNo() + "可入信号" + staProtocol.isOutEnable()
                                + "能入信号(wms设置).equals(\"Y\")" + staDetl.getCanouting());
@@ -3104,7 +3103,7 @@
                    }
                    WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(wrkNo));//根据站点工作号和小车工作范围检索任务档
                    if( null == wrkMastSta ) {
                        News.infoNoLog( " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo());
                        News.infoNoLog( " - 1" + " - 4" + " - 查询无待出库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo());
                        continue;
                    }
                    wrkMastSta.setWrkSts(2);
@@ -3202,17 +3201,34 @@
    public synchronized void rgvRunWrkMastIn(RgvSlave slave, RgvProtocol rgvProtocol,Integer mark) {
        for (RgvSlave.RgvStn rgvStn : slave.getRgvInTStn()) {//rgv入库取货站点
            boolean flag = false;
            boolean ds = false;
            //遍历rgv入库取货站点
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, rgvStn.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(rgvStn.getStaNo());
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, (int) rgvProtocol.getRgvNo());
            StaProtocol staProtocol2 = null;
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, (int) rgvProtocol.getRgvNo());
            if(rgvStn.getStaNo2()!= null ){
                staProtocol2 = devpThread.getStation().get(rgvStn.getStaNo2());
                if (staProtocol2 == null) {
                    News.infoNoLog("" + mark + " - 1" + " - 1" + " - Rgv入库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
                    continue;
                } else {
                    staProtocol2 = staProtocol2.clone();
                }
                BasDevp staDetl2 = basDevpService.selectById(rgvStn.getStaNo2());
                if (staDetl2 == null) {
                    News.error("" + mark + " - 1" + " - 2" + " - 入库 ===>>Rgv站点在数据库不存在, 站点编号={}", rgvStn.getStaNo());
                    continue;
                }
            }
            if (staProtocol == null) {
                News.infoNoLog("" + mark + " - 1" + " - 1" + " - Rgv入库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
                continue;
            } else {
                staProtocol = staProtocol.clone();
            }
            // 查询站点详细信息
            BasDevp staDetl = basDevpService.selectById(rgvStn.getStaNo());
            if (staDetl == null) {
@@ -3236,12 +3252,13 @@
            List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
            basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
            WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档
            if( null == wrkMastSta ) {
                News.infoNoLog("" + mark + " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo());
                continue;
            }
            WrkMastSta wrkMastSta2 = wrkMastStaMapper.selectByWorkSta(2, (int) rgvProtocol.getRgvNo());
            boolean result = true;
            boolean result = false;
            if(wrkMastSta2 != null && rgvProtocol.getRgvNo() == 1){ //距离计算   2楼单入库口不需要计算
                 result = rgvCalcDistance((int) rgvProtocol.getRgvNo(),wrkMastSta2.getStaEnd(),wrkMastSta.getStaStart());//工位2放货站点,工位1取货站点
            }
@@ -3252,7 +3269,16 @@
            wrkMastSta.setWorkSta(wrkMastSta2 != null ? 1 : 2);
            wrkMastSta.setRgvNo((int) rgvProtocol.getRgvNo());
            Short direction = 2;//双工位最终抵达位置
            boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,direction); //命令下发
            boolean sign = false;
            //若取货为工位2且取货口前一站点有物,给双工位同时下发指令
            if(wrkMastSta.getWorkSta() == 2 && staProtocol2 != null && staProtocol2.isLoading() && staProtocol2.getWorkNo() > 0){
                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){
                wrkMastSta.setWrkSts(1);
                try{
@@ -3283,7 +3309,21 @@
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, rgvStn.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(rgvStn.getStaNo());
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, (int) rgvProtocol.getRgvNo());
            StaProtocol staProtocol2 = null;
            if(rgvStn.getStaNo2()!= null ){
                staProtocol2 = devpThread.getStation().get(rgvStn.getStaNo2());
                if (staProtocol2 == null) {
                    News.infoNoLog("" + mark + " - 1" + " - 1" + " - Rgv入库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
                    continue;
                } else {
                    staProtocol2 = staProtocol2.clone();
                }
                BasDevp staDetl2 = basDevpService.selectById(rgvStn.getStaNo2());
                if (staDetl2 == null) {
                    News.error("" + mark + " - 1" + " - 2" + " - 入库 ===>>Rgv站点在数据库不存在, 站点编号={}", rgvStn.getStaNo());
                    continue;
                }
            }
            if (staProtocol == null) {
                News.infoNoLog("" + mark + " - 1" + " - 1" + " - Rgv出库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
                continue;
@@ -3316,12 +3356,29 @@
                News.infoNoLog("" + mark + " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo());
                continue;
            }
            WrkMastSta wrkMastSta2 = wrkMastStaMapper.selectByWorkSta(2, (int) rgvProtocol.getRgvNo());
            boolean result = false;
            if(wrkMastSta2 != null && rgvProtocol.getRgvNo() == 1){ //距离计算   2楼单入库口不需要计算
                result = rgvCalcDistance((int) rgvProtocol.getRgvNo(),wrkMastSta2.getStaEnd(),wrkMastSta.getStaStart());//工位2放货站点,工位1取货站点
            }
            if(result){//若小车距离放货点距离近于取货点则跳过取货 true跳过取货/false优先取货
                rgvThread.setPakRgv(false);
                continue;
            }
            WrkMastSta wrkMastSta1 = wrkMastStaMapper.selectByWorkSta(1, (int) rgvProtocol.getRgvNo());
            wrkMastSta.setWorkSta(wrkMastSta1 != null ? 2 : 1);//若1号工位有任务给2号工位
            wrkMastSta.setRgvNo((int) rgvProtocol.getRgvNo());
            boolean sign = false;
            Short direction = 1;//工位1方向
            boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta, direction); //命令下发
            //若取货为工位2且取货口前一站点有物,给双工位同时下发指令
            if(wrkMastSta.getWorkSta() == 1 && staProtocol2 != null && staProtocol2.isLoading() && staProtocol2.getWorkNo() > 0){
                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){
                wrkMastSta.setWrkSts(1);
                try{
@@ -3509,7 +3566,7 @@
                    // 根据输送线plc遍历
                    for (DevpSlave devp : slaveProperties.getDevp()) {
                        // 遍历入库口  入库预调度
                        List<Integer> staNos = Arrays.asList(1042, 1043, 1105, 1104);
                        List<Integer> staNos = Arrays.asList( 1043, 1104,1037);
                        for (Integer staNo : staNos) {
                            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                            StaProtocol staProtocol = devpThread.getStation().get(staNo);
@@ -3520,10 +3577,14 @@
                                rgvCommand.setTaskNo1(9999); // 工位1工作号
                                rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式:  移动
                                rgvCommand.setEndStaNo1(0);   //工位1 放货后要去的位置
                                if(staNo == 1042 || staNo ==1043){
                                    rgvCommand.setTargetPosition1(1042);   //工位1目标站点
                                }else{
                                    rgvCommand.setTargetPosition1(1105);   //工位1目标站点
                                switch (staNo){
                                    case 1043: rgvCommand.setTargetPosition1(1042);break;  //工位1目标站点
                                    case 1104: rgvCommand.setTargetPosition1(1105);break;
                                    case 1037: rgvCommand.setTargetPosition1(1036);break;
                                }
                                if(Objects.equals(basRgvMap.getNowRoute(), staNo)){
                                    continue;
                                }
                                rgvCommand.setCommand(true);   //工位1任务确认
                                if (!MessageQueue.offer(SlaveType.Rgv, (int) rgvProtocol.getRgvNo(), new Task(4, rgvCommand))) {
@@ -3864,6 +3925,96 @@
        }
    }
    /*
     * 小车取货至双工位任务
     * */
    public synchronized boolean rgvTakeFullAll2(Integer rgvId,WrkMastSta wrkMastSta,WrkMastSta wrkMastSta2){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            boolean pakIn1 = true;
            boolean pakIn2 = true;
            rgvCommand.setRgvNo(rgvId); // RGV编号
            if(wrkMastSta.getWrkSts() == 0) {//取货
                if (wrkMastSta.getWorkSta() == 2) {//入库RGV取货
                    rgvCommand.setAckFinish2(false);  // 工位2任务完成确认位
                    rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号
                    rgvCommand.setTaskStatus2(RgvTaskStatusType.FETCH); // 工位2任务模式:  取放货
                    rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd());   //工位2 放货后要去的位置
                    rgvCommand.setTargetPosition2(wrkMastSta.getStaStart());   //工位2目标站点
                    rgvCommand.setCommand(true);   //工位1任务确认
                    rgvCommand.setAckFinish1(false);  // 工位1任务完成确认位
                    rgvCommand.setTaskNo1(Math.toIntExact(wrkMastSta2.getWrkNo())); // 工位1工作号
                    rgvCommand.setTaskStatus1(RgvTaskStatusType.FETCH); // 工位1任务模式:  取放货
                    rgvCommand.setEndStaNo1(wrkMastSta2.getWrkEnd());   //工位1 放货后要去的位置
                    rgvCommand.setTargetPosition1(wrkMastSta2.getStaStart());   //工位1目标站点
                    rgvCommand.setCommand(true);   //工位1任务确认
                    rgvCommand.setWrkTaskPri((short) 2); //优先执行工位2任务
                } else {  //出库RGV取货
                    rgvCommand.setAckFinish1(false);  // 工位1任务完成确认位
                    rgvCommand.setTaskNo1(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位1工作号
                    rgvCommand.setTaskStatus1(RgvTaskStatusType.FETCH); // 工位1任务模式:  取放货
                    rgvCommand.setEndStaNo1(wrkMastSta.getWrkEnd());   //工位1 放货后要去的位置
                    rgvCommand.setTargetPosition1(wrkMastSta.getStaStart());   //工位1目标站点
                    rgvCommand.setAckFinish2(false);  // 工位2任务完成确认位
                    rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号
                    rgvCommand.setTaskStatus2(RgvTaskStatusType.FETCH); // 工位2任务模式:  取放货
                    rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd());   //工位2 放货后要去的位置
                    rgvCommand.setTargetPosition2(wrkMastSta.getStaStart());   //工位2目标站点
                    rgvCommand.setWrkTaskPri((short) 1); //出库取货优先执行工位1任务
                    rgvCommand.setCommand(true);   //工位1任务确认
                }
                if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(2, 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() == 2) {//放货
//                if((wrkMastSta.getWorkSta() == 2)){ //工位2任务放货
//                    rgvCommand.setAckFinish2(false);  // 工位2任务完成确认位
//                    rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号
//                    rgvCommand.setTaskStatus2(RgvTaskStatusType.PUT); // 工位2任务模式:  放货
//                    rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd());   //工位2 放货后要去的位置
//                    rgvCommand.setTargetPosition2(wrkMastSta.getStaEnd());   //工位2目标站点
//                    rgvCommand.setCommand(true);   //工位1任务确认
//                    pakIn2 = false;
//                }else{  //工位1任务放货
//                    rgvCommand.setAckFinish1(false);  // 工位1任务完成确认位
//                    rgvCommand.setTaskNo1(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位1工作号
//                    rgvCommand.setTaskStatus1(RgvTaskStatusType.PUT); // 工位1任务模式:  放货
//                    rgvCommand.setEndStaNo1(wrkMastSta.getWrkEnd());   //工位1 放货后要去的位置
//                    rgvCommand.setTargetPosition1(wrkMastSta.getStaEnd());   //工位1目标站点
//                    rgvCommand.setCommand(true);   //工位1任务确认
//                }
//                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));
//                        return false;
//                    } else {
//                        return true;
//                    }
//                }else{
//                    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;
//                    }
//                }
//            }
            return true;
        }catch (Exception e){
            return false;
        }
    }
    /*
     * 小车取货至工位任务
     * */
src/main/java/com/zy/core/model/RgvSlave.java
@@ -54,6 +54,8 @@
        // RGV站点编号
        private Integer staNo;
        // RGV二站点编号
        private Integer staNo2;
//        // 排
//        private Integer row;
src/main/java/com/zy/core/model/command/RgvCommand.java
@@ -132,6 +132,14 @@
     */
    private Boolean command = false;
    /**
     * 同时下发时作业顺序
     * 0:无(不判断)
     * 1:工位1先执行
     * 2:工位2先执行
     */
    Short wrkTaskPri = 0;
    public void setTaskMode1(Short taskMode1){
        this.taskMode1 = taskMode1;
        this.taskModeType1 = RgvTaskModeType.get(taskModeType1);
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -28,6 +28,14 @@
    private transient Long loadingStartTime;
    /**
     * 执行优先级
     * 0:不判断
     * 1:工位1先执行
     * 2:工位2先执行
     */
    public Short wrkTaskPri;
    /**
     * RGV当前状态工位1
src/main/java/com/zy/core/thread/RgvThread.java
@@ -80,10 +80,10 @@
                    case 1:
                        readStatus();
                        break;
//                    // 工位1、2写入数据
//                    case 2:
//                        write((RgvCommand) task.getData());
//                        break;
                    // 工位1、2写入数据
                    case 2:
                        write12((RgvCommand) task.getData());
                        break;
                    //工位1写入数据
                    case 4:
                        write1((RgvCommand) task.getData());
@@ -104,6 +104,7 @@
                        command.setTaskStatus1(RgvTaskStatusType.NONE); // 任务模式
                        command.setTargetPosition1( 0);     // 源站
                        command.setEndStaNo1(0);     // 目标站
                        command.setWrkTaskPri((short)0);
                        command.setCommand(false);
                        write1(command);
                        break;
@@ -118,6 +119,7 @@
                        command2.setTaskStatus2(RgvTaskStatusType.NONE); // 任务模式
                        command2.setTargetPosition2( 0);     // 源站
                        command2.setEndStaNo2(0);     // 目标站
                        command2.setWrkTaskPri((short)0);
                        command2.setCommand(false);
                        write2(command2);
                        break;
@@ -131,6 +133,7 @@
                        command3.setTaskStatus1(RgvTaskStatusType.NONE); // 任务模式
                        command3.setTargetPosition1( 0);     // 源站
                        command3.setCommand(false);
                        command3.setWrkTaskPri((short)0);
                        write1(command3);
                        break;
                    case 8 :
@@ -143,6 +146,7 @@
                        command4.setTaskStatus2(RgvTaskStatusType.NONE); // 任务模式
                        command4.setTargetPosition2( 0);     // 小车目标站清零
                        command4.setCommand(false);
                        command4.setWrkTaskPri((short)0);
                        write2(command4);
                        break;
                    // 回原点  避让
@@ -195,6 +199,7 @@
        rgvProtocol.setErr5(false);
        rgvProtocol.setErr6(false);
        rgvProtocol.setErr7(false);
        rgvProtocol.setWrkTaskPri((short)0);
        //工位1状态
        rgvProtocol.setTaskNo1(0);
        rgvProtocol.setStatus1((short)-1);
@@ -242,7 +247,7 @@
     */
    private void readStatus(){
        try {
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 30);
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 27);
            if (result.IsSuccess) {
                if (null == rgvProtocol) {
                    rgvProtocol = new RgvProtocol();
@@ -276,6 +281,7 @@
                rgvProtocol.setErr5(status3[4]);
                rgvProtocol.setErr6(status3[5]);
                rgvProtocol.setErr7(status3[6]);
//                rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 12));
//                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 14));
@@ -346,73 +352,179 @@
        }
    }
//    /**
//     * 工位1、2同时写入数据
//     */
//    private boolean write(RgvCommand command) throws InterruptedException {
//        if (null == command) {
//            log.error("RGV写入命令为空");
//            return false;
//        }
////        convertRow(command);
//        command.setRgvNo(slave.getId());
//        short[] array = new short[11];
//        array[0] = command.getAckFinish1();
//        array[1] = command.getTaskNo1();
//        array[2] = command.getTaskMode1();
//        array[3] = command.getSourceStaNo1();
//        array[4] = command.getDestinationStaNo1();
////        array[0] = command.getAckFinish1();
////        array[1] = command.getTaskNo1();
////        array[2] = command.getTaskMode1();
////        array[3] = command.getSourceStaNo1();
////        array[4] = command.getDestinationStaNo1();
////        array[5] = command.getAckFinish2();
////        array[6] = command.getTaskNo2();
////        array[7] = command.getTaskMode2();
////        array[8] = command.getSourceStaNo2();
////        array[9] = command.getDestinationStaNo2();
////        array[10] = command.getCommand();
//        OperateResult result = siemensNet.Write("DB100.0", array);
//
////        if (command.getAckFinish1() == 0 && command.getAckFinish2() == 0) {
////            short commandFinish = 3;  //工位1、2任务同时写入
////            Thread.sleep(100L);
////            result = siemensNet.Write("DB100.20", commandFinish);
////        }
//
//        try {
//            // 日志记录
//            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
//            BasRgvOpt basRgvOpt = new BasRgvOpt(
//                    command.getTaskNo1().intValue(),
//                    command.getTaskNo2().intValue(),
//                    command.getRgvNo(),
//                    new Date(),
//                    command.getTaskModeType1().toString(),
//                    command.getSourceStaNo1().intValue(),
//                    command.getDestinationStaNo1().intValue(),
//                    command.getSourceStaNo2().intValue(),
//                    command.getDestinationStaNo2().intValue(),
//                    null,
//                    new Date(),
//                    null
//            );
//            bean.insert(basRgvOpt);
//        } catch (Exception ignore) {}
//
//        if (result != null && result.IsSuccess) {
//            Thread.sleep(200);
//            this.readStatus();
//            log.info("RGV 命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
//            OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
//            return true;
//        } else {
//            OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
//            log.error("写入RGV plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
//            return false;
//        }
//    }
    /**
     * 工位1、2同时写入数据
     */
    private boolean write12(RgvCommand command) throws InterruptedException {
        if (null == command) {
            log.error("RGV写入命令为空");
            return false;
        }
        OperateResultExOne<byte[]> result1 = siemensNet.Read("DB100.0", (short) 34);
//        OperateResultExOne<byte[]> result4 = siemensNet.Read("DB100.10", (short) 2);
        if (result1.IsSuccess){
            RgvCommand one = new RgvCommand();
            one.setTargetPosition1(siemensNet.getByteTransform().TransInt32(result1.Content, 0));
            one.setEndStaNo1(siemensNet.getByteTransform().TransInt32(result1.Content, 4));
            one.setTaskStatus1(siemensNet.getByteTransform().TransInt16(result1.Content, 8));
            one.setTaskNo1(siemensNet.getByteTransform().TransInt32(result1.Content, 10));
            one.setDirection1(siemensNet.getByteTransform().TransInt16(result1.Content, 14));
            one.setTargetPosition2(siemensNet.getByteTransform().TransInt32(result1.Content, 16));
            one.setEndStaNo2(siemensNet.getByteTransform().TransInt32(result1.Content, 20));
            one.setTaskStatus2(siemensNet.getByteTransform().TransInt16(result1.Content, 24));
            one.setTaskNo2(siemensNet.getByteTransform().TransInt32(result1.Content, 26));
            one.setDirection2(siemensNet.getByteTransform().TransInt16(result1.Content, 30));
            News.error("RGV命令下发前读取状态[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
        }
        OperateResult result2 = siemensNet.Write("DB100.34", false);
        if (result2.IsSuccess){
            News.error("下发前把车子确认位置为false");
        }
        byte[] writeBytes = new byte[36];
        command.setRgvNo(slave.getId());
        siemensNet.getByteTransform().TransInt32(writeBytes, 0, command.getTargetPosition1());
        siemensNet.getByteTransform().TransInt32(writeBytes, 4, command.getEndStaNo1());
        siemensNet.getByteTransform().TransInt16(writeBytes, 8, command.getTaskStatus1());
        siemensNet.getByteTransform().TransInt32(writeBytes, 10, command.getTaskNo1());
        siemensNet.getByteTransform().TransInt16(writeBytes, 14, command.getDirection1());
        setBool(writeBytes, 32, 0, command.getAckFinish1());
        siemensNet.getByteTransform().TransInt32(writeBytes, 16, command.getTargetPosition2());
        siemensNet.getByteTransform().TransInt32(writeBytes, 20, command.getEndStaNo2());
        siemensNet.getByteTransform().TransInt16(writeBytes, 24, command.getTaskStatus2());
        siemensNet.getByteTransform().TransInt32(writeBytes, 26, command.getTaskNo2());
        siemensNet.getByteTransform().TransInt16(writeBytes, 30, command.getDirection2());
        setBool(writeBytes, 32, 1, command.getAckFinish2());
        siemensNet.getByteTransform().TransInt16(writeBytes, 36, command.getWrkTaskPri());
        OperateResult result = siemensNet.Write("DB100.0", writeBytes);
        if (!result.IsSuccess){
            News.error("写入RGVplc数据失败,重新添加任务到队列 ===> [id:{}],{}",slave.getId(),JSON.toJSON(command));
            MessageQueue.offer(SlaveType.Rgv,slave.getId(),new Task(2,command));
            Thread.sleep(100);
            readStatus();
            return false;
        }
        //RGV任务写入后,回读一次,看是否成功
        Thread.sleep(400);
        try {
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 36);
            if (resultRead.IsSuccess){
                RgvCommand one = new RgvCommand();
                one.setDirection1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
                one.setTaskNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 10));
                one.setTaskStatus1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                one.setEndStaNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 4));
                one.setTargetPosition1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 0));
                one.setWrkTaskPri(siemensNet.getByteTransform().TransInt16(resultRead.Content, 36));
                one.setDirection2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 30));
                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));
                if (
                        !command.getDirection1().equals(one.getDirection1()) ||
                                !command.getTaskNo1().equals(one.getTaskNo1()) ||
                                !command.getTaskStatus1().equals(one.getTaskStatus1()) ||
                                !command.getEndStaNo1().equals(one.getEndStaNo1()) ||
                                !command.getTargetPosition1().equals(one.getTargetPosition1()) ||
                                !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())
                ) {
                    try{
                        News.error("RGV命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    }catch (Exception e){
                        try{
                            News.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead));
                        }catch (Exception e1){
                            News.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
                        }
                    }
                    News.error("Rgv命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
                    MessageQueue.offer(SlaveType.Rgv, slave.getId(), new Task(4, command));
                    Thread.sleep(100);
                    readStatus();
                    return false;
                }else {
                    News.info("RGV命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                }
            }
        }catch (Exception e){
            News.error("RGV命令地址写入后回读出错");
        }
        if (command.getAckFinish1() || command.getAckFinish2()) {
            if (result.IsSuccess) {
                Thread.sleep(300);
                //任务下发次数
                int writeCount2 = 0;
                do {
                    writeCount2++;
                    boolean commandFinish = false;
                    boolean commandFinish2 = false;
                    result = siemensNet.Write("DB100.DBX32.0", commandFinish);
                    OperateResult result3 = siemensNet.Write("DB100.DBX32.1", commandFinish);
                    if(result.IsSuccess && result3.IsSuccess){
                        //RGV任务写入后,回读一次,看是否成功
                        Thread.sleep(200);
                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.32", (short) 2);
                        if (resultRead.IsSuccess) {
                            commandFinish=siemensNet.getByteTransform().TransBool(resultRead.Content, 0);
                            commandFinish2=siemensNet.getByteTransform().TransBool(resultRead.Content, 1);
                            if (!commandFinish && !commandFinish2) {
                                News.error("RGV任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次");
                            }else{
                                //任务命令写入成功
                                News.info("RGV任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次");
                                break;
                            }
                        }else {
                            News.error("RGV任务确认位"+commandFinish+"回读失败!"+"循环执行次数:"+writeCount2+"次");
                        }
                    } else {
                        News.error("RGV任务确认位"+commandFinish+"写入失败!"+"循环执行次数:"+writeCount2+"次");
                    }
                }while (writeCount2<5);
            }
        }
        try {
            // 日志记录
            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
            BasRgvOpt basRgvOpt = new BasRgvOpt(
                    command.getTaskNo1(),
                    command.getTaskNo2(),
                    command.getRgvNo(),
                    new Date(),
                    command.getTargetPosition1()
            );
            bean.insert(basRgvOpt);
        } catch (Exception ignore) {
            log.error(ignore.getMessage());
        }
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
            this.readStatus();
            log.info("RGV 工位1命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 工位12命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
            return true;
        } else {
            OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV plc工位12数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("写入RGV plc工位1数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }
    /**
     * 工位1写入数据
@@ -445,7 +557,7 @@
        OperateResult result2 = siemensNet.Write("DB100.34", false);
        if (result2.IsSuccess){
            News.error("下发前把车子确认位置为0");
            News.error("下发前把车子确认位置为false");
        }
        byte[] writeBytes = new byte[34];
        command.setRgvNo(slave.getId());
@@ -636,11 +748,11 @@
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 34);
            if (resultRead.IsSuccess){
                RgvCommand one = new RgvCommand();
                one.setDirection1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 30));
                one.setTaskNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 26));
                one.setTaskStatus1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 24));
                one.setEndStaNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 20));
                one.setTargetPosition1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 16));
                one.setDirection2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 30));
                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));
                if (
                        !command.getDirection2().equals(one.getDirection2()) ||
                                !command.getTaskNo2().equals(one.getTaskNo2()) ||
src/main/resources/application.yml
@@ -178,9 +178,11 @@
    rgvInTStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1042
      staNo2: 1043
    rgvInTStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1105
      staNo2: 1104
    rgvInTStn[2]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1038
@@ -207,18 +209,23 @@
    rgvOutTStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1007
      staNo2: 1005
    rgvOutTStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1010
      staNo2: 1008
    rgvOutTStn[2]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1021
      staNo2: 1019
    rgvOutTStn[3]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1024
      staNo2: 1022
    rgvOutTStn[4]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1031
      staNo2: 1029
    #RGV出库放货站点
    rgvOutPStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
src/main/resources/mapper/WrkMastMapper.xml
@@ -185,6 +185,12 @@
    <select id="selectPakoutEmpty" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where  io_type = 110 and sta_no = #{staNo} order by io_time,wrk_no
    </select>
    <select id="countPakOutEmpty" resultType="int">
        select count(*)
        from dbo.asr_wrk_mast
        where io_type = 110 and sta_no = #{staNo}
    </select>
    <select id="selectPickStep2" resultMap="BaseResultMap">
        select top 1 * from asr_wrk_mast where barcode = #{barcode} and (wrk_sts=14 and io_type=107) or (wrk_sts=2 and io_type=57)
    </select>