| | |
| | | public synchronized void loopShuttleCharge() { |
| | | for (ShuttleSlave shuttle : slaveProperties.getShuttle()) { |
| | | //获取四向穿梭车线程 |
| | | ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId()); |
| | | ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); |
| | | NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId()); |
| | | NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); |
| | | if (shuttleProtocol == null) { |
| | | continue; |
| | | } |
| | |
| | | continue; |
| | | } |
| | | |
| | | ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkCharge.getShuttleNo()); |
| | | NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkCharge.getShuttleNo()); |
| | | if (shuttleThread == null) { |
| | | continue; |
| | | } |
| | | ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); |
| | | NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); |
| | | if (shuttleProtocol == null) { |
| | | continue; |
| | | } |
| | | |
| | | //获取提升机 |
| | | LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, 1); |
| | | if (liftThread == null) { |
| | | continue; |
| | | } |
| | | LiftProtocol liftProtocol = liftThread.getLiftProtocol(); |
| | | if (liftProtocol == null) { |
| | | continue; |
| | | } |
| | | //充电库位号 |
| | | String chargeLocNo = wrkCharge.getLocNo(); |
| | | //充电库位层高 |
| | | Integer chargeLocNoLev = Utils.getLev(chargeLocNo); |
| | | |
| | | if (wrkCharge.getWrkSts() == 51) { |
| | | //当前穿梭车库位号 |
| | | String currentLocNo = shuttleProtocol.getCurrentLocNo(); |
| | | if (currentLocNo == null) { |
| | | continue; |
| | | } |
| | | //小车当前层高 |
| | | Integer currentLev = Utils.getLev(currentLocNo); |
| | | |
| | | if (currentLev == chargeLocNoLev) { |
| | | //同一层无需经过提升机 |
| | | //直接计算车到充电库位 |
| | | |
| | | ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); |
| | | |
| | | //获取小车到充电库位路径指令 |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, chargeLocNo, NavigationMapType.NONE.id, assignCommand, shuttleThread); |
| | | if (commands == null) { |
| | | continue;//未找到路径 |
| | | } |
| | | //进行充电中 |
| | | shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING); |
| | | |
| | | assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); |
| | | assignCommand.setTaskMode(ShuttleTaskModeType.CHARGE.id.shortValue());//充电 |
| | | assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); |
| | | assignCommand.setCharge(true);//充电任务 |
| | | |
| | | //创建充电指令 |
| | | ShuttleCommand command = shuttleThread.getChargeSwitchCommand((short) 1);//开始充电 |
| | | commands.add(command); |
| | | |
| | | //指令集分配 |
| | | // assignCommand.setCommands(commands); |
| | | |
| | | wrkCharge.setWrkSts(56L);//充电中状态 |
| | | if (wrkChargeMapper.updateById(wrkCharge) > 0) { |
| | | //下发任务 |
| | | MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand)); |
| | | } |
| | | }else { |
| | | //不同层,调度小车到充电桩目标层 |
| | | |
| | | ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); |
| | | |
| | | //获取小车当前楼层的站点号 |
| | | String liftSiteLocNo = Utils.levToOutInStaLocNo(currentLev); |
| | | |
| | | //小车移动到提升机口站点,计算路径 |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(currentLocNo, liftSiteLocNo, NavigationMapType.NONE.id, assignCommand, shuttleThread); |
| | | if (commands == null) { |
| | | continue;//未找到路径 |
| | | } |
| | | |
| | | //获取当前小车所在楼层的站点信息 |
| | | BasDevp basDevp = basDevpService.queryByLocNo(liftSiteLocNo); |
| | | if (basDevp == null) { |
| | | continue;//找不到站点信息 |
| | | } |
| | | Short basDevpQrCode = Short.parseShort(basDevp.getQrCodeValue());//站点二维码 |
| | | |
| | | // //增加移动进提升机命令 |
| | | // ShuttleCommand moveCommand = shuttleThread.getMoveCommand(basDevpQrCode, liftProtocol.getBarcode(), 1600, ShuttleRunDirection.TOP.id, basDevpQrCode, 1600, 500); |
| | | // commands.add(moveCommand); |
| | | |
| | | //分配目标库位 |
| | | shuttleProtocol.setLocNo(chargeLocNo); |
| | | assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); |
| | | assignCommand.setTaskMode(ShuttleTaskModeType.CHARGE.id.shortValue());//充电 |
| | | assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); |
| | | assignCommand.setCharge(true);//充电任务 |
| | | //目标库位 |
| | | assignCommand.setLocNo(chargeLocNo); |
| | | //源库位 |
| | | assignCommand.setSourceLocNo(currentLocNo); |
| | | // assignCommand.setCommands(commands); |
| | | wrkCharge.setWrkSts(52L);//小车迁移状态 |
| | | if (wrkChargeMapper.updateById(wrkCharge) > 0) { |
| | | //下发任务 |
| | | MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand)); |
| | | } |
| | | } |
| | | |
| | | }else if(wrkCharge.getWrkSts() == 53){ |
| | | //小车已经达到提升机内 |
| | | |
| | | //判断提升机是否处于空闲状态 |
| | | if (!liftProtocol.isIdle(wrkCharge.getWrkNo().shortValue())) { |
| | | if (!shuttleProtocol.getCurrentLocNo().equals(wrkCharge.getLocNo())) { |
| | | //小车不在充电桩位置 |
| | | dispatchShuttle(wrkCharge.getWrkNo(), wrkCharge.getLocNo(), shuttle.getId());//调度小车去充电桩 |
| | | continue; |
| | | } |
| | | |
| | | // //判断小车是否在提升机内 |
| | | // if (shuttleProtocol.getCurrentCode().intValue() != liftProtocol.getBarcode().intValue()) { |
| | | // //小车不在提升机内 |
| | | // continue; |
| | | // } |
| | | |
| | | //给提升机分配任务 |
| | | liftProtocol.setTaskNo(wrkCharge.getWrkNo().shortValue());//设置任务号 |
| | | liftProtocol.setShuttleNo(wrkCharge.getShuttleNo().shortValue());//设置四向穿梭车号 |
| | | liftProtocol.setProtocolStatus(LiftProtocolStatusType.WORKING);//设置提升机状态为工作中 |
| | | |
| | | //命令list |
| | | ArrayList<LiftCommand> commands = new ArrayList<>(); |
| | | |
| | | // //提升机前往目标楼层 |
| | | // //获取充电库位目标楼层命令 |
| | | // LiftCommand command1 = liftThread.getLiftUpDownCommand(liftProtocol.getLiftNo(), liftProtocol.getTaskNo(), chargeLocNoLev >= 2 ? chargeLocNoLev + 1 : chargeLocNoLev); |
| | | // commands.add(command1);//将命令添加进list |
| | | |
| | | wrkCharge.setWrkSts(54L);//提升机搬运中 |
| | | //所需命令组合完毕,更新数据库,提交到线程去工作 |
| | | LiftAssignCommand assignCommand = new LiftAssignCommand(); |
| | | // assignCommand.setCommands(commands); |
| | | assignCommand.setLiftNo(liftProtocol.getLiftNo()); |
| | | assignCommand.setTaskNo(liftProtocol.getTaskNo()); |
| | | if (wrkChargeMapper.updateById(wrkCharge) > 0) { |
| | | //下发任务 |
| | | MessageQueue.offer(SlaveType.Lift, liftProtocol.getLiftNo().intValue(), new Task(3, assignCommand)); |
| | | } |
| | | |
| | | }else if(wrkCharge.getWrkSts() == 55){//55.提升机迁移小车完成 |
| | | //直接计算车到充电库位 |
| | | |
| | | //小车已经在充电桩位置,下发充电命令 |
| | | NyShuttleHttpCommand chargeCommand = NyHttpUtils.getChargeCommand(shuttle.getId(), wrkCharge.getWrkNo(), true); |
| | | ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>(); |
| | | commands.add(chargeCommand); |
| | | //创建分配命令 |
| | | ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); |
| | | assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//四向穿梭车号 |
| | | assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue());//任务号 |
| | | assignCommand.setTaskMode(ShuttleTaskModeType.CHARGE.id.shortValue());//出库模式 |
| | | assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//源库位(小车当前位置) |
| | | assignCommand.setCommands(commands);//运行命令 |
| | | |
| | | Short liftLev = liftProtocol.getLev(); |
| | | if (liftLev == null) { |
| | | continue; |
| | | } |
| | | //判断提升机楼层是否到达目标楼层 |
| | | if (liftLev.intValue() != chargeLocNoLev) { |
| | | continue;//没有到达目标楼层 |
| | | } |
| | | |
| | | //此时车在提升机内部,下达一步指令让车移动到提升机口 |
| | | Integer staNo = Utils.levToOutInStaNo(liftLev >= 2 ? liftLev + 1 : liftLev);//站点号 |
| | | BasDevp basDevp = basDevpService.selectById(staNo); |
| | | if (basDevp == null) { |
| | | continue;//站点不存在 |
| | | } |
| | | |
| | | //获取提升机口到充电库位路径指令 |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(basDevp.getLocNo(), chargeLocNo, NavigationMapType.NONE.id, assignCommand, shuttleThread); |
| | | if (commands == null) { |
| | | continue;//未找到路径 |
| | | } |
| | | |
| | | // short startCode = liftProtocol.getBarcode();//提升机内部二维码 |
| | | // Short distCode = Short.parseShort(basDevp.getQrCodeValue());//提升机口站点二维码 |
| | | // Short runDirection = ShuttleRunDirection.BOTTOM.id;//运行方向 |
| | | // //获取命令 |
| | | // ShuttleCommand moveCommand = shuttleThread.getMoveCommand(startCode, distCode, 1600, runDirection, startCode, 1600, 500); |
| | | // commands.add(0, moveCommand);//将该指令添加到队头 |
| | | |
| | | //进行充电中 |
| | | shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING); |
| | | |
| | | assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); |
| | | assignCommand.setTaskMode(ShuttleTaskModeType.CHARGE.id.shortValue());//充电 |
| | | assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); |
| | | assignCommand.setCharge(true);//充电任务 |
| | | |
| | | //创建充电指令 |
| | | ShuttleCommand command = shuttleThread.getChargeSwitchCommand((short) 1);//开始充电 |
| | | commands.add(command); |
| | | |
| | | //指令集分配 |
| | | // assignCommand.setCommands(commands); |
| | | |
| | | wrkCharge.setWrkSts(56L);//充电中状态 |
| | | wrkCharge.setWrkSts(52L);//51.生成充电任务 => 52.小车去充电中 |
| | | wrkCharge.setModiTime(new Date()); |
| | | if (wrkChargeMapper.updateById(wrkCharge) > 0) { |
| | | //下发任务 |
| | | MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand)); |
| | | } |
| | | }else if (wrkCharge.getWrkSts() == 57) {//57.小车到达充电桩 |
| | | //充电中 |
| | | //判断小车是否充满电量,满电1000或电压54V以上 |
| | | if (shuttleProtocol.getBatteryPower() == null || shuttleProtocol.getCurrentVoltage() == null) { |
| | | } else if (wrkCharge.getWrkSts() == 52) { |
| | | //检测小车是否满电 |
| | | if (shuttleProtocol.getPowerPercent() < 100) { |
| | | continue; |
| | | } |
| | | 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); |
| | | // |
| | | // //创建充电指令 |
| | | // 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; |
| | | } |
| | | //小车满电,结束充电任务 |
| | | NyShuttleHttpCommand chargeCommand = NyHttpUtils.getChargeCommand(shuttle.getId(), wrkCharge.getWrkNo(), false); |
| | | ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>(); |
| | | commands.add(chargeCommand); |
| | | //创建分配命令 |
| | | ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); |
| | | assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo());//四向穿梭车号 |
| | | assignCommand.setTaskNo(wrkCharge.getWrkNo().shortValue());//任务号 |
| | | assignCommand.setTaskMode(ShuttleTaskModeType.CHARGE.id.shortValue());//出库模式 |
| | | assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//源库位(小车当前位置) |
| | | assignCommand.setCommands(commands);//运行命令 |
| | | |
| | | wrkCharge.setWrkSts(60L);//60.充电任务完成 |
| | | if (wrkChargeMapper.updateById(wrkCharge) > 0) { |
| | | //下发任务 |
| | | MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand)); |
| | | } |
| | | } |
| | | |
| | | if (shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.CHARGING_WAITING.id) { |
| | | shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING); |
| | | wrkCharge.setWrkSts(60L);//52.小车去充电中 => 60.充电任务完成 |
| | | wrkCharge.setModiTime(new Date()); |
| | | if (wrkChargeMapper.updateById(wrkCharge) > 0) { |
| | | //下发任务 |
| | | MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand)); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | } |