|  |  |  | 
|---|
|  |  |  | import com.zy.asrs.entity.*; | 
|---|
|  |  |  | import com.zy.asrs.mapper.*; | 
|---|
|  |  |  | import com.zy.asrs.service.*; | 
|---|
|  |  |  | import com.zy.asrs.utils.RouteUtils; | 
|---|
|  |  |  | import com.zy.asrs.utils.Utils; | 
|---|
|  |  |  | import com.zy.asrs.utils.VersionUtils; | 
|---|
|  |  |  | import com.zy.common.model.LocTypeDto; | 
|---|
|  |  |  | 
|---|
|  |  |  | private RedisUtil redisUtil; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private WrkMastStaMapper wrkMastStaMapper; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private BasRgvMapMapper basRgvMapMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Value("${wms.url}") | 
|---|
|  |  |  | private String wmsUrl; | 
|---|
|  |  |  | 
|---|
|  |  |  | StartupDto dto = jsonObject.getObject("data", StartupDto.class); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | barcodeThread.setBarcode(""); | 
|---|
|  |  |  | staProtocol.setWorkNo(dto.getWorkNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setWorkNo(dto.getWorkNo()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(Cools.isEmpty(dto.getRgvNo()) || dto.getRgvNo() <= 0) { | 
|---|
|  |  |  | staProtocol.setStaNo(dto.getStaNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setStaNo(dto.getStaNo()); | 
|---|
|  |  |  | } else {//如果存在RGV编号,说明需要RGV接驳,先下发任务到RGV源站 | 
|---|
|  |  |  | staProtocol.setStaNo(dto.getRgvSstaNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setStaNo(dto.getRgvSstaNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | devpThread.setPakMk(staProtocol.getSiteId(), false); | 
|---|
|  |  |  | 
|---|
|  |  |  | // 命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 更新站点信息 且 下发plc命令 | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo()); | 
|---|
|  |  |  | devpThread.setPakMk(staProtocol.getSiteId(), false); | 
|---|
|  |  |  | boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
|---|
|  |  |  | if (result) { | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 更新站点信息 且 下发plc命令 | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo()); | 
|---|
|  |  |  | devpThread.setPakMk(staProtocol.getSiteId(), false); | 
|---|
|  |  |  | boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
|---|
|  |  |  | if (!result) { | 
|---|
|  |  |  | 
|---|
|  |  |  | // 命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 下发站点信息 | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo()); | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | * 入出库  ===>>  堆垛机入出库作业下发 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public synchronized void crnIoExecute() { | 
|---|
|  |  |  | for (CrnSlave crn : slaveProperties.getCrn()) { | 
|---|
|  |  |  | // 获取堆垛机信息 | 
|---|
|  |  |  | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
|---|
|  |  |  | CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
|---|
|  |  |  | if (crnProtocol == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); | 
|---|
|  |  |  | if (basCrnp == null) { | 
|---|
|  |  |  | log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | for (CrnSlave crn : slaveProperties.getCrn()) { | 
|---|
|  |  |  | // 获取堆垛机信息 | 
|---|
|  |  |  | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
|---|
|  |  |  | CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
|---|
|  |  |  | if (crnProtocol == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); | 
|---|
|  |  |  | if (basCrnp == null) { | 
|---|
|  |  |  | log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 只有当堆垛机空闲 并且 无任务时才继续执行 | 
|---|
|  |  |  | if (crnProtocol.getStatusType() == CrnStatusType.IDLE | 
|---|
|  |  |  | && crnProtocol.getTaskNo() == 0 | 
|---|
|  |  |  | && crnProtocol.getModeType() == CrnModeType.AUTO | 
|---|
|  |  |  | && crnProtocol.getLoaded() == 0 | 
|---|
|  |  |  | && crnProtocol.getForkPos() == 0) { | 
|---|
|  |  |  | // 如果最近一次是入库模式 | 
|---|
|  |  |  | if (crnProtocol.getLastIo().equals("I")) { | 
|---|
|  |  |  | if (basCrnp.getInEnable().equals("Y")) { | 
|---|
|  |  |  | this.crnStnToLoc1(crn, crnProtocol); //  入库 | 
|---|
|  |  |  | crnProtocol.setLastIo("O"); | 
|---|
|  |  |  | } else if (basCrnp.getOutEnable().equals("Y")) { | 
|---|
|  |  |  | this.locToCrnStn1(crn, crnProtocol); //  出库 | 
|---|
|  |  |  | crnProtocol.setLastIo("I"); | 
|---|
|  |  |  | // 只有当堆垛机空闲 并且 无任务时才继续执行 | 
|---|
|  |  |  | if (crnProtocol.getStatusType() == CrnStatusType.IDLE | 
|---|
|  |  |  | && crnProtocol.getTaskNo() == 0 | 
|---|
|  |  |  | && crnProtocol.getModeType() == CrnModeType.AUTO | 
|---|
|  |  |  | && crnProtocol.getLoaded() == 0 | 
|---|
|  |  |  | && crnProtocol.getForkPos() == 0) { | 
|---|
|  |  |  | // 如果最近一次是入库模式 | 
|---|
|  |  |  | if (crnProtocol.getLastIo().equals("I")) { | 
|---|
|  |  |  | if (basCrnp.getInEnable().equals("Y")) { | 
|---|
|  |  |  | this.crnStnToLoc1(crn, crnProtocol); //  入库 | 
|---|
|  |  |  | crnProtocol.setLastIo("O"); | 
|---|
|  |  |  | } else if (basCrnp.getOutEnable().equals("Y")) { | 
|---|
|  |  |  | this.locToCrnStn1(crn, crnProtocol); //  出库 | 
|---|
|  |  |  | crnProtocol.setLastIo("I"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 如果最近一次是出库模式 | 
|---|
|  |  |  | else if (crnProtocol.getLastIo().equals("O")) { | 
|---|
|  |  |  | if (basCrnp.getOutEnable().equals("Y")) { | 
|---|
|  |  |  | this.locToCrnStn1(crn, crnProtocol); //  出库 | 
|---|
|  |  |  | crnProtocol.setLastIo("I"); | 
|---|
|  |  |  | } else if (basCrnp.getInEnable().equals("Y")) { | 
|---|
|  |  |  | this.crnStnToLoc1(crn, crnProtocol); //  入库 | 
|---|
|  |  |  | crnProtocol.setLastIo("O"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 如果最近一次是出库模式 | 
|---|
|  |  |  | else if (crnProtocol.getLastIo().equals("O")) { | 
|---|
|  |  |  | if (basCrnp.getOutEnable().equals("Y")) { | 
|---|
|  |  |  | this.locToCrnStn1(crn, crnProtocol); //  出库 | 
|---|
|  |  |  | crnProtocol.setLastIo("I"); | 
|---|
|  |  |  | } else if (basCrnp.getInEnable().equals("Y")) { | 
|---|
|  |  |  | this.crnStnToLoc1(crn, crnProtocol); //  入库 | 
|---|
|  |  |  | crnProtocol.setLastIo("O"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 库位移转 | 
|---|
|  |  |  | this.locToLoc(crn, crnProtocol); | 
|---|
|  |  |  | // 库位移转 | 
|---|
|  |  |  | this.locToLoc(crn, crnProtocol); | 
|---|
|  |  |  | //            this.crnRebackHp(crnProtocol, crnThread); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | log.error("堆垛机出入库下发报错"+e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | * 搜索RGV车。通过目标站搜索哪台车可用 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public synchronized Integer searchRgvNo(Integer staNo) { | 
|---|
|  |  |  | BasDevp basDevp = basDevpService.selectById(staNo); | 
|---|
|  |  |  | if (basDevp == null) { | 
|---|
|  |  |  | return null;//目标站不存在 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //路径值 | 
|---|
|  |  |  | int path = basDevp.getLocType3().intValue(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ArrayList<RgvThread> list = new ArrayList<>(); | 
|---|
|  |  |  | for (RgvSlave rgv : slaveProperties.getRgv()) { | 
|---|
|  |  |  | // 获取RGV信息 | 
|---|
|  |  |  | RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId()); | 
|---|
|  |  |  | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); | 
|---|
|  |  |  | if (rgvProtocol == null) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | BasDevp basDevp = basDevpService.selectById(staNo); | 
|---|
|  |  |  | if (basDevp == null) { | 
|---|
|  |  |  | return null;//目标站不存在 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BasRgv basRgv = basRgvService.selectById(rgv.getId()); | 
|---|
|  |  |  | if (basRgv == null) { | 
|---|
|  |  |  | log.error("{}号RGV尚未在数据库进行维护!", rgv.getId()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //路径值 | 
|---|
|  |  |  | int path = basDevp.getLocType3().intValue(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | list.add(rgvThread); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | ArrayList<RgvThread> list = new ArrayList<>(); | 
|---|
|  |  |  | for (RgvSlave rgv : slaveProperties.getRgv()) { | 
|---|
|  |  |  | // 获取RGV信息 | 
|---|
|  |  |  | RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId()); | 
|---|
|  |  |  | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); | 
|---|
|  |  |  | if (rgvProtocol == null) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (list.size() > 1) { | 
|---|
|  |  |  | //超过两台车,按照配置的规则进行分配 | 
|---|
|  |  |  | for (RgvThread rgvThread : list) { | 
|---|
|  |  |  | //获取车辆配置的路径规则 | 
|---|
|  |  |  | BasRgvPath basRgvPath = basRgvPathService.selectByRgvNo(rgvThread.getSlave().getId()); | 
|---|
|  |  |  | if (basRgvPath == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //目标站是否包含当前路径中 | 
|---|
|  |  |  | BasRgv basRgv = basRgvService.selectById(rgv.getId()); | 
|---|
|  |  |  | if (basRgv == null) { | 
|---|
|  |  |  | log.error("{}号RGV尚未在数据库进行维护!", rgv.getId()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | list.add(rgvThread); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (list.size() > 1) { | 
|---|
|  |  |  | //超过两台车,按照配置的规则进行分配 | 
|---|
|  |  |  | for (RgvThread rgvThread : list) { | 
|---|
|  |  |  | //获取车辆配置的路径规则 | 
|---|
|  |  |  | BasRgvPath basRgvPath = basRgvPathService.selectByRgvNo(rgvThread.getSlave().getId()); | 
|---|
|  |  |  | if (basRgvPath == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //目标站是否包含当前路径中 | 
|---|
|  |  |  | List<Integer> rgvPath = JSON.parseArray(basRgvPath.getPath(), Integer.class); | 
|---|
|  |  |  | if (rgvPath.contains(path)) { | 
|---|
|  |  |  | //当前路径中包含目标站,则选定这台车 | 
|---|
|  |  |  | return rgvThread.getSlave().getId(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | //小于或等于1台车,分配全路径 | 
|---|
|  |  |  | BasRgvPath basRgvPath = basRgvPathService.selectByRgvNo(0);//获取默认路径 | 
|---|
|  |  |  | if (basRgvPath == null) { | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<Integer> rgvPath = JSON.parseArray(basRgvPath.getPath(), Integer.class); | 
|---|
|  |  |  | if (rgvPath.contains(path)) { | 
|---|
|  |  |  | //当前路径中包含目标站,则选定这台车 | 
|---|
|  |  |  | return rgvThread.getSlave().getId(); | 
|---|
|  |  |  | return list.get(0).getSlave().getId(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | //小于或等于1台车,分配全路径 | 
|---|
|  |  |  | BasRgvPath basRgvPath = basRgvPathService.selectByRgvNo(0);//获取默认路径 | 
|---|
|  |  |  | if (basRgvPath == null) { | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<Integer> rgvPath = JSON.parseArray(basRgvPath.getPath(), Integer.class); | 
|---|
|  |  |  | if (rgvPath.contains(path)) { | 
|---|
|  |  |  | //当前路径中包含目标站,则选定这台车 | 
|---|
|  |  |  | return list.get(0).getSlave().getId(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | log.error("搜索RGV车。通过目标站搜索哪台车可用"+e); | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //    /** | 
|---|
|  |  |  | 
|---|
|  |  |  | && rgvProtocol.statusType1 == RgvStatusType.WAITING) { | 
|---|
|  |  |  | // 命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | // 下发站点信息 | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo()); | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Devp, rgvStn.getDevpPlcId(), new Task(2, staProtocol))) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | && rgvProtocol.statusType2 == RgvStatusType.WAITING) { | 
|---|
|  |  |  | // 命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | // 下发站点信息 | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo()); | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Devp, rgvStn.getDevpPlcId(), new Task(2, staProtocol))) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | && rgvProtocol.statusType1 == RgvStatusType.WAITING) { | 
|---|
|  |  |  | // 命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | // 下发站点信息 | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo()); | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Devp, rgvStn.getDevpPlcId(), new Task(2, staProtocol))) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | && rgvProtocol.statusType2 == RgvStatusType.WAITING) { | 
|---|
|  |  |  | // 命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | // 下发站点信息 | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo()); | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Devp, rgvStn.getDevpPlcId(), new Task(2, staProtocol))) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | StartupDto dto = jsonObject.getObject("data", StartupDto.class); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 更新站点信息 且 下发plc命令 | 
|---|
|  |  |  | staProtocol.setWorkNo(dto.getWorkNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setStaNo(dto.getStaNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setWorkNo(dto.getWorkNo()); | 
|---|
|  |  |  | staProtocol.setStaNo(dto.getStaNo()); | 
|---|
|  |  |  | devpThread.setPakMk(staProtocol.getSiteId(), false); | 
|---|
|  |  |  | boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
|---|
|  |  |  | if (!result) { | 
|---|
|  |  |  | 
|---|
|  |  |  | && staProtocol.getWorkNo() == 9992 | 
|---|
|  |  |  | ) {//&& staProtocol.isPakMk() && !Cools.isEmpty(barcode)) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | staProtocol.setWorkNo((short)9999); | 
|---|
|  |  |  | staNo = staNo + 1; | 
|---|
|  |  |  | staProtocol.setStaNo((short)staNo); | 
|---|
|  |  |  | staProtocol.setWorkNo(9999); | 
|---|
|  |  |  | staProtocol.setStaNo(staNo + 1); | 
|---|
|  |  |  | devpThread.setPakMk(staProtocol.getSiteId(), false); | 
|---|
|  |  |  | boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol)); | 
|---|
|  |  |  | if (!result) { | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
|---|
|  |  |  | //            e.printStackTrace(); | 
|---|
|  |  |  | //            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
|---|
|  |  |  | log.error("其他  ===>> 码垛完成驱动托盘进入下一步(入库前扫码)"+e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | && staProtocol.getWorkNo() >= 9990 | 
|---|
|  |  |  | ) {//&& staProtocol.isPakMk() && !Cools.isEmpty(barcode)) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo()); | 
|---|
|  |  |  | devpThread.setPakMk(staProtocol.getSiteId(), false); | 
|---|
|  |  |  | boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol)); | 
|---|
|  |  |  | if (!result) { | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
|---|
|  |  |  | //            e.printStackTrace(); | 
|---|
|  |  |  | //            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
|---|
|  |  |  | log.error("其他  ===>> 码垛完成驱动托盘进入下一步"+e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | && staProtocol.isLoading() | 
|---|
|  |  |  | ) {//&& staProtocol.isPakMk() && !Cools.isEmpty(barcode)) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); | 
|---|
|  |  |  | staProtocol.setWorkNo(wrkMast.getWrkNo()); | 
|---|
|  |  |  | staProtocol.setStaNo(wrkMast.getStaNo()); | 
|---|
|  |  |  | devpThread.setPakMk(staProtocol.getSiteId(), false); | 
|---|
|  |  |  | boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol)); | 
|---|
|  |  |  | if (!result) { | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
|---|
|  |  |  | //            e.printStackTrace(); | 
|---|
|  |  |  | //            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
|---|
|  |  |  | log.error("其他  ===>> 贴标完成驱动托盘进入下一步"+e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | *  完成小车任务 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public synchronized void rgvCompleteWrkMastSta() { | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | for (RgvSlave rgvSlave:slaveProperties.getRgv()) { | 
|---|
|  |  |  | RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); | 
|---|
|  |  |  | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); | 
|---|
|  |  |  | if (rgvProtocol == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BasRgv basRgv = basRgvService.selectById(rgvSlave.getId()); | 
|---|
|  |  |  | if (basRgv == null) { | 
|---|
|  |  |  | log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 只有当RGV等待WCS确认、自动 | 
|---|
|  |  |  | if (rgvProtocol.getStatusType() == RgvStatusType.WAITING | 
|---|
|  |  |  | && rgvProtocol.getModeType() == RgvModeType.AUTO | 
|---|
|  |  |  | ) { | 
|---|
|  |  |  | log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol); | 
|---|
|  |  |  | if (rgvProtocol.getTaskNo1()!=0){ | 
|---|
|  |  |  | if (rgvProtocol.getTaskNo1()==9999){ | 
|---|
|  |  |  | boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | if (!rgvComplete){ | 
|---|
|  |  |  | log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); | 
|---|
|  |  |  | rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute()); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo1().intValue()); | 
|---|
|  |  |  | if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=1 || wrkMastSta.getWrkSts()!=1){ | 
|---|
|  |  |  | log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | if (!rgvComplete){ | 
|---|
|  |  |  | log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | wrkMastSta.setWrkSts(3); | 
|---|
|  |  |  | wrkMastStaMapper.updateById(wrkMastSta); | 
|---|
|  |  |  | BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); | 
|---|
|  |  |  | rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute()); | 
|---|
|  |  |  | }else if (rgvProtocol.getTaskNo2()!=0){ | 
|---|
|  |  |  | if (rgvProtocol.getTaskNo2()==9999){ | 
|---|
|  |  |  | boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | if (!rgvComplete){ | 
|---|
|  |  |  | log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); | 
|---|
|  |  |  | rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute()); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo2().intValue()); | 
|---|
|  |  |  | if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=2){ | 
|---|
|  |  |  | log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | if (!rgvComplete){ | 
|---|
|  |  |  | log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | wrkMastSta.setWrkSts(3); | 
|---|
|  |  |  | wrkMastStaMapper.updateById(wrkMastSta); | 
|---|
|  |  |  | BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); | 
|---|
|  |  |  | rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute()); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | log.error("小车复位失败,小车号{},等待wcs确认但是没有工作号!",rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | log.error("小车复位线程报错!"+e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 执行小车搬运任务 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public synchronized void rgvRunWrkMastSta() { | 
|---|
|  |  |  | Integer signCount = 0; | 
|---|
|  |  |  | for (RgvSlave rgvSlave:slaveProperties.getRgv()){ | 
|---|
|  |  |  | public synchronized void rgvRunWrkMastFullSta() { | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | for (RgvSlave rgvSlave:slaveProperties.getRgv()) { | 
|---|
|  |  |  | RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); | 
|---|
|  |  |  | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); | 
|---|
|  |  |  | if (rgvProtocol == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BasRgv basRgv = basRgvService.selectById(rgvSlave.getId()); | 
|---|
|  |  |  | if (basRgv == null) { | 
|---|
|  |  |  | log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (true){//rgv可用 | 
|---|
|  |  |  | signCount++; | 
|---|
|  |  |  | // 只有当RGV空闲、自动,工位一无物//rgv可用 | 
|---|
|  |  |  | if (rgvProtocol.getStatusType() == RgvStatusType.IDLE | 
|---|
|  |  |  | && rgvProtocol.getModeType() == RgvModeType.AUTO | 
|---|
|  |  |  | && rgvProtocol.getLoaded1()==0 | 
|---|
|  |  |  | ) { | 
|---|
|  |  |  | BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | if (basRgvMap == null) { | 
|---|
|  |  |  | log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute()); | 
|---|
|  |  |  | basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 | 
|---|
|  |  |  | List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route); | 
|---|
|  |  |  | for (WrkMastSta wrkMastSta : wrkMastStaList){ | 
|---|
|  |  |  | if (wrkMastSta.getType()!=1 || wrkMastSta.getWrkType()!=3){//1:满版   3:取放 | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); | 
|---|
|  |  |  | if (sign){ | 
|---|
|  |  |  | boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd()); | 
|---|
|  |  |  | if (signMap){ | 
|---|
|  |  |  | wrkMastSta.setWrkSts(1); | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | wrkMastStaMapper.updateById(wrkMastSta); | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | log.error("更新小车任务失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | log.error("3864行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | log.error("3875行执行小车搬运任务下发失败"); | 
|---|
|  |  |  | log.error("3875行"+e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<WrkMastSta> wrkMastStas = wrkMastStaMapper.selectAllWrkMastStaList(); | 
|---|
|  |  |  | for (WrkMastSta wrkMastSta : wrkMastStas) { | 
|---|
|  |  |  | // 只有当堆垛机空闲 并且 无任务时才继续执行 | 
|---|
|  |  |  | if (true) { | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 执行小车搬运任务 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public synchronized void rgvRunWrkMastEmptyStaPut() {//放 | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | for (RgvSlave rgvSlave:slaveProperties.getRgv()) { | 
|---|
|  |  |  | RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); | 
|---|
|  |  |  | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); | 
|---|
|  |  |  | if (rgvProtocol == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BasRgv basRgv = basRgvService.selectById(rgvSlave.getId()); | 
|---|
|  |  |  | if (basRgv == null) { | 
|---|
|  |  |  | log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 只有当RGV空闲、自动,工位二有物//rgv可用 | 
|---|
|  |  |  | if (rgvProtocol.getStatusType() == RgvStatusType.IDLE | 
|---|
|  |  |  | && rgvProtocol.getModeType() == RgvModeType.AUTO | 
|---|
|  |  |  | && rgvProtocol.getLoaded2()==1  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接 | 
|---|
|  |  |  | ) { | 
|---|
|  |  |  | BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | if (basRgvMap == null) { | 
|---|
|  |  |  | log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 | 
|---|
|  |  |  | List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());//获取活动范围 | 
|---|
|  |  |  | List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);//查询可执行任务 | 
|---|
|  |  |  | for (WrkMastSta wrkMastSta : wrkMastStaList){ | 
|---|
|  |  |  | if (wrkMastSta.getType()!=2 || (wrkMastSta.getWrkType()!=2 && wrkMastSta.getWrkType()!=4)){// 2:空板  2:放 4:拆盘 | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | boolean sign = false; | 
|---|
|  |  |  | if (wrkMastSta.getStaStart()==0 && wrkMastSta.getStaEnd()!=0){//放 | 
|---|
|  |  |  | sign = rgvPutEmpty(rgvProtocol.getRgvNo(),wrkMastSta); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (sign){ | 
|---|
|  |  |  | boolean signMap = rgvMapUpdate(basRgvMap, basRgvMap.getStartRoute(), wrkMastSta.getStaEnd()); | 
|---|
|  |  |  | if (signMap){ | 
|---|
|  |  |  | wrkMastSta.setWrkSts(2); | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | wrkMastStaMapper.updateById(wrkMastSta); | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | log.error("更新小车任务失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | log.error("3857行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | log.error("3933行执行小车放空板任务下发失败"); | 
|---|
|  |  |  | log.error("3933行"+e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public synchronized void rgvRunWrkMastEmptyStaTake() {//取 | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | for (RgvSlave rgvSlave:slaveProperties.getRgv()) { | 
|---|
|  |  |  | RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); | 
|---|
|  |  |  | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); | 
|---|
|  |  |  | if (rgvProtocol == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BasRgv basRgv = basRgvService.selectById(rgvSlave.getId()); | 
|---|
|  |  |  | if (basRgv == null) { | 
|---|
|  |  |  | log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 只有当RGV空闲、自动,工位二无物//rgv可用 | 
|---|
|  |  |  | if (rgvProtocol.getStatusType() == RgvStatusType.IDLE | 
|---|
|  |  |  | && rgvProtocol.getModeType() == RgvModeType.AUTO | 
|---|
|  |  |  | && rgvProtocol.getLoaded2()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接 | 
|---|
|  |  |  | ) { | 
|---|
|  |  |  | BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | if (basRgvMap == null) { | 
|---|
|  |  |  | log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute()); | 
|---|
|  |  |  | basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 | 
|---|
|  |  |  | List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route); | 
|---|
|  |  |  | for (WrkMastSta wrkMastSta : wrkMastStaList){ | 
|---|
|  |  |  | if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=1){// 2:空板  1:取 | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | boolean sign = false; | 
|---|
|  |  |  | if (wrkMastSta.getStaEnd()==0 && wrkMastSta.getStaStart()!=0){//取 | 
|---|
|  |  |  | sign = rgvTakeEmpty(rgvProtocol.getRgvNo(),wrkMastSta); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (sign){ | 
|---|
|  |  |  | boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), basRgvMap.getStartRoute()); | 
|---|
|  |  |  | if (signMap){ | 
|---|
|  |  |  | wrkMastSta.setWrkSts(1); | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | wrkMastStaMapper.updateById(wrkMastSta); | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | log.error("更新小车任务失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | log.error("3879行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | log.error("3989行执行小车取空板任务下发失败"); | 
|---|
|  |  |  | log.error("3989行"+e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /* | 
|---|
|  |  |  | * 有任务但未执行  此时需要调整小车位置 | 
|---|
|  |  |  | * */ | 
|---|
|  |  |  | public synchronized void rgvRunWrkMastEmptyStaAvoidance() { | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | Integer integer = wrkMastStaMapper.selectAllWrkStsCount(null,0);//查询状态为0的任务 | 
|---|
|  |  |  | if (integer==0){ | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (RgvSlave rgvSlave:slaveProperties.getRgv()) { | 
|---|
|  |  |  | RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); | 
|---|
|  |  |  | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); | 
|---|
|  |  |  | if (rgvProtocol == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BasRgv basRgv = basRgvService.selectById(rgvSlave.getId()); | 
|---|
|  |  |  | if (basRgv == null) { | 
|---|
|  |  |  | log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 只有当RGV空闲、自动,工位一无物//rgv可用 | 
|---|
|  |  |  | if (rgvProtocol.getStatusType() == RgvStatusType.IDLE | 
|---|
|  |  |  | && rgvProtocol.getModeType() == RgvModeType.AUTO | 
|---|
|  |  |  | && rgvProtocol.getLoaded1()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接 | 
|---|
|  |  |  | && rgvProtocol.getTaskNo1()==0 | 
|---|
|  |  |  | && rgvProtocol.getTaskNo2()==0 | 
|---|
|  |  |  | ) { | 
|---|
|  |  |  | BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | if (rgvProtocol.getRgvPosI().equals(basRgvMap.getStartRoute())){ | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | rgvAvoidanceXY(rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | log.error("4109行执行小车初始化任务下发失败"); | 
|---|
|  |  |  | log.error("4109行"+e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /* | 
|---|
|  |  |  | * 刷新地图数据 | 
|---|
|  |  |  | * */ | 
|---|
|  |  |  | public synchronized void refreshRgvMap() { | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | for (RgvSlave rgvSlave:slaveProperties.getRgv()) { | 
|---|
|  |  |  | RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); | 
|---|
|  |  |  | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); | 
|---|
|  |  |  | if (rgvProtocol == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BasRgv basRgv = basRgvService.selectById(rgvSlave.getId()); | 
|---|
|  |  |  | if (basRgv == null) { | 
|---|
|  |  |  | log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 只有当RGV空闲、自动,工位一无物//rgv可用 | 
|---|
|  |  |  | if (rgvProtocol.getStatusType() == RgvStatusType.IDLE | 
|---|
|  |  |  | && rgvProtocol.getModeType() == RgvModeType.AUTO | 
|---|
|  |  |  | && rgvProtocol.getLoaded1()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接 | 
|---|
|  |  |  | && (rgvProtocol.getTaskNo1()==0 || rgvProtocol.getTaskNo1()==9999) | 
|---|
|  |  |  | && (rgvProtocol.getTaskNo2()==0 || rgvProtocol.getTaskNo2()==9999) | 
|---|
|  |  |  | ) { | 
|---|
|  |  |  | BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); | 
|---|
|  |  |  | basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); | 
|---|
|  |  |  | rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | log.error("4109行执行小车初始化任务下发失败"); | 
|---|
|  |  |  | log.error("4109行"+e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /* | 
|---|
|  |  |  | * 小车XY移动  避让 | 
|---|
|  |  |  | * */ | 
|---|
|  |  |  | public synchronized boolean rgvAvoidanceXY(Integer rgvId){ | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | //  命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | RgvCommand rgvCommand = new RgvCommand(); | 
|---|
|  |  |  | rgvCommand.setRgvNo(rgvId); // RGV编号 | 
|---|
|  |  |  | rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位 | 
|---|
|  |  |  | rgvCommand.setTaskNo1((short)9999); // 工位1工作号 | 
|---|
|  |  |  | rgvCommand.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 工位1任务模式:  回原点 | 
|---|
|  |  |  | rgvCommand.setCommand((short) 1);   //工位1任务确认 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(9, rgvCommand))) { | 
|---|
|  |  |  | //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务   step=9,回原点 9999任务号 | 
|---|
|  |  |  | log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /* | 
|---|
|  |  |  | * 小车取货至工位任务 | 
|---|
|  |  |  | * */ | 
|---|
|  |  |  | public synchronized boolean rgvTakeFullAll(Integer rgvId,WrkMastSta wrkMastSta){ | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | //  命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | RgvCommand rgvCommand = new RgvCommand(); | 
|---|
|  |  |  | rgvCommand.setRgvNo(rgvId); // RGV编号 | 
|---|
|  |  |  | rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位 | 
|---|
|  |  |  | rgvCommand.setTaskNo1(wrkMastSta.getWrkNo().shortValue()); // 工位1工作号 | 
|---|
|  |  |  | rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式:  取放货 | 
|---|
|  |  |  | rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue());   //工位1起点 | 
|---|
|  |  |  | rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue());   //工位1目标站点 | 
|---|
|  |  |  | rgvCommand.setCommand((short) 1);   //工位1任务确认 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(4, rgvCommand))) { | 
|---|
|  |  |  | //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务 | 
|---|
|  |  |  | log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /* | 
|---|
|  |  |  | * 小车取货至工位任务 | 
|---|
|  |  |  | * */ | 
|---|
|  |  |  | public synchronized boolean rgvTakeFull(Integer rgvId,WrkMastSta wrkMastSta){ | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | //  命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | RgvCommand rgvCommand = new RgvCommand(); | 
|---|
|  |  |  | rgvCommand.setRgvNo(rgvId); // RGV编号 | 
|---|
|  |  |  | rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位 | 
|---|
|  |  |  | rgvCommand.setTaskNo1(wrkMastSta.getWrkNo().shortValue()); // 工位1工作号 | 
|---|
|  |  |  | rgvCommand.setTaskMode1(RgvTaskModeType.FETCH); // 工位1任务模式:  取货 | 
|---|
|  |  |  | rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue());   //工位1起点 | 
|---|
|  |  |  | rgvCommand.setCommand((short) 1);   //工位1任务确认 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(4, rgvCommand))) { | 
|---|
|  |  |  | //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务 | 
|---|
|  |  |  | log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /* | 
|---|
|  |  |  | * 小车放货至输送线任务 | 
|---|
|  |  |  | * */ | 
|---|
|  |  |  | public synchronized boolean rgvPutFull(Integer rgvId,WrkMastSta wrkMastSta){ | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | //  命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | RgvCommand rgvCommand = new RgvCommand(); | 
|---|
|  |  |  | rgvCommand.setRgvNo(rgvId); // RGV编号 | 
|---|
|  |  |  | rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位 | 
|---|
|  |  |  | rgvCommand.setTaskNo1(wrkMastSta.getWrkNo().shortValue()); // 工位1工作号 | 
|---|
|  |  |  | rgvCommand.setTaskMode1(RgvTaskModeType.PUT); // 工位1任务模式:  放货 | 
|---|
|  |  |  | rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue());   //工位1目标站点 | 
|---|
|  |  |  | rgvCommand.setCommand((short) 1);   //工位1任务确认 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(4, rgvCommand))) { | 
|---|
|  |  |  | //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务 | 
|---|
|  |  |  | log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /* | 
|---|
|  |  |  | * 小车取空板至工位任务 | 
|---|
|  |  |  | * */ | 
|---|
|  |  |  | public synchronized boolean rgvTakeEmpty(Integer rgvId,WrkMastSta wrkMastSta){ | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | //  命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | RgvCommand rgvCommand = new RgvCommand(); | 
|---|
|  |  |  | rgvCommand.setRgvNo(rgvId); // RGV编号 | 
|---|
|  |  |  | rgvCommand.setAckFinish2((short) 0);  // 工位2任务完成确认位 | 
|---|
|  |  |  | rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 工位2工作号 | 
|---|
|  |  |  | rgvCommand.setTaskMode2(RgvTaskModeType.FETCH); // 工位2任务模式:  取货 | 
|---|
|  |  |  | rgvCommand.setSourceStaNo2(wrkMastSta.getStaStart().shortValue());   //工位2起点 | 
|---|
|  |  |  | rgvCommand.setCommand((short) 2);   //工位2任务确认 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(5, rgvCommand))) { | 
|---|
|  |  |  | //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务 | 
|---|
|  |  |  | log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /* | 
|---|
|  |  |  | * 小车放空板至输送线任务 | 
|---|
|  |  |  | * */ | 
|---|
|  |  |  | public synchronized boolean rgvPutEmpty(Integer rgvId,WrkMastSta wrkMastSta){ | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | //  命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | RgvCommand rgvCommand = new RgvCommand(); | 
|---|
|  |  |  | rgvCommand.setRgvNo(rgvId); // RGV编号 | 
|---|
|  |  |  | rgvCommand.setAckFinish2((short) 0);  // 工位2任务完成确认位 | 
|---|
|  |  |  | rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 工位2工作号 | 
|---|
|  |  |  | rgvCommand.setTaskMode2(RgvTaskModeType.PUT); // 工位2任务模式:  放货 | 
|---|
|  |  |  | rgvCommand.setDestinationStaNo2(wrkMastSta.getStaEnd().shortValue());   //工位2目标站点 | 
|---|
|  |  |  | rgvCommand.setCommand((short) 2);   //工位2任务确认 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(5, rgvCommand))) { | 
|---|
|  |  |  | //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务 | 
|---|
|  |  |  | log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /* | 
|---|
|  |  |  | * 小车复位 | 
|---|
|  |  |  | * */ | 
|---|
|  |  |  | public synchronized boolean rgvComplete(Integer rgvId){ | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | //  命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(3, new RgvCommand()))) { | 
|---|
|  |  |  | //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务 | 
|---|
|  |  |  | log.error("RGV命令下发失败,RGV号={}",rgvId); | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | log.info("RGV命令下发成功,RGV号={}",rgvId); | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | log.error("RGV命令下发失败,RGV号={}。异常:"+e,rgvId); | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /* | 
|---|
|  |  |  | * 小车地图更新  更新锁 | 
|---|
|  |  |  | * */ | 
|---|
|  |  |  | public synchronized boolean rgvMapUpdate(BasRgvMap basRgvMapCurrent,Integer staStart,Integer staEnd){ | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //        List<Integer> integers = RouteUtils.RouteMapCurrentFar(basRgvMapCurrent.getNowRoute(),staStart,staEnd, basRgvMapCurrent.getLockStartRoute()); | 
|---|
|  |  |  | //更新当前小车锁 | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | Integer farCurrentStaNo = RouteUtils.RouteIndexFarMas(basRgvMapCurrent.getNowRoute(), staStart, staEnd, basRgvMapCurrent.getLockStartRoute());//获取最远站点 | 
|---|
|  |  |  | Integer fallMerge = RouteUtils.RouteIndexFarMas(basRgvMapCurrent.getRgvNo(), farCurrentStaNo); //获取合并干涉项 | 
|---|
|  |  |  | basRgvMapCurrent.setLockEndRoute(fallMerge); | 
|---|
|  |  |  | basRgvMapMapper.updateById(basRgvMapCurrent); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //更新另一台小车地图 | 
|---|
|  |  |  | Integer rgvNoOther = basRgvMapCurrent.getRgvNoOther(); | 
|---|
|  |  |  | BasRgvMap basRgvMapOther = basRgvMapMapper.selectById(rgvNoOther); | 
|---|
|  |  |  | List<Integer> integers = RouteUtils.RouteMapCurrentFar(fallMerge, basRgvMapCurrent.getLockStartRoute()); | 
|---|
|  |  |  | Integer lockEndRoute = RouteUtils.RouteMapOtherFarStnNo(integers, basRgvMapCurrent.getLockStartRoute());//另一台小车可活动最远位置 | 
|---|
|  |  |  | basRgvMapOther.setStartRoute(lockEndRoute); | 
|---|
|  |  |  | basRgvMapMapper.updateById(basRgvMapOther); | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | log.error("小车地图更新出错!"); | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|