pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/entity/param/CarryParam.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/cache/TaskProtocolCache.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/RgvThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/SiemensDevpThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application-prod.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
pom.xml
@@ -61,12 +61,12 @@ <!-- </dependency>--> <!-- 显式排除slf4j-simple --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.30</version> <scope>provided</scope> <!-- 或直接删除该依赖 --> </dependency> <!-- <dependency>--> <!-- <groupId>org.slf4j</groupId>--> <!-- <artifactId>slf4j-simple</artifactId>--> <!-- <version>1.7.30</version>--> <!-- <scope>provided</scope> <!– 或直接删除该依赖 –>--> <!-- </dependency>--> <dependency> <groupId>com.dameng</groupId> <artifactId>DmJdbcDriver8</artifactId> src/main/java/com/zy/asrs/entity/param/CarryParam.java
@@ -51,7 +51,6 @@ // String locNo = String.format("%02d", ) + // String.format("%03d", split[3]) + // String.format("%02d", split[4]); split[3] = split[3]+1; return split[2]+"0"+split[3]+split[4]; } else { return point; src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -200,6 +200,25 @@ continue; } String barcode = barcodeThread.getBarcode(); int signI = 0; while (signI<6){ Thread.sleep(200); signI = signI +1; // 获取条码扫描仪信息 if (Cools.isEmpty(barcode) || barcode.equals("000000")) { devpThread.setErrorDev(staProtocol.getSiteId(), "循环次数:"+signI+";扫码值:"+barcode); BarcodeThread barcodeThreadO = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode()); if (barcodeThreadO == null) { continue; } barcode = barcodeThreadO.getBarcode(); } else { break; } } if (!Cools.isEmpty(barcode) && !barcode.equals("99999999") && !barcode.equals("000000")) { // 请求wms接口,获取工作号和目标库位 ToWmsDTO toWmsDTO = new ToWmsDTO(staProtocol.getSiteId(),staProtocol.getGrossWt(),barcode, workNo == 9998? 0 : 1); @@ -293,7 +312,7 @@ staProtocol.setWorkNo(9999); staProtocol.setStaNo(inSta.getBackSta()); devpThread.setPakMk(staProtocol.getSiteId(), false); devpThread.setErrorDev(staProtocol.getSiteId(), jsonObject.getString("msg")); devpThread.setErrorDev(staProtocol.getSiteId(), jsonObject.getString("message")); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); } } else { @@ -1664,6 +1683,8 @@ if (!sign && staList.size()==1){ if (rgvOtherIDLEOther(rgvSlave)){ if (!rgvOtherIDLE(rgvSlave,staList.get(0))){ System.out.println("空闲就近跳过==="+rgvSlave.getId()+"==="); sign=true; } } @@ -1675,6 +1696,8 @@ Integer outStaNo = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()); for (RgvSlave.RgvStn rgvSuper : rgvSlave.getRgvSuperSta()){ if (rgvSuper.getStaNo().equals(outStaNo)){ System.out.println("空闲就近跳过后因最远再次执行==="+rgvSlave.getId()+"==="); sign=false; break; } @@ -1696,6 +1719,9 @@ if (taskWrk != null) { BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()))); if (RouteUtils.CheckIfItIsWithinTheRange(rangeList, basDevpPosition.getPlcPosition(), basDevpPositions, itSmall)) { System.out.println("全范围执行==="+rgvSlave.getId()+"==="+taskWrk); System.out.println("全范围执行==="+rgvSlave.getId()+"==="+JSON.toJSONString(belongToRange)); sign = taskGenerate(rgvSlave, rgvStn, 0); } } @@ -1717,6 +1743,9 @@ Integer outStaNo = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()); for (RgvSlave.RgvStn rgvStnOut : rgvSlave.getRgvOutSta()) { if (rgvStnOut.getStaNo().equals(outStaNo)) { System.out.println("筛选范围内取货任务==="+rgvSlave.getId()+"==="+taskWrk); System.out.println("筛选范围内取货任务==="+rgvSlave.getId()+"==="+JSON.toJSONString(belongToRange)); sign = taskGenerate(rgvSlave, rgvStn, 0); break; } @@ -1734,12 +1763,16 @@ if (!sign && staList.size()==1){ if (rgvOtherIDLEOther2(rgvSlave)){ if (!rgvOtherIDLE2(rgvSlave,staList.get(0))){ System.out.println("运行就近跳过==="+rgvSlave.getId()+"==="); sign=true; } } } if (!sign) { if (!sign && staList.size()>1) { for (Integer staNoNow : rangeList) { for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { if (rgvStn.getStaNo().equals(staNoNow)) { @@ -1747,6 +1780,9 @@ if (taskWrk != null) { BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()))); if (RouteUtils.CheckIfItIsWithinTheRange(rangeList, basDevpPosition.getPlcPosition(), basDevpPositions, itSmall)) { System.out.println("筛选半边范围内任务==="+rgvSlave.getId()+"==="+taskWrk); System.out.println("筛选半边范围内任务==="+rgvSlave.getId()+"==="+JSON.toJSONString(belongToRange)); sign = taskGenerate(rgvSlave, rgvStn, 0); } } @@ -1757,7 +1793,34 @@ break; } } }else if (!sign && staList.size()==1){ BasDevpPosition basDevpPosition1 = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", staList.get(0))); if (Math.abs(basDevpPosition1.getPlcPosition()- rgvProtocol.getRgvPos())<rgvProtocol.getCarBodyJiaoMing()+rgvProtocol.getCarBodyKunPeng() + avoidDistance*2){ for (Integer staNoNow : rangeList) { for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { if (rgvStn.getStaNo().equals(staNoNow)) { TaskWrk taskWrk = deviceDetection(rgvStn); if (taskWrk != null) { BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()))); if (RouteUtils.CheckIfItIsWithinTheRange(rangeList, basDevpPosition.getPlcPosition(), basDevpPositions, itSmall)) { System.out.println("筛选半边范围内任务==="+rgvSlave.getId()+"==="+taskWrk); System.out.println("筛选半边范围内任务==="+rgvSlave.getId()+"==="+JSON.toJSONString(belongToRange)); sign = taskGenerate(rgvSlave, rgvStn, 0); } } break; } } if (sign) { break; } } } } if (!sign && staList.size()>1) { // 半边区域内取货任务 for (Integer staNoNow : rangeList) { @@ -1768,6 +1831,9 @@ Integer outStaNo = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()); for (RgvSlave.RgvStn rgvStnOut : rgvSlave.getRgvOutSta()) { if (rgvStnOut.getStaNo().equals(outStaNo)) { System.out.println("筛选半边范围取货任务==="+rgvSlave.getId()+"==="+taskWrk); System.out.println("筛选半边范围取货任务==="+rgvSlave.getId()+"==="+JSON.toJSONString(belongToRange)); sign = taskGenerate(rgvSlave, rgvStn, 0); break; } src/main/java/com/zy/core/cache/TaskProtocolCache.java
@@ -155,4 +155,32 @@ } } /** * 查询是否有可执行任务 */ public TaskProtocol getNowPosRunTask2() { // lock.readLock().lock(); // 加读锁 try { for (TaskProtocol task : cache.values()) { if (task.getTaskStatus()==1) { return task; } } for (TaskProtocol task : cache.values()) { if (task.getTaskStatus()==2) { return task; } } for (TaskProtocol task : cache.values()) { if (task.getTaskStatus()==3) { return task; } } return null; // 返回副本 } finally { // lock.readLock().unlock(); // 释放读锁 } } } src/main/java/com/zy/core/thread/RgvThread.java
@@ -94,7 +94,7 @@ new Thread(this::taskIssued).start(); // 启动漫游线程 // new Thread(this::taskWalkIssued).start(); new Thread(this::taskWalkIssued).start(); // new Thread(this::taskWalkIssued2).start(); // 启动任务完成线程 @@ -104,6 +104,7 @@ private void rgvConnect() { while (true) { try { Thread.sleep(1000); if(!connectRgv){ try { connectRgv = this.connect(); @@ -249,40 +250,40 @@ /** * 漫游 */ // private void taskWalkIssued() { // while (true) { // try { // // 休眠 1 秒 // Thread.sleep(100); // // if (!deviceDetection()) { // continue; // } // RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); // if (rgvTaskProtocol == null) { // initRgv(); // rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); // } // if (rgvTaskProtocol.getAvoid() != 1) { // continue; // } // TaskProtocol issued = new TaskProtocol(); // issued.setTaskNo(32222L); // issued.setTargetPosition(rgvTaskProtocol.getAvoidingTheDestination()); // issued.setTaskStatus(1); // issued.setDirection(true); // write(issued); // rgvTaskProtocol.setAvoid(0); // // Thread.sleep(200); // RgvTaskCache.updateRgvStatus(rgvTaskProtocol); // // } catch (Exception e) { // log.error("RGV行走任务下发线程异常!!!" + e.getMessage()); //// e.printStackTrace(); // } // } // } private void taskWalkIssued() { while (true) { try { // 休眠 1 秒 Thread.sleep(100); if (!deviceDetection()) { continue; } RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); if (rgvTaskProtocol == null) { initRgv(); rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); } if (rgvTaskProtocol.getAvoid() != 1) { continue; } TaskProtocol issued = new TaskProtocol(); issued.setTaskNo(32222L); issued.setTargetPosition(rgvTaskProtocol.getAvoidingTheDestination()); issued.setTaskStatus(1); issued.setDirection(true); write(issued); rgvTaskProtocol.setAvoid(0); Thread.sleep(200); RgvTaskCache.updateRgvStatus(rgvTaskProtocol); } catch (Exception e) { log.error("RGV行走任务下发线程异常!!!" + e.getMessage()); // e.printStackTrace(); } } } /** * 任务下发 @@ -308,7 +309,9 @@ rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50; rgvRun.setRgvNo(slave.getOtherId()); RgvRunCache.updateRgvStatus(rgvRun); RgvErrCache.updateRgvErr(slave.getId(),errorRgv); if (!errorRgv.equals("无")){ RgvErrCache.updateRgvErr(slave.getId(),errorRgv); } continue; } @@ -333,20 +336,6 @@ continue; } if (rgvTaskProtocol.getAvoid() != 0) { if (rgvTaskProtocol.getAvoid() == 1) { TaskProtocol issued = new TaskProtocol(); issued.setTaskNo(32222L); issued.setTargetPosition(rgvTaskProtocol.getAvoidingTheDestination()); issued.setTaskStatus(1); issued.setDirection(true); write(issued); RgvErrCache.updateRgvErr(slave.getId()); rgvTaskProtocol.setAvoid(0); // try{Thread.sleep(50L);} catch (Exception e){} RgvTaskCache.updateRgvStatus(rgvTaskProtocol); } rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50; rgvRun.setRgvNo(slave.getOtherId()); RgvRunCache.updateRgvStatus(rgvRun); @@ -494,7 +483,7 @@ return false; } if (!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE) && !rgvProtocol.getStatusType().equals(RgvStatusType.ROAM)) { errorRgv = slave.getId()+"号小车非空闲"; errorRgv = "无"; return false; } if ( (Math.abs(rgvProtocol.getRgvPos() - rgvProtocol.getRgvPosDestination())>100) && !rgvProtocol.getStatusType().equals(RgvStatusType.ROAM)) { @@ -534,6 +523,10 @@ public boolean otherRgvAvoid(Long targetPosition) { RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId()); long onePos = Math.abs(targetPosition - rgvProtocol.getRgvPos()); if (onePos<50){ return true; } RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); @@ -596,6 +589,66 @@ return false; } } TaskProtocol nowPosRunTask2 = taskProtocolCacheOther.getNowPosRunTask2(); if (!Cools.isEmpty(nowPosRunTask2)){ boolean signNowPosRun = true; boolean signNowPosA = true; if (targetPosition - rgvProtocol.getRgvPos()>0){ if (nowPosRunTask2.getTargetPosition() - rgvProtocolOther.getRgvPos()>0){ if (rgvProtocol.getRgvPos()>rgvProtocolOther.getRgvPos()){ signNowPosA = false; signNowPosRun = false; } } } else if (targetPosition - rgvProtocol.getRgvPos()<0){ if (nowPosRunTask2.getTargetPosition() - rgvProtocolOther.getRgvPos()<0){ if (rgvProtocol.getRgvPos()<rgvProtocolOther.getRgvPos()){ signNowPosA = false; signNowPosRun = false; } } } if (signNowPosA){ if (nowPosRunTask2.getTaskStatus()==3){ long twoPos = Math.abs(nowPosRunTask2.getTargetPosition() - rgvProtocolOther.getRgvPos()); if (Math.abs(onePos - twoPos)>100){ if (onePos-50>twoPos+50){ DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, nowPosRunTask2.getTargetPositionStaNoPlcId()); StaProtocol staProtocol = devpThread.getStation().get(nowPosRunTask2.getTargetPositionStaNo()); if (staProtocol == null ) { signNowPosRun =false; } if (signNowPosRun){ // 判断是否满足入库条件 if (staProtocol.isAutoing() && !staProtocol.isLoading() ){ errorRgv = slave.getOtherId()+"号RGV等待作业..."; return false; } } signNowPosRun =false; } } } else { long twoPos = Math.abs(nowPosRunTask2.getTargetPosition() - rgvProtocolOther.getRgvPos()); if (twoPos<100){ errorRgv = slave.getOtherId()+"号RGV等待作业..."; return false; } if (Math.abs(onePos - twoPos)>100){ if (onePos-50>twoPos+50){ signNowPosRun =false; } } } } if (signNowPosRun){ errorRgv = slave.getOtherId()+"号RGV等待作业..."; return false; } } long avoid = targetPosition + rgvProtocol.getCarBodyKunPeng() + avoidDistance + rgvProtocolOther.getCarBodyJiaoMing(); if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[0])) { log.error("RGV行走超出范围!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -50,6 +50,8 @@ add(1008);add(1009);add(1010);add(1011);add(1012);add(1013);add(1014);add(1015); add(1016);add(1017);add(1018);add(1019);add(1020);add(1021);add(1022);add(1023); }}; private boolean connectDev = false; /** * 条码数量 @@ -82,36 +84,53 @@ @Override @SuppressWarnings("InfiniteLoopStatement") public void run() { connect(); while (true) { connectDev = connect(); while(!connectDev){ try { int step = 1; Task task = MessageQueue.poll(SlaveType.Devp, slave.getId()); if (task != null) { step = task.getStep(); } switch (step) { // 读数据 case 1: read(); break; // 写数据 ID+目标站 case 2: write((StaProtocol)task.getData()); break; default: break; } // 心跳 // heartbeat(); Thread.sleep(400); } catch (Exception e) { e.printStackTrace(); } connectDev = this.connect(); Thread.sleep(100); } catch (Exception e){ } } // 启动线程自动重连 new Thread(this::devConnect).start(); new Thread(this::readStatusDev).start(); new Thread(this::writeStatusDev).start(); } private void devConnect() { while (true) { try { Thread.sleep(1000); if(!connectDev){ try { connectDev = this.connect(); Thread.sleep(100); } catch (Exception e){ } } } catch (Exception e) { log.info("dev连接失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); // log.error("rgv连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); try{ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("dev", slave.getId(), "rgv连接失败"+e.getMessage()); } catch (Exception e2){ // log.error("e2:"+e2.getMessage()); } initSite(); // e.printStackTrace(); } } } /** * 初始化站点状态 */ @@ -161,6 +180,61 @@ return result; } private void writeStatusDev() { while (true) { try { int step = 1; Task task = MessageQueue.poll(SlaveType.Devp, slave.getId()); if (task != null) { step = task.getStep(); } switch (step) { // 读数据 case 1: // read(); break; // 写数据 ID+目标站 case 2: write((StaProtocol)task.getData()); break; default: break; } // 心跳 // heartbeat(); Thread.sleep(200); } catch (Exception e) { // e.printStackTrace(); } } } private void readStatusDev() { while (true) { try { Thread.sleep(50); // System.out.println("读线程"+ slave.getId()); read(); } catch (Exception e) { log.error("RGV数据读取线程异常!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); try{ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV数据读取线程异常"+e.getMessage()); } catch (Exception e2){ // log.error("e2:"+e2.getMessage()); } initSite(); // e.printStackTrace(); } } } /** * 读取状态 ====> 整块plc */ @@ -191,7 +265,7 @@ staProtocol.setInEnable(status[2]); // 可入 // staProtocol.setInEnable(true); // 可入 staProtocol.setOutEnable(status[3]);// 可出 staProtocol.setOutEnable(true);// 可出 // staProtocol.setOutEnable(true);// 可出 staProtocol.setEmptyMk(status[4]); // 空板信号 staProtocol.setFullPlt(status[5]); // 满托盘 staProtocol.setHigh(status[6]); // 高库位 @@ -212,7 +286,7 @@ } //条码 Thread.sleep(200); // Thread.sleep(50); OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB400.100.0",(short) (barcodeSize*8)); if (result2.IsSuccess) { for (int i = 0; i < barcodeSize; i++) { @@ -225,7 +299,7 @@ } //条码 Thread.sleep(200); // Thread.sleep(50); int[] staW = new int[]{1004,1014,1020}; OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB400.148.0",(short) (staW.length*4)); src/main/resources/application-prod.yml
@@ -280,7 +280,7 @@ id: 2 ip: 27.172.2.122 port: 5005 staNo: 1022 staNo: 1020 devpPlcId: 1 crn[0]: #堆垛机1 ip: 27.172.2.10