zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java
@@ -476,10 +476,8 @@ //穿梭车出提升机待机位库位号 String standbyLocNoFrom = shuttleStandbyFrom.getDeviceStandbyLoc(); //穿梭车出提升机后小车待机位 List<String> standbyLocs = shuttleStandbyFrom.getStandbyLoc$();//获取全部待机位 //获取可用待机位 String shuttleFromLiftStandbyLoc = shuttleDispatcher.searchAvailableLocNo(Integer.valueOf(shuttleDevice.getDeviceNo()), shuttleDevice.getHostId(), shuttleThread.getStatus().getCurrentLocNo(), standbyLocs); //穿梭车出提升机后全部待机位 String standbyLocs = shuttleStandbyFrom.getStandbyLoc();//获取全部待机位 //换层需要锁定的路径 List<String> lockPath = shuttleStandbyFrom.getLockPath$(); @@ -500,18 +498,11 @@ return motionList; } //计算路径并分解成两段动作 List<NavigateNode> nodeList = NavigateUtils.calc(originLoc, standbyLocNoTo, NavigationMapType.DFX.id, Utils.getShuttlePoints(Integer.parseInt(shuttleDevice.getDeviceNo()), Utils.getLev(originLoc))); if (nodeList == null) { News.error("{} dash {} can't find navigate path!", originLoc, standbyLocNoTo); return null; //分析出库路径待机库位 String lastPathStartLoc = shuttleDispatcher.analyzeOutPathWaitLoc(originLoc, standbyLocNoTo, shuttleDevice); if (lastPathStartLoc == null) { return motionList;//未分析成功 } //获取分段路径 ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(nodeList); //取出最后一段路径 ArrayList<NavigateNode> navigateNodes = data.get(data.size() - 1); NavigateNode startNode = navigateNodes.get(0); String lastPathStartLoc = Utils.getLocNo(startNode.getX(), startNode.getY(), startNode.getZ()); /** * 出库 @@ -580,7 +571,7 @@ MotionCtgType.SHUTTLE_PALLET_DOWN )); // 穿梭车提升机待机位 - 到待机位 // 穿梭车提升机待机位 - 到待机位(自动选择合适待机位) motionList.addAll(kernelService.shuttleMove( MotionDto.build((dto -> { dto.setShuttleNo(shuttleDevice.getId().intValue()); @@ -588,11 +579,11 @@ })), MotionDto.build((dto -> { dto.setShuttleNo(shuttleDevice.getId().intValue()); dto.setLocNo(shuttleFromLiftStandbyLoc); dto.setLocNo(standbyLocs); dto.setSync(0);//异步执行 dto.setReleaseShuttle(1);//执行完成后释放小车 })), MotionCtgType.SHUTTLE_MOVE MotionCtgType.SHUTTLE_MOVE_STANDBY )); // 提升机载货移动 @@ -812,7 +803,7 @@ MotionCtgType.SHUTTLE_PALLET_DOWN )); // 穿梭车提升机待机位 - 到待机位 // 穿梭车提升机待机位 - 到待机位(自动选择合适待机位) motionList.addAll(kernelService.shuttleMove( MotionDto.build((dto -> { dto.setShuttleNo(shuttleDevice.getId().intValue()); @@ -820,11 +811,11 @@ })), MotionDto.build((dto -> { dto.setShuttleNo(shuttleDevice.getId().intValue()); dto.setLocNo(shuttleFromLiftStandbyLoc); dto.setLocNo(standbyLocs); dto.setSync(0);//异步执行 dto.setReleaseShuttle(1);//执行完成后释放穿梭车 dto.setReleaseShuttle(1);//执行完成后释放小车 })), MotionCtgType.SHUTTLE_MOVE MotionCtgType.SHUTTLE_MOVE_STANDBY )); // 提升机载货移动 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/KernelService.java
@@ -301,6 +301,10 @@ case SHUTTLE_TRANSPORT_TO_CONVEYOR://穿梭车载货进输送线 motion.setDockNo(String.valueOf(target.getStaNo())); break; case SHUTTLE_MOVE_STANDBY://穿梭车移动到待机位 motion.setTarget(null);//等待自动搜索 motion.setTemp(target.getLocNo());//全部待机位 break; default: break; } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java
@@ -15,6 +15,7 @@ import com.zy.asrs.wcs.core.utils.*; import com.zy.asrs.wcs.rcs.News; import com.zy.asrs.wcs.rcs.cache.SlaveConnection; import com.zy.asrs.wcs.rcs.entity.Device; import com.zy.asrs.wcs.rcs.model.enums.ShuttleProtocolStatusType; import com.zy.asrs.wcs.rcs.model.enums.SlaveType; import com.zy.asrs.wcs.rcs.model.protocol.LiftProtocol; @@ -60,6 +61,8 @@ private BasConveyorService basConveyorService; @Autowired private BasConveyorStaService basConveyorStaService; @Autowired private ShuttleDispatcher shuttleDispatcher; // 计算 public Boolean accept(Motion motion) { @@ -68,6 +71,8 @@ if (shuttleThread == null) { return false; } Device shuttleDevice = shuttleThread.getDevice(); ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); if (null == shuttleProtocol) { return false; @@ -272,6 +277,21 @@ shuttleTaskModeType = ShuttleTaskModeType.SHUTTLE_UPDATE_LOCATION; shuttleCommands.add(shuttleThread.getUpdateLocationCommand(motion.getTaskNo(), motion.getTarget())); break; case SHUTTLE_MOVE_STANDBY://穿梭车移动到待机位 shuttleTaskModeType = ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO; //获取全部待机位 List<String> standbyLocs = JSON.parseArray(motion.getTemp(), String.class); //获取可用待机位 String shuttleFromLiftStandbyLoc = shuttleDispatcher.searchAvailableLocNo(Integer.valueOf(shuttleDevice.getDeviceNo()), shuttleDevice.getHostId(), shuttleThread.getStatus().getCurrentLocNo(), standbyLocs); shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), shuttleFromLiftStandbyLoc, NavigationMapType.NORMAL.id, assignCommand, shuttleThread); //更新动作可用待机位 motion.setTarget(shuttleFromLiftStandbyLoc); motion.setUpdateTime(new Date()); motionService.updateById(motion); break; default: throw new CoolException(motion.getMotionCtgEl() + "没有指定任务作业流程!!!"); } @@ -461,6 +481,19 @@ return false; } break; case SHUTTLE_MOVE_STANDBY://穿梭车移动到待机位 if (!shuttleProtocol.getCurrentLocNo().equals(motion.getTarget())) { return false; } if (Optional.ofNullable(motion.getReleaseShuttle()).orElse(0) == 1) {//释放穿梭车 task.setShuttleNo(0); task.setUpdateTime(new Date()); if (!taskService.updateById(task)) { return false; } } break; default: break; } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/MotionCtgType.java
@@ -40,6 +40,7 @@ SHUTTLE_MOVE_TO_LIFT(SHUTTLE), SHUTTLE_MOVE_FROM_CONVEYOR(SHUTTLE), SHUTTLE_MOVE_TO_CONVEYOR(SHUTTLE), SHUTTLE_MOVE_STANDBY(SHUTTLE), SHUTTLE_MOVE_FROM_LIFT_TO_CONVEYOR(SHUTTLE), zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateSolution.java
@@ -205,7 +205,13 @@ return false; } // 如果结点的位置小于0,则不合法 if (map[x][y] < 0) return false; if (map[x][y] < 0) { return false; } if (map[x][y] == MapNodeType.CAR.id) {//节点是小车 return false; } NavigateNode navigateNode = new NavigateNode(x, y); if (is_exist(navigateNode)) { return false; zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java
@@ -439,5 +439,26 @@ return levCount < Integer.parseInt(dict.getValue()); } //分析出库路径待机库位 public String analyzeOutPathWaitLoc(String startLoc, String targetLoc, Device shuttleDevice) { //计算路径并分解成两段动作 List<NavigateNode> nodeList = NavigateUtils.calc(startLoc, targetLoc, NavigationMapType.DFX.id, Utils.getShuttlePoints(Integer.parseInt(shuttleDevice.getDeviceNo()), Utils.getLev(startLoc))); if (nodeList == null) { News.error("{} dash {} can't find navigate path!", startLoc, targetLoc); return null; } //获取分段路径 ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(nodeList); if (data.size() <= 1) { return null;//两点之间只有一段路径 } //取出倒数第二段路径 ArrayList<NavigateNode> navigateNodes = data.get(data.size() - 2); NavigateNode startNode = navigateNodes.get(0); String lastPathStartLoc = Utils.getLocNo(startNode.getX(), startNode.getY(), startNode.getZ()); return lastPathStartLoc; } }