| | |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.transaction.interceptor.TransactionAspectSupport; |
| | | |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | continue; |
| | | } |
| | | |
| | | if(!staProtocol.isAutoing()){ |
| | | continue; |
| | | } |
| | | |
| | | |
| | | String barcode = barcodeThread.getBarcode(); |
| | | |
| | |
| | | continue; |
| | | } |
| | | if (!staProtocol.isPakMk()) { |
| | | continue; |
| | | } |
| | | if(!staProtocol.isAutoing()){ |
| | | continue; |
| | | } |
| | | // led 异常显示 |
| | |
| | | //mark - 3 - .... |
| | | this.locToLoc(crn, crnProtocol,mark); |
| | | //预调度 |
| | | // this.crnRebackHp(crnProtocol, crnThread); |
| | | this.crnRebackHp(crnProtocol, crnThread); |
| | | |
| | | } |
| | | // News.infoNoLog(""+mark+" - 0"+" - 堆垛机入出库作业下发执行完成"); |
| | |
| | | */ |
| | | 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; |
| | |
| | | } |
| | | crnThread.setBackHpFlag(true); |
| | | } |
| | | |
| | | // } |
| | | } |
| | | |
| | | /** |
| | |
| | | // 状态:等待确认 并且 任务完成位 = 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); |
| | |
| | | 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); |
| | | } |
| | |
| | | |
| | | } |
| | | |
| | | // 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);//若暂无下发任务预调度提前到取货点 |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | /** |
| | | * 小车预调度 |
| | | */ |
| | | // 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()); |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | |
| | | 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); //工位目标站点 |
| | |
| | | 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())); |
| | |
| | | |
| | | } |
| | | WrkMast wrkMast = wrkMastService.selectByWrkNo(staProtocol.getWorkNo()); |
| | | 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())); |
| | |
| | | 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){ |