| | |
| | | import com.zy.common.utils.News; |
| | | import com.zy.core.CrnThread; |
| | | import com.zy.core.DevpThread; |
| | | import com.zy.core.RgvThread; |
| | | import com.zy.core.cache.MessageQueue; |
| | | import com.zy.core.cache.SlaveConnection; |
| | | import com.zy.core.enums.*; |
| | |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.transaction.interceptor.TransactionAspectSupport; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | private BasErrLogService basErrLogService; |
| | | @Autowired |
| | | private BasCrnErrorMapper basCrnErrorMapper; |
| | | @Autowired |
| | | private EmptyBarrelInService emptyBarrelInService; |
| | | |
| | | @Value("${wms.url}") |
| | | private String wmsUrl; |
| | | |
| | | public int workNo = 9900; |
| | | |
| | | /** |
| | | * 组托 |
| | |
| | | */ |
| | | public synchronized void crnStnToOutStn() { |
| | | for (CrnSlave crnSlave : slaveProperties.getCrn()) { |
| | | if (crnSlave.getId() ==5){ |
| | | continue; |
| | | } |
| | | // 遍历堆垛机出库站 |
| | | for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) { |
| | | // 获取堆垛机出库站信息 |
| | |
| | | */ |
| | | public synchronized void crnIoExecute() { |
| | | for (CrnSlave crn : slaveProperties.getCrn()) { |
| | | if (crn.getId() == 5){ |
| | | continue; |
| | | } |
| | | // 获取堆垛机信息 |
| | | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); |
| | | CrnProtocol crnProtocol = crnThread.getCrnProtocol(); |
| | |
| | | if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO |
| | | && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) { |
| | | |
| | | Crn5InTaskSta(crnSlave,crnProtocol); |
| | | // Crn5InTaskSta(crnSlave,crnProtocol); |
| | | |
| | | // 如果最近一次是入库模式 |
| | | if (crnProtocol.getLastIo().equals("I")) { |
| | | if (basCrnp.getInEnable().equals("Y")) { |
| | | this.Crn5InTaskSta(crnSlave,crnProtocol); |
| | | crnProtocol.setLastIo("O"); |
| | | } else if (basCrnp.getOutEnable().equals("Y")) { |
| | | this.locToCrn5Stn(crnSlave, crnProtocol); // 出库 |
| | | crnProtocol.setLastIo("I"); |
| | | } |
| | | } |
| | | // 如果最近一次是出库模式 |
| | | else if (crnProtocol.getLastIo().equals("O")) { |
| | | if (basCrnp.getOutEnable().equals("Y")) { |
| | | this.locToCrn5Stn(crnSlave, crnProtocol); // 出库 |
| | | crnProtocol.setLastIo("I"); |
| | | } else if (basCrnp.getInEnable().equals("Y")) { |
| | | |
| | | this.Crn5InTaskSta(crnSlave,crnProtocol); |
| | | crnProtocol.setLastIo("O"); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | |
| | | public synchronized void crn5StnToOutStn() { |
| | | for (CrnSlave crnSlave : slaveProperties.getCrn()) { |
| | | if (crnSlave.getId() != 5){ |
| | | continue; |
| | | } |
| | | // 遍历堆垛机出库站 |
| | | for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) { |
| | | // 获取堆垛机出库站信息 |
| | | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); |
| | | if (staProtocol == null) { |
| | | continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()) { |
| | | // 查询工作档 |
| | | WrkMast wrkMast = wrkMastMapper.selectPakOutStep2(crnStn.getStaNo()); |
| | | if (wrkMast == null) { |
| | | continue; |
| | | } |
| | | // 判断工作档条件 |
| | | if (wrkMast.getIoType() < 100 || wrkMast.getStaNo() == null || wrkMast.getSourceStaNo() == null) { |
| | | continue; |
| | | } |
| | | // 判断吊车是否实际已完成,且电脑状态在move中,以备电脑进行更新工作档 |
| | | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkMast.getCrnNo()); |
| | | CrnProtocol crnProtocol = crnThread.getCrnProtocol(); |
| | | if (crnProtocol.statusType == CrnStatusType.FETCHING || crnProtocol.statusType == CrnStatusType.PUTTING) { |
| | | // 移动中 |
| | | continue; |
| | | } |
| | | // 判断堆垛机状态等待确认 |
| | | if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(wrkMast.getWrkNo().shortValue()) |
| | | && crnProtocol.statusType == CrnStatusType.WAITING |
| | | && crnProtocol.forkPosType == CrnForkPosType.HOME) { |
| | | |
| | | // 更新工作档状态为14 |
| | | wrkMast.setWrkSts(14L); |
| | | |
| | | wrkMast.setCrnEndTime(new Date()); |
| | | if (wrkMastMapper.updateById(wrkMast) != 0) { |
| | | // 复位堆垛机 |
| | | crnThread.setResetFlag(true); |
| | | } else { |
| | | log.error("更新工作档的工作状态为14失败!!! [工作号:{}]", wrkMast.getWrkNo()); |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | public synchronized void locToCrn5Stn(CrnSlave slave, CrnProtocol crnProtocol) { |
| | | 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()); |
| | | // 获取工作状态为14的工作档 |
| | | WrkMast wrkMast1 = wrkMastMapper.selectPakOutStep14(slave.getId(), crnStn.getStaNo()); |
| | | if ( wrkMast1 !=null) { |
| | | continue; |
| | | } |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | if (wrkMast == null) { |
| | | continue; |
| | | } |
| | | // 工作档状态判断 |
| | | if (wrkMast.getIoType() < 100 || wrkMast.getSourceStaNo() == null) { |
| | | log.error("查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getIoType()); |
| | | continue; |
| | | } |
| | | // 获取源库位信息 |
| | | LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo()); |
| | | if (!locMast.getLocSts().equals("R") && !locMast.getLocSts().equals("P")) { |
| | | log.error("出库操作库位状态不符合--状态, 库位号={},库位状态={}", wrkMast.getLocNo(), locMast.getLocSts()); |
| | | continue; |
| | | } |
| | | // 获取堆垛机出库站信息 |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); |
| | | if (staProtocol == null) { |
| | | break; |
| | | // continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | // 查询站点详细信息 |
| | | BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); |
| | | if (staDetl == null) { |
| | | log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); |
| | | break; |
| | | // continue; |
| | | } |
| | | // 判断堆垛机出库站状态 |
| | | if (staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.isOutEnable()) { |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | |
| | | // 堆垛机控制过滤 |
| | | if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { |
| | | // continue; |
| | | break; |
| | | } |
| | | |
| | | |
| | | // 已经存在吊车执行任务时,则过滤 |
| | | if (wrkMastMapper.selectWorking(slave.getId()) != null) { |
| | | break; |
| | | // return; |
| | | } |
| | | |
| | | // 1.堆垛机开始移动 |
| | | CrnCommand crnCommand = new CrnCommand(); |
| | | crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 |
| | | crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 |
| | | crnCommand.setAckFinish((short) 0); // 任务完成确认位 |
| | | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 |
| | | crnCommand.setSourcePosX(locMast.getRow1()==9?(short)4:(short)5); // 源库位排 |
| | | crnCommand.setSourcePosY(locMast.getBay1().shortValue()); // 源库位列 |
| | | crnCommand.setSourcePosZ(locMast.getLev1().shortValue()); // 源库位层 |
| | | crnCommand.setDestinationPosX(crnStn.getRow().shortValue()); // 目标库位排 |
| | | crnCommand.setDestinationPosY(crnStn.getBay().shortValue()); // 目标库位列 |
| | | crnCommand.setDestinationPosZ(crnStn.getLev().shortValue()); // 目标库位层 |
| | | crnCommand.setLocType1(locMast.getLocType1().shortValue()); // 货物类型 |
| | | if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { |
| | | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); |
| | | } else { |
| | | // 修改工作档状态 11.生成出库ID => 12.吊车出库中 |
| | | Date now = new Date(); |
| | | wrkMast.setWrkSts(12L); |
| | | wrkMast.setCrnStrTime(now); |
| | | wrkMast.setModiTime(now); |
| | | if (wrkMastMapper.updateById(wrkMast) == 0) { |
| | | log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo()); |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | public synchronized void crn5TaskCreate() throws IOException { |
| | | for (CrnSlave crnSlave : slaveProperties.getCrn()) { |
| | | if (crnSlave.getId() != 5){ |
| | | continue; |
| | | } |
| | | for (CrnSlave.CrnStn crnStn : crnSlave.getCrnInStn()) { |
| | | // 获取堆垛机出库站信息 |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); |
| | | if (staProtocol == null) { |
| | | break; |
| | | // continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()){ |
| | | |
| | | EmptyBarrelIn emptyBarrelIn = emptyBarrelInService.selectOne(new EntityWrapper<>()); |
| | | if (Cools.isEmpty(emptyBarrelIn)){ |
| | | continue; |
| | | } |
| | | |
| | | FullStoreParam fullStoreParam = new FullStoreParam(); |
| | | fullStoreParam.setDevpNo(crnStn.getStaNo()); |
| | | FullStoreParam.MatCodeStore matCodeStore = new FullStoreParam.MatCodeStore(); |
| | | matCodeStore.setMatnr(emptyBarrelIn.getMatnr()); |
| | | matCodeStore.setBatch(emptyBarrelIn.getBatch()); |
| | | if (staProtocol.isForce()){ |
| | | log.info("空桶强制入库:"+staProtocol.getAmount()); |
| | | matCodeStore.setAnfme(Double.valueOf(staProtocol.getAmount())); |
| | | }else { |
| | | matCodeStore.setAnfme(8d) ; |
| | | } |
| | | ArrayList<FullStoreParam.MatCodeStore> matCodeStores = new ArrayList<>(); |
| | | matCodeStores.add(matCodeStore); |
| | | fullStoreParam.setList(matCodeStores); |
| | | try { |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/full/store/put/start") |
| | | .setJson(JSON.toJSONString(fullStoreParam)) |
| | | .build() |
| | | .doPost(); |
| | | JSONObject jsonObject = JSON.parseObject(response); |
| | | if (jsonObject.getInteger("code").equals(200)) { |
| | | devpThread.setPakMk(crnStn.getStaNo(),false); |
| | | } |
| | | }catch (CoolException e){ |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | |
| | | public synchronized void RGVTaskPut(){ |
| | | for (RgvSlave rgvSlave:slaveProperties.getRgv()){ |
| | | ZyRgvThread rgvThread = (ZyRgvThread)SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); |
| | | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); |
| | | if (rgvProtocol.getModeType() != RgvModeType.AUTO){ |
| | | continue; |
| | | } |
| | | |
| | | |
| | | int workNo1 = 0; |
| | | int workNo2 = 0; |
| | | short souSta1 = 0; |
| | | short sta1 = 0; |
| | | short souSta2 = 0; |
| | | short sta2 = 0; |
| | | |
| | | //工位一任务 |
| | | for (RgvSlave.Sta inStn : rgvSlave.getInStn()){ |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, inStn.getSourcePlcId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(inStn.getSourceStaNo()); |
| | | if (staProtocol == null) { |
| | | break; |
| | | // continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | if (staProtocol.isLoading() && staProtocol.isLoading() && staProtocol.isInEnable()){ |
| | | if (staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() <9900){ |
| | | WrkMast wrkMast = wrkMastService.selectByworkNo(staProtocol.getWorkNo()); |
| | | if (Cools.isEmpty(wrkMast)){ |
| | | log.error("未找到工作档"); |
| | | continue; |
| | | } |
| | | workNo1 = wrkMast.getWrkNo(); |
| | | souSta1 = inStn.getSourceStaNo().shortValue(); |
| | | sta1 = Utils.getRgvEndStaNo(rgvSlave.getId(),wrkMast.getStaNo()); |
| | | break; |
| | | } |
| | | workNo1 = workNo++; |
| | | souSta1 = inStn.getSourceStaNo().shortValue(); |
| | | sta1 = inStn.getStaNo().shortValue(); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | |
| | | //工位二任务 |
| | | for (RgvSlave.Sta inStn : rgvSlave.getInStn()){ |
| | | if (souSta1 == inStn.getSourceStaNo()){ |
| | | continue; |
| | | } |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, inStn.getSourcePlcId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(inStn.getSourceStaNo()); |
| | | if (staProtocol == null) { |
| | | break; |
| | | // continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | if (staProtocol.isLoading() && staProtocol.isLoading() && staProtocol.isInEnable()){ |
| | | if (staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() <9900){ |
| | | WrkMast wrkMast = wrkMastService.selectByworkNo(staProtocol.getWorkNo()); |
| | | if (Cools.isEmpty(wrkMast)){ |
| | | log.error("未找到工作档"); |
| | | continue; |
| | | } |
| | | workNo2 = wrkMast.getWrkNo(); |
| | | souSta2 = inStn.getSourceStaNo().shortValue(); |
| | | sta2 = Utils.getRgvEndStaNo(rgvSlave.getId(),wrkMast.getStaNo()); |
| | | break; |
| | | } |
| | | workNo2 = workNo++; |
| | | souSta2 = inStn.getSourceStaNo().shortValue(); |
| | | sta2 = inStn.getStaNo().shortValue(); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | //rgv任务下发-------------------------------------------------------------- |
| | | RgvCommand command = new RgvCommand(); |
| | | command.setRgvNo(rgvSlave.getId()); // RGV编号 |
| | | //工位1 |
| | | command.setTaskNo1(workNo1); // 工作号 |
| | | command.setSourceStaNo1(souSta1); // 源站 |
| | | command.setDestinationStaNo1(sta1); // 目标站 |
| | | command.setAckFinish1(false); // 任务完成确认位 |
| | | |
| | | //工位2 |
| | | command.setTaskNo2(workNo2); // 工作号 |
| | | command.setSourceStaNo2(souSta2); // 源站 |
| | | command.setDestinationStaNo2(sta2); // 目标站 |
| | | command.setAckFinish2(false); // 任务完成确认位 |
| | | |
| | | if (workNo1 != 0 && workNo2 ==0){ |
| | | command.setTaskMode(RgvTaskModeType.FETCH_PUT2); // 任务模式: 取放货 |
| | | } else if (workNo1 == 0 && workNo2 !=0) { |
| | | command.setTaskMode(RgvTaskModeType.FETCH_PUT1); // 任务模式: 取放货 |
| | | }else { |
| | | command.setTaskMode(RgvTaskModeType.FETCH_PUT_ALL); // 任务模式: 取放货 |
| | | } |
| | | command.setCommand(false); |
| | | MessageQueue.offer(SlaveType.Rgv, rgvSlave.getId(), new Task(2, command)); |
| | | log.info("rgv任务下发:"+JSON.toJSONString(command)); |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | public synchronized void RGVTaskOver() { |
| | | |
| | | } |
| | | } |