| | |
| | | private BasArmMastService basArmMastService; |
| | | @Autowired |
| | | private ApiLogService apiLogService; |
| | | @Autowired |
| | | private BasDevpOptService basDevpOptService; |
| | | |
| | | @Value("${wms.url}") |
| | | private String wmsUrl; |
| | |
| | | private Integer inventoryNumber; |
| | | |
| | | public Integer wrkNo = 10001; |
| | | public static final List<Integer> LEFT_POSITION = Arrays.asList(1018,2018); |
| | | public static final List<Integer> LEFT_POSITION = Arrays.asList(1004,1014,1018,1028,1035,2006,2012,2018,2024,2030); |
| | | /** |
| | | * 组托 |
| | | * 入库站,根据条码扫描生成入库工作档,工作状态 2 |
| | |
| | | MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg)); |
| | | } |
| | | staProtocol.setWorkNo(wrkNo); |
| | | staProtocol.setErrCode(errMsg); |
| | | News.info("异常判断{}入库回退:{},任务号:{}", inSta.getStaNo(), errMsg,wrkNo); |
| | | wrkNo++; |
| | | staProtocol.setStaNo(inSta.getBackSta().shortValue()); |
| | |
| | | MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg)); |
| | | } |
| | | staProtocol.setWorkNo(wrkNo); |
| | | staProtocol.setErrCode(errMsg); |
| | | News.info("条码判断{}入库回退:{},任务号:{}", inSta.getStaNo(), errMsg,wrkNo); |
| | | wrkNo++; |
| | | staProtocol.setStaNo(inSta.getBackSta().shortValue()); |
| | |
| | | } |
| | | try { |
| | | LocTypeDto locTypeDto = new LocTypeDto(staProtocol); |
| | | |
| | | SearchLocParam param = new SearchLocParam(); |
| | | param.setBarcode(barcode); |
| | | param.setIoType(1); |
| | |
| | | staProtocol.setWorkNo(wrkNo); |
| | | staProtocol.setStaNo(inSta.getBackSta().shortValue()); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | switch (jsonObject.getInteger("code")){ |
| | | case 700: staProtocol.setErrCode("未组托");break; |
| | | case 500: staProtocol.setErrCode("工作档/库存条码数据已存在");break; |
| | | } |
| | | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | News.info("任务下发判断{}入库回退:{},错误编号{},任务号:{}", inSta.getStaNo(), errMsg,jsonObject.getInteger("code"),wrkNo); |
| | | wrkNo++; |
| | |
| | | staProtocol.setStaNo((short) (pickSta.getStaNo().shortValue())); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); |
| | | log.error("输送线下发4:"+9996+","+(pickSta.getStaNo().shortValue()-(short)1)); |
| | | //LED |
| | | LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed()); |
| | | // led 异常显示 |
| | |
| | | staProtocol2 = staProtocol2.clone(); |
| | | } |
| | | SiemensDevpThread devpThread2 = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 2); |
| | | StaProtocol staProtocol4004 = devpThread2.getStation().get(4004); |
| | | if (staProtocol4004 == null) { |
| | | News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol4004); |
| | | break; |
| | | } else { |
| | | staProtocol4004 = staProtocol4004.clone(); |
| | | } |
| | | StaProtocol staProtocol3 = devpThread2.getStation().get(2016); |
| | | if (staProtocol3 == null) { |
| | | News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol2); |
| | |
| | | if (wrkMastMapper.selectWorking(slave.getId()) != null) { |
| | | break; |
| | | // return; |
| | | } |
| | | if(staProtocol4004.isLoading()){ |
| | | continue; |
| | | } |
| | | // 1.堆垛机开始移动 |
| | | CrnCommand crnCommand = new CrnCommand(); |
| | |
| | | break; |
| | | // return; |
| | | } |
| | | if(staProtocol4004.isLoading()){ |
| | | continue; |
| | | } |
| | | // 1.堆垛机开始移动 |
| | | CrnCommand crnCommand = new CrnCommand(); |
| | | crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 |
| | |
| | | } |
| | | } |
| | | if (slave.getId() == 3 && wrkMast9996 != null) { |
| | | SiemensDevpThread devpThread1 = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); |
| | | |
| | | SiemensDevpThread devpThread2 = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 2); |
| | | StaProtocol staProtocol4001 = devpThread2.getStation().get(4001); |
| | | if (staProtocol4001 == null) { |
| | |
| | | break; |
| | | } else { |
| | | staProtocol4001 = staProtocol4001.clone(); |
| | | } |
| | | StaProtocol staProtocol2013 = devpThread2.getStation().get(2013); |
| | | if (staProtocol2013 == null) { |
| | | News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol2013); |
| | | break; |
| | | } else { |
| | | staProtocol2013 = staProtocol2013.clone(); |
| | | } |
| | | StaProtocol staProtocol1019 = devpThread1.getStation().get(1019); |
| | | if (staProtocol1019 == null) { |
| | | News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol1019); |
| | | break; |
| | | } else { |
| | | staProtocol1019 = staProtocol1019.clone(); |
| | | } |
| | | BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); |
| | | if (staDetl == null) { |
| | |
| | | if (wrkMastMapper.selectWorking(slave.getId()) != null) { |
| | | break; |
| | | // return; |
| | | } |
| | | if(staProtocol1019.isLoading() && wrkMast9996.getStaNo() < 2000){ |
| | | continue; |
| | | } |
| | | if(staProtocol2013.isLoading() && wrkMast9996.getStaNo() > 2000){ |
| | | continue; |
| | | } |
| | | // 1.堆垛机开始移动 |
| | | CrnCommand crnCommand = new CrnCommand(); |
| | |
| | | BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm()); |
| | | String errName = crnError == null ? String.valueOf(crnProtocol.getAlarm()) : crnError.getErrName(); |
| | | BasErrLog basErrLog = new BasErrLog( |
| | | null, // 编号 |
| | | crnProtocol.getUuid(), // 编号 |
| | | wrkMast.getWrkNo(), // 工作号 |
| | | now, // 发生时间 |
| | | null, // 结束时间 |
| | |
| | | BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm()); |
| | | String errName = crnError == null ? String.valueOf(crnProtocol.getAlarm()) : crnError.getErrName(); |
| | | BasErrLog basErrLog = new BasErrLog( |
| | | null, // 编号 |
| | | crnProtocol.getUuid(), // 编号 |
| | | null, // 工作号 |
| | | now, // 发生时间 |
| | | null, // 结束时间 |
| | |
| | | WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo()); |
| | | if (null == wrkMast) { |
| | | if(staProtocol.getWorkNo() > 9999){ //异常退出 |
| | | MessageQueue.offer(SlaveType.Led, 2, new Task(3, "异常退出")); |
| | | String err = basDevpOptService.getErr(staProtocol.getWorkNo()); |
| | | MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, err)); |
| | | } |
| | | continue; |
| | | } |
| | |
| | | break; |
| | | case 10: |
| | | ledCommand.setTitle("空板入库"); |
| | | break; |
| | | case 12: |
| | | ledCommand.setTitle("物料衔接"); |
| | | break; |
| | | case 57: |
| | | ledCommand.setTitle("盘点再入库"); |
| | | break; |
| | | case 101: |
| | | ledCommand.setTitle("全板出库"); |
| | |
| | | ledCommand.setSourceLocNo(wrkMast.getSourceLocNo()); |
| | | ledCommand.setStaNo(wrkMast.getStaNo()); |
| | | ledCommand.setBarcode(wrkMast.getBarcode()); |
| | | if(wrkMast.getIoType() == 12){ |
| | | List<WrkDetl> wrkDetls = wrkDetlService.findByBarcode(wrkMast.getBarcode()); |
| | | wrkDetls.forEach(wrkDetl -> { |
| | | Double total = 0.0; |
| | | EntityWrapper<LocDetl> wrapper = new EntityWrapper<>(); |
| | | LocDetl locDetl = locDetlService.selectOne(wrapper.eq("zpallet", wrkDetl.getZpallet()).eq("matnr", wrkDetl.getMatnr())); |
| | | if (Cools.isEmpty(locDetl)) { |
| | | total = wrkDetl.getAnfme(); |
| | | } else { |
| | | total = locDetl.getAnfme(); |
| | | } |
| | | ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total)); |
| | | }); |
| | | } |
| | | if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) { |
| | | List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo()); |
| | | |
| | |
| | | // 命令集合 |
| | | boolean reset = true; |
| | | for (Integer staNo : led.getStaArr()) { |
| | | // System.out.println("staArr = " + staNo); |
| | | |
| | | // 获取叉车站点 |
| | | StaProtocol staProtocol = devpThread.getStation().get(staNo); |
| | | if (staProtocol == null) { continue; } |
| | |
| | | // 获取RGV信息 |
| | | RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId()); |
| | | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); |
| | | if (rgvProtocol == null) { |
| | | continue; |
| | | } |
| | | if (rgvProtocol.getStatusType1() != RgvStatusType.IDLE && rgvProtocol.getModeType() != RgvModeType.AUTO) { |
| | | continue; |
| | | } |
| | |
| | | continue; |
| | | } |
| | | |
| | | if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")) { |
| | | if (staProtocol.isAutoing() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")) { |
| | | flag = true; |
| | | } |
| | | if (!flag) { |
| | |
| | | basRgv.setPakAll("1"); |
| | | basRgvService.updateById(basRgv); |
| | | rgvThread.setPakMk(true); |
| | | |
| | | } |
| | | // List<WrkMastSta> wrkMastStaPakingNum = wrkMastStaService.selectPakingWrkNum(basRgv.getRgvNo()); |
| | | // if(wrkMastStaPakingNum.size() <1){ |
| | |
| | | // 获取堆垛机信息 |
| | | RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId()); |
| | | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); |
| | | |
| | | if (rgvProtocol == null) { |
| | | continue; |
| | | } |
| | |
| | | if(rgvProtocol.getStatusType1() == RgvStatusType.WORKING){ |
| | | rgvThread.setPaking(true); |
| | | } |
| | | if(rgvProtocol.getTaskNo1() == 0 && rgvProtocol.getTaskNo2() == 0 && rgvProtocol.getStatusType1() == RgvStatusType.IDLE){ |
| | | rgvThread.setPaking(true); |
| | | } |
| | | if(rgvProtocol.isLoaded1ing() && rgvProtocol.isLoaded2ing()){ |
| | | basRgv.setPakAll("1"); |
| | | basRgvService.updateById(basRgv); |
| | |
| | | // 只有当RGV空闲 并且 无任务时才继续执行 |
| | | if (rgvProtocol.getStatusType1() == RgvStatusType.IDLE && |
| | | rgvProtocol.getModeType() == RgvModeType.AUTO && rgvThread.isPakMk() |
| | | && basRgv.getPakToCrn().equals("1") && rgvThread.isPaking()) { |
| | | && rgvThread.isPaking()) { |
| | | News.warnNoLog(""+mark+" - 0"+" - 开始执行RGV入出库作业下发"); |
| | | // 如果最近一次是入库模式 |
| | | // rgvRunWrkMastInTest(); |
| | |
| | | |
| | | if(wrkMastSta3 != null ){ |
| | | List<WrkMastSta> wrkMastStaPaking = wrkMastStaService.selectPakingWrk(wrkMastSta3.getStaStart()); |
| | | if(wrkMastStaPaking.size() < 1 ){//已有标记不再标记 |
| | | if(wrkMastStaPaking.size() < 1 && !wrkMastSta3.getWrkNo().equals(wrkMastSta.getWrkNo())){//已有标记不再标记 |
| | | wrkMastSta3.setMk(1); |
| | | basRgv.setPakAll("0"); |
| | | basRgvService.updateById(basRgv); |
| | |
| | | basRgvMap.setNowRoute(rgvProtocol.getRgvNo() == 1?rgvProtocol.getRgvPosI1():rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 |
| | | basRgvMapService.updateById(basRgvMap); |
| | | WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档 |
| | | if( null == wrkMastSta ) { |
| | | News.infoNoLog("" + mark + " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo()); |
| | | continue; |
| | | } |
| | | WrkMastSta wrkMastSta1 = wrkMastStaMapper.selectByWrkNo( rgvProtocol.getTaskNo1()); |
| | | if(basRgv.getPakToCrn().equals("0")){ |
| | | wrkMastSta = wrkMastStaMapper.selectNoInterfereCrn(route, route, Long.valueOf(staProtocol.getWorkNo()));//处理接驳任务时,连续只取接驳任务 |
| | | } |
| | | if( null == wrkMastSta ) { |
| | | News.infoNoLog("" + mark + " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo()); |
| | | continue; |
| | | } |
| | | boolean result = false; |
| | | if(wrkMastSta1!= null && rgvProtocol.getRgvNo() == 1){ //距离计算 2楼单入库口不需要计算 |
| | |
| | | |
| | | continue; |
| | | } |
| | | if(wrkMastSta != null &&LEFT_POSITION.contains(wrkMastSta.getStaEnd())){ |
| | | StaProtocol staProtocolSta = devpThread.getStation().get(wrkMastSta.getStaEnd()); |
| | | if (staProtocolSta == null) { |
| | | News.infoNoLog("" + mark + " - 1" + " - 1" + " - Rgv入库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol); |
| | | continue; |
| | | } else { |
| | | staProtocolSta = staProtocolSta.clone(); |
| | | } |
| | | if(staProtocolSta.isLoading()){ |
| | | continue; |
| | | } |
| | | } |
| | | wrkMastSta.setWorkSta(wrkMastSta1 !=null ? 2 : 1);//若1号工位有任务给2号工位 |
| | | wrkMastSta.setRgvNo((int) rgvProtocol.getRgvNo()); |
| | | boolean sign = false; |
| | | |
| | | sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发 |
| | | if (sign){ |
| | | if(wrkMastSta.getMk() == 1){//若已执行 |
| | | basRgv.setPakAll("1"); |
| | | basRgvService.updateById(basRgv); |
| | | } |
| | | if(LEFT_POSITION.contains(wrkMastSta.getStaEnd())){ |
| | | basRgv.setPakToCrn("0"); |
| | | basRgvService.updateById(basRgv); |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | if(wrkMastSta3 != null ){ |
| | | if(wrkMastSta3 != null && !wrkMastSta3.getWrkNo().equals(wrkMastSta.getWrkNo())){ |
| | | List<WrkMastSta> wrkMastStaPaking = wrkMastStaService.selectPakingWrk(wrkMastSta3.getStaStart()); |
| | | if(wrkMastStaPaking.size() < 1){ |
| | | wrkMastSta3.setMk(1); |
| | |
| | | basRgvService.updateById(basRgv); |
| | | try{ |
| | | wrkMastStaMapper.updateById(wrkMastSta3); |
| | | log.error("锁定相隔站点任务"); |
| | | log.error("锁定相隔站点任务:"+ wrkMastSta3.getWrkNo()); |
| | | }catch (Exception e){ |
| | | log.error("锁定相隔站点任务失败"); |
| | | } |
| | |
| | | basRgvService.updateById(basRgv); |
| | | |
| | | rgvThread.setPaking(false); |
| | | // rgvThread.setPakIn(false);//入库不允许 |
| | | try{ |
| | | wrkMastSta.setWrkSts(1); |
| | | wrkMastStaMapper.updateById(wrkMastSta); |
| | |
| | | //arm任务完成自动组托 |
| | | ReturnT<String> result = new PostMesDataUtils().postMesData("arm任务完成自动组托",wmsUrl, wmsComb, combParam); |
| | | if (result.getCode()==200){ |
| | | basArmMastService.updateArmMastStatus(basArm.getArmNo(),basArm.getSortingLineSou(),3,4); |
| | | basArmMastService.updateArmMastStatus(basArm.getArmNo(),basArm.getSortingLineSou(),3,5); |
| | | } else { |
| | | armTaskAssignmentCallApiLogSave(staProtocol, "自动组托失败", staProtocol.getSiteId()+"码垛位置,===》自动组托失败,等待重试", false); |
| | | // log.error("机械臂抓取任务完成:"+JSON.toJSON(basArmMastList)+"===》自动组托失败,等待重试"); |
| | |
| | | new EntityWrapper<BasArmMast>() |
| | | .eq("arm_no", basArm.getArmNo()) |
| | | .eq("sorting_line", basArm.getSortingLineSou()) |
| | | .eq("sku", basArmMast.getSku()) |
| | | .eq("matnr", basArmMast.getMatnr()) |
| | | .eq("order_no", basArmMast.getOrderNo()) |
| | | .eq("binding_tags", basArmMast.getBindingTags()) |
| | | ); |
| | |
| | | .eq("status", 2) |
| | | .eq("binding_tags", basArmMast.getBindingTags()) |
| | | ); |
| | | Double anfmeSignOne = basArmMastService.selectBasArmMastSignValue(basArmMastOne.getOrderNo(), basArmMastOne.getSku(),basArmMastOne.getBindingTags()); |
| | | Double anfmeSignOne = basArmMastService.selectBasArmMastSignValue(basArmMastOne.getOrderNo(), basArmMastOne.getMatnr(),basArmMastOne.getBindingTags()); |
| | | |
| | | if (anfmeSignOne>1D){ |
| | | armTaskAssignmentCallApiLogSave(staProtocol, "条码数据已存在!!!", staProtocol.getSiteId()+"码垛位置,条码数据正在自动组托===>>" + barcode, false); |
| | |
| | | |
| | | } |
| | | } |
| | | OrderDetlValueResultUtil orderDetlValueResultUtil = basArmMastService.selectOrderDetlValue(basArmMast.getOrderNo(), basArmMast.getSku()); |
| | | OrderDetlValueResultUtil orderDetlValueResultUtil = basArmMastService.selectOrderDetlValue(basArmMast.getOrderNo(), basArmMast.getMatnr()); |
| | | |
| | | if (Cools.isEmpty(orderDetlValueResultUtil)){ |
| | | continue; |
| | | } |
| | | Double anfmeSign = basArmMastService.selectBasArmMastSignValue(basArmMast.getOrderNo(), basArmMast.getSku(),basArmMast.getBindingTags()); |
| | | Double anfmeSign = basArmMastService.selectBasArmMastSignValue(basArmMast.getOrderNo(), basArmMast.getMatnr(),basArmMast.getBindingTags()); |
| | | orderDetlValueResultUtil.setAnfme(anfmeSign); |
| | | //订单下发 |
| | | try{ |
| | |
| | | // News.info("{}号站点存在任务执行中,请等待任务执行完毕:{}", outStaAgv.getStaNo(), barcode); |
| | | continue; |
| | | } |
| | | |
| | | if(barcode.equals("0")){ |
| | | continue; |
| | | } |
| | | List<LocMast> locMastList = locMastService.selectList(new EntityWrapper<LocMast>().eq("barcode", barcode)); |
| | | if (!locMastList.isEmpty()) { |
| | | News.info("{}号站点条码信息重复:{}", outStaAgv.getStaNo(), barcode); |
| | |
| | | } |
| | | } |
| | | |
| | | /* |
| | | * agv任务生成 异常送到入库口 |
| | | * */ |
| | | public synchronized void agvTaskCreateException() { |
| | | // 根据输送线plc遍历 |
| | | for (DevpSlave devp : slaveProperties.getDevp()) { |
| | | Integer outStaAgv = 1041; |
| | | // 获取入库站信息 |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(outStaAgv); |
| | | if (staProtocol == null) { |
| | | continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | // 判断是否满足入库条件 |
| | | if (!staProtocol.isLoading()){ |
| | | continue; |
| | | } |
| | | |
| | | if (staProtocol.isAutoing() && staProtocol.getWorkNo() > 10000) { |
| | | |
| | | // 判断重复工作档 |
| | | List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("sta_no", 1037)); |
| | | if (!basAgvMastList.isEmpty()) { |
| | | News.info("{}号站点存在任务执行中,等待任务执行完毕!!!", outStaAgv); |
| | | continue; |
| | | } |
| | | // 任务生成区 -------------------------------------------------------------------------- |
| | | |
| | | BasAgvMast basAgvMast = new BasAgvMast(); |
| | | try { |
| | | basAgvMast.setTaskNo(staProtocol.getWorkNo()); |
| | | basAgvMast.setSourceStaNo(1041); |
| | | basAgvMast.setStaNo(1037); |
| | | basAgvMast.setDevpId(devp.getId()); |
| | | basAgvMast.setIoType(3);//输送==》输送线站点 3 |
| | | basAgvMastService.insert(basAgvMast); |
| | | break; |
| | | } catch (Exception e) { |
| | | News.error(JSON.toJSONString(e.getMessage())); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /* |
| | | * agv任务下发:AGV库位==》输送线站点 |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /* |
| | | * agv任务下发:AGV库位==》AGV库位 |
| | | * */ |