| | |
| | | //状态8,等待命令进行入库搬运动作 |
| | | |
| | | //判断提升机是否空闲 |
| | | if (!liftProtocol.isIdle()) { |
| | | if (!liftProtocol.isIdleNoTask()) { |
| | | try { |
| | | Thread.sleep(1000);//休眠1s |
| | | } catch (InterruptedException e) { |
| | | throw new RuntimeException(e); |
| | | } |
| | | continue;//提升机忙 |
| | | } |
| | | //判断提升机任务号和当前工作档任务号是否一致 |
| | | if (liftProtocol.getTaskNo().intValue() != 0 && liftProtocol.getTaskNo().intValue() != wrkMast.getWrkNo()) { |
| | | continue; |
| | | } |
| | | |
| | | //判断提升机楼层是否到位,判断站点是否给出提升机到位信号 |
| | |
| | | }else if(wrkMast.getWrkSts() == 25) {//状态25,需要向小车下发命令从提升机移动出去,需要判断提升机状是否空闲、提升机是否到达目标楼层、目标楼层站点是否存在、目标楼层站点是否给出提升机到位信号 |
| | | |
| | | //判断提升机是否空闲 |
| | | if (!liftProtocol.isIdle()) { |
| | | if (!liftProtocol.isIdleNoTask()) { |
| | | try { |
| | | Thread.sleep(1000);//休眠1s |
| | | } catch (InterruptedException e) { |
| | | throw new RuntimeException(e); |
| | | } |
| | | continue;//提升机忙 |
| | | } |
| | | //判断提升机任务号和当前工作档任务号是否一致 |
| | | if (liftProtocol.getTaskNo().intValue() != 0 && liftProtocol.getTaskNo().intValue() != wrkMast.getWrkNo()) { |
| | | continue; |
| | | } |
| | | |
| | | //判断提升机楼层是否到位,判断站点是否给出提升机到位信号 |
| | |
| | | BasDevp basDevp = basDevpService.queryByLocNo(liftSiteLocNo); |
| | | Short endStartCode = Short.parseShort(basDevp.getQrCodeValue());//站点二维码 |
| | | |
| | | String disLocNo = "190020" + Utils.getLev(liftSiteLocNo);//避让位置 |
| | | 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, 1400, ShuttleRunDirection.BOTTOM.id, endStartCode, 1400, 500); |
| | | ShuttleCommand moveCommand = shuttleThread.getMoveCommand(endStartCode, disCode, 2800, ShuttleRunDirection.BOTTOM.id, endStartCode, 2800, 1000); |
| | | commands.add(moveCommand); |
| | | |
| | | //分配目标库位 |
| | |
| | | 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();//提升机内部二维码 |
| | | Short distCode = commands.get(0).getStartCodeNum();//目标二维码 |
| | |
| | | ArrayList<ShuttleThread> sameLev = new ArrayList<>();//相同楼层的穿梭车 |
| | | ArrayList<ShuttleThread> diffLev = new ArrayList<>();//不同楼层的穿梭车 |
| | | |
| | | //判断其他空闲穿梭车是否离任务最近 |
| | | String distLocNo = null;//目标地点,入库=》提升机口,出库=》货物库位号 |
| | | if (wrkMast.getIoType() < 101) { |
| | | //入库 |
| | | distLocNo = Utils.levToOutInStaLocNo(lev); |
| | | }else { |
| | | //出库 |
| | | distLocNo = locNo; |
| | | } |
| | | |
| | | for (ShuttleSlave shuttle : slaveProperties.getShuttle()) { |
| | | //获取四向穿梭车线程 |
| | | ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId()); |
| | | ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); |
| | | if (shuttleProtocol == null) { |
| | | if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) { |
| | | continue; |
| | | } |
| | | if (!shuttleProtocol.isIdle()) { |
| | |
| | | if (shuttleLocNo == null) { |
| | | continue; |
| | | } |
| | | |
| | | if (shuttleLocNo.equals(distLocNo)) { |
| | | //车辆当前位置已经是目标库位,无需计算 |
| | | map.put("sameLay", true);//同层 |
| | | map.put("result", shuttleThread); |
| | | return map; |
| | | } |
| | | |
| | | int shuttleLocNoLey = Utils.getLev(shuttleLocNo);//库位号对应层高 |
| | | if (lev == shuttleLocNoLey) { |
| | | //工作档楼层相同的穿梭车 |
| | |
| | | for (ShuttleThread shuttleThread : sameLev) { |
| | | if (recentShuttle == null) {//最近穿梭车为空,则默认赋予为最近穿梭车 |
| | | recentShuttle = shuttleThread; |
| | | } |
| | | |
| | | //判断其他空闲穿梭车是否离任务最近 |
| | | String distLocNo = null;//目标地点,入库=》提升机口,出库=》货物库位号 |
| | | if (wrkMast.getIoType() < 101) { |
| | | //入库 |
| | | distLocNo = Utils.levToOutInStaLocNo(lev); |
| | | }else { |
| | | //出库 |
| | | distLocNo = locNo; |
| | | } |
| | | |
| | | //当前穿梭车库位号 |
| | |
| | | && 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; |
| | | } |
| | | |
| | | //判断提升机是否处于空闲状态 |
| | | if (!liftProtocol.isIdle()) { |
| | | |
| | | // if (!liftProtocol.isIdle()) { |
| | | // continue; |
| | | // } |
| | | |
| | | //判断提升机是否处于空闲状态,没有判断任务号,可能提升机处于空闲,但是还有任务未完成 |
| | | if (!liftProtocol.isIdleNoTask()) { |
| | | continue; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | if (wrkMast.getWrkSts() == 2) {//2.设备上走 |
| | | if (liftProtocol.getTaskNo().intValue() != 0) { |
| | | //存在未完成任务号 |
| | | continue; |
| | | } |
| | | if (liftProtocol.getPlatShuttleCheck()) { |
| | | //提升机此时有四向车,可能有未完成的任务,禁止分配新任务 |
| | | continue; |
| | | } |
| | | |
| | | //获取目标站 |
| | | StaProtocol staProtocol = devpThread.getStation().get(wrkMast.getStaNo()); |
| | | if (staProtocol.isLoading() || !staProtocol.isInEnable()) {//目标站有物,不可入,禁止分配任务 |
| | | continue; |
| | | } |
| | | |
| | | //工作档目标库位号 |
| | | String wrkMastLocNo = wrkMast.getLocNo(); |
| | | //工作档目标库位楼层 |
| | |
| | | |
| | | wrkMast.setWrkSts(3L);//3.提升机搬运中 |
| | | } else if (wrkMast.getWrkSts() == 6) {//6.迁移小车至提升机口完成 => 7.提升机迁移小车中 |
| | | if (liftProtocol.getTaskNo().intValue() != 0 && liftProtocol.getTaskNo().intValue() != wrkMast.getWrkNo()) { |
| | | //提升机存在未完成任务,且提升机任务号和当前工作档任务号不一致 |
| | | continue; |
| | | } |
| | | liftProtocol.setShuttleNo(wrkMast.getShuttleNo().shortValue());//设置四向穿梭车号 |
| | | |
| | | //判断小车是否在提升机内,且处于空闲状态 |
| | |
| | | } |
| | | if (shuttleProtocol.getCurrentCode().intValue() != liftProtocol.getBarcode().intValue()) { |
| | | continue;//小车当前二维码和提升机内部二维码不一致,不允许执行 |
| | | } |
| | | if (!liftProtocol.getPlatShuttleCheck()) { |
| | | //提升机未检测到小车,禁止执行 |
| | | continue; |
| | | } |
| | | |
| | | //工作档目标库位号 |
| | |
| | | |
| | | wrkMast.setWrkSts(7L);//6.迁移小车至提升机口完成 => 7.提升机迁移小车中 |
| | | } else if(wrkMast.getWrkSts() == 23) {//23.迁移小车至提升机口完成 => 24.提升机迁移小车中 |
| | | if (liftProtocol.getTaskNo().intValue() != 0 && liftProtocol.getTaskNo().intValue() != wrkMast.getWrkNo()) { |
| | | //提升机存在未完成任务,且提升机任务号和当前工作档任务号不一致 |
| | | continue; |
| | | } |
| | | liftProtocol.setShuttleNo(wrkMast.getShuttleNo().shortValue());//设置四向穿梭车号 |
| | | |
| | | //判断小车是否在提升机内,且处于空闲状态 |
| | |
| | | } |
| | | if (shuttleProtocol.getCurrentCode().intValue() != liftProtocol.getBarcode().intValue()) { |
| | | continue;//小车当前二维码和提升机内部二维码不一致,不允许执行 |
| | | } |
| | | if (!liftProtocol.getPlatShuttleCheck()) { |
| | | //提升机未检测到小车,禁止执行 |
| | | continue; |
| | | } |
| | | |
| | | //工作档目标库位号 |
| | |
| | | |
| | | wrkMast.setWrkSts(24L);//23.迁移小车至提升机口完成 => 24.提升机迁移小车中 |
| | | } else if (wrkMast.getWrkSts() == 27) {//27.小车出库搬运完成 |
| | | if (liftProtocol.getTaskNo().intValue() != 0 && liftProtocol.getTaskNo().intValue() != wrkMast.getWrkNo()) { |
| | | //提升机存在未完成任务,且提升机任务号和当前工作档任务号不一致 |
| | | continue; |
| | | } |
| | | if (liftProtocol.getPlatShuttleCheck()) { |
| | | //提升机此时有四向车,可能有未完成的任务,禁止分配新任务 |
| | | continue; |
| | | } |
| | | |
| | | //工作档源库位号 |
| | | String wrkMastLocNo = wrkMast.getSourceLocNo(); |
| | | //工作档源库位楼层 |
| | |
| | | //将任务档标记为完成 |
| | | WrkMast wrkMast = wrkMastMapper.selectByWorkNo372428(liftProtocol.getTaskNo().intValue()); |
| | | if (wrkMast != null) { |
| | | //判断提升机是否到达任务楼层 |
| | | String locNo = wrkMast.getIoType() < 101 ? wrkMast.getLocNo() : wrkMast.getSourceLocNo(); |
| | | int lev = Utils.getLev(locNo);//任务目标楼层 |
| | | |
| | | //标记复位 |
| | | liftProtocol.setPakMk(true); |
| | | |
| | | switch (wrkMast.getWrkSts().intValue()) { |
| | | case 3://3.提升机搬运中 ==> 4.提升机搬运完成 |
| | | if (liftProtocol.getLev().intValue() != lev) { |
| | | continue;//提升机没有到达目标 |
| | | } |
| | | //给目标站设置工作号 |
| | | StaProtocol staProtocol = devpThread.getStation().get(wrkMast.getStaNo());//目标站 |
| | | staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); |
| | |
| | | if (!result) { |
| | | throw new CoolException("更新plc站点信息失败"); |
| | | } |
| | | //任务号清零 |
| | | liftProtocol.setTaskNo((short) 0); |
| | | wrkMast.setWrkSts(4L); |
| | | break; |
| | | case 7://7.提升机迁移小车中 ==> 8.提升机迁移小车完成 |
| | | if (liftProtocol.getLev().intValue() != lev) { |
| | | continue;//提升机没有到达目标 |
| | | } |
| | | wrkMast.setWrkSts(8L); |
| | | break; |
| | | case 24://24.提升机迁移小车中 ==> 25.提升机迁移小车完成 |
| | | if (liftProtocol.getLev().intValue() != lev) { |
| | | continue;//提升机没有到达目标 |
| | | } |
| | | wrkMast.setWrkSts(25L); |
| | | break; |
| | | case 28://28.提升机搬运中 ==> 29.提升机搬运完成 |
| | | if (liftProtocol.getPositionArrivalFeedback().intValue() != 2) { |
| | | continue;//提升机是否达到输送线楼层 |
| | | } |
| | | wrkMast.setWrkSts(29L); |
| | | wrkMast.setWrkSts(34L);//34.出库完成,暂时先直接完成出库工作档,后续需要根据输送线给出的状态来确定34.出库完成状态 |
| | | //任务号清零 |
| | | liftProtocol.setTaskNo((short) 0); |
| | | break; |
| | | default: |
| | | } |
| | |
| | | if (wrkMastMapper.updateById(wrkMast) > 0) { |
| | | //设置提升机为空闲状态 |
| | | liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE); |
| | | //任务号清零 |
| | | liftProtocol.setTaskNo((short) 0); |
| | | //标记复位 |
| | | liftProtocol.setPakMk(true); |
| | | //任务指令清零 |
| | | liftProtocol.setAssignCommand(null); |
| | | News.info("提升机已确认且任务完成状态,复位。提升机号={}", liftProtocol.getLiftNo()); |
| | | News.info("提升机已确认且任务完成状态。提升机号={}", liftProtocol.getLiftNo()); |
| | | } else { |
| | | News.error("提升机已确认且任务完成状态,复位失败,但未找到工作档。提升机号={},工作号={}", liftProtocol.getLiftNo(), liftProtocol.getTaskNo()); |
| | | } |
| | |
| | | //查询是否有充电任务 |
| | | WrkCharge wrkCharge = wrkChargeMapper.selectByWorkNo(liftProtocol.getTaskNo().intValue()); |
| | | if (wrkCharge != null) { |
| | | //标记复位 |
| | | liftProtocol.setPakMk(true); |
| | | |
| | | switch (wrkCharge.getWrkSts().intValue()) { |
| | | case 54://提升机搬运中 |
| | | wrkCharge.setWrkSts(55L);//提升机搬运完成 |
| | |
| | | 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); |
| | | //下发任务 |
| | | MessageQueue.offer(SlaveType.Shuttle, assignCommand.getShuttleNo().intValue(), new Task(3, assignCommand)); |
| | | |
| | | 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 = ""; |