#
1
18 小时以前 b6fc07bc9d9af60511d171c2147b806bb7dd6983
#
2个文件已修改
278 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 268 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -50,6 +50,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@@ -152,6 +153,10 @@
                    continue;
                }
                if(!staProtocol.isAutoing()){
                    continue;
                }
                String barcode = barcodeThread.getBarcode();
@@ -196,6 +201,9 @@
                        continue;
                    }
                    if (!staProtocol.isPakMk()) {
                        continue;
                    }
                    if(!staProtocol.isAutoing()){
                        continue;
                    }
                    // led 异常显示
@@ -1145,7 +1153,7 @@
            //mark - 3 - ....
            this.locToLoc(crn, crnProtocol,mark);
            //预调度
//            this.crnRebackHp(crnProtocol, crnThread);
            this.crnRebackHp(crnProtocol, crnThread);
        }
//        News.infoNoLog(""+mark+" - 0"+" - 堆垛机入出库作业下发执行完成");
@@ -1156,7 +1164,20 @@
     */
    public synchronized void crnRebackHp(CrnProtocol crnProtocol, CrnThread crnThread) {
        if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
            if (crnProtocol.getBay() == 1) {
            if (crnProtocol.getBay() == 52) {
                return;
            }
            BasCrnp basCrnp = basCrnpService.selectOne(
                    new EntityWrapper<BasCrnp>().eq("crn_no", crnProtocol.getCrnNo())
            );
            Date modiTime = basCrnp.getModiTime();
            Date now = new Date();
            // 当前时间 - 修改时间 > 1分钟(60000毫秒)
            if (now.getTime() - modiTime.getTime() < 60 * 1000) {
                return;
            }
            if(crnProtocol.getCrnNo() != 5){
                return;
            }
            int x=1;
@@ -1203,8 +1224,6 @@
            }
            crnThread.setBackHpFlag(true);
        }
//        }
    }
    /**
@@ -1997,9 +2016,6 @@
                //  状态:等待确认 并且  任务完成位 = 1
                if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) {
                    News.warnNoLog("" + mark + " - 0" + " - 开始执行对工作档的完成操作,任务号:" + crnProtocol.getTaskNo());
                    // 堆垛机复位
                    News.warnNoLog("" + mark + " - 2" + " - 修改成功后复位堆垛机 : 堆垛机号={}", crnThread.getCrnProtocol().getCrnNo());
                    crnThread.setResetFlag(true);
@@ -3016,6 +3032,11 @@
                        staProtocol.setStaNo(site.shortValue());
                        devpThread.setPakMk(site,false);
                        MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
                        Date now = new Date();
                        System.out.println("小车下发命令时间:" +
                                    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(now));
                    } else {
                        News.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyIn/v1", JSON.toJSONString(locTypeDto), response);
                    }
@@ -3682,9 +3703,14 @@
            }
//            if(rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getTaskNo1() == 0 && rgvThread.isPakIn() && rgvThread.isPakRgv()){
//                rgvPreScheduling();//若暂无下发任务预调度提前到取货点
//            }
            if(rgvProtocol.getStatusType1() == RgvStatusType.IDLE &&
                    rgvProtocol.getModeType() == RgvModeType.AUTO && rgvThread.isPakMk()
                    && rgvThread.isPaking() && basRgv.getPakAll().equals("1")){
                if(basRgv.getPakOut().equals("1") && basRgv.getPakIn().equals("1")){
                    rgvPreSchedulingIn(rgv, rgvProtocol);//若暂无下发任务预调度提前到取货点
                }
            }
        }
@@ -4233,77 +4259,140 @@
    /**
     * 小车预调度
     */
//    public synchronized  void rgvPreScheduling(){
//        try{
//            List<BasRgvMap> basRgvMaps = basRgvMapService.selectList(new EntityWrapper<>());
//            for (BasRgvMap rgvSlave:basRgvMaps) {
//                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getRgvNo());
//                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
//                if (rgvProtocol == null) {
//                    continue;
//                }else {
//                    rgvProtocol = rgvProtocol.clone();
//                }
//                BasRgv basRgv = basRgvService.selectById(rgvSlave.getRgvNo());
//                if (basRgv == null) {
//                    log.error("{}号RGV尚未在数据库进行维护!4", rgvSlave.getRgvNo());
//                    continue;
//                }
//
//                // 只有当RGV空闲、自动,工位一无物//rgv可用  才进行预调度
//                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
//                        && rgvProtocol.getModeType() == RgvModeType.AUTO
//                        && !rgvProtocol.isLoaded1ing()
//                        && rgvProtocol.getTaskNo1() == 0
//                        && !rgvProtocol.isLoaded2ing()
//                        && rgvProtocol.getTaskNo2() == 0
//                        && rgvThread.isPakMk()
//                ) {
//                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
//                    if (basRgvMap == null) {
//                        log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo());
//                        continue;
//                    }
//                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
//                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
//                    // 根据输送线plc遍历
//                    for (DevpSlave devp : slaveProperties.getDevp()) {
//                        // 遍历入库口  入库预调度
//                        List<Integer> staNos = Arrays.asList( 1043, 1104, 1029, 1022, 1019, 1008, 1005);
//                        for (Integer staNo : staNos) {
//                            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
//                            StaProtocol staProtocol = devpThread.getStation().get(staNo);
//                            if(staProtocol.isLoading()){
//                                RgvCommand rgvCommand = new RgvCommand();
//                                rgvCommand.setRgvNo((int) rgvProtocol.getRgvNo()); // RGV编号
//                                rgvCommand.setAckFinish1(false);  // 工位1任务完成确认位
//                                rgvCommand.setTaskNo(9999); // 工位1工作号
//                                rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位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))) {
//                                    //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
//                                    log.error("RGV命令下发失败,RGV号={},任务数据={}", (int) rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
//                                }
//                            }
//                        }
//
//                    }
//
//                }
//            }
//        }catch (Exception e){
//            log.error("执行小车移动下发失败");
//        }
//    }
    public synchronized  void rgvPreSchedulingIn(RgvSlave slave, RgvProtocol rgvProtocol){
        for (RgvSlave.RgvStn rgvStn : slave.getRgvInTStn()) {//rgv入库取货站点
            boolean flag = false;
            BasRgv basRgv = basRgvService.selectById(slave.getId());
            if (basRgv == null) {
                log.error("{}号RGV尚未在数据库进行维护!4", slave.getId());
                continue;
            }
            if(rgvStn.getStaNo2() == null){
                continue;
            }
            //遍历rgv入库取货站点
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, rgvStn.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(rgvStn.getStaNo2()); //倒数第二个
            StaProtocol staProtocol2 = null;  //连续取货任务站点
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, (int) rgvProtocol.getRgvNo());
            WrkMastSta wrkMastSta3 = null;//连取两个
            Integer staNo = null;  //与调度
            switch (rgvStn.getStaNo2()){
                case 1043: staNo = 1044;break;
                case 1104: staNo = 1103;break;
            }
            if(staNo != null ){
                staProtocol2 = devpThread.getStation().get(staNo);
                if (staProtocol2 == null) {
                    News.infoNoLog(" - Rgv入库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
                    continue;
                } else {
                    staProtocol2 = staProtocol2.clone();
                }
                BasDevp staDetl2 = basDevpService.selectById(rgvStn.getStaNo2());
                if (staDetl2 == null) {
                    News.error(" - 入库 ===>>Rgv站点在数据库不存在, 站点编号={}", rgvStn.getStaNo());
                    continue;
                }
                if((staProtocol.getWorkNo()>9999 && staProtocol2.getWorkNo()>9999) || (staProtocol.getWorkNo()<10000 && staProtocol2.getWorkNo()<10000)){
                    //当连续取货站点为相同类型时才能连续取
                    wrkMastSta3 = wrkMastStaMapper.selectByWrkNo(staProtocol2.getWorkNo());
                }
            }
            if(rgvProtocol.getTaskNo2() > 9999 && staProtocol.getWorkNo() < 10000){
                continue;
            }
            if (staProtocol == null) {
                News.infoNoLog( " - Rgv入库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
                continue;
            } else {
                staProtocol = staProtocol.clone();
            }
            // 查询站点详细信息
            BasDevp staDetl = basDevpService.selectById(rgvStn.getStaNo());
            if (staDetl == null) {
                News.error(" - 入库 ===>>Rgv站点在数据库不存在, 站点编号={}", rgvStn.getStaNo());
                continue;
            }
            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() != 0
                    && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
                flag = true;
            }
            if (!flag) {
                News.errorNoLog(" - 3" + " - Rgv入库取货站信息(以下需要全true):"
                        + "自动信号" + staProtocol.isAutoing() + "有物信号" + staProtocol.isLoading()
                        + "工作号>0" + staProtocol.getWorkNo() + "能入信号(wms设置).equals(\"Y\")" + staDetl.getCanining());
                continue;
            }
            BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
            List<Integer> route = new ArrayList<>();
            switch (rgvProtocol.getRgvNo()){
                case 1: route = RouteUtils.getRouteOne();break;
                case 2: route = RouteUtils.getRouteTwo();break;
            }
            basRgvMap.setNowRoute(rgvProtocol.getRgvNo() == 1?rgvProtocol.getRgvPosI1():rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号
            basRgvMapService.updateById(basRgvMap);
            WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档
            if( null == wrkMastSta ) {
                News.infoNoLog(" - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo());
                continue;
            }
            WrkMastSta wrkMastSta2 = null;
            if(rgvProtocol.getTaskNo2() != null){
                wrkMastSta2 = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo2());
            }
            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优先取货
                basRgv.setPakRgv("0");
                basRgvService.updateById(basRgv);
//                rgvThread.setPakRgv(false);
                continue;
            }
            wrkMastSta.setWorkSta(wrkMastSta2 !=null ? 1 : 2);
            wrkMastSta.setRgvNo((int) rgvProtocol.getRgvNo());
            boolean sign = false;
            sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发
            if (sign){
                if(wrkMastSta3 != null ){
                    List<WrkMastSta> wrkMastStaPaking = wrkMastStaService.selectPakingWrk(wrkMastSta3.getStaStart());
                    if(wrkMastStaPaking.size() < 1 && !wrkMastSta3.getWrkNo().equals(wrkMastSta.getWrkNo())){//已有标记不再标记
                        wrkMastSta3.setMk(1);
                        basRgv.setPakAll("0");
                        basRgvService.updateById(basRgv);
                        try{
                            wrkMastStaMapper.updateById(wrkMastSta3);
                            log.error("锁定相隔站点任务");
                        }catch (Exception e){
                            log.error("锁定相隔站点任务失败");
                        }
                    }
                }
                basRgv.setPakOut("0");//出库不允许
                basRgvService.updateById(basRgv);
                rgvThread.setPaking(false);//任务下发锁定
                try{
                    wrkMastSta.setWrkSts(1);
                    wrkMastStaMapper.updateById(wrkMastSta);
                    log.error("更新小车任务成功{}",wrkMastSta);
                }catch (Exception e){
                    log.error("更新小车任务失败");
                }
            } else {
                log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
            }
        }
    }
@@ -4324,6 +4413,12 @@
                type = RgvTaskStatusType.PUT; //放货
                targetPosition = wrkMastSta.getStaEnd();
            }
            Date now = new Date();
            if (targetPosition == 1038) {
                System.out.println("小车下发命令时间:" +
                        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(now));
            }
            rgvCommand.setTaskNo(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位工作号
            rgvCommand.setTaskStatus(type); // 工位任务模式:  取货
            rgvCommand.setTargetPosition(targetPosition);   //工位目标站点
@@ -5086,8 +5181,8 @@
                                AgvBindCtnrAndBinParam agvBindCtnrAndBinParam = new AgvBindCtnrAndBinParam(basAgvMast);
                                agvBindCtnrAndBinParam.setCtnrCode(basAgvMast.getTimestamp().toString());
                                agvBindCtnrAndBinParam.setCtnrTyp("1");
                                ReturnT<String> resultBind = new PostMesDataUtils().postMesDataAgv("AGV出库容器绑定解绑", AgvConstant.AGV_URL, AgvConstant.AGV_CTNRANDBING, agvBindCtnrAndBinParam);
                                ReturnT<String> resultBind = new PostMesDataUtils().postMesDataAgv("AGV出库容器解绑", AgvConstant.AGV_URL, AgvConstant.AGV_CTNRANDBING, agvBindCtnrAndBinParam);
                                break;
                            }
                        }catch (Exception e){
                            News.error(JSON.toJSONString(e.getMessage()));
@@ -5096,7 +5191,10 @@
                    }
                    WrkMast wrkMast = wrkMastService.selectByWrkNo(staProtocol.getWorkNo());
                    if(wrkMast.getIoType() == 110){
                    if(Cools.isEmpty(wrkMast)){
                        continue;
                    }
                    if(wrkMast.getIoType() == 110 ){
                        BasAgvMast basAgvMast = new BasAgvMast();
                        List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("task_no", staProtocol.getWorkNo()));
                        if(!basAgvMastList.isEmpty()){
@@ -5136,7 +5234,7 @@
                                AgvBindCtnrAndBinParam agvBindCtnrAndBinParam = new AgvBindCtnrAndBinParam(basAgvMast);
                                agvBindCtnrAndBinParam.setCtnrCode(basAgvMast.getTimestamp().toString());
                                agvBindCtnrAndBinParam.setCtnrTyp("1");
                                ReturnT<String> resultBind = new PostMesDataUtils().postMesDataAgv("AGV出库容器绑定解绑", AgvConstant.AGV_URL, AgvConstant.AGV_CTNRANDBING, agvBindCtnrAndBinParam);
                                ReturnT<String> resultBind = new PostMesDataUtils().postMesDataAgv("AGV出库容器解绑", AgvConstant.AGV_URL, AgvConstant.AGV_CTNRANDBING, agvBindCtnrAndBinParam);
                            }
                        }catch (Exception e){
src/main/java/com/zy/core/MainProcess.java
@@ -29,6 +29,7 @@
    // 频率
    private int i = 0;
    private int k = 0;
    private int q = 0;
    private boolean rgcWrk = true;
    /**
@@ -97,10 +98,15 @@
                if (i>10){
                    //空托盘自动出库
                    mainService.autoEmptyOut();
                    //空托盘自动入库
                    mainService.autoEmptyIn();
                    i=0;
                }
                if(q>2){
                    //空托盘自动入库
                    mainService.autoEmptyIn();
                    q = 0;
                }
                q++;
                i++;
                /////////////////////////////////////RGV调度/////////////////////////////////////