| | |
| | | back = true; |
| | | } |
| | | // 退回 |
| | | if (back && (staProtocol.getWorkNo() >= 9993 && staProtocol.getWorkNo() <= 9995) && staProtocol.isLoading() && staProtocol.isPakMk()) { |
| | | if (back && (staProtocol.getWorkNo() >= 9993 && staProtocol.getWorkNo() <= 9995 || staProtocol.getWorkNo() == 9997) && staProtocol.isLoading() && staProtocol.isPakMk()) { |
| | | MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg)); |
| | | staProtocol.setWorkNo(wrkNo); |
| | | News.info("{}入库回退:{},任务号:{}", inSta.getStaNo(), errMsg,wrkNo); |
| | |
| | | if (staProtocol.isAutoing() |
| | | && staProtocol.isLoading() |
| | | && staProtocol.isInEnable() |
| | | && !staProtocol.isEmptyMk() |
| | | && staProtocol.isPakMk() && staProtocol.getWorkNo() >= 9993 && staProtocol.getWorkNo() <= 9995) { // 9990-9992空托,9993-9995 满托,9999回退 |
| | | if(Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "00000000".equals(barcode)) { |
| | | // && !staProtocol.isEmptyMk() |
| | | && staProtocol.isPakMk() |
| | | && (staProtocol.getWorkNo() >= 9993 && staProtocol.getWorkNo() <= 9995|| staProtocol.getWorkNo() == 9997)) { // 9990-9992空托,9993-9995 满托,9999回退 |
| | | log.info("入库请求:" + staProtocol); |
| | | if(Cools.isEmpty(barcode) || barcode.endsWith("NG") || "NoRead".equals(barcode) || barcode.startsWith("00000000")) { |
| | | News.info("{}条码扫描错误:{}",barcodeThread.getSlave().getId(),barcode); |
| | | staProtocol.setWorkNo(wrkNo); |
| | | staProtocol.setStaNo(inSta.getBackSta().shortValue()); |
| | |
| | | } |
| | | String barcode = barcodeThread.getBarcode(); |
| | | if(!Cools.isEmpty(barcode)) { |
| | | if("NG".endsWith(barcode) || "NoRead".equals(barcode)) { |
| | | if(barcode.endsWith("NG") || barcode.equals("NoRead")) { |
| | | continue; |
| | | } |
| | | } else { |
| | |
| | | } |
| | | |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk() |
| | | && staProtocol.getWorkNo() >= 9993 && staProtocol.getWorkNo() <= 9995) { |
| | | && (staProtocol.getWorkNo() >= 9993 && staProtocol.getWorkNo() <= 9995 || staProtocol.getWorkNo() == 9997)) { |
| | | News.warnNoLog(""+mark+" - 0"+" - 开始执行"); |
| | | WrkMast wrkMast = wrkMastMapper.selectPickStep(barcode); |
| | | if (wrkMast == null) { |
| | |
| | | wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57 |
| | | wrkMast.setWrkSts(2L); // 工作状态: 2.设备上走 |
| | | wrkMast.setSourceStaNo(staProtocol.getSiteId()); // 源站 |
| | | wrkMast.setStaNo(staNo); // 目标站 |
| | | wrkMast.setStaNo(staProtocol.getSiteId()); // 目标站 |
| | | wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 目标库位 = 出库时的源库位 |
| | | wrkMast.setSourceLocNo(""); // 源库位清空 |
| | | wrkMast.setModiTime(now); |
| | |
| | | staProtocol.setStaNo(staProtocol.getSiteId().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发5:"+wrkMast.getWrkNo()+","+wrkMast.getStaNo()); |
| | | log.info("输送线下发5:"+wrkMast.getWrkNo()+","+wrkMast.getStaNo()); |
| | | if (!result) { |
| | | News.error(""+mark+" - 3"+" - 发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId()); |
| | | } |
| | |
| | | |
| | | // 只有当堆垛机空闲 并且 无任务时才继续执行 |
| | | if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO |
| | | && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) { |
| | | && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0 && wrkMastMapper.selectWorking(crn.getId()) == null) { |
| | | News.warnNoLog(""+mark+" - 0"+" - 开始执行堆垛机入出库作业下发"); |
| | | boolean success; |
| | | // 如果最近一次是入库模式 |
| | | if (crnProtocol.getLastIo().equals("I")) { |
| | | if (basCrnp.getInEnable().equals("Y")) { |
| | | //mark - 1 - .... |
| | | this.crnStnToLoc(crn, crnProtocol,mark); // 入库 |
| | | crnProtocol.setLastIo("O"); |
| | | } else if (basCrnp.getOutEnable().equals("Y")) { |
| | | success = this.crnStnToLoc(crn, crnProtocol,mark); // 入库 |
| | | if(success) { |
| | | crnProtocol.setLastIo("O"); |
| | | continue; |
| | | } |
| | | } |
| | | if (basCrnp.getOutEnable().equals("Y")) { |
| | | //mark - 2 - .... |
| | | this.locToCrnStn(crn, crnProtocol,mark); // 出库 |
| | | crnProtocol.setLastIo("I"); |
| | | success = this.locToCrnStn(crn, crnProtocol,mark); // 出库 |
| | | if(success) { |
| | | crnProtocol.setLastIo("I"); |
| | | continue; |
| | | } |
| | | } |
| | | } |
| | | // 如果最近一次是出库模式 |
| | | else if (crnProtocol.getLastIo().equals("O")) { |
| | | if (basCrnp.getOutEnable().equals("Y")) { |
| | | this.locToCrnStn(crn, crnProtocol,mark); // 出库 |
| | | crnProtocol.setLastIo("I"); |
| | | } else if (basCrnp.getInEnable().equals("Y")) { |
| | | this.crnStnToLoc(crn, crnProtocol,mark); // 入库 |
| | | crnProtocol.setLastIo("O"); |
| | | success = this.locToCrnStn(crn, crnProtocol,mark); // 出库 |
| | | if(success) { |
| | | crnProtocol.setLastIo("I"); |
| | | continue; |
| | | } |
| | | } |
| | | if (basCrnp.getInEnable().equals("Y")) { |
| | | success = this.crnStnToLoc(crn, crnProtocol,mark); // 入库 |
| | | if(success) { |
| | | crnProtocol.setLastIo("O"); |
| | | continue; |
| | | } |
| | | } |
| | | } |
| | | // log.info("堆垛机切换出入库模式为:{}",crnProtocol.getLastIo().equals("I") ? "入库" : "出库"); |
| | | } |
| | | // 库位移转 |
| | | //mark - 3 - .... |
| | |
| | | /** |
| | | * 入库 ===>> 堆垛机站到库位 |
| | | */ |
| | | public synchronized void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol,Integer mark) { |
| | | public synchronized boolean crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol,Integer mark) { |
| | | News.warnNoLog(""+mark+" - 1"+" - 0"+" - 堆垛机入出库作业下发:执行入库"); |
| | | for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) { |
| | | boolean flag = false; |
| | |
| | | if (wrkMastMapper.updateById(wrkMast) == 0) { |
| | | News.error(""+mark+" - 1"+" - 17"+" - 修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo()); |
| | | } |
| | | return true; |
| | | } |
| | | } |
| | | News.infoNoLog(""+mark+" - 1"+" - 0"+" - 堆垛机入出库作业下发 : 入库执行完毕"); |
| | | return false; |
| | | } |
| | | |
| | | @Resource |
| | | private BasDevpMapper basDevpMapper; |
| | | |
| | | @Resource |
| | | private ConfigService configService; |
| | | |
| | | /** |
| | | * 出库 ===>> 库位到堆垛机站 |
| | | * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库 |
| | | */ |
| | | public synchronized void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol,Integer mark) { |
| | | public synchronized boolean locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol,Integer mark) { |
| | | News.warnNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发:执行出库"); |
| | | |
| | | // 控制是否允许连续出库,不判断出库站点状态(根据状态启用) |
| | | boolean crnAvailableOut = false; |
| | | Config config = configService.selectOne(new EntityWrapper<Config>().eq("code","removeCrnAvailableOut")); |
| | |
| | | crnAvailableOut = true; |
| | | } |
| | | for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { |
| | | // 出入库任务控制,有入库任务不给堆垛机下发命令 |
| | | if (crnStn.getStaNo() == 205) { |
| | | BasDevp basDevp = basDevpMapper.selectById(crnStn.getStaNo()); |
| | | Integer inQty = basDevp.getInQty(); |
| | | if (inQty != 0) { |
| | | log.warn("该出库站点:{},存在执行的入库任务:{}条", crnStn.getStaNo(), inQty); |
| | | continue; |
| | | } |
| | | } |
| | | // 获取工作状态为11(生成出库ID)的出库工作档 |
| | | List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo()); |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | |
| | | |
| | | // 判断堆垛机出库站状态 |
| | | if (staProtocol.isAutoing() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") |
| | | && (crnAvailableOut || !staProtocol.isLoading() && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable())) { |
| | | && (crnAvailableOut || !staProtocol.isLoading() && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable())) { |
| | | // 堆垛机控制过滤 |
| | | if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { |
| | | // continue; |
| | |
| | | |
| | | // 已经存在吊车执行任务时,则过滤 |
| | | if (wrkMastMapper.selectWorking(slave.getId()) != null) { |
| | | break; |
| | | return false; |
| | | // return; |
| | | } |
| | | |
| | |
| | | if (wrkMastMapper.updateById(wrkMast) == 0) { |
| | | News.error(""+mark+" - 2"+" - 14"+" - 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo()); |
| | | } |
| | | break; |
| | | return true; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | News.infoNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发 : 出库执行完毕"); |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | |
| | | for (DevpSlave.Sta emptyInSta : devp.getEmptyInSta()) { |
| | | // 获取空板入库站信息 |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); |
| | | BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, emptyInSta.getBarcode()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(emptyInSta.getStaNo()); |
| | | if (staProtocol == null) { |
| | | continue; |
| | |
| | | if (!staProtocol.isLoading()){ |
| | | continue; |
| | | } |
| | | if (barcodeThread == null) { |
| | | continue; |
| | | } |
| | | String barcode = barcodeThread.getBarcode(); |
| | | // 尺寸检测异常 |
| | | boolean back = false; |
| | | String errMsg = ""; |
| | | if (staProtocol.isFrontErr()) { |
| | | errMsg = "前超限"; |
| | | back = true; |
| | | } |
| | | if (!back && (staProtocol.isBarcodeErr()||Cools.isEmpty(barcode))) { |
| | | errMsg = "扫码失败"; |
| | | back = true; |
| | | } |
| | | |
| | | // 站点条件判断 |
| | | if (staProtocol.isAutoing() |
| | | && staProtocol.isLoading() |
| | | && staProtocol.isInEnable() |
| | | && staProtocol.isEmptyMk() |
| | | && staProtocol.isPakMk() |
| | | && staProtocol.getWorkNo() >= 9990 && staProtocol.getWorkNo() <= 9992 // 9990-9992空托,9993-9995 满托,9999回退 |
| | | // && staProtocol.isEmptyMk() |
| | | // && staProtocol.isPakMk() |
| | | && ((staProtocol.getWorkNo() >= 9990 && staProtocol.getWorkNo() <= 9992) || staProtocol.getWorkNo() == 9996) // 9990-9992空托,9993-9995 满托,9999回退 |
| | | ) { |
| | | if(back){ |
| | | MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(3, errMsg)); |
| | | staProtocol.setWorkNo(wrkNo); |
| | | News.info("{}入库回退:{},任务号:{}", emptyInSta.getStaNo(), errMsg,wrkNo); |
| | | staProtocol.setStaNo(emptyInSta.getBackSta().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发1:"+wrkNo+","+emptyInSta.getBackSta()); |
| | | return; |
| | | } |
| | | News.warnNoLog(""+mark+" - 0"+" - 开始执行:空栈板初始化入库,叉车入库站放货"); |
| | | |
| | | if(Cools.isEmpty(barcode) || barcode.endsWith("NG") || barcode.equals("NoRead") || barcode.startsWith("00000000") || barcode.contains("ERROR")) { |
| | | News.info("{}条码扫描错误:{}",barcodeThread.getSlave().getId(),barcode); |
| | | staProtocol.setWorkNo(wrkNo); |
| | | staProtocol.setStaNo(emptyInSta.getBackSta().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(3, "条码扫描错误")); |
| | | return; |
| | | } |
| | | try { |
| | | LocTypeDto locTypeDto = new LocTypeDto(staProtocol); |
| | | |
| | |
| | | param.setSourceStaNo(emptyInSta.getStaNo()); |
| | | param.setLocType1(locTypeDto.getLocType1()); |
| | | param.setLocType2(locTypeDto.getLocType2()); |
| | | param.setBarcode(barcode); |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/rpc/pakin/loc/v1") |
| | |
| | | staProtocol.setStaNo(staProtocol.getSiteId().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发6:"+dto.getWorkNo()+","+staProtocol.getSiteId()); |
| | | log.info("输送线下发6:"+dto.getWorkNo()+","+staProtocol.getSiteId()); |
| | | if (!result) { |
| | | News.errorNoLog(""+mark+" - 1"+" - 更新plc站点信息失败"); |
| | | throw new CoolException("SiemensDevp - 5"); |
| | |
| | | MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(1, commands)); |
| | | // ledThread.errorReset(); |
| | | } |
| | | Thread.sleep(2000); |
| | | } else { |
| | | staProtocol.setWorkNo(wrkNo); |
| | | staProtocol.setStaNo(emptyInSta.getBackSta().shortValue()); |
| | |
| | | } |
| | | // News.error(""+mark+" - 3"+" - 请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response); |
| | | } |
| | | Thread.sleep(1000); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | |
| | | ledCommand.setEmptyMk(true); |
| | | break; |
| | | default: |
| | | News.error("任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType()); |
| | | // News.error("任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType()); |
| | | break; |
| | | } |
| | | ledCommand.setLocNo(wrkMast.getLocNo()); |
| | |
| | | if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO |
| | | && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) { |
| | | // 判断是不是已在原点 |
| | | if(crnProtocol.getBay() == 1 && crnProtocol.getLevel() == 1) { |
| | | if(crnProtocol.getBay() == 3 && crnProtocol.getLevel() == 1) { |
| | | continue; |
| | | } |
| | | // 判断是不是空闲三分钟 |
| | |
| | | crnCommand.setTaskNo((short) 9999); // 工作号 |
| | | crnCommand.setTaskMode((short)8); // 任务模式: 回原点 |
| | | crnCommand.setSourcePosX((short) 1); // 源库位排 |
| | | crnCommand.setSourcePosY((short) 1); // 源库位列 |
| | | crnCommand.setSourcePosY((short) 3); // 源库位列 |
| | | crnCommand.setSourcePosZ((short) 1); // 源库位层 |
| | | crnCommand.setDestinationPosX((short) 0); // 目标库位排 |
| | | crnCommand.setDestinationPosY((short) 0); // 目标库位列 |