src/main/java/com/zy/asrs/entity/BasDevpPosition.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/utils/RouteUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/utils/TrackRangeUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/entity/BasDevpPosition.java
@@ -42,7 +42,20 @@ this.plcPosition = plcPosition; } // BasDevpPosition basDevpPosition = new BasDevpPosition( public BasDevpPosition(BasDevpPosition basDevpPosition) { this.id = basDevpPosition.getId(); this.devNo = basDevpPosition.getDevNo(); this.plcId = basDevpPosition.getPlcId(); this.plcPosition = basDevpPosition.getPlcPosition(); } public BasDevpPosition(BasDevpPosition basDevpPosition,Long plcPosition) { this.id = basDevpPosition.getId(); this.devNo = basDevpPosition.getDevNo(); this.plcId = basDevpPosition.getPlcId(); this.plcPosition = plcPosition; } // BasDevpPosition basDevpPosition = new BasDevpPosition( // null, // // null, // // null // src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -1211,7 +1211,7 @@ if (rgvOtherStatusEnable(rgvSlave)){ //分成上下两部分任务 List<Integer>[] avoidRange = RouteUtils.gradeRange(staList, basDevpPositions); List<Integer>[] avoidRange = RouteUtils.gradeRange(staList, basDevpPositions,itSmall); List<Integer> rangeListSou = avoidRange[itSmall ? 0 : 1]; List<Integer> rangeListSouOther = avoidRange[itSmall ? 1 : 0]; //就近排序 @@ -1223,15 +1223,17 @@ //筛选范围内任务 //就近排序 RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(rgvSlave.getOtherId()); //筛选在范围任务 List<Integer> belongToRange = RouteUtils.belongToRange(rangeList, rgvProtocolOther.getRgvPosDestination(), basDevpPositions); Long[][] avoidedRange = new TrackRangeUtils().avoidRangeArr(rgvSlave, trackEntireLength, trackBenchmark, avoidDistance); List<Integer> belongToRange = RouteUtils.SortNearby(RouteUtils.belongToRange(rangeList, avoidedRange[0], basDevpPositions), rgvProtocol.RgvPos, basDevpPositions); for (Integer staNoNow : belongToRange){ for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){ if (rgvStn.getStaNo().equals(staNoNow)){ TaskWrk taskWrk = deviceDetection(rgvStn); if (taskWrk!=null){ if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,taskWrk.getTargetPointConvert(),basDevpPositions)){ BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", taskWrk.getTargetPointConvert())); if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,basDevpPosition.getPlcPosition(),basDevpPositions,itSmall)){ sign = taskGenerate(rgvSlave,rgvStn,0); } } @@ -1263,7 +1265,8 @@ if (rgvStn.getStaNo().equals(staNoNow)){ TaskWrk taskWrk = deviceDetection(rgvStn); if (taskWrk!=null){ if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,taskWrk.getTargetPointConvert(),basDevpPositions)){ BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", taskWrk.getTargetPointConvert())); if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,basDevpPosition.getPlcPosition(),basDevpPositions,itSmall)){ sign = taskGenerate(rgvSlave,rgvStn,0); } } @@ -1296,7 +1299,8 @@ if (rgvStn.getStaNo().equals(staNoNow)){ TaskWrk taskWrk = deviceDetection(rgvStn); if (taskWrk!=null){ if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,taskWrk.getTargetPointConvert(),basDevpPositions)){ BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", taskWrk.getTargetPointConvert())); if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,basDevpPosition.getPlcPosition(),basDevpPositions,itSmall)){ sign = taskGenerate(rgvSlave,rgvStn,0); } } src/main/java/com/zy/asrs/utils/RouteUtils.java
@@ -7,6 +7,7 @@ import com.zy.core.model.RgvSlave; import java.util.ArrayList; import java.util.Collections; import java.util.List; import static java.util.stream.Collectors.toList; @@ -16,55 +17,154 @@ */ public class RouteUtils { //排序 执行方向(面朝轨道 定位值左小右大) 0:左 小 1:右 大 public static List<Integer>[] gradeRange(List<Integer> staNoList,List<BasDevpPosition> basDevpPositions) { public static List<Integer>[] gradeRange(List<Integer> staNoList, List<BasDevpPosition> basDevpPositionList, boolean itSmall) { List<Integer>[] avoidRangeArray = new ArrayList[2]; Integer[] rangeList = new Integer[staNoList.size()]; List<Integer> rangeList1 = new ArrayList<>(); List<Integer> rangeList2 = new ArrayList<>(); int i = 0; for (BasDevpPosition basDevpPosition : basDevpPositionList) { for (Integer staNo : staNoList) { if (basDevpPosition.getDevNo().equals(staNo)) { rangeList[i] = staNo; i = i + 1; break; } } } boolean sign = true; for (int j = 0; j < rangeList.length; j++) { if (itSmall) { if (sign) { rangeList1.add(rangeList[j]); } else { rangeList2.add(rangeList[j]); } if (sign && j >= rangeList.length / 2) { sign = false; } } else { if (sign && j >= rangeList.length / 2) { sign = false; } if (sign) { rangeList1.add(rangeList[j]); } else { rangeList2.add(rangeList[j]); } } } avoidRangeArray[0] = rangeList1; avoidRangeArray[1] = rangeList2; return avoidRangeArray; } //获取在范围的站点 public static List<Integer> belongToRange(List<Integer> staNoList,Long position,List<BasDevpPosition> basDevpPositions){ public static List<Integer> belongToRange(List<Integer> staNoList, Long[] avoid, List<BasDevpPosition> basDevpPositions) { List<Integer> siteList = new ArrayList<>(); for (BasDevpPosition basDevpPosition : basDevpPositions) { if (new TrackRangeUtils().avoidRange(basDevpPosition.getPlcPosition(), avoid)) { for (Integer staNo : staNoList) { if (basDevpPosition.getDevNo().equals(staNo)) { siteList.add(staNo); break; } } } } return siteList; } //提取站点集合 public static List<Integer> BasDevpPositionExtractSites(List<BasDevpPosition> basDevpPositions){ public static List<Integer> BasDevpPositionExtractSites(List<BasDevpPosition> basDevpPositions) { List<Integer> siteList = new ArrayList<>(); for (BasDevpPosition basDevpPosition : basDevpPositions){ if (!siteList.contains(basDevpPosition.getDevNo())){ for (BasDevpPosition basDevpPosition : basDevpPositions) { if (!siteList.contains(basDevpPosition.getDevNo())) { siteList.add(basDevpPosition.getDevNo()); } } return siteList; } //提取站点集合 public static List<Integer> SortNearby(List<Integer> staNoList,Long rgvNowPos,List<BasDevpPosition> basDevpPositions){ //提取站点集合//就近排序 public static List<Integer> SortNearby(List<Integer> staNoList, Long rgvNowPos, List<BasDevpPosition> basDevpPositionList) { List<Integer> siteList = new ArrayList<>(); List<BasDevpPosition> basDevpPositions = devpNoSort(basDevpPositionList, rgvNowPos); for (BasDevpPosition basDevpPosition : basDevpPositions) { for (Integer staNo : staNoList) { if (basDevpPosition.getDevNo().equals(staNo)) { siteList.add(staNo); break; } } } return siteList; } //站点过滤 public static List<BasDevpPosition> devpNoSort(List<BasDevpPosition> devpPositionList, Long rgvNowPos) { List<BasDevpPosition> basDevpPositions = new ArrayList<>(); List<BasDevpPosition> basDevpPositionSort = new ArrayList<>(); ArrayList<Long> arrayList = new ArrayList<>(); for (BasDevpPosition basDevpPosition : devpPositionList) { long position = Math.abs(basDevpPosition.getPlcPosition() - rgvNowPos); BasDevpPosition devpPosition = new BasDevpPosition(basDevpPosition, position); basDevpPositions.add(devpPosition); arrayList.add(position); } Collections.sort(arrayList); // 升序排序 for (Long position : arrayList) { for (BasDevpPosition basDevpPosition : basDevpPositions) { if (basDevpPosition.getPlcPosition().equals(position)) { basDevpPositionSort.add(basDevpPosition); break; } } } return basDevpPositionSort; } //检测是否在范围 public static boolean CheckIfItIsWithinTheRange(List<Integer> staNoList,Integer staNo,List<BasDevpPosition> basDevpPositions){ public static boolean CheckIfItIsWithinTheRange(List<Integer> staNoList, Long staNoNowPos, List<BasDevpPosition> basDevpPositionList, boolean itSmall) { List<Integer> siteList = new ArrayList<>(); if (staNoList.isEmpty()){ return true; Integer[] rangeList = new Integer[staNoList.size()]; int i = 0; for (BasDevpPosition basDevpPosition : basDevpPositionList) { for (Integer staNo : staNoList) { if (basDevpPosition.getDevNo().equals(staNo)) { rangeList[i] = staNo; i = i + 1; break; } } } return false; if (itSmall) { return staNoNowPos <= rangeList[rangeList.length - 1]; } return staNoNowPos >= rangeList[0]; } public static long absoluteDifference(Long a, Long b) { if (a == null || b == null) { a = 0L; b = 0L; // throw new IllegalArgumentException(""); System.out.println("a or b is null"); } return Math.abs(a - b); } } src/main/java/com/zy/asrs/utils/TrackRangeUtils.java
@@ -23,7 +23,7 @@ RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); RgvProtocol rgvProtocolE, rgvProtocolB; if (rgvProtocol.getRgvPos() < rgvProtocolOther.getRgvPos()) { if (IsItSmall(slave)) { rgvProtocolE = rgvProtocolOther; rgvProtocolB = rgvProtocol; } else { @@ -42,6 +42,38 @@ } public Long[][] avoidRangeArr(RgvSlave slave, Long trackEntireLength, Long trackBenchmark, Long avoidDistance) { RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId()); RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); RgvProtocol rgvProtocolE, rgvProtocolB; if (IsItSmall(slave)) { rgvProtocolE = rgvProtocolOther; rgvProtocolB = rgvProtocol; long entireLength = rgvProtocolE.getRgvPosDestination() - rgvProtocolE.getCarBodyJiaoMing() - avoidDistance - rgvProtocolB.getCarBodyKunPeng(); long benchmark = trackBenchmark + rgvProtocolB.getCarBodyJiaoMing(); long entireLengthOther = trackEntireLength - rgvProtocolE.getCarBodyKunPeng(); long benchmarkOther = rgvProtocolB.getRgvPosDestination() + rgvProtocolB.getCarBodyKunPeng() + avoidDistance + rgvProtocolE.getCarBodyJiaoMing(); return new Long[][]{new Long[]{entireLength, benchmark}, new Long[]{entireLengthOther, benchmarkOther}}; } else { rgvProtocolE = rgvProtocol; rgvProtocolB = rgvProtocolOther; long entireLength = trackEntireLength - rgvProtocolE.getCarBodyKunPeng(); long benchmark = rgvProtocolB.getRgvPosDestination() + rgvProtocolB.getCarBodyKunPeng() + avoidDistance + rgvProtocolE.getCarBodyJiaoMing(); long entireLengthOther = rgvProtocolE.getRgvPosDestination() - rgvProtocolE.getCarBodyJiaoMing() - avoidDistance - rgvProtocolB.getCarBodyKunPeng(); long benchmarkOther = trackBenchmark + rgvProtocolB.getCarBodyJiaoMing(); return new Long[][]{new Long[]{entireLength, benchmark}, new Long[]{entireLengthOther, benchmarkOther}}; } } public boolean avoidRange(Long avoid, Long[] range) { return avoid < range[0] && avoid > range[1]; }