| | |
| | | if (wrkMast.getWrkSts() == WrkStsType.MOVE_SITE.sts) { |
| | | //302.小车移动至站点 ==> 303.小车移动至站点完成 |
| | | wrkMast.setWrkSts(WrkStsType.MOVE_SITE_COMPLETE.sts); |
| | | shuttleThread.setSyncTaskNo(0); |
| | | } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_OUT_LIFT.sts) { |
| | | //308.小车迁出提升机中 ==> 309.小车迁出提升机完成 |
| | | wrkMast.setWrkSts(WrkStsType.MOVE_OUT_LIFT_COMPLETE.sts); |
| | | shuttleThread.setSyncTaskNo(0); |
| | | } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_SHUTTLE.sts) { |
| | | //310.小车移动中 ==> 311.小车移动完成 |
| | | wrkMast.setWrkSts(WrkStsType.COMPLETE_MOVE.sts); |
| | |
| | | //204.小车充电中 ==> 205.小车充电完成 |
| | | wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_COMPLETE.sts); |
| | | shuttleThread.setSyncTaskNo(0); |
| | | }else { |
| | | continue; |
| | | } |
| | | // switch (wrkMast.getWrkSts().intValue()) { |
| | | //// case 5://5.小车搬运中 ==> 9.入库完成 |
| | |
| | | // break; |
| | | case 306://306.提升机搬运中 ==> 307.提升机搬运完成 |
| | | wrkMast.setWrkSts(WrkStsType.MOVE_LIFT_RUN_COMPLETE.sts); |
| | | //货叉提升机需要跳过迁出提升机流程 |
| | | wrkMast.setWrkSts(WrkStsType.MOVE_OUT_LIFT_COMPLETE.sts); |
| | | forkLiftThread.setSyncTaskNo(0); |
| | | break; |
| | | default: |
| | | } |
| | |
| | | continue; |
| | | } |
| | | |
| | | boolean updateShuttleLocation = this.shuttleMoveExecuteStepUpdateShuttleLocation(wrkMast);//提升机搬运完成更新小车坐标 |
| | | if (!updateShuttleLocation) { |
| | | continue; |
| | | } |
| | | |
| | | boolean stepMoveLoc = this.shuttleMoveExecuteStepMoveLoc(wrkMast);//小车移动到目标库位中 |
| | | if (!stepMoveLoc) { |
| | | continue; |
| | |
| | | return false;//当前提升机存在未完成任务,等待下一次轮询 |
| | | } |
| | | |
| | | //*************尝试锁定目标站路径*************** |
| | | List<NavigateNode> targetNodes = ForkLiftUtils.getLiftStaNodes(wrkMast.getStaNo()); |
| | | if (targetNodes == null) { |
| | | return false;//未获取到节点 |
| | | } |
| | | boolean checkPathIsAvailable = navigateUtils.checkPathIsAvailable(targetNodes, shuttleProtocol.getShuttleNo(), Utils.getLev(wrkMast.getLocNo())); |
| | | if (!checkPathIsAvailable) { |
| | | News.info("{}任务,{}小车,目标站点路径被占用,禁止派发", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); |
| | | return false;//检测目标站点路径是否未被占用 |
| | | } |
| | | //尝试锁定目标站路径 |
| | | boolean result2 = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(wrkMast.getLocNo()), shuttleProtocol.getShuttleNo(), targetNodes, true);//所使用的路径进行锁定禁用 |
| | | if (!result2) { |
| | | News.info("{}任务,{}小车,路径锁定失败,禁止派发", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); |
| | | return false;//路径锁定失败 |
| | | } |
| | | //*************尝试锁定目标站路径*************** |
| | | |
| | | ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); |
| | | assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 四向穿梭车编号 |
| | | assignCommand.setTaskMode(ShuttleTaskModeType.MOVE_LOC_NO.id);//小车移库任务 |
| | |
| | | List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), liftSta.getLocNo(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread); |
| | | if (commands == null) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,路径计算失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); |
| | | |
| | | //所使用的路径进行锁定禁用 |
| | | navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(wrkMast.getLocNo()), shuttleProtocol.getShuttleNo(), targetNodes, false); |
| | | return false;//路径解锁失败 |
| | | } |
| | | |
| | | assignCommand.setCommands(commands); |
| | | |
| | | // //*************尝试锁定目标站路径*************** |
| | | // List<NavigateNode> targetNodes = ForkLiftUtils.getLiftStaNodes(wrkMast.getStaNo()); |
| | | // if (targetNodes == null) { |
| | | // return false;//未获取到节点 |
| | | // } |
| | | // boolean checkPathIsAvailable = navigateUtils.checkPathIsAvailable(targetNodes, shuttleProtocol.getShuttleNo(), Utils.getLev(wrkMast.getLocNo())); |
| | | // if (!checkPathIsAvailable) { |
| | | // News.info("{}任务,{}小车,目标站点路径被占用,禁止派发", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); |
| | | // return false;//检测目标站点路径是否未被占用 |
| | | // } |
| | | // //尝试锁定目标站路径 |
| | | // boolean result2 = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(wrkMast.getLocNo()), shuttleProtocol.getShuttleNo(), targetNodes, true);//所使用的路径进行锁定禁用 |
| | | // if (!result2) { |
| | | // News.info("{}任务,{}小车,路径锁定失败,禁止派发", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); |
| | | // return false;//路径锁定失败 |
| | | // } |
| | | // //*************尝试锁定目标站路径*************** |
| | | |
| | | wrkMast.setWrkSts(WrkStsType.MOVE_SITE.sts);//小车移动到提升机中 301.生成小车移库任务 ==> 302.小车移动至站点 |
| | | wrkMast.setModiTime(now); |
| | | wrkMast.setLiftNo(liftSta.getLiftNo());//提前锁定提升机 |
| | | wrkMast.setSystemMsg("");//清空消息 |
| | | // shuttleProtocol.setToken(wrkMast.getWrkNo());//独占该小车令牌 |
| | | if (wrkMastService.updateById(wrkMast)) { |
| | | //下发任务 |
| | |
| | | return false;//缺少站点信息 |
| | | } |
| | | |
| | | if (liftSta.getHasTray()) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,目标站存在托盘,禁止派发", wrkMast.getWrkNo()); |
| | | return false;//有托盘跳过 |
| | | } |
| | | |
| | | //获取提升机命令 |
| | | List<ForkLiftCommand> liftCommands = forkLiftThread.getShuttleSwitchCommand(wrkMast.getWrkNo(), sourceLiftSta.getLev(), liftSta.getLev()); |
| | |
| | | assignCommand.setTaskMode(ForkLiftTaskModeType.SHUTTLE_SWITCH.id.shortValue()); |
| | | |
| | | wrkMast.setWrkSts(WrkStsType.MOVE_LIFT_RUN.sts);//提升机搬运中 303.小车移动至站点完成 ==> 306.提升机搬运中 |
| | | wrkMast.setSystemMsg("");//清空消息 |
| | | wrkMast.setModiTime(now); |
| | | if (wrkMastService.updateById(wrkMast)) { |
| | | //下发任务 |
| | | forkLiftAction.assignWork(wrkMast.getLiftNo(), assignCommand); |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * 小车迁移-提升机搬运完成更新小车坐标 |
| | | * 如需主方法执行continue,请返回false |
| | | * ps:返回值true并不代表该方法执行成功,返回值仅做标记用于主方法是否执行continue |
| | | */ |
| | | private boolean shuttleMoveExecuteStepUpdateShuttleLocation(WrkMast wrkMast) { |
| | | //--------------------------------------提升机搬运中-----------------------------------------// |
| | | Date now = new Date(); |
| | | |
| | | //提升机搬运中 307.提升机搬运完成 ==> 308.小车迁出提升机中 |
| | | if (wrkMast.getWrkSts() == WrkStsType.MOVE_LIFT_RUN_COMPLETE.sts) { |
| | | //获取四向穿梭车线程 |
| | | ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo()); |
| | | if (shuttleThread == null) { |
| | | return false; |
| | | } |
| | | ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); |
| | | if (shuttleProtocol == null) { |
| | | return false; |
| | | } |
| | | |
| | | //小车处于空闲状态 |
| | | if (!shuttleThread.isIdle()) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,小车忙碌中,禁止派发", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); |
| | | return false; |
| | | } |
| | | |
| | | ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); |
| | | assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 四向穿梭车编号 |
| | | assignCommand.setTaskMode(ShuttleTaskModeType.UPDATE_LOCATION.id);//更新坐标 |
| | | assignCommand.setTaskNo(wrkMast.getWrkNo());//任务号 |
| | | assignCommand.setAuto(true);//自动模式 |
| | | assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//源库位 |
| | | assignCommand.setLocNo(wrkMast.getLocNo());//目标库位 |
| | | |
| | | //更新小车坐标 |
| | | ShuttleCommand command = shuttleThread.getUpdateLocationCommand(wrkMast.getWrkNo(), wrkMast.getLocNo()); |
| | | ArrayList<ShuttleCommand> commands = new ArrayList<>(); |
| | | commands.add(command); |
| | | |
| | | assignCommand.setCommands(commands); |
| | | |
| | | wrkMast.setWrkSts(WrkStsType.MOVE_OUT_LIFT.sts);//小车迁出提升机中 |
| | | wrkMast.setSystemMsg("");//清空消息 |
| | | wrkMast.setModiTime(now); |
| | | |
| | | if (wrkMastService.updateById(wrkMast)) { |
| | | //下发任务 |
| | | shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand); |
| | | } |
| | | } |
| | | return true; |
| | |
| | | List<ShuttleCommand> commands = null; |
| | | //跨楼层移动任务 |
| | | if (Utils.getLev(wrkMast.getSourceLocNo()) != Utils.getLev(wrkMast.getLocNo())) { |
| | | // //需要将前两个节点作为白名单节点传入 |
| | | // //获取目标站 |
| | | // LiftStaProtocol liftSta = NyLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo()); |
| | | // if (liftSta == null) { |
| | | // return false;//找不到站点 |
| | | // } |
| | | // |
| | | // List<NavigateNode> targetNodes = NyLiftUtils.getLiftStaNodes(liftSta.getStaNo()); |
| | | // if (targetNodes == null) { |
| | | // return false;//未获取到节点 |
| | | // } |
| | | // |
| | | // //设置计算节点的白名单 |
| | | // ArrayList<int[]> whiteList = new ArrayList<>();//设置计算节点的白名单 |
| | | // for (NavigateNode node : targetNodes) { |
| | | // whiteList.add(new int[]{node.getX(), node.getY()}); |
| | | // } |
| | | // commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread, whiteList); |
| | | //需要将前两个节点作为白名单节点传入 |
| | | List<NavigateNode> targetNodes = ForkLiftUtils.getLiftStaNodes(wrkMast.getStaNo()); |
| | | if (targetNodes == null) { |
| | | return false;//未获取到节点 |
| | | } |
| | | |
| | | //设置计算节点的白名单 |
| | | ArrayList<int[]> whiteList = new ArrayList<>();//设置计算节点的白名单 |
| | | for (NavigateNode node : targetNodes) { |
| | | whiteList.add(new int[]{node.getX(), node.getY()}); |
| | | } |
| | | commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.NORMAL.id, whiteList, assignCommand, shuttleThread); |
| | | }else { |
| | | //获取小车到目标库位命令 |
| | | commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread); |
| | | } |
| | | |
| | | if (commands == null) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,路径计算失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); |
| | | return false;//路径计算失败 |
| | | } |
| | | |
| | | assignCommand.setCommands(commands); |
| | | |
| | | // if (wrkMast.getLiftNo() != null) { |
| | | // LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, wrkMast.getLiftNo()); |
| | | // if (liftThread == null) { |
| | | // return false; |
| | | // } |
| | | // LiftProtocol liftProtocol = liftThread.getLiftProtocol(); |
| | | // if (liftProtocol == null) { |
| | | // return false; |
| | | // } |
| | | // if (liftProtocol.getToken().equals(shuttleProtocol.getShuttleNo())) { |
| | | // liftProtocol.setToken(0);//释放提升机令牌 |
| | | // } |
| | | // } |
| | | |
| | | wrkMast.setWrkSts(WrkStsType.MOVE_SHUTTLE.sts);//小车移动到目标库位中 309.小车迁出提升机完成 ==> 310.小车移动中 |
| | | wrkMast.setLiftNo(null);//释放提升机 |
| | | wrkMast.setSystemMsg("");//清空消息 |
| | | wrkMast.setModiTime(now); |
| | | |
| | | if (wrkMastService.updateById(wrkMast)) { |