| | |
| | | BasDevp basDevp = basDevpService.queryByLocNo(liftSiteLocNo); |
| | | Short endStartCode = Short.parseShort(basDevp.getQrCodeValue());//站点二维码 |
| | | |
| | | String disLocNo = "2000202" + Utils.getLev(liftSiteLocNo);//避让位置 |
| | | String disLocNo = "190020" + Utils.getLev(liftSiteLocNo);//避让位置 |
| | | LocMast locMast1 = locMastService.queryByLoc(disLocNo); |
| | | if (locMast1 == null) { |
| | | continue;//找不到库位 |
| | |
| | | assignCommand.setTaskMode(ShuttleTaskModeType.PAK_OUT.id.shortValue()); |
| | | assignCommand.setSourceLocNo(liftSiteLocNo); |
| | | |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(liftSiteLocNo, wrkMast.getSourceLocNo(), liftSiteLocNo, assignCommand, shuttleThread); |
| | | if (commands == null) { |
| | | continue;//未找到路径 |
| | | } |
| | | //此时车在提升机内部,需要多下达一步指令让车移动到提升机口 |
| | | short startCode = liftProtocol.getBarcode();//提升机内部二维码 |
| | | Short distCode = commands.get(0).getStartCodeNum();//目标二维码 |
| | | //获取移动命令 |
| | | ShuttleCommand moveCommand = shuttleThread.getMoveCommand(startCode, distCode, 1400, commands.get(0).getRunDirection(), startCode, 1400, 500); |
| | | commands.add(0, moveCommand);//将该指令添加到队头 |
| | | |
| | | //获取当前小车所在楼层的站点信息 |
| | | BasDevp basDevp = basDevpService.queryByLocNo(liftSiteLocNo); |
| | | Short endStartCode = Short.parseShort(basDevp.getQrCodeValue());//站点二维码 |
| | | |
| | | String disLocNo = "2000202" + Utils.getLev(liftSiteLocNo);//避让位置 |
| | | String disLocNo = "190020" + Utils.getLev(liftSiteLocNo);//避让位置 |
| | | LocMast locMast1 = locMastService.queryByLoc(disLocNo); |
| | | if (locMast1 == null) { |
| | | continue;//找不到库位 |
| | |
| | | short disCode = Short.parseShort(locMast1.getQrCodeValue()); |
| | | //任务执行完后,小车进入移开提升机口站点位置,以免坠落 |
| | | ShuttleCommand moveCommand2 = shuttleThread.getMoveCommand(endStartCode, disCode, 1400, ShuttleRunDirection.BOTTOM.id, endStartCode, 1400, 500); |
| | | commands.add(moveCommand2); |
| | | |
| | | List<ShuttleCommand> commands = this.shuttleAssignCommand(liftSiteLocNo, wrkMast.getSourceLocNo(), liftSiteLocNo, assignCommand, shuttleThread); |
| | | if (commands == null) { |
| | | continue;//未找到路径 |
| | | } |
| | | commands.add(moveCommand2);//任务执行完后,小车进入移开提升机口站点位置,以免坠落 |
| | | |
| | | //此时车在提升机内部,需要多下达一步指令让车移动到提升机口 |
| | | short startCode = liftProtocol.getBarcode();//提升机内部二维码 |
| | | Short distCode = commands.get(0).getStartCodeNum();//目标二维码 |
| | | //获取移动命令 |
| | | ShuttleCommand moveCommand = shuttleThread.getMoveCommand(startCode, distCode, 1400, commands.get(0).getRunDirection(), startCode, 1400, 500); |
| | | commands.add(0, moveCommand);//将该指令添加到队头 |
| | | |
| | | //分配目标库位 |
| | | shuttleProtocol.setLocNo(wrkMast.getSourceLocNo()); |
| | |
| | | && shuttleProtocol.getTaskNo() != 0 |
| | | && shuttleProtocol.getBusyStatus() == 0 |
| | | ) { |
| | | //标记复位 |
| | | shuttleProtocol.setPakMk(true); |
| | | |
| | | //将任务档标记为完成 |
| | | WrkMast wrkMast = wrkMastMapper.selectByWorkNo(shuttleProtocol.getTaskNo().intValue()); |
| | | if (wrkMast != null) { |
| | |
| | | shuttleProtocol.setSourceLocNo(null); |
| | | //目标库位清零 |
| | | shuttleProtocol.setLocNo(null); |
| | | //标记复位 |
| | | shuttleProtocol.setPakMk(true); |
| | | //任务指令清零 |
| | | shuttleProtocol.setAssignCommand(null); |
| | | News.info("四向穿梭车已确认且任务完成状态,复位。四向穿梭车号={}", shuttleProtocol.getShuttleNo()); |
| | |
| | | continue; |
| | | } |
| | | |
| | | WrkCharge wrkCharge = wrkChargeService.selectWorking(shuttleProtocol.getShuttleNo().intValue(), WrkChargeType.charge); |
| | | WrkCharge wrkCharge = wrkChargeService.selectWorking(shuttleProtocol.getShuttleNo().intValue()); |
| | | if (wrkCharge != null) {//已有充电任务 |
| | | continue; |
| | | } |
| | |
| | | */ |
| | | public synchronized void executeShuttleCharge() { |
| | | for (ShuttleSlave shuttle : slaveProperties.getShuttle()) { |
| | | WrkCharge wrkCharge = wrkChargeService.selectWorking(null, WrkChargeType.charge); |
| | | WrkCharge wrkCharge = wrkChargeService.selectWorking(shuttle.getId()); |
| | | if (wrkCharge == null) { |
| | | continue; |
| | | } |
| | |
| | | assignCommand.setCommands(commands); |
| | | |
| | | shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING); |
| | | |
| | | 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) { |
| | |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 轮询充电桩是否有空闲小车 |
| | | */ |
| | | @Deprecated |
| | | public synchronized void queryChargeLocOfComplete() { |
| | | // 与充电任务不同步进行 |
| | | if (null != wrkChargeService.selectWorking(null, WrkChargeType.charge)) { return; } |
| | | if (null != wrkChargeService.selectWorking(null, WrkChargeType.reset)) { return; } |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); |
| | | // 检索充电桩 |
| | | for (SteChargeType value : SteChargeType.values()) { |
| | | Integer steNo = basSteService.hasCarOfLocNo(value.locNo); |
| | | if (steNo != null) { |
| | | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo); |
| | | SteProtocol steProtocol = steThread.getSteProtocol(); |
| | | BasSte basSte = basSteService.selectById(steNo); |
| | | if (Cools.isEmpty(steProtocol, basSte)) { |
| | | continue; |
| | | } |
| | | if (steProtocol.getCharge() < 99) { |
| | | continue; |
| | | } |
| | | if (steProtocol.getMode() == 0) { |
| | | continue; |
| | | } |
| | | if (!steProtocol.getStatusType().equals(SteStatusType.IDLE)) { |
| | | continue; |
| | | } |
| | | // // 1号充电桩 |
| | | // if (value.equals(SteChargeType.FIRST) && devpThread.charge0) { |
| | | // continue; |
| | | // } |
| | | // // 2号充电桩 |
| | | // if (value.equals(SteChargeType.SECOND) && devpThread.charge1) { |
| | | // continue; |
| | | // } |
| | | // // 3号充电桩 |
| | | // if (value.equals(SteChargeType.THIRD) && devpThread.charge2) { |
| | | // continue; |
| | | // } |
| | | // // 小车是否处于充电状态 |
| | | // if (steProtocol.getChargeStatus() == 1) { |
| | | // continue; |
| | | // } |
| | | // case 1 : 自动充电开 馈电 × |
| | | // case 2 : 自动充电开 满电 ✔ |
| | | // case 3 : 自动充电关 馈电 ✔ |
| | | // case 4 : 自动充电关 满电 ✔ |
| | | if (basSte.getAutoCharge().equals("Y") |
| | | && steProtocol.getCharge() < Float.parseFloat(basSte.getChargeLine())) { |
| | | continue; |
| | | } |
| | | |
| | | WrkCharge wrkCharge = wrkChargeService.selectWorking(steNo, WrkChargeType.reset); |
| | | |
| | | if (wrkCharge == null) { |
| | | // 开始穿梭车复位任务 |
| | | wrkCharge = new WrkCharge(); |
| | | wrkCharge.setSteNo(steNo); |
| | | wrkCharge.setWrkNo(commonService.getChargeWorkNo(6)); |
| | | wrkCharge.setWrkSts(41L); // 41.小车准备复位 |
| | | wrkCharge.setCrnNo(2); // 固定2号堆垛机 |
| | | wrkCharge.setIoPri((double) 10); |
| | | wrkCharge.setSourceLocNo(value.locNo); |
| | | wrkCharge.setLocNo(basSte.getIdleLoc()); |
| | | wrkCharge.setMemo("reset"); |
| | | wrkCharge.setAppeTime(new Date()); |
| | | if (!wrkChargeService.insert(wrkCharge)) { |
| | | News.error("保存{}号穿梭车复位任务失败!!!", steNo); |
| | | } else { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 小车从充电桩 至 待机库位 |
| | | */ |
| | | @Deprecated |
| | | public synchronized void steFromChargeToIdleLoc() { |
| | | WrkCharge wrkCharge = wrkChargeService.selectWorking(null, WrkChargeType.reset); |
| | | if (wrkCharge == null) { return; } |
| | | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, wrkCharge.getSteNo()); |
| | | SteProtocol steProtocol = steThread.getSteProtocol(); |
| | | BasSte basSte = basSteService.selectById(wrkCharge.getSteNo()); |
| | | if (Cools.isEmpty(steProtocol, basSte)) { |
| | | return; |
| | | } |
| | | // 搬运至固定通道 |
| | | if (wrkCharge.getWrkSts() == 41L) { |
| | | // 搬小车至小车走向通道 |
| | | List<String> channel = slaveProperties.getChannel(); |
| | | for (String channelLocNo : channel) { |
| | | Integer otherSte = existOtherSte(channelLocNo, wrkCharge.getSteNo()); |
| | | if (null != otherSte) { |
| | | News.warn("{}号小车移入{}库位组失败,原因:存在{}号穿梭车!", wrkCharge.getSteNo(), channelLocNo, otherSte); |
| | | } else { |
| | | // 固定堆垛机 |
| | | int crnNo = 1; |
| | | if (null != wrkMastMapper.selectWorkingByCrn(crnNo)) { |
| | | return; |
| | | } |
| | | |
| | | LocMast channelLoc = locMastService.selectById(channelLocNo); |
| | | |
| | | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnNo); |
| | | CrnProtocol crnProtocol = crnThread.getCrnProtocol(); |
| | | if (crnProtocol == null) { continue; } |
| | | // 只有当堆垛机空闲 并且 无任务时才继续执行 |
| | | if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) { |
| | | // 堆垛机命令下发区 -------------------------------------------------------------------------- |
| | | CrnCommand crnCommand = new CrnCommand(); |
| | | crnCommand.setCrnNo(crnNo); // 堆垛机编号 |
| | | crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 工作号 |
| | | crnCommand.setAckFinish((short) 0); // 任务完成确认位 |
| | | crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 任务模式: 库位移转 |
| | | crnCommand.setSourcePosX(steProtocol.getRow()); // 源库位排 |
| | | crnCommand.setSourcePosY(steProtocol.getBay()); // 源库位列 |
| | | crnCommand.setSourcePosZ(steProtocol.getLev()); // 源库位层 |
| | | crnCommand.setDestinationPosX(Utils.getGroupRow(channelLoc.getLocNo(), false).shortValue()); // 目标库位排 |
| | | crnCommand.setDestinationPosY(channelLoc.getBay1().shortValue()); // 目标库位列 |
| | | crnCommand.setDestinationPosZ(channelLoc.getLev1().shortValue()); // 目标库位层 |
| | | if (!MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, crnCommand))) { |
| | | News.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkCharge.getCrnNo(), JSON.toJSON(crnCommand)); |
| | | } else { |
| | | // 修改穿梭车运行中排列层 |
| | | steThread.modifyPos(Utils.getGroupRow(channelLoc.getLocNo(), false), channelLoc.getBay1(), channelLoc.getLev1()); |
| | | // 修改工作档状态 41.小车准备复位 => 42.吊车搬运 |
| | | Date now = new Date(); |
| | | wrkCharge.setWrkSts(42L); |
| | | wrkCharge.setCrnStrTime(now); |
| | | wrkCharge.setModiTime(now); |
| | | if (!wrkChargeService.updateById(wrkCharge)) { |
| | | News.error("修改复位任务状态 41.小车准备复位 => 42.吊车搬运 失败!!,工作号={}", wrkCharge.getWrkNo()); |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | |
| | | } |
| | | } |
| | | } else if (wrkCharge.getWrkSts() == 43L) { |
| | | // 小车行驶通道 |
| | | if (steProtocol.statusType.equals(SteStatusType.IDLE) && steProtocol.getPakMk().equals("N")) { |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | SteCommand steCommand = new SteCommand(); |
| | | steCommand.setSteNo(wrkCharge.getSteNo()); // 穿梭车编号 |
| | | steCommand.setTaskNo(wrkCharge.getWrkNo()); // 工作号 |
| | | steCommand.setTaskMode(SteTaskModeType.BACK_ORIGIN); // 去左端 |
| | | |
| | | steCommand.setRow(Utils.getGroupRow(steProtocol.getRow().intValue(), true).shortValue()); |
| | | steCommand.setBay(steProtocol.getBay()); |
| | | steCommand.setLev(steProtocol.getLev()); |
| | | if (!MessageQueue.offer(SlaveType.Ste, wrkCharge.getSteNo(), new Task(2, steCommand))) { |
| | | News.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", wrkCharge.getSteNo(), JSON.toJSON(steCommand)); |
| | | } else { |
| | | // 修改工作档状态 43.小车到达 ===> 44.小车走行 |
| | | wrkCharge.setWrkSts(44L); |
| | | Date now = new Date(); |
| | | wrkCharge.setCrnEndTime(now); |
| | | wrkCharge.setModiTime(now); |
| | | if (!wrkChargeService.updateById(wrkCharge)) { |
| | | News.error("修改复位任务状态 43.小车到达 ===> 44.小车走行 失败!!,工作号={}", wrkCharge.getWrkNo()); |
| | | } |
| | | } |
| | | } |
| | | } else if (wrkCharge.getWrkSts() == 45L) { |
| | | if (null != wrkMastMapper.selectWorkingByCrn(wrkCharge.getCrnNo())) { |
| | | return; |
| | | } |
| | | |
| | | LocMast idleLoc = locMastService.selectById(basSte.getIdleLoc()); |
| | | |
| | | Integer otherSte = existOtherSte(idleLoc.getLocNo(), wrkCharge.getSteNo()); |
| | | if (null != otherSte) { |
| | | News.warn("{}号小车移入{}库位组失败,原因:存在{}号穿梭车!", wrkCharge.getSteNo(), idleLoc.getLocNo(), otherSte); |
| | | } else { |
| | | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkCharge.getCrnNo()); |
| | | CrnProtocol crnProtocol = crnThread.getCrnProtocol(); |
| | | if (crnProtocol == null) { return; } |
| | | // 只有当堆垛机空闲 并且 无任务时才继续执行 |
| | | if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) { |
| | | // 堆垛机命令下发区 -------------------------------------------------------------------------- |
| | | CrnCommand crnCommand = new CrnCommand(); |
| | | crnCommand.setCrnNo(wrkCharge.getCrnNo()); // 堆垛机编号 |
| | | crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 工作号 |
| | | crnCommand.setAckFinish((short) 0); // 任务完成确认位 |
| | | crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 任务模式: 库位移转 |
| | | crnCommand.setSourcePosX(Utils.getGroupRow(steProtocol.getRow().intValue(), true).shortValue()); // 源库位排 |
| | | crnCommand.setSourcePosY(steProtocol.getBay()); // 源库位列 |
| | | crnCommand.setSourcePosZ(steProtocol.getLev()); // 源库位层 |
| | | crnCommand.setDestinationPosX(Utils.getGroupRow(idleLoc.getLocNo(), true).shortValue()); // 目标库位排 |
| | | crnCommand.setDestinationPosY(idleLoc.getBay1().shortValue()); // 目标库位列 |
| | | crnCommand.setDestinationPosZ(idleLoc.getLev1().shortValue()); // 目标库位层 |
| | | if (!MessageQueue.offer(SlaveType.Crn, wrkCharge.getCrnNo(), new Task(2, crnCommand))) { |
| | | News.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkCharge.getCrnNo(), JSON.toJSON(crnCommand)); |
| | | } else { |
| | | // 修改穿梭车运行中排列层 |
| | | steThread.modifyPos(Utils.getGroupRow(idleLoc.getLocNo(), true), idleLoc.getBay1(), idleLoc.getLev1()); |
| | | // 修改工作档状态 45.小车待搬 => 46.放至待机位 |
| | | Date now = new Date(); |
| | | wrkCharge.setWrkSts(46L); |
| | | wrkCharge.setCrnStrTime(now); |
| | | wrkCharge.setModiTime(now); |
| | | if (!wrkChargeService.updateById(wrkCharge)) { |
| | | News.error("修改工作档状态 45.小车待搬 => 46.放至待机位 失败!!,工作号={}", wrkCharge.getWrkNo()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | |
| | | public List<String> crn2DemoLocs = new ArrayList<String>(); public String crn2LastLoc = ""; |