| | |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == null)) { |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == null || staProtocol.getWorkNo() == 0)) { |
| | | |
| | | // 判断吊车是否实际已完成,且电脑状态在move中,以备电脑进行更新工作档 |
| | | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn,crnNo); |
| | |
| | | } |
| | | } |
| | | }else if (conStation==2){ |
| | | if (crnProtocol.statusType != CrnStatusType.IDLE){ |
| | | return false; |
| | | } |
| | | // 查询工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectPakOutStep2345(staProtocol.getSiteId(),crnProtocol.getTaskNoTwo().intValue()); |
| | | if (wrkMast == null) { |
| | |
| | | } |
| | | } |
| | | |
| | | StaProtocol staProtocolOther = devpThread.getStation().get(crnStn.getStaNoOther()); |
| | | if (staProtocolOther == null) { |
| | | continue; |
| | | } else { |
| | | staProtocolOther = staProtocolOther.clone(); |
| | | } |
| | | |
| | | // 查询站点详细信息 |
| | | BasDevp staDetlOther = basDevpService.selectById(crnStn.getStaNoOther()); |
| | | if (staDetlOther == null) { |
| | | log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNoOther()); |
| | | continue; |
| | | } |
| | | if (staProtocolOther.getWorkNo()!=0){ |
| | | WrkMast wrkMastOther = wrkMastMapper.selectPakInStep3(staProtocolOther.getWorkNo()); |
| | | if (Cools.isEmpty(wrkMastOther)){ |
| | | log.error("Other查询工作档案无数据--工作号{},站点号:{}", staProtocolOther.getWorkNo(),staProtocolOther.getSiteId()); |
| | | continue; |
| | | } |
| | | // 获取库位信息 |
| | | LocMast locMastOther = locMastService.selectById(wrkMastOther.getLocNo()); |
| | | if (locMastOther == null) { |
| | | log.error("查询库存无数据--库位号{}", locMastOther.getLocNo()); |
| | | continue; |
| | | } |
| | | if (!locMastOther.getLocSts().equals("S") && !locMastOther.getLocSts().equals("Q")) { |
| | | log.error("入库操作库位状态不符合--状态, 库位号={},库位状态={}", wrkMastOther.getLocNo(), locMastOther.getLocSts()); |
| | | continue; |
| | | } |
| | | if (locMastOther.getBay1()!=81){ |
| | | if (staProtocolOther.isAutoing() && staProtocolOther.isLoading() |
| | | && staProtocolOther.isInEnable() && staDetlOther.getCanining() != null && staDetlOther.getCanining().equals("Y")) { |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | CrnCommandParam crnCommandParam = new CrnCommandParam(); |
| | | crnCommandParam.setCrnNo(slave.getId()); // 堆垛机编号 |
| | | |
| | | crnCommandParam.setTaskNo2(wrkMast.getWrkNo().shortValue()); // 工作号 |
| | | crnCommandParam.setAckFinish2((short) 0); // 任务完成确认位 |
| | | crnCommandParam.setTaskMode2(CrnTaskModeType.SEPARATE_TAKE); // 任务模式: 单取货 |
| | | crnCommandParam.setSourcePosX2(crnStn.getRow().shortValue()); // 源库位排 |
| | | crnCommandParam.setSourcePosY2(crnStn.getBay().shortValue()); // 源库位列 |
| | | crnCommandParam.setSourcePosZ2(crnStn.getLev().shortValue()); // 源库位层 |
| | | crnCommandParam.setDestinationPosX2((short)0); // 目标库位排 |
| | | crnCommandParam.setDestinationPosY2((short)0); // 目标库位列 |
| | | crnCommandParam.setDestinationPosZ2((short)0); // 目标库位层 |
| | | |
| | | crnCommandParam.setTaskNo(wrkMastOther.getWrkNo().shortValue()); // 工作号 |
| | | crnCommandParam.setAckFinish((short) 0); // 任务完成确认位 |
| | | crnCommandParam.setTaskMode(CrnTaskModeType.SEPARATE_TAKE); // 任务模式: 单取货 |
| | | crnCommandParam.setSourcePosX(crnStn.getRow().shortValue()); // 源库位排 |
| | | crnCommandParam.setSourcePosY(crnStn.getBay().shortValue()); // 源库位列 |
| | | crnCommandParam.setSourcePosZ(crnStn.getLev().shortValue()); // 源库位层 |
| | | crnCommandParam.setDestinationPosX((short)0); // 目标库位排 |
| | | crnCommandParam.setDestinationPosY((short)0); // 目标库位列 |
| | | crnCommandParam.setDestinationPosZ((short)0); // 目标库位层 |
| | | if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(99, crnCommandParam.getCrnNo()-2))) { |
| | | log.error("输送线锁定命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), crnCommandParam.getCrnNo()-2); |
| | | continue; |
| | | } |
| | | if (!MessageQueue.offer(SlaveType.Crn, crnCommandParam.getCrnNo(), new Task(9, crnCommandParam))) { |
| | | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSONString(crnCommandParam)); |
| | | } else { |
| | | // 修改工作档状态 2.设备上走 => 3.吊车入库中 |
| | | Date now = new Date(); |
| | | wrkMast.setWrkSts(3L); |
| | | wrkMast.setCrnStrTime(now); |
| | | wrkMast.setModiTime(now); |
| | | WrkMastSplitTwin wrkMastSplitTwin = new WrkMastSplitTwin(wrkMast,2,now); |
| | | wrkMastSplitTwin.setWrkSts(1); |
| | | wrkMastSplitTwin.setWrkStart(wrkMast.getStaNo().toString()); |
| | | wrkMastSplitTwin.setWrkEnd(wrkMast.getLocNo()); |
| | | wrkMastSplitTwin.setStartRow(crnStn.getRow()); |
| | | wrkMastSplitTwin.setStartBay(crnStn.getBay()); |
| | | wrkMastSplitTwin.setStartLev(crnStn.getLev()); |
| | | wrkMastSplitTwin.setEndRow(locMast.getRow1()); |
| | | wrkMastSplitTwin.setEndBay(locMast.getBay1()); |
| | | wrkMastSplitTwin.setEndLev(locMast.getLev1()); |
| | | wrkMastSplitTwin.setWrkType(1); |
| | | wrkMastSplitTwin.setIoType(1); |
| | | |
| | | wrkMastOther.setWrkSts(3L); |
| | | wrkMastOther.setCrnStrTime(now); |
| | | wrkMastOther.setModiTime(now); |
| | | WrkMastSplitTwin wrkMastSplitTwinOther = new WrkMastSplitTwin(wrkMastOther,1,now); |
| | | wrkMastSplitTwinOther.setWrkSts(1); |
| | | wrkMastSplitTwinOther.setWrkStart(wrkMastOther.getStaNo().toString()); |
| | | wrkMastSplitTwinOther.setWrkEnd(wrkMastOther.getLocNo()); |
| | | wrkMastSplitTwinOther.setStartRow(crnStn.getRow()); |
| | | wrkMastSplitTwinOther.setStartBay(crnStn.getBay()); |
| | | wrkMastSplitTwinOther.setStartLev(crnStn.getLev()); |
| | | wrkMastSplitTwinOther.setEndRow(locMastOther.getRow1()); |
| | | wrkMastSplitTwinOther.setEndBay(locMastOther.getBay1()); |
| | | wrkMastSplitTwinOther.setEndLev(locMastOther.getLev1()); |
| | | wrkMastSplitTwinOther.setWrkType(1); |
| | | wrkMastSplitTwinOther.setIoType(1); |
| | | |
| | | if (wrkMastMapper.updateById(wrkMast) == 0) { |
| | | log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo()); |
| | | } |
| | | |
| | | if (wrkMastSplitTwinMapper.insert(wrkMastSplitTwin)==0){ |
| | | log.error("创建 堆垛机执行任务 失败!!,工作号={},堆垛机号={}", wrkMast.getWrkNo(),wrkMast.getCrnNo()); |
| | | } |
| | | |
| | | if (wrkMastMapper.updateById(wrkMastOther) == 0) { |
| | | log.error("Other修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo()); |
| | | } |
| | | |
| | | if (wrkMastSplitTwinMapper.insert(wrkMastSplitTwinOther)==0){ |
| | | log.error("Other创建 堆垛机执行任务 失败!!,工作号={},堆垛机号={}", wrkMast.getWrkNo(),wrkMast.getCrnNo()); |
| | | } |
| | | return; |
| | | } |
| | | } |
| | | } |
| | | return; |
| | | } |
| | | StaProtocol staProtocolOther1 = devpThread.getStation().get(crnStn.getStaNoOther1()); |
| | | if (staProtocolOther1 == null) { |
| | | continue; |
| | | } else { |
| | | staProtocolOther1 = staProtocolOther1.clone(); |
| | | } |
| | | |
| | | if (staProtocolOther1.isAutoing() && staProtocolOther1.getWorkNo()!=0){ |
| | | return; |
| | | } |
| | | |
| | | |
| | | StaProtocol staProtocolOther2 = devpThread.getStation().get(crnStn.getStaNoOther2()); |
| | | if (staProtocolOther2 == null) { |
| | | continue; |
| | | } else { |
| | | staProtocolOther2 = staProtocolOther2.clone(); |
| | | } |
| | | if (staProtocolOther2.isAutoing() && staProtocolOther2.getWorkNo()!=0){ |
| | | return; |
| | | } |
| | | crnStation = 2; |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | CrnCommand crnCommand = new CrnCommand(); |
| | | crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 |
| | |
| | | crnCommand.setDestinationPosX((short)0); // 目标库位排 |
| | | crnCommand.setDestinationPosY((short)0); // 目标库位列 |
| | | crnCommand.setDestinationPosZ((short)0); // 目标库位层 |
| | | if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(crnStation==1? 2:5, crnCommand))) { |
| | | |
| | | staProtocol.setWorkNo(wrkMast.getWrkNo()); |
| | | staProtocol.setStaNo(wrkMast.getStaNo()); |
| | | |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | |
| | | if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(99, crnCommand.getCrnNo()-2))) { |
| | | log.error("输送线锁定命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), crnCommand.getCrnNo()-2); |
| | | continue; |
| | | } |
| | | if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(5, crnCommand))) { |
| | | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSONString(crnCommand)); |
| | | } else { |
| | | // 修改工作档状态 2.设备上走 => 3.吊车入库中 |
| | |
| | | int[] sign = new int[]{0,0}; |
| | | // 只有当堆垛机自动时才继续执行 |
| | | if (crnProtocol.getModeType() == CrnModeType.AUTO) { |
| | | //双 |
| | | if (crnProtocol.getStatusType() == CrnStatusType.SEPARATE_IDLE |
| | | && crnProtocol.getTaskNo() == 0 |
| | | && crnProtocol.getLoaded() == 1 |
| | | && crnProtocol.getForkPos() == 0) { |
| | | if (crnProtocol.getStatusTypeTwo() == CrnStatusType.SEPARATE_IDLE |
| | | && crnProtocol.getTaskNoTwo() == 0 |
| | | && crnProtocol.getLoadedTwo() == 1 |
| | | && crnProtocol.getForkPosTwo() == 0){ |
| | | List<WrkMastSplitTwin> wrkMastSplitTwinList1 = wrkMastSplitTwinService.getWrkMastSplitTwin(crn.getId(),1,2,2,0); |
| | | List<WrkMastSplitTwin> wrkMastSplitTwinList2 = wrkMastSplitTwinService.getWrkMastSplitTwin(crn.getId(),2,2,2,0); |
| | | if (!wrkMastSplitTwinList1.isEmpty() && !wrkMastSplitTwinList2.isEmpty() ){ |
| | | if (wrkMastSplitTwinList1.size()>1 || wrkMastSplitTwinList2.size()>1 ){ |
| | | log.error("Pair堆垛机出入库下发异常,堆垛机号={},异常信息={},工位号={},工作类型={}",crn.getId(),"存在多笔可执行作业,请删除无效作业!!!",sign[1],sign[0]); |
| | | return false; |
| | | } |
| | | WrkMastSplitTwin wrkMastSplitTwin1 = wrkMastSplitTwinList1.get(0); |
| | | WrkMastSplitTwin wrkMastSplitTwin2 = wrkMastSplitTwinList2.get(0); |
| | | boolean ack = crnExecutePutFullPair(crn.getId(), wrkMastSplitTwin1,wrkMastSplitTwin2, sign[1]); |
| | | if (ack){ |
| | | wrkMastSplitTwin1.setWrkSts(wrkMastSplitTwin1.getWrkType()==1? 1:3); |
| | | wrkMastSplitTwinService.updateById(wrkMastSplitTwin1); |
| | | wrkMastSplitTwin2.setWrkSts(wrkMastSplitTwin2.getWrkType()==1? 1:3); |
| | | wrkMastSplitTwinService.updateById(wrkMastSplitTwin2); |
| | | }else { |
| | | log.error("堆垛机出入库下发报错,堆垛机号={},异常信息={}",crn.getId(),"下发任务返回值为:"+ack); |
| | | } |
| | | |
| | | return false; |
| | | } |
| | | |
| | | } |
| | | } |
| | | // 只有当堆垛机工位1取货或者有物 并且 工位2无任务时才继续执行 |
| | | switch (i){ |
| | | case 1: |
| | |
| | | crnCommand.setDestinationPosZ(wrkMastSplitTwin.getEndLev().shortValue()); // 目标库位层 |
| | | if (!MessageQueue.offer(SlaveType.Crn, wrkMastSplitTwin.getCrnNo(), new Task(crnStation==1? 2:5, crnCommand))) { |
| | | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMastSplitTwin.getCrnNo(), JSON.toJSONString(crnCommand)); |
| | | return false; |
| | | } else { |
| | | return true; |
| | | } |
| | | }catch (Exception e){ |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /* |
| | | * 堆垛机取货至工位任务 |
| | | * */ |
| | | public synchronized boolean crnExecuteTakeFullPair(Integer crnNo,WrkMastSplitTwin wrkMastSplitTwinOne,WrkMastSplitTwin wrkMastSplitTwinTwo, Integer crnStation){ |
| | | try{ |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | // 1.堆垛机开始移动 |
| | | CrnCommandParam crnCommandParam = new CrnCommandParam(); |
| | | crnCommandParam.setCrnNo(crnNo); // 堆垛机编号 |
| | | crnCommandParam.setTaskNo(wrkMastSplitTwinOne.getWrkNo().shortValue()); // 工作号 |
| | | crnCommandParam.setAckFinish((short) 0); // 任务完成确认位 |
| | | crnCommandParam.setTaskMode(CrnTaskModeType.SEPARATE_TAKE); // 任务模式: 单取货 |
| | | crnCommandParam.setSourcePosX(wrkMastSplitTwinOne.getStartRow().shortValue()); // 源库位排 |
| | | crnCommandParam.setSourcePosY(wrkMastSplitTwinOne.getStartBay().shortValue()); // 源库位列 |
| | | crnCommandParam.setSourcePosZ(wrkMastSplitTwinOne.getStartLev().shortValue()); // 源库位层 |
| | | crnCommandParam.setDestinationPosX((short)0); // 目标库位排 |
| | | crnCommandParam.setDestinationPosY((short)0); // 目标库位列 |
| | | crnCommandParam.setDestinationPosZ((short)0); // 目标库位层 |
| | | |
| | | crnCommandParam.setTaskNo2(wrkMastSplitTwinTwo.getWrkNo().shortValue()); // 工作号 |
| | | crnCommandParam.setAckFinish2((short) 0); // 任务完成确认位 |
| | | crnCommandParam.setTaskMode2(CrnTaskModeType.SEPARATE_TAKE); // 任务模式: 单取货 |
| | | crnCommandParam.setSourcePosX2(wrkMastSplitTwinTwo.getStartRow().shortValue()); // 源库位排 |
| | | crnCommandParam.setSourcePosY2(wrkMastSplitTwinTwo.getStartBay().shortValue()); // 源库位列 |
| | | crnCommandParam.setSourcePosZ2(wrkMastSplitTwinTwo.getStartLev().shortValue()); // 源库位层 |
| | | crnCommandParam.setDestinationPosX2((short)0); // 目标库位排 |
| | | crnCommandParam.setDestinationPosY2((short)0); // 目标库位列 |
| | | crnCommandParam.setDestinationPosZ2((short)0); // 目标库位层 |
| | | if (!MessageQueue.offer(SlaveType.Crn, crnCommandParam.getCrnNo(), new Task(9, crnCommandParam))) { |
| | | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", crnCommandParam.getCrnNo(), JSON.toJSONString(crnCommandParam)); |
| | | return false; |
| | | } else { |
| | | return true; |
| | | } |
| | | }catch (Exception e){ |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /* |
| | | * 堆垛机放货货至出库站点任务 |
| | | * */ |
| | | public synchronized boolean crnExecutePutFullPair(Integer crnNo,WrkMastSplitTwin wrkMastSplitTwinOne,WrkMastSplitTwin wrkMastSplitTwinTwo, Integer crnStation){ |
| | | try{ |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | // 1.堆垛机开始移动 |
| | | CrnCommandParam crnCommandParam = new CrnCommandParam(); |
| | | crnCommandParam.setCrnNo(crnNo); // 堆垛机编号 |
| | | crnCommandParam.setTaskNo(wrkMastSplitTwinOne.getWrkNo().shortValue()); // 工作号 |
| | | crnCommandParam.setAckFinish((short) 0); // 任务完成确认位 |
| | | crnCommandParam.setTaskMode(CrnTaskModeType.SEPARATE_PUT); // 任务模式: 单放货 |
| | | crnCommandParam.setSourcePosX((short)0); // 源库位排 |
| | | crnCommandParam.setSourcePosY((short)0); // 源库位列 |
| | | crnCommandParam.setSourcePosZ((short)0); // 源库位层 |
| | | crnCommandParam.setDestinationPosX(wrkMastSplitTwinOne.getEndRow().shortValue()); // 目标库位排 |
| | | crnCommandParam.setDestinationPosY(wrkMastSplitTwinOne.getEndBay().shortValue()); // 目标库位列 |
| | | crnCommandParam.setDestinationPosZ(wrkMastSplitTwinOne.getEndLev().shortValue()); // 目标库位层 |
| | | |
| | | crnCommandParam.setTaskNo2(wrkMastSplitTwinTwo.getWrkNo().shortValue()); // 工作号 |
| | | crnCommandParam.setAckFinish2((short) 0); // 任务完成确认位 |
| | | crnCommandParam.setTaskMode2(CrnTaskModeType.SEPARATE_PUT); // 任务模式: 单放货 |
| | | crnCommandParam.setSourcePosX2((short)0); // 源库位排 |
| | | crnCommandParam.setSourcePosY2((short)0); // 源库位列 |
| | | crnCommandParam.setSourcePosZ2((short)0); // 源库位层 |
| | | crnCommandParam.setDestinationPosX2(wrkMastSplitTwinTwo.getEndRow().shortValue()); // 目标库位排 |
| | | crnCommandParam.setDestinationPosY2(wrkMastSplitTwinTwo.getEndBay().shortValue()); // 目标库位列 |
| | | crnCommandParam.setDestinationPosZ2(wrkMastSplitTwinTwo.getEndLev().shortValue()); // 目标库位层 |
| | | if (!MessageQueue.offer(SlaveType.Crn, crnCommandParam.getCrnNo(), new Task(9, crnCommandParam))) { |
| | | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", crnCommandParam.getCrnNo(), JSON.toJSONString(crnCommandParam)); |
| | | return false; |
| | | } else { |
| | | return true; |
| | |
| | | continue; |
| | | } |
| | | } else if (steProtocol.getCharge()<80.0F){ |
| | | List<BasJarMast> basJarMastList = basJarMastService.getJarMastByJarIdAndStatusListCharge(steSlave.getId(), new ArrayList<Integer>() {{ |
| | | add(5); |
| | | add(11); |
| | | add(16); |
| | | }}); |
| | | if(!basJarMastList.isEmpty()){ |
| | | continue; |
| | | } |
| | | if (wrkMastExecuteService.selectNoStart(steSlave.getId())!=0){ |
| | | continue; |
| | | } |
| | |
| | | |
| | | if (steProtocol.getCharge()>95.0F || steProtocol.getFullCharge()){ |
| | | } else if (steProtocol.getCharge()>50.0F){ |
| | | if (wrkMastExecuteService.selectNoStart(steSlave.getId())==0){ |
| | | if (wrkMastExecuteService.selectNoStartCharge(steSlave.getId())==0){ |
| | | if (wrkMastExecuteService.selectMoveStart(steSlave.getId())==0){ |
| | | continue; |
| | | } |