| | |
| | | import com.baomidou.mybatisplus.mapper.Wrapper; |
| | | import com.core.common.Cools; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.common.model.LocTypeDto; |
| | | import com.zy.common.model.MatDto; |
| | | import com.zy.common.model.SearchLocParam; |
| | | import com.zy.common.model.StartupDto; |
| | | import com.zy.common.model.*; |
| | | import com.zy.common.service.CommonService; |
| | | import com.zy.core.CrnThread; |
| | | import com.zy.core.DevpThread; |
| | |
| | | |
| | | public static final long COMMAND_TIMEOUT = 5 * 1000; |
| | | |
| | | // 空拖出库站点 |
| | | // 空拖出库站点,区分子母空托盘 |
| | | public static final Map<Integer,String> emptyPalletSiteMap = new HashMap<>(); |
| | | |
| | | // 初始化空托盘出库站点 M空母托盘,Z空子托盘 |
| | | // 母托盘叠盘站点 |
| | | public static final List<Integer> stackingSite = new ArrayList<>(); |
| | | |
| | | // rgv接驳站点 |
| | | public static final List<Integer> rgvConnectionSiteList = new ArrayList<>(); |
| | | |
| | | // 工作档对应目标站点转换为rgv目标站点 |
| | | public static final Map<Integer,Integer> taskStaNoToRgvStaNoMap = new HashMap<>(); |
| | | |
| | | // 罐装完成rgv接驳站点 |
| | | public static final List<Integer> canningLineRgvConnectionSiteList = new ArrayList<>(); |
| | | |
| | | static { |
| | | emptyPalletSiteMap.put(1002,"M");emptyPalletSiteMap.put(1020,"M");emptyPalletSiteMap.put(1035,"Z"); |
| | | emptyPalletSiteMap.put(1002,"M"); |
| | | emptyPalletSiteMap.put(1020,"M");emptyPalletSiteMap.put(1035,"Z"); |
| | | |
| | | stackingSite.add(1027);stackingSite.add(1020); |
| | | |
| | | rgvConnectionSiteList.add(1012);rgvConnectionSiteList.add(1006);rgvConnectionSiteList.add(1001);rgvConnectionSiteList.add(1018); |
| | | rgvConnectionSiteList.add(1019);rgvConnectionSiteList.add(1041);rgvConnectionSiteList.add(1034);rgvConnectionSiteList.add(1033); |
| | | rgvConnectionSiteList.add(1026);rgvConnectionSiteList.add(1022);rgvConnectionSiteList.add(1044); |
| | | rgvConnectionSiteList.add(1083);rgvConnectionSiteList.add(1086);rgvConnectionSiteList.add(1089);rgvConnectionSiteList.add(1090); |
| | | rgvConnectionSiteList.add(1105);rgvConnectionSiteList.add(1100);rgvConnectionSiteList.add(1097);rgvConnectionSiteList.add(1094); |
| | | rgvConnectionSiteList.add(1091); |
| | | |
| | | taskStaNoToRgvStaNoMap.put(1050,1044);taskStaNoToRgvStaNoMap.put(1079,1044);taskStaNoToRgvStaNoMap.put(1065,1044);taskStaNoToRgvStaNoMap.put(1072,1044);taskStaNoToRgvStaNoMap.put(1093,1094); |
| | | taskStaNoToRgvStaNoMap.put(1104,1100);taskStaNoToRgvStaNoMap.put(1102,1100);taskStaNoToRgvStaNoMap.put(1090,1090);taskStaNoToRgvStaNoMap.put(1002,1001);taskStaNoToRgvStaNoMap.put(1016,1018); |
| | | taskStaNoToRgvStaNoMap.put(1020,1019);taskStaNoToRgvStaNoMap.put(1024,1022);taskStaNoToRgvStaNoMap.put(1035,1034);taskStaNoToRgvStaNoMap.put(1040,1033);taskStaNoToRgvStaNoMap.put(1043,1041); |
| | | |
| | | canningLineRgvConnectionSiteList.add(1083);canningLineRgvConnectionSiteList.add(1086); |
| | | canningLineRgvConnectionSiteList.add(1089); |
| | | |
| | | } |
| | | |
| | | @Autowired |
| | |
| | | // 尺寸检测异常 |
| | | boolean back = false; |
| | | String errMsg = ""; |
| | | // if ((staProtocol.getSiteId() == 101 && devpThread.ioModeOf101 == IoModeType.PAKOUT_MODE) |
| | | // ||(staProtocol.getSiteId() == 103 && devpThread.ioModeOf103 == IoModeType.PAKOUT_MODE) |
| | | // ||(staProtocol.getSiteId() == 305 && devpThread.ioModeOf305 == IoModeType.PAKOUT_MODE)) { |
| | | // errMsg = "当前为出库模式"; |
| | | // back = true; |
| | | // } |
| | | // if (!back && staProtocol.isFrontErr()) { |
| | | if (staProtocol.isFrontErr()) { |
| | | if (staProtocol.isFrontErr()) { |
| | | errMsg = "前超限"; |
| | | back = true; |
| | | } |
| | |
| | | } |
| | | // 退回 |
| | | if (back) { |
| | | // News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg); |
| | | MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg)); |
| | | |
| | | if (!staProtocol.isLoading()){ |
| | |
| | | param.setIoType(1); |
| | | param.setSourceStaNo(inSta.getStaNo()); |
| | | param.setLocType1(locTypeDto.getLocType1()); |
| | | param.setLocArea(2);// 入空桶库标识 |
| | | param.setBucketType(staProtocol.getBucketType()); |
| | | param.setBucketCount(staProtocol.getBucketCount()); |
| | | param.setTailSupportFlag(staProtocol.isTailSupportFlag()); |
| | | param.setWantBucketFlag(devpThread.getWantBucketFlag()); |
| | | |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/rpc/pakin/loc/v1") |
| | |
| | | if (jsonObject.getInteger("code").equals(200)) { |
| | | StartupDto dto = jsonObject.getObject("data", StartupDto.class); |
| | | barcodeThread.setBarcode(""); |
| | | // 目标站点是直供罐装线 |
| | | if (dto.getStaNo() == 1079 || dto.getStaNo() == 1065 || dto.getStaNo() == 1072) { |
| | | devpThread.getWantBucketFlag().remove(dto.getCrnNo()); // 移除输送线要桶信号 |
| | | staProtocol.setClearBucketSignal(dto.getCrnNo()); // 清除要桶信号标识 |
| | | } |
| | | staProtocol.setWorkNo(dto.getWorkNo()); |
| | | staProtocol.setStaNo(RouteUtils.SouStaEnd(dto.getStaNo(),dto.getSourceStaNo())); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | |
| | | staProtocol.setStaNo(inSta.getBackSta().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | // |
| | | // if (ledThread != null) { |
| | | if (ledThread != null) { |
| | | String errorMsg = jsonObject.getString("msg"); |
| | | if (!Cools.isEmpty(errorMsg)) { |
| | | MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg)); |
| | | } |
| | | // } |
| | | // News.error(methodName + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response); |
| | | } |
| | | News.error(methodName + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response); |
| | | } |
| | | |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
| | | // News.infoNoLog(""+mark+" - 0"+" - 组托 ===》执行完成"); |
| | | |
| | | } |
| | | |
| | |
| | | if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(wrkMast.getWrkNo().shortValue()) |
| | | && crnProtocol.statusType == CrnStatusType.WAITING |
| | | && crnProtocol.forkPosType == CrnForkPosType.HOME) { |
| | | // News.error("堆垛机出库完成 - 开始执行"); |
| | | |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | |
| | | // 更新工作档状态为14失败 |
| | | |
| | | // 下发站点信息 |
| | | |
| | | if (wrkMast.getSourceStaNo() == 106 && wrkMast.getWrkSts() == 12L) { |
| | | wrkMast.setWrkSts(16L); |
| | | wrkMast.setCrnNo(1); |
| | | if (wrkMast.getStaNo() == 107) { |
| | | wrkMast.setSourceStaNo(107); |
| | | } else if(wrkMast.getStaNo()==104) { |
| | | wrkMast.setSourceStaNo(105); |
| | | } |
| | | staProtocol.setStaNo((short) 106); |
| | | |
| | | log.info("----------106移库标识---------"); |
| | | }else if(wrkMast.getSourceStaNo() == 105 && wrkMast.getWrkSts() == 16L) { |
| | | staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); |
| | | log.info("106移库完成,输送线发送105到104,源站为:" + staProtocol.getSiteId()); |
| | | wrkMast.setWrkSts(14L); |
| | | }else { |
| | | staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); |
| | | wrkMast.setWrkSts(14L); |
| | | } |
| | | |
| | | staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); |
| | | staProtocol.setWorkNo(wrkMast.getWrkNo()); |
| | | if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) { |
| | | continue; |
| | | } |
| | | wrkMast.setWrkSts(14L); |
| | | wrkMast.setCrnEndTime(new Date()); |
| | | if (wrkMastMapper.updateById(wrkMast) != 0) { |
| | | // 空桶出库完成库位组任务 |
| | | if (wrkMast.getSourceStaNo() == 1056) { |
| | | WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_sta_no", 1056).eq("wrk_sts", 12)); |
| | | if (wrkMast1 != null) { |
| | | StaProtocol staProtocol1 = devpThread.getStation().get(1057); |
| | | if (staProtocol1 != null) { |
| | | staProtocol1 = staProtocol1.clone(); |
| | | staProtocol1.setStaNo(wrkMast1.getStaNo().shortValue()); |
| | | staProtocol1.setWorkNo(wrkMast1.getWrkNo()); |
| | | if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol1))) { |
| | | log.error("空桶出库完成库位组任务推送输送线命令队列失败"); |
| | | } |
| | | wrkMast1.setWrkSts(14L); |
| | | wrkMast1.setCrnEndTime(new Date()); |
| | | if (wrkMastMapper.updateById(wrkMast1) != 0) { |
| | | } |
| | | } |
| | | } |
| | | } |
| | | // 复位堆垛机 |
| | | log.info("出库任务完成下发堆垛机复位,任务号:{}",wrkMast.getWrkNo()); |
| | | crnThread.setResetFlag(true); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 空子托盘入库 |
| | | */ |
| | | public synchronized void storeEmptyPlt() { |
| | | // 根据输送线plc遍历 |
| | | for (DevpSlave devp : slaveProperties.getDevp()) { |
| | | // 遍历入库口 |
| | | for (DevpSlave.Sta inSta : devp.getEmptyInSta()) { |
| | | // 获取条码扫描仪信息 |
| | | BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode()); |
| | | LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed()); |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); |
| | | if (staProtocol == null) { |
| | | continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | if (barcodeThread == null) { |
| | | continue; |
| | | } |
| | | String barcode = barcodeThread.getBarcode(); |
| | | // 尺寸检测异常 |
| | | boolean back = false; |
| | | String errMsg = ""; |
| | | if (staProtocol.isFrontErr()) { |
| | | errMsg = "前超限"; |
| | | back = true; |
| | | } |
| | | if (!back && staProtocol.isBackErr()) { |
| | | errMsg = "后超限"; |
| | | back = true; |
| | | } |
| | | if (!back && staProtocol.isHighErr()) { |
| | | errMsg = "高超限"; |
| | | back = true; |
| | | } |
| | | if (!back && staProtocol.isLeftErr()) { |
| | | errMsg = "左超限"; |
| | | back = true; |
| | | } |
| | | if (!back && staProtocol.isRightErr()) { |
| | | errMsg = "右超限"; |
| | | back = true; |
| | | } |
| | | if (!back && staProtocol.isWeightErr()) { |
| | | errMsg = "超重"; |
| | | back = true; |
| | | } |
| | | if (!back && staProtocol.isBarcodeErr()) { |
| | | errMsg = "扫码失败"; |
| | | back = true; |
| | | } |
| | | // 退回 |
| | | if (back) { |
| | | MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg)); |
| | | if (!staProtocol.isLoading()) { |
| | | continue; |
| | | } |
| | | if (!staProtocol.isPakMk()) { |
| | | continue; |
| | | } |
| | | staProtocol.setWorkNo(wrkNo); |
| | | News.info("{}空托入库回退:{},任务号:{}", inSta.getStaNo(), errMsg, wrkNo); |
| | | staProtocol.setStaNo(inSta.getBackSta().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发1:" + wrkNo + "," + inSta.getBackSta()); |
| | | return; |
| | | } |
| | | |
| | | // 判断是否满足入库条件 |
| | | if (staProtocol.isAutoing() |
| | | && staProtocol.isLoading() |
| | | && staProtocol.isInEnable() |
| | | && staProtocol.isEmptyMk() |
| | | && staProtocol.isPakMk()) { |
| | | if (Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "00000000".equals(barcode)) { |
| | | News.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode); |
| | | continue; |
| | | } |
| | | // 判断重复工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode); |
| | | if (wrkMast != null) { |
| | | continue; |
| | | } |
| | | try { |
| | | LocTypeDto locTypeDto = new LocTypeDto(staProtocol); |
| | | |
| | | SearchLocParam param = new SearchLocParam(); |
| | | param.setBarcode(barcode); |
| | | param.setIoType(10); |
| | | param.setSourceStaNo(inSta.getStaNo()); |
| | | param.setLocType1(locTypeDto.getLocType1()); |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/rpc/pakin/loc/v1") |
| | | .setJson(JSON.toJSONString(param)) |
| | | .build() |
| | | .doPost(); |
| | | log.info("空子托盘入库请求wms原始返回:" + response); |
| | | JSONObject jsonObject = JSON.parseObject(response); |
| | | if (jsonObject.getInteger("code").equals(200)) { |
| | | StartupDto dto = jsonObject.getObject("data", StartupDto.class); |
| | | barcodeThread.setBarcode(""); |
| | | staProtocol.setWorkNo(dto.getWorkNo()); |
| | | staProtocol.setStaNo(RouteUtils.SouStaEnd(dto.getStaNo(), dto.getSourceStaNo())); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发2:" + dto.getWorkNo() + "," + dto.getStaNo()); |
| | | if (!result) { |
| | | News.error(":更新plc站点信息失败"); |
| | | throw new CoolException("更新plc站点信息失败"); |
| | | } else { |
| | | ledThread.errorReset(); |
| | | } |
| | | } else { |
| | | staProtocol.setWorkNo(wrkNo); |
| | | staProtocol.setStaNo(inSta.getBackSta().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | String errorMsg = jsonObject.getString("msg"); |
| | | if (!Cools.isEmpty(errorMsg)) { |
| | | MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg)); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 入出库 ===>> 堆垛机入出库作业下发 |
| | | */ |
| | | public synchronized void crnIoExecute(Integer mark) { |
| | |
| | | News.error(""+mark+" - 1"+" - {}号堆垛机尚未在数据库进行维护!", crn.getId()); |
| | | continue; |
| | | } |
| | | |
| | | // //堆垛机回原点任务中 |
| | | // if(crnThread.isBackHpFlag()){ |
| | | // continue; |
| | | // } |
| | | |
| | | // 只有当堆垛机空闲 并且 无任务时才继续执行 |
| | | if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO |
| | |
| | | } |
| | | } |
| | | // 库位移转 |
| | | //mark - 3 - .... |
| | | this.locToLoc(crn, crnProtocol,mark); |
| | | // this.crnRebackHp(crnProtocol, crnThread); |
| | | |
| | | } |
| | | // News.infoNoLog(""+mark+" - 0"+" - 堆垛机入出库作业下发执行完成"); |
| | | } |
| | | |
| | | /** |
| | |
| | | News.error(""+mark+" - 1"+" - 16"+" - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); |
| | | } else { |
| | | |
| | | // long startTime = System.currentTimeMillis(); |
| | | // while ((System.currentTimeMillis() - startTime) < COMMAND_TIMEOUT) { |
| | | // |
| | | // if (true) { |
| | | // break; |
| | | // } |
| | | // |
| | | // try{ |
| | | // Thread.sleep(500); |
| | | // }catch(Exception ignore){} |
| | | // } |
| | | |
| | | // 修改工作档状态 2.设备上走 => 3.吊车入库中 |
| | | Date now = new Date(); |
| | | wrkMast.setWrkSts(3L); |
| | |
| | | wrkMast.setModiTime(now); |
| | | if (wrkMastMapper.updateById(wrkMast) == 0) { |
| | | News.error(""+mark+" - 1"+" - 17"+" - 修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo()); |
| | | } |
| | | // 如果是1049则有两个任务,需要把1050改成吊车入库中 |
| | | if (crnStn.getStaNo() == 1049) { |
| | | BasDevp basDevp = basDevpService.selectById(1050); |
| | | if (basDevp.getWrkNo() == 0) { |
| | | log.error("取货点为1049,但是1050任务号为0"); |
| | | } else { |
| | | WrkMast wrkMast1 = wrkMastMapper.selectById(basDevp.getWrkNo()); |
| | | wrkMast1.setWrkSts(3L); |
| | | wrkMast1.setCrnStrTime(now); |
| | | wrkMast1.setModiTime(now); |
| | | if (wrkMastMapper.updateById(wrkMast1) == 0) { |
| | | News.error(""+mark+" - 1"+" - 17"+" - 修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | News.warnNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发:执行出库"); |
| | | for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { |
| | | // 获取工作状态为11(生成出库ID)的出库工作档 |
| | | // WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(slave.getId(), crnStn.getStaNo()); |
| | | List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo()); |
| | | // todo 限制出库到305的工作档,如果配置outModel不等于Y,则跳过 |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | if (wrkMast == null) { |
| | | continue; |
| | |
| | | if (staProtocol == null) { |
| | | News.infoNoLog(""+mark+" - 2"+" - 3"+" - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol="+staProtocol); |
| | | break; |
| | | // continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | // // 入出库模式判断 |
| | | // if (devpThread.ioMode != IoModeType.PAKOUT_MODE) { continue; } |
| | | // if (wrkMast.getStaNo() == 204 && devpThread.ioModeOf2F != IoModeType.PAKOUT_MODE) { |
| | | // News.infoNoLog(""+mark+" - 2"+" - 4"+" - 入出库模式(此处出库方法,出库模式继续=="+devpThread.ioModeOf2F); |
| | | // continue; |
| | | // } |
| | | // 入出库模式判断 |
| | | // if ((staProtocol.getSiteId() == 101 && devpThread.ioModeOf101 != IoModeType.PAKOUT_MODE) |
| | | // || (staProtocol.getSiteId() == 103 && devpThread.ioModeOf103 != IoModeType.PAKOUT_MODE) |
| | | // || (staProtocol.getSiteId() == 305 && devpThread.ioModeOf305 != IoModeType.PAKOUT_MODE)) { |
| | | // continue; |
| | | // } |
| | | |
| | | // 查询站点详细信息 |
| | | BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); |
| | | if (staDetl == null) { |
| | | News.error(""+mark+" - 2"+" - 5"+" - 出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); |
| | | break; |
| | | // continue; |
| | | } |
| | | // 107无物才能出,其他有转运架才能出 |
| | | boolean loading = (staProtocol.getSiteId() == 107) != staProtocol.isLoading(); |
| | | |
| | | // 判断堆垛机出库站状态 |
| | | if (staProtocol.isAutoing() && loading && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") |
| | | && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | // log.warn("堆垛机出库命令下发:"+staProtocol.getWorkNo()+","+staProtocol.isOutEnable()+","+staProtocol.getSiteId()); |
| | | // 堆垛机控制过滤 |
| | | if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { |
| | | // continue; |
| | | break; |
| | | } |
| | | |
| | |
| | | // 已经存在吊车执行任务时,则过滤 |
| | | if (wrkMastMapper.selectWorking(slave.getId()) != null) { |
| | | break; |
| | | // return; |
| | | } |
| | | // if(crnStn.getStaNo() == 105) { |
| | | // continue; |
| | | // } |
| | | |
| | | WrkMast wrkMast1 = null; // 库位任务对应另一个库位任务 |
| | | LocMast locMast = null; // 库位对应另一个库位 |
| | | // 空桶库出库需要两个库位一起出 |
| | | if(slave.getId() == 4) { |
| | | Integer row = sourceSta.getRow1(); |
| | | // 获取对应库位 |
| | | String newLocNo = (row == 9 || row == 11 ? String.valueOf(row + 1) : row == 10 ? "09" : "11") + sourceSta.getLocNo().substring(2); |
| | | locMast = locMastService.selectById(newLocNo); |
| | | if (locMast == null) { |
| | | log.error("空桶出库寻找{}对应库位组库位号{}错误",sourceSta.getLocNo(),newLocNo); |
| | | break; |
| | | } |
| | | if (locMast.getLocSts().equals("R")) { |
| | | wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_loc_no", newLocNo)); |
| | | } else if(locMast.getLocSts().equals("F")) { |
| | | log.error("空桶出库寻找{}对应库位组库位号{}库位状态错误F",sourceSta.getLocNo(),newLocNo); |
| | | break; |
| | | } |
| | | } |
| | | if (wrkMast1 != null) { |
| | | // 判断给堆垛机发生命令的源库位 |
| | | if (sourceSta.getRow1() == 10 || sourceSta.getRow1() == 11) { |
| | | // 交换库位和任务 |
| | | LocMast t1 = sourceSta; |
| | | sourceSta = locMast; |
| | | locMast = t1; |
| | | WrkMast t2 = wrkMast1; |
| | | wrkMast1 = wrkMast; |
| | | wrkMast = t2; |
| | | } |
| | | } |
| | | |
| | | News.warnNoLog(""+mark+" - 2"+" - 12"+" - 命令下发 : 工作号={},源排={},源列={},源层={},目标排={},目标列={},目标层={}",wrkMast.getWrkNo().shortValue() |
| | | ,sourceSta.getRow1().shortValue(),sourceSta.getBay1().shortValue(),sourceSta.getLev1().shortValue() |
| | |
| | | wrkMast.setModiTime(now); |
| | | if (wrkMastMapper.updateById(wrkMast) == 0) { |
| | | News.error(""+mark+" - 2"+" - 14"+" - 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo()); |
| | | } |
| | | // 修改空桶库对应库位任务状态 |
| | | if (wrkMast1 != null) { |
| | | wrkMast1.setWrkSts(12L); |
| | | wrkMast1.setCrnStrTime(now); |
| | | wrkMast1.setModiTime(now); |
| | | if (wrkMastMapper.updateById(wrkMast1) == 0) { |
| | | News.error(""+mark+" - 2"+" - 14"+" - 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo()); |
| | | } |
| | | } |
| | | break; |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * 生成 空子/母托盘任务 |
| | | * 生成 空子/母托盘出库任务 |
| | | */ |
| | | public synchronized void generateEmptyPalletStoreWrk() { |
| | | Integer devpId = 1; |
| | |
| | | // 自动&无物&可出 |
| | | if (staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.isOutEnable()) { |
| | | // 判断是否已经生成任务 |
| | | if (wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type", 110).eq("sta_no", entry.getKey())).size() > 0) { |
| | | if (wrkMastService.selectList(new EntityWrapper<WrkMast>().in("io_type", 111,112).eq("sta_no", entry.getKey())).size() > 0) { |
| | | log.warn("{}站点已经存在空板出库任务", entry.getKey()); |
| | | continue; |
| | | } |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 托盘到达rgv接驳站点,更改工作档状态为9.呼叫RGV,环穿程序调度rgv |
| | | */ |
| | | public synchronized void callRgv() { |
| | | // 输送线plc编号 |
| | | Integer devpPlcId = 1; |
| | | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devpPlcId); |
| | | for (Integer site : rgvConnectionSiteList) { |
| | | StaProtocol staProtocol = devpThread.getStation().get(site); |
| | | if (staProtocol == null) { |
| | | continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() != 0) { |
| | | // 查询工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo()); |
| | | if ((wrkMast.getWrkSts() == 2 || wrkMast.getWrkSts() == 15) && wrkMast.getRgvNo() == null) { |
| | | wrkMast.setRgvNo(0); |
| | | wrkMast.setRgvSstaNo(site); |
| | | wrkMast.setRgvDstaNo(taskStaNoToRgvStaNoMap.get(wrkMast.getStaNo())); |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMastMapper.updateById(wrkMast); |
| | | log.info("任务号:{}已到达rgv接驳位,准备呼叫rgv...", wrkMast.getWrkNo()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 母托盘叠满自动入库 |
| | | */ |
| | | public synchronized void autoEmptyIn() { |
| | | |
| | | for (DevpSlave devp : slaveProperties.getDevp()) { |
| | | // 遍历空板入库口 |
| | | for (Integer site : stackingSite) { |
| | | // 获取空板入库站信息 |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(site); |
| | | if (staProtocol == null) { |
| | | continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | if (!staProtocol.isLoading()){ |
| | | continue; |
| | | } |
| | | |
| | | // 站点条件判断 |
| | | if (staProtocol.isAutoing() |
| | | && staProtocol.isLoading() |
| | | && staProtocol.isInEnable() |
| | | && staProtocol.isEmptyMk() |
| | | && staProtocol.isPakMk() |
| | | && staProtocol.getWorkNo() == 0 |
| | | ) { |
| | | |
| | | try { |
| | | LocTypeDto locTypeDto = new LocTypeDto(staProtocol); |
| | | |
| | | SearchLocParam param = new SearchLocParam(); |
| | | param.setIoType(10); |
| | | param.setSourceStaNo(site); |
| | | param.setLocType1(locTypeDto.getLocType1()); |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/rpc/pakin/loc/v1") |
| | | .setJson(JSON.toJSONString(param)) |
| | | .build() |
| | | .doPost(); |
| | | JSONObject jsonObject = JSON.parseObject(response); |
| | | if (jsonObject.getInteger("code").equals(200)) { |
| | | StartupDto dto = jsonObject.getObject("data", StartupDto.class); |
| | | // 更新站点信息 且 下发plc命令 |
| | | staProtocol.setWorkNo(dto.getWorkNo()); |
| | | 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()); |
| | | if (!result) { |
| | | News.errorNoLog(""+" - 1"+" - 更新plc站点信息失败"); |
| | | throw new CoolException("更新plc站点信息失败"); |
| | | } |
| | | } else { |
| | | News.error(" - 3"+" - 母托叠盘入库请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | } |
| | | } else { |
| | | News.errorNoLog(" - 母托叠盘入库站点信息不符合入库条件!!!"+" 自动信号:"+staProtocol.isAutoing()+"、可入信号:" + staProtocol.isInEnable() |
| | | +"、空板信号:"+ staProtocol.isEmptyMk()+"、工作号:" + staProtocol.getWorkNo() |
| | | +"、锁定标记"+ staProtocol.isPakMk()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 空桶罐装完成到达罐装线rgv口 完成直供罐装线任务和空桶出库任务,创建成品桶入库任务 |
| | | */ |
| | | public synchronized void canningLineTaskFinish() { |
| | | // 输送线plc编号 |
| | | Integer devpPlcId = 1; |
| | | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devpPlcId); |
| | | for (Integer site : canningLineRgvConnectionSiteList) { |
| | | StaProtocol staProtocol = devpThread.getStation().get(site); |
| | | if (staProtocol == null) { |
| | | continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.getWorkNo() != 0) { |
| | | // 查询工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo()); |
| | | if (wrkMast.getIoType() != 1) { |
| | | try { |
| | | CanningLineInLocParam param = new CanningLineInLocParam(); |
| | | param.setWrkNo(wrkMast.getWrkNo()); |
| | | param.setSourceStaNo(site); |
| | | |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/rpc/pakin/CanningLine/loc/v1") |
| | | .setJson(JSON.toJSONString(param)) |
| | | .build() |
| | | .doPost(); |
| | | log.info("罐装线入库请求wms原始返回:" + response); |
| | | JSONObject jsonObject = JSON.parseObject(response); |
| | | if (jsonObject.getInteger("code").equals(200)) { |
| | | StartupDto dto = jsonObject.getObject("data", StartupDto.class); |
| | | staProtocol.setWorkNo(dto.getWorkNo()); |
| | | staProtocol.setStaNo(RouteUtils.SouStaEnd(dto.getStaNo(), dto.getSourceStaNo())); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | // 这里下发命令后,输送线要把该站点可入信号去除 |
| | | boolean result = MessageQueue.offer(SlaveType.Devp, devpPlcId, new Task(2, staProtocol)); |
| | | if (result) { |
| | | log.info("罐装线入库推送输送线命令成功:" + dto.getWorkNo() + "," + site + "," + dto.getStaNo()); |
| | | News.info("罐装线入库推送输送线命令成功:" + dto.getWorkNo() + "," + site + "," + dto.getStaNo()); |
| | | } else { |
| | | log.error("罐装线入库推送输送线命令失败:" + dto.getWorkNo() + "," + site + "," + dto.getStaNo()); |
| | | News.error("罐装线入库推送输送线命令失败:" + dto.getWorkNo() + "," + site + "," + dto.getStaNo()); |
| | | throw new CoolException("罐装线入库推送输送线命令失败:" + site); |
| | | } |
| | | } else { |
| | | log.error("罐装线入库请求接口异常,url:{},request:{},response:{}", wmsUrl + "/rpc/pakin/CanningLine/loc/v1", JSON.toJSONString(param), response); |
| | | News.error("罐装线入库请求接口异常!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/CanningLine/loc/v1", JSON.toJSONString(param), response); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |