| | |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * 立体仓库WCS系统主流程业务 |
| | |
| | | } |
| | | } |
| | | |
| | | public synchronized void rgvTheHandlingTaskIsIssued() { |
| | | try { |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("rgv_no", 0).eq("wrk_sts", 9) |
| | | .orderBy("io_pri", false) |
| | | .orderBy("modi_time", true)); |
| | | if (wrkMasts.isEmpty()) { |
| | | return; |
| | | } |
| | | |
| | | LinkedList<RgvProtocol> rgvProtocolList = new LinkedList<>(); |
| | | for (int i = 1; i <= 5; i++) { |
| | | RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, i); |
| | | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); |
| | | if (rgvProtocol == null) { |
| | | continue; |
| | | } |
| | | rgvProtocolList.add(rgvProtocol); |
| | | } |
| | | |
| | | runRgv: |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | Integer rgvSstaNo = wrkMast.getRgvSstaNo(); |
| | | // 1090,1089,1086,1083 按1083站点位置计算,能取1083,就能取1090,1089,1086,避免任务延迟下发方案一直给1083发 |
| | | if (rgvSstaNo == 1090 || rgvSstaNo == 1089 || rgvSstaNo == 1086) { |
| | | rgvSstaNo = 1083; |
| | | } |
| | | BasDevpPosition basDevpPositions = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("dev_no", rgvSstaNo)); // 站点 |
| | | long position = basDevpPositions.getPlcPosition(); // 起始站位置 |
| | | TreeMap<Long, RgvProtocol> map = new TreeMap<>(); |
| | | for (RgvProtocol rgvProtocol : rgvProtocolList) { |
| | | long distance; |
| | | if (rgvProtocol.getRgvPos() <= position) { |
| | | distance = position - rgvProtocol.getRgvPos(); |
| | | } else { |
| | | distance = position + (perimeter - rgvProtocol.getRgvPos()); |
| | | } |
| | | map.put(distance, rgvProtocol); |
| | | } |
| | | // log.info("取货站点:{},后面小车排序", basDevpPositions.getDevNo()); |
| | | // StringBuilder sb = new StringBuilder(); |
| | | // for (Map.Entry<Long, RgvProtocol> rgvProtocolMap : map.entrySet()) { |
| | | // RgvProtocol rgvProtocol = rgvProtocolMap.getValue(); |
| | | // sb.append("[").append(rgvProtocol.getRgvNo()).append(",").append(rgvProtocol.getStatusType().desc).append("]"); |
| | | // } |
| | | // log.info(sb.toString()); |
| | | |
| | | for (Map.Entry<Long, RgvProtocol> rgvProtocolMap : map.entrySet()) { |
| | | RgvProtocol rgvProtocol = rgvProtocolMap.getValue(); // 最近距离小车 |
| | | // log.info("取货站点:{},后面最近小车:{},状态:{}", basDevpPositions.getDevNo(), rgvProtocol.getRgvNo(), rgvProtocol.getStatusType().desc); |
| | | int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("rgv_no", rgvProtocol.getRgvNo()).eq("wrk_sts", 10)); |
| | | if(wrkMast.getIoType() == 10 || wrkMast.getIoType() == 110 || wrkMast.getSourceStaNo() == 1034) { |
| | | if (count != 0) { |
| | | continue; |
| | | } |
| | | if (rgvProtocol.modeType == RgvModeType.AUTO |
| | | && (rgvProtocol.getStatusType() == RgvStatusType.IDLE || rgvProtocol.getStatusType() == RgvStatusType.ROAM) |
| | | && rgvProtocol.getTaskNo1() == 0 |
| | | && rgvProtocol.getAlarm() == 0) { |
| | | RgvCommand rgvCommand = new RgvCommand(); |
| | | rgvCommand.setRgvNo(rgvProtocol.getRgvNo()); |
| | | rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 |
| | | rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue()); |
| | | rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式: 取放货 |
| | | rgvCommand.setSourceStaNo1(wrkMast.getRgvSstaNo().shortValue()); //工位1起点 |
| | | rgvCommand.setDestinationStaNo1(wrkMast.getRgvDstaNo().shortValue()); //工位1目标站点 |
| | | rgvCommand.setCommand((short) 1); //工位1任务确认 |
| | | if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(2, rgvCommand))) { |
| | | log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | break runRgv; |
| | | } |
| | | log.info("RGV命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | Date now = new Date(); |
| | | wrkMast.setRgvNo(rgvProtocol.getRgvNo()); |
| | | wrkMast.setWrkSts(10L); |
| | | wrkMast.setRgvCreateTime(now); |
| | | wrkMastService.updateById(wrkMast); |
| | | break runRgv; |
| | | } |
| | | } else { |
| | | if (count != 0) { |
| | | break; |
| | | } |
| | | if (rgvProtocol.modeType == RgvModeType.AUTO |
| | | && (rgvProtocol.getStatusType() == RgvStatusType.IDLE || rgvProtocol.getStatusType() == RgvStatusType.ROAM) |
| | | && rgvProtocol.getTaskNo1() == 0 |
| | | && rgvProtocol.getAlarm() == 0) { |
| | | RgvCommand rgvCommand = new RgvCommand(); |
| | | rgvCommand.setRgvNo(rgvProtocol.getRgvNo()); |
| | | rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 |
| | | rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue()); |
| | | rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式: 取放货 |
| | | rgvCommand.setSourceStaNo1(wrkMast.getRgvSstaNo().shortValue()); //工位1起点 |
| | | rgvCommand.setDestinationStaNo1(wrkMast.getRgvDstaNo().shortValue()); //工位1目标站点 |
| | | rgvCommand.setCommand((short) 1); //工位1任务确认 |
| | | if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(2, rgvCommand))) { |
| | | log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | break runRgv; |
| | | } |
| | | log.info("RGV命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); |
| | | Date now = new Date(); |
| | | wrkMast.setRgvNo(rgvProtocol.getRgvNo()); |
| | | wrkMast.setWrkSts(10L); |
| | | wrkMast.setRgvCreateTime(now); |
| | | wrkMastService.updateById(wrkMast); |
| | | break runRgv; |
| | | } else { |
| | | break ; // 只看最近的第一个小车 |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("自动下发小车取放任务失败,异常:" + e); |
| | | } |
| | | } |
| | | |
| | | //任务完成 |
| | | public synchronized void rgvCompleteWrkMastSta(int[] autoZ) { |
| | | try { |
| | |
| | | } |
| | | wrkMast.setWrkSts(2L); |
| | | Date now = new Date(); |
| | | wrkMast.setModiTime(now); |
| | | wrkMast.setRgvFinishTime(now); |
| | | wrkMastService.updateById(wrkMast); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("小车复位线程报错!" + e); |
| | | } |
| | | } |
| | | |
| | | // 小车取货越位,任务取消 |
| | | public synchronized void rgvTaskCancel() { |
| | | try { |
| | | for (RgvSlave rgvSlave : slaveProperties.getRgv()) { |
| | | RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); |
| | | RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); |
| | | if (rgvProtocol == null) { |
| | | continue; |
| | | } |
| | | |
| | | // 只有当RGV等待WCS确认、自动 |
| | | if (rgvProtocol.getStatusType() == RgvStatusType.PICK_UP_OFFSIDE |
| | | && rgvProtocol.getModeType() == RgvModeType.AUTO |
| | | && rgvProtocol.getTaskNo1() != 0 |
| | | ) { |
| | | log.info("{}号小车小车取货越位,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol); |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", rgvProtocol.getTaskNo1().longValue())); |
| | | if (Cools.isEmpty(wrkMast)) { |
| | | log.error("未查到小车执行任务!" + rgvProtocol.getTaskNo1()); |
| | | continue; |
| | | } else if(wrkMast.getWrkSts() != 10) { |
| | | log.error("执行任务状态不符合!" + rgvProtocol.getTaskNo1()); |
| | | continue; |
| | | } |
| | | boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo()); |
| | | if (!rgvComplete) { |
| | | log.error("小车取货越位,任务取消,复位失败,小车号{}!", rgvProtocol.getRgvNo()); |
| | | break; |
| | | } |
| | | wrkMast.setWrkSts(9L); |
| | | wrkMast.setRgvNo(0); |
| | | wrkMast.setRgvCreateTime(new Date()); |
| | | wrkMastService.updateById(wrkMast); |
| | | } |
| | | } |
| | |
| | | log.error("小车复位RGV命令下发失败,RGV号={}", rgvNo); |
| | | return false; |
| | | } else { |
| | | log.info("RGV命令下发成功,RGV号={}", rgvNo); |
| | | log.info("小车复位RGV命令下发成功,RGV号={}", rgvNo); |
| | | return true; |
| | | } |
| | | } catch (Exception e) { |