src/main/java/com/zy/asrs/entity/BasDevpPosition.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/entity/StaDesc.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/core/model/CrnSlave.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/command/CrnCommand.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/protocol/CrnProtocol.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/SiemensCrnThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application-prod.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | 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/entity/StaDesc.java
@@ -69,6 +69,14 @@ private Integer crnNo; /** * 堆垛机号 */ @ApiModelProperty(value= "堆垛机号") @TableId(value = "LANE_NO", type = IdType.INPUT) @TableField("LANE_NO") private Integer laneNo; /** * 堆垛机站点 */ @ApiModelProperty(value= "堆垛机站点") @@ -301,5 +309,11 @@ return basWrkIotype.getIoDesc(); } public Integer getLaneNo() { return laneNo; } public void setLaneNo(Integer laneNo) { this.laneNo = laneNo; } } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -384,9 +384,28 @@ */ public void crnStnToOutStn() { for (CrnSlave crnSlave : slaveProperties.getCrn()) { // 获取堆垛机信息 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId()); CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol == null) { continue; } BasCrnp basCrnp = basCrnpService.selectById(crnSlave.getId()); if (basCrnp == null) { log.error("{}号堆垛机尚未在数据库进行维护!", crnSlave.getId()); continue; } if (!crnSlave.getId().equals(crnProtocol.getLaneNo())){ for (CrnSlave crnOther : slaveProperties.getCrn()) { if (crnOther.getId().equals(crnProtocol.getLaneNo())){ crnSlave.updateCrnInStn(crnOther); } } } // 遍历堆垛机出库站 for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) { List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", crnSlave.getId()).eq("crn_stn", crnStn.getStaNo())); List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnSlave.getId()).eq("LANE_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo())); // List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", crnSlave.getId()).eq("").eq("crn_stn", crnStn.getStaNo())); for (StaDesc staDesc : staDescs){ try{ // 获取堆垛机出库站信息 @@ -399,7 +418,7 @@ } if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) { // 查询工作档 TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnSlave.getId(), staDesc.getStnNo().toString()); TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnProtocol.getLaneNo(), staDesc.getStnNo().toString()); if (taskWrk == null) { continue; } @@ -452,6 +471,14 @@ continue; } if (!crn.getId().equals(crnProtocol.getLaneNo())){ for (CrnSlave crnOther : slaveProperties.getCrn()) { if (crnOther.getId().equals(crnProtocol.getLaneNo())){ crn.updateCrnInStn(crnOther); } } } // 库位移转 this.locToLoc(crn, crnProtocol); @@ -488,7 +515,7 @@ */ public void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol) throws IOException { for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) { List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", slave.getId()).eq("crn_stn", crnStn.getStaNo())); List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", slave.getId()).eq("LANE_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo())); for (StaDesc staDesc : staDescs) { boolean flag = false; // 获取堆垛机入库站信息 @@ -514,7 +541,7 @@ } // 获取工作状态为2(设备上走)的入库工作档 TaskWrk taskWrk = taskWrkMapper.selectPakIn(slave.getId(), staProtocol.getWorkNo().intValue(), staDesc.getStnNo().toString()); TaskWrk taskWrk = taskWrkMapper.selectPakIn(crnProtocol.getLaneNo(), staProtocol.getWorkNo().intValue(), staDesc.getStnNo().toString()); if(null == taskWrk) { continue; } @@ -525,7 +552,7 @@ } // 已经存在吊车执行任务时,则过滤 if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) { if (taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()) != null) { continue; } @@ -573,7 +600,8 @@ // 命令下发区 -------------------------------------------------------------------------- CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(staDesc.getCrnNo()); // 堆垛机编号 crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 crnCommand.setCrnNo(staDesc.getLaneNo()); // 堆垛机巷道编号 crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 crnCommand.setAckFinish((short) 0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 @@ -634,15 +662,17 @@ * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库 */ public void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol){ List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOut(slave.getId(), null); List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOut(crnProtocol.getLaneNo(), null); if (taskWrksInitial.size()==0){ return; } for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", slave.getId()).eq("crn_stn", crnStn.getStaNo())); List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", slave.getId()).eq("LANE_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo())); // List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", crnProtocol.getLaneNo()).eq("crn_stn", crnStn.getStaNo())); for (StaDesc staDesc : staDescs){ // 获取工作状态为11(生成出库ID)的出库工作档 List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(slave.getId(),staDesc.getStnNo().toString()); List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(crnProtocol.getLaneNo(),staDesc.getStnNo().toString()); for (TaskWrk taskWrk : taskWrks){ if (taskWrk == null) { continue; @@ -679,12 +709,13 @@ } // 已经存在吊车执行任务时,则过滤 if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) { if (taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()) != null) { break; } CrnCommand command = new CrnCommand(); command.setCrnNo(taskWrk.getCrnNo()); // 堆垛机编号 command.setCrnNo(slave.getId()); // 堆垛机编号 command.setLaneNo(crnProtocol.getLaneNo()); // 堆垛机编号 command.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 command.setAckFinish((short) 0); // 任务完成确认位 command.setTaskMode(CrnTaskModeType.PAKIN); // 任务模式 @@ -696,7 +727,7 @@ command.setDestinationPosZ(crnStn.getLev().shortValue()); // 目标库位层 command.setCommand((short)1); if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, command),false)) { log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(command)); log.error("堆垛机命令生成失败,堆垛机号={},巷道={},任务数据={}",slave.getId(), taskWrk.getCrnNo(), JSON.toJSON(command)); throw new CoolException("堆垛机命令生成失败"); }else{ try{ @@ -755,7 +786,7 @@ // 获取工作状态为11(生成出库ID)的移库工作档 List<TaskWrk> taskWrks = taskWrkMapper.selectList( new EntityWrapper<TaskWrk>() .eq("CRN_NO",slave.getId()) .eq("CRN_NO",crnProtocol.getLaneNo()) .eq("WRK_STS",11) .eq("IO_TYPE",3) .orderBy("IO_PRI",false)); @@ -775,7 +806,7 @@ } // 已经存在吊车执行任务时,则过滤 if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) { if (taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()) != null) { continue; } @@ -796,6 +827,7 @@ // 1.堆垛机开始移动 CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 crnCommand.setLaneNo(crnProtocol.getLaneNo()); // 堆垛机编号 crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 crnCommand.setAckFinish((short) 0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 @@ -863,12 +895,20 @@ CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol == null) { continue; } if (!crn.getId().equals(crnProtocol.getLaneNo())){ for (CrnSlave crnOther : slaveProperties.getCrn()) { if (crnOther.getId().equals(crnProtocol.getLaneNo())){ crn.updateCrnInStn(crnOther); } } } // 状态:等待确认 并且 任务完成位 = 1 if (!Cools.isEmpty(crnProtocol.getTaskFinish()) && crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { //获取入库待确认工作档 TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crn.getId(),crnProtocol.getTaskNo().intValue()); TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crnProtocol.getLaneNo(),crnProtocol.getTaskNo().intValue()); if (Cools.isEmpty(taskWrk)&&crnProtocol.getTaskNo() !=999) { log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo()); log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},巷道号={},工作号={}", crn.getId(),crnProtocol.getLaneNo(), crnProtocol.getTaskNo()); continue; } Thread.sleep(300); @@ -1211,7 +1251,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 +1263,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 +1305,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 +1339,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]; } src/main/java/com/zy/core/model/CrnSlave.java
@@ -51,4 +51,9 @@ } public void updateCrnInStn(CrnSlave crnSlave){ crnInStn = crnSlave.getCrnInStn(); crnOutStn = crnSlave.getCrnOutStn(); } } src/main/java/com/zy/core/model/command/CrnCommand.java
@@ -16,6 +16,7 @@ // 堆垛机号 private Integer crnNo = 0; private Integer laneNo = 0; // 任务完成确认位 private Short ackFinish = 0; src/main/java/com/zy/core/model/protocol/CrnProtocol.java
@@ -14,6 +14,7 @@ public class CrnProtocol { private Integer crnNo; private Integer laneNo; /** * 1 = 手动模式 src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -159,8 +159,11 @@ if (result.IsSuccess) { if (null == crnProtocol) { crnProtocol = new CrnProtocol(); crnProtocol.setCrnNo(slave.getId()); } crnProtocol.setCrnNo(slave.getId()); crnProtocol.setLaneNo(siemensNet.getByteTransform().TransInt32(result.Content, 0));//巷道号 crnProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0)); crnProtocol.setTaskNo(siemensNet.getByteTransform().TransInt16(result.Content, 2)); crnProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 4)); src/main/resources/application-prod.yml
@@ -1,7 +1,7 @@ wcs-slave: doubleDeep: true #双深 doubleDeep: false #双深 doubleLocs: 3,6,7,10,13 #双深库位排号 3,6,7,10,13 groupCount: 4 #一个堆垛机负责的货架排数 groupCount: 2 #一个堆垛机负责的货架排数 crn[0]: #堆垛机1 ip: 192.168.4.250 id: 1 @@ -22,6 +22,86 @@ bay: 1 lev: 1 devpPlcId: ${wcs-slave.devp[0].id} crn[1]: #堆垛机1 ip: 192.168.4.250 id: 2 slot: 0 demo: false rack: 0 offset: 2 #偏移量,当堆垛机站点列号=1时,偏移量=2 port: 102 crnOutStn[0]: #堆垛机出库站点 staNo: 101 row: 2 bay: 1 lev: 1 devpPlcId: ${wcs-slave.devp[0].id} crnInStn[0]: #堆垛机入库站点1 staNo: 100 row: 1 bay: 1 lev: 1 devpPlcId: ${wcs-slave.devp[0].id} crn[2]: #堆垛机1 ip: 192.168.4.250 id: 3 slot: 0 demo: false rack: 0 offset: 2 #偏移量,当堆垛机站点列号=1时,偏移量=2 port: 102 crnOutStn[0]: #堆垛机出库站点 staNo: 101 row: 2 bay: 1 lev: 1 devpPlcId: ${wcs-slave.devp[0].id} crnInStn[0]: #堆垛机入库站点1 staNo: 100 row: 1 bay: 1 lev: 1 devpPlcId: ${wcs-slave.devp[0].id} crn[3]: #堆垛机1 ip: 192.168.4.250 id: 4 slot: 0 demo: false rack: 0 offset: 2 #偏移量,当堆垛机站点列号=1时,偏移量=2 port: 102 crnOutStn[0]: #堆垛机出库站点 staNo: 101 row: 2 bay: 1 lev: 1 devpPlcId: ${wcs-slave.devp[0].id} crnInStn[0]: #堆垛机入库站点1 staNo: 100 row: 1 bay: 1 lev: 1 devpPlcId: ${wcs-slave.devp[0].id} crn[4]: #堆垛机1 ip: 192.168.4.250 id: 5 slot: 0 demo: false rack: 0 offset: 2 #偏移量,当堆垛机站点列号=1时,偏移量=2 port: 102 crnOutStn[0]: #堆垛机出库站点 staNo: 101 row: 2 bay: 1 lev: 1 devpPlcId: ${wcs-slave.devp[0].id} crnInStn[0]: #堆垛机入库站点1 staNo: 100 row: 1 bay: 1 lev: 1 devpPlcId: ${wcs-slave.devp[0].id} barcode[0]: #条码扫描仪1 port: 51236 ip: 10.10.10.52 src/main/resources/application.yml
@@ -1,5 +1,5 @@ server: port: 8080 port: 8083 servlet: context-path: /@pom.build.finalName@