| | |
| | | //数据库中也不存在地图数据,从地图文件中获取 |
| | | //载入地图 |
| | | NavigateMapData mapData = new NavigateMapData(i); |
| | | List<List<MapNode>> lists = mapData.getJsonData(-1, null);//获取完整地图(包括入库出库) |
| | | List<List<MapNode>> lists = mapData.getJsonData(-1, null, null);//获取完整地图(包括入库出库) |
| | | |
| | | //存入数据库 |
| | | basMap = new BasMap(); |
| | |
| | | } |
| | | |
| | | //计算小车起点到中点所需命令 |
| | | List<NavigateNode> calc = NavigateUtils.calc(startLocNo, locNo, mapType); |
| | | List<NavigateNode> calc = NavigateUtils.calc(startLocNo, locNo, mapType, Utils.getShuttlePoints(shuttleThread.getSlave().getId(), Utils.getLev(startLocNo))); |
| | | List<ShuttleCommand> commands = new ArrayList<>(); |
| | | if (calc == null) { |
| | | return null; |
| | | } |
| | | |
| | | if (!Utils.checkShuttlePath(calc, shuttleThread.getSlave().getId())) {//检测穿梭车行走路径,是否存在其他小车,如有其他小车则进行调离 |
| | | return null; |
| | | } |
| | | List<NavigateNode> allNode = new ArrayList<>(); |
| | | allNode.addAll(calc); |
| | | |
| | |
| | | List<NavigateNode> allNode = new ArrayList<>(); |
| | | |
| | | //计算小车起点到中点所需命令 |
| | | List<NavigateNode> calc = NavigateUtils.calc(startLocNo, middleLocNo, NavigationMapType.NORMAL.id);//小车无货,走正常库位通道 |
| | | List<NavigateNode> calc = NavigateUtils.calc(startLocNo, middleLocNo, NavigationMapType.NORMAL.id, null);//小车无货,走正常库位通道 |
| | | List<ShuttleCommand> commands = new ArrayList<>(); |
| | | |
| | | if (calc != null) { |
| | | if (!Utils.checkShuttlePath(calc, shuttleThread.getSlave().getId())) {//检测穿梭车行走路径,是否存在其他小车,如有其他小车则进行调离 |
| | | return null; |
| | | } |
| | | |
| | | allNode.addAll(calc); |
| | | //获取分段路径 |
| | | ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc); |
| | |
| | | commands.add(shuttleThread.getPalletCommand((short) 1)); |
| | | |
| | | //计算小车中点到终点所需命令 |
| | | List<NavigateNode> calc2 = NavigateUtils.calc(middleLocNo, locNo, NavigationMapType.DFX.id);//小车有货,走禁用过DFX库位的地图通道 |
| | | List<NavigateNode> calc2 = NavigateUtils.calc(middleLocNo, locNo, NavigationMapType.DFX.id, null);//小车有货,走禁用过DFX库位的地图通道 |
| | | if (calc2 == null) { |
| | | return null; |
| | | } |
| | | |
| | | if (!Utils.checkShuttlePath(calc2, shuttleThread.getSlave().getId())) {//检测穿梭车行走路径,是否存在其他小车,如有其他小车则进行调离 |
| | | return null; |
| | | } |
| | | allNode.addAll(calc2); |
| | | |
| | | //获取分段路径 |
| | |
| | | //判断提升机楼层是否到位,判断站点是否给出提升机到位信号 |
| | | String locNo = wrkMast.getSourceLocNo(); |
| | | int lev = Utils.getLev(locNo);//目标二维码所在楼层 |
| | | int liftLev = liftProtocol.getLev().intValue();//提升机所在楼层 |
| | | if (liftLev != lev) { |
| | | Short liftLev = liftProtocol.getLev();//提升机所在楼层 |
| | | if (liftLev == null) {//提升机可能在输送线楼层 |
| | | continue; |
| | | } |
| | | if (liftLev.intValue() != lev) { |
| | | continue;//提升机不在目标楼层跳过 |
| | | } |
| | | |
| | |
| | | //判断小车和库位是否在同一层 |
| | | if (Boolean.parseBoolean(searchIdleShuttle.get("sameLay").toString())) { |
| | | //同一层(将小车移动到货物位置) |
| | | |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, wrkMast.getSourceLocNo(), liftSiteLocNo, assignCommand, shuttleThread); |
| | | if (commands == null) { |
| | | //未找到路径,等待下一次 |
| | | continue; |
| | | } |
| | | |
| | | //获取当前小车所在楼层的站点信息 |
| | | BasDevp basDevp = basDevpService.queryByLocNo(liftSiteLocNo); |
| | | Short endStartCode = Short.parseShort(basDevp.getQrCodeValue());//站点二维码 |
| | | |
| | | String disLocNo = "200020" + Utils.getLev(liftSiteLocNo);//避让位置 |
| | | LocMast locMast1 = locMastService.queryByLoc(disLocNo); |
| | | if (locMast1 == null) { |
| | | continue;//找不到库位 |
| | | } |
| | | short disCode = Short.parseShort(locMast1.getQrCodeValue()); |
| | | //任务执行完后,小车进入移开提升机口站点位置,以免坠落 |
| | | ShuttleCommand moveCommand = shuttleThread.getMoveCommand(endStartCode, disCode, 2800, ShuttleRunDirection.BOTTOM.id, endStartCode, 2800, 1000); |
| | | commands.add(moveCommand); |
| | | |
| | | //分配目标库位 |
| | | shuttleProtocol.setLocNo(wrkMast.getSourceLocNo()); |
| | |
| | | assignCommand.setTaskMode(ShuttleTaskModeType.PAK_OUT.id.shortValue()); |
| | | assignCommand.setSourceLocNo(liftSiteLocNo); |
| | | |
| | | //获取当前小车所在楼层的站点信息 |
| | | BasDevp basDevp = basDevpService.queryByLocNo(liftSiteLocNo); |
| | | Short endStartCode = Short.parseShort(basDevp.getQrCodeValue());//站点二维码 |
| | | |
| | | String disLocNo = "200020" + Utils.getLev(liftSiteLocNo);//避让位置 |
| | | LocMast locMast1 = locMastService.queryByLoc(disLocNo); |
| | | if (locMast1 == null) { |
| | | continue;//找不到库位 |
| | | } |
| | | short disCode = Short.parseShort(locMast1.getQrCodeValue()); |
| | | //任务执行完后,小车进入移开提升机口站点位置,以免坠落 |
| | | ShuttleCommand moveCommand2 = shuttleThread.getMoveCommand(endStartCode, disCode, 2800, ShuttleRunDirection.BOTTOM.id, endStartCode, 2800, 1000); |
| | | |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(liftSiteLocNo, wrkMast.getSourceLocNo(), liftSiteLocNo, assignCommand, shuttleThread); |
| | | if (commands == null) { |
| | | continue;//未找到路径 |
| | | } |
| | | commands.add(moveCommand2);//任务执行完后,小车进入移开提升机口站点位置,以免坠落 |
| | | |
| | | //此时车在提升机内部,需要多下达一步指令让车移动到提升机口 |
| | | short startCode = liftProtocol.getBarcode();//提升机内部二维码 |
| | |
| | | String recentLocNo = recentShuttle.getShuttleProtocol().getCurrentLocNo(); |
| | | |
| | | //当前最近四向穿梭车到目标地点距离 |
| | | List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentLocNo, distLocNo, NavigationMapType.NORMAL.id);//搜索空闲穿梭车,使用正常通道地图 |
| | | List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentLocNo, distLocNo, NavigationMapType.NORMAL.id, Utils.getShuttlePoints(recentShuttle.getSlave().getId(), Utils.getLev(recentLocNo)));//搜索空闲穿梭车,使用正常通道地图 |
| | | //当前穿梭车线程到目标地点距离 |
| | | List<NavigateNode> currentShuttlePath = NavigateUtils.calc(currentLocNo, distLocNo, NavigationMapType.NORMAL.id);//搜索空闲穿梭车,使用正常通道地图 |
| | | List<NavigateNode> currentShuttlePath = NavigateUtils.calc(currentLocNo, distLocNo, NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleThread.getSlave().getId(), Utils.getLev(currentLocNo)));//搜索空闲穿梭车,使用正常通道地图 |
| | | if (recentShuttlePath == null || currentShuttlePath == null) { |
| | | continue; |
| | | } |
| | |
| | | int recentLev = Utils.getLev(recentLocNo); |
| | | |
| | | //当前最近四向穿梭车到当前车子所在楼层的提升机口距离 |
| | | List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentLocNo, Utils.levToOutInStaLocNo(recentLev), NavigationMapType.NORMAL.id);//搜索空闲穿梭车,使用正常通道地图 |
| | | List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentLocNo, Utils.levToOutInStaLocNo(recentLev), NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleThread.getSlave().getId(), recentLev));//搜索空闲穿梭车,使用正常通道地图 |
| | | //当前穿梭车线程到当前车子所在楼层的提升机口距离 |
| | | List<NavigateNode> currentShuttlePath = NavigateUtils.calc(currentLocNo, Utils.levToOutInStaLocNo(currentLev), NavigationMapType.NORMAL.id);//搜索空闲穿梭车,使用正常通道地图 |
| | | List<NavigateNode> currentShuttlePath = NavigateUtils.calc(currentLocNo, Utils.levToOutInStaLocNo(currentLev), NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleThread.getSlave().getId(), currentLev));//搜索空闲穿梭车,使用正常通道地图 |
| | | if (recentShuttlePath == null || currentShuttlePath == null) { |
| | | continue; |
| | | } |
| | |
| | | |
| | | //将任务档标记为完成 |
| | | WrkMast wrkMast = wrkMastMapper.selectByWorkNo(shuttleProtocol.getTaskNo().intValue()); |
| | | ShuttleAssignCommand moveAssignCommand = null;//避让命令 |
| | | if (wrkMast != null) { |
| | | switch (wrkMast.getWrkSts().intValue()) { |
| | | case 9://9.小车入库搬运中 ==> 14.入库完成 |
| | |
| | | wrkMast.setWrkSts(23L); |
| | | break; |
| | | case 26://26.小车出库搬运中 ==> 27.小车出库搬运完成 |
| | | //任务执行完后,小车进入移开提升机口站点位置,以免坠落 |
| | | //搜索一条没有小车的空巷道,并调度小车 |
| | | int distLev = Utils.getLev(wrkMast.getSourceLocNo());//避让楼层 |
| | | String startLocNo = "180020" + distLev; |
| | | moveAssignCommand = Utils.searchEmptyGroupToMoveShuttle(distLev, shuttleThread.getSlave().getId(), shuttleThread, startLocNo); |
| | | if (moveAssignCommand == null) {//调度小车命令为空 |
| | | continue; |
| | | } |
| | | |
| | | wrkMast.setWrkSts(27L); |
| | | break; |
| | | default: |
| | |
| | | //任务指令清零 |
| | | shuttleProtocol.setAssignCommand(null); |
| | | News.info("四向穿梭车已确认且任务完成状态,复位。四向穿梭车号={}", shuttleProtocol.getShuttleNo()); |
| | | |
| | | if (wrkMast.getWrkSts() == 27) { |
| | | if (moveAssignCommand != null) { |
| | | //下发任务 |
| | | shuttleProtocol.setPakMk(true); |
| | | MessageQueue.offer(SlaveType.Shuttle, shuttleThread.getSlave().getId(), new Task(3, moveAssignCommand)); |
| | | } |
| | | } |
| | | |
| | | } else { |
| | | News.error("四向穿梭车已确认且任务完成状态,复位失败,但未找到工作档。四向穿梭车号={},工作号={}", shuttleProtocol.getShuttleNo(), shuttleProtocol.getTaskNo()); |
| | | } |
| | |
| | | if (!result) { |
| | | throw new CoolException("更新plc站点信息失败"); |
| | | } |
| | | //任务号清零 |
| | | liftProtocol.setTaskNo((short) 0); |
| | | wrkMast.setWrkSts(4L); |
| | | break; |
| | | case 7://7.提升机迁移小车中 ==> 8.提升机迁移小车完成 |
| | |
| | | } |
| | | wrkMast.setWrkSts(29L); |
| | | wrkMast.setWrkSts(34L);//34.出库完成,暂时先直接完成出库工作档,后续需要根据输送线给出的状态来确定34.出库完成状态 |
| | | //任务号清零 |
| | | liftProtocol.setTaskNo((short) 0); |
| | | break; |
| | | default: |
| | | } |
| | |
| | | liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE); |
| | | //任务指令清零 |
| | | liftProtocol.setAssignCommand(null); |
| | | //任务号清零 |
| | | liftProtocol.setTaskNo((short) 0); |
| | | News.info("提升机已确认且任务完成状态。提升机号={}", liftProtocol.getLiftNo()); |
| | | } else { |
| | | News.error("提升机已确认且任务完成状态,复位失败,但未找到工作档。提升机号={},工作号={}", liftProtocol.getLiftNo(), liftProtocol.getTaskNo()); |
| | |
| | | if (liftProtocol.getAssignCommand() != null) { |
| | | //设置提升机为空闲状态 |
| | | liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE); |
| | | //任务号清零 |
| | | liftProtocol.setTaskNo((short) 0); |
| | | //判断是否为四向穿梭车调度提升机,如是则无需清理任务号 |
| | | if (!liftProtocol.getSecurityMk()) { |
| | | //任务号清零 |
| | | liftProtocol.setTaskNo((short) 0); |
| | | } |
| | | //标记复位 |
| | | liftProtocol.setPakMk(true); |
| | | //任务指令清零 |
| | |
| | | //判断小车是否充满电量,满电1000或电压54V以上 |
| | | if (shuttleProtocol.getBatteryPower() >= 1000 && shuttleProtocol.getCurrentVoltage() >= 54000) { |
| | | //充满,断开充电 |
| | | List<ShuttleCommand> commands = new ArrayList<>(); |
| | | ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); |
| | | assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); |
| | | assignCommand.setTaskMode((short) 0); |
| | | assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); |
| | | assignCommand.setCharge(true); |
| | | // List<ShuttleCommand> commands = new ArrayList<>(); |
| | | // ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); |
| | | // assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); |
| | | // assignCommand.setTaskMode((short) 0); |
| | | // assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); |
| | | // assignCommand.setCharge(true); |
| | | // |
| | | // //创建充电指令 |
| | | // ShuttleCommand command = shuttleThread.getChargeSwitchCommand((short) 2);//断开充电 |
| | | // commands.add(command); |
| | | // |
| | | // //指令集分配 |
| | | // assignCommand.setCommands(commands); |
| | | // |
| | | // shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING); |
| | | |
| | | //创建充电指令 |
| | | ShuttleCommand command = shuttleThread.getChargeSwitchCommand((short) 2);//断开充电 |
| | | commands.add(command); |
| | | |
| | | //指令集分配 |
| | | assignCommand.setCommands(commands); |
| | | |
| | | shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING); |
| | | //将小车移动到空闲的巷道 |
| | | ShuttleAssignCommand assignCommand = Utils.searchEmptyGroupToMoveShuttle(Utils.getLev(shuttleProtocol.getLocNo()), shuttleProtocol.getShuttleNo().intValue(), shuttleThread, null); |
| | | if (assignCommand == null) { |
| | | continue; |
| | | } |
| | | |
| | | wrkCharge.setWrkSts(60L);//60.充电任务完成 |
| | | if (wrkChargeMapper.updateById(wrkCharge) > 0) { |