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/controller/CrnController.java
@@ -303,6 +303,7 @@ } } vo.setLaneNo(crnProtocol.getLaneNo()); // vo.setErrorCrn(crnProtocol.getErrCrn()); // vo.setXspeed(crnProtocol.getXSpeed()); // 走行速度(m/min) vo.setYspeed(crnProtocol.getYSpeed()); // 升降速度(m/min) vo.setZspeed(crnProtocol.getZSpeed()); // 叉牙速度(m/min) src/main/java/com/zy/asrs/controller/OpenController.java
@@ -551,13 +551,14 @@ basRgvWmsParam.setStatusType(rgvStatus.getStatusType().desc); basRgvWmsParam.setSteNo(rgvSlave.getId()); basRgvWmsParam.setSteErr(rgvStatus.getAlarm().longValue()); try{ BasRgvErr basRgvErr = basRgvErrService.selectById((long)rgvStatus.getAlarm$()); basRgvWmsParam.setSteErrM(basRgvErr.getErrName()); } catch (Exception e){ basRgvWmsParam.setSteErrM("未知异常"); } basRgvWmsParam.setSteErrM(rgvStatus.getAlarmM()); // try{ // BasRgvErr basRgvErr = basRgvErrService.selectById((long)rgvStatus.getAlarm$()); // // basRgvWmsParam.setSteErrM(basRgvErr.getErrName()); // } catch (Exception e){ // basRgvWmsParam.setSteErrM("未知异常"); // } if (rgvStatus.getMode()!=1){ basRgvWmsParam.setSteErr(999L); basRgvWmsParam.setSteErrM("非自动!!!"); src/main/java/com/zy/asrs/controller/RgvController.java
@@ -2,9 +2,11 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.annotations.ManagerAuth; import com.core.common.Cools; import com.core.common.R; import com.zy.asrs.entity.BasDevpPosition; import com.zy.asrs.service.BasDevpPositionService; import com.zy.core.cache.RgvErrCache; import com.zy.core.cache.RgvStatusCache; import com.zy.core.cache.SlaveConnection; import com.zy.core.cache.TaskProtocolCache; @@ -46,6 +48,7 @@ map2.put("rgvPos", rgvProtocol.getRgvPos()); map2.put("rgvPosDestination", rgvProtocol.getRgvPosDestination()); map2.put("loaded", rgvProtocol.getLoaded().equals((short)-1)? "未知":rgvProtocol.getLoaded()==1? "有物":"无物"); map2.put("errorRgv", RgvErrCache.getErrorDev(rgvProtocol.getRgvNo())); res.add(map2); } return R.ok().add(res); @@ -113,6 +116,9 @@ } if (rgvPosDestination == null || rgvPosDestination == 0){ BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNoPut)); if (Cools.isEmpty(basDevpPosition)){ return R.error("目标站点不存在"); } rgvPosDestination = basDevpPosition.getPlcPosition(); } RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo); @@ -168,6 +174,9 @@ } BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNoPut)); if (Cools.isEmpty(basDevpPosition)){ return R.error("目标站点不存在"); } //执行 issuedPut.setTaskNo(Long.valueOf(taskNo)); issuedPut.setTaskStatus(3); @@ -210,9 +219,14 @@ } BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNoTake)); if (Cools.isEmpty(basDevpPosition)){ return R.error("取货站点不存在"); } //执行 issuedTake.setTaskNo(Long.valueOf(taskNo)); issuedTake.setTaskStatus(2); issuedTake.setTargetPositionStaNo(basDevpPosition.getDevNo()); issuedTake.setTargetPositionStaNoPlcId(basDevpPosition.getPlcId()); issuedTake.setTaskNoDirection(issuedTake.gettaskNoDirection$(issuedTake.getTaskNo(), issuedTake.getTaskStatus())); issuedTake.setTargetPosition(basDevpPosition.getPlcPosition()); issuedTake.setIsRunning(1); @@ -255,6 +269,9 @@ } BasDevpPosition basDevpPositionTake = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNoTake)); if (Cools.isEmpty(basDevpPositionTake)){ return R.error("取货站点不存在"); } //执行 issuedTake.setTaskNo(Long.valueOf(taskNo)); issuedTake.setTaskStatus(2); @@ -266,6 +283,9 @@ issuedTake.setDirection(basDevpPositionTake.getRgvSign()==1); BasDevpPosition basDevpPositionPut = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNoPut)); if (Cools.isEmpty(basDevpPositionPut)){ return R.error("目标站点不存在"); } //执行 issuedPut.setTaskNo(Long.valueOf(taskNo)); issuedPut.setTaskStatus(3); src/main/java/com/zy/asrs/controller/SiteController.java
@@ -113,6 +113,8 @@ vo.setStaNo(staProtocol.getStaNo()); // 目标站 // vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "低" : "高"); //高低库位 vo.setLocType1(devp.getDevNo()==102 ? "高" : "低"); vo.setWeight(staProtocol.getGrossWt().toString()); vo.setErrorDev(staProtocol.getErrorDev()); } return R.ok().add(list); } src/main/java/com/zy/asrs/domain/vo/CrnListVo.java
@@ -112,6 +112,7 @@ // 可出 private String outEnable; private String errorCrn; public void setXspeed(Float xspeed) { this.xspeed = Utils.scale(xspeed); src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java
@@ -37,5 +37,7 @@ //高低库位 private String locType1 = "-"; private String weight = "-"; private String errorDev = "-"; private String car = "-"; } src/main/java/com/zy/asrs/entity/param/CarryParam.java
@@ -51,7 +51,7 @@ // 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
@@ -128,7 +128,7 @@ // 尺寸检测异常 boolean back = false; String errMsg = ""; String errMsg = "-"; if (staProtocol.getGrossWt()>=600){ errMsg = "超重"; back = true; @@ -177,6 +177,7 @@ staProtocol.setWorkNo(9999); staProtocol.setStaNo(inSta.getBackSta()); devpThread.setPakMk(staProtocol.getSiteId(), false); devpThread.setErrorDev(staProtocol.getSiteId(), errMsg); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo)); if (taskWrk != null) { @@ -217,6 +218,7 @@ staProtocol.setWorkNo(taskWrk1.getWrkNo()); staProtocol.setStaNo(staProtocol.getSiteId()); devpThread.setPakMkWalk(staProtocol.getSiteId(), false); devpThread.setErrorDev(staProtocol.getSiteId(), errMsg); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); } } @@ -252,6 +254,7 @@ staProtocol.setStaNo(inSta.getBackSta()); devpThread.setPakMk(staProtocol.getSiteId(), false); devpThread.setPakMkWalk(staProtocol.getSiteId(), false); devpThread.setErrorDev(staProtocol.getSiteId(), e.getMessage()); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); continue; } @@ -270,6 +273,8 @@ if (!Cools.isEmpty(jsonObject.getInteger("code")) && jsonObject.getInteger("code").equals(200)) { try { devpThread.setPakMk(staProtocol.getSiteId(), false); devpThread.setErrorDev(staProtocol.getSiteId(), "上报成功等待任务"); } catch (Exception e) { // 退回 log.error("扫码检测程序异常" + inSta.getStaNo() + errMsg); @@ -278,9 +283,18 @@ staProtocol.setWorkNo(9999); staProtocol.setStaNo(inSta.getBackSta()); devpThread.setPakMk(staProtocol.getSiteId(), false); devpThread.setErrorDev(staProtocol.getSiteId(), "上报成功锁定失败"); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); } } else { // 退回 staProtocol.setWorkNo(9999); staProtocol.setStaNo(inSta.getBackSta()); devpThread.setPakMk(staProtocol.getSiteId(), false); devpThread.setErrorDev(staProtocol.getSiteId(), jsonObject.getString("msg")); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); } } else { // 退回 @@ -289,6 +303,7 @@ staProtocol.setWorkNo(9999); staProtocol.setStaNo(inSta.getBackSta()); devpThread.setPakMk(staProtocol.getSiteId(), false); devpThread.setErrorDev(staProtocol.getSiteId(), "扫码入库扫码失败!!!扫码值:"+barcode); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo)); if (taskWrk != null) { @@ -558,6 +573,7 @@ staProtocol.setWorkNo(taskWrk1.getWrkNo()); staProtocol.setStaNo(BarcodeUtils.getStaNo(staProtocol.getSiteId())); devpThread.setPakMkWalk(staProtocol.getSiteId(), false); devpThread.setErrorDev(staProtocol.getSiteId(), "-"); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); Date now = new Date(); @@ -721,8 +737,19 @@ crnProtocol.setLastIo("O"); } } } else { if (crnProtocol.getModeType() == CrnModeType.AUTO && crnProtocol.getStatusType() == CrnStatusType.IDLE){ if (crnProtocol.getTaskNo() != 0){ CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "工作号不为0"); } if (crnProtocol.getLoaded() != 0){ CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "载货台有物"); } if (crnProtocol.getForkPos() != 0){ CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "货叉位置不在中位"); } } } } } @@ -749,7 +776,8 @@ log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); continue; } if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable() if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 // && staProtocol.isInEnable() && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) { flag = true; } @@ -764,12 +792,20 @@ } // 堆垛机控制过滤 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE)) { devpThread.setErrorDev(staProtocol.getSiteId(), "堆垛机非空闲"); continue; } if (crnProtocol.getTaskNo() != 0) { devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机工作号不为0"); CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "工作号不为0"); continue; } // 已经存在吊车执行任务时,则过滤 if (taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()) != null) { devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机存在吊车任务"); CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "堆垛机存在执行中吊车任务"); continue; } @@ -822,18 +858,25 @@ crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 crnCommand.setAckFinish((short) 0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 crnCommand.setSourcePosX(crnStn.getRow().shortValue()); // 源库位列 crnCommand.setSourcePosY(crnStn.getBay().shortValue()); // 源库位层 crnCommand.setSourcePosZ(crnStn.getLev().shortValue()); // 源库位排 crnCommand.setSourcePosX(crnStn.getRow().shortValue()); // 源库位排 crnCommand.setSourcePosY(crnStn.getBay().shortValue()); // 源库位列 crnCommand.setSourcePosZ(crnStn.getLev().shortValue()); // 源库位层 crnCommand.setDestinationPosX(Utils.getRowShort(taskWrk.getTargetPoint())); // 目标库位列 crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint())); // 目标库位层 int bay1 = Utils.getBayShort(taskWrk.getTargetPoint()) + 1; crnCommand.setDestinationPosY((short)bay1); // 目标库位层 crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint())); // 目标库位排 // crnCommand.setCommand((short) 1); if (!MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, crnCommand))) { log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机命令生成失败"); CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "运行命令下发失败"); throw new CoolException("堆垛机命令生成失败"); } else { try { devpThread.setErrorDev(staProtocol.getSiteId(), "-"); CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "-"); taskWrkService.updateById(taskWrk); } catch (Exception e) { log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", taskWrk.getWrkNo()); @@ -922,12 +965,21 @@ // 命令下发区 -------------------------------------------------------------------------- // 堆垛机控制过滤 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { break; if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE)) { devpThread.setErrorDev(staProtocol.getSiteId(), "堆垛机非空闲"); continue; } if (crnProtocol.getTaskNo() != 0) { devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机工作号不为0"); CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "工作号不为0"); continue; } // 已经存在吊车执行任务时,则过滤 if (taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()) != null) { devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机存在吊车任务"); CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "堆垛机存在执行中吊车任务"); break; } @@ -938,14 +990,17 @@ command.setAckFinish((short) 0); // 任务完成确认位 command.setTaskMode(CrnTaskModeType.PAKIN); // 任务模式 command.setSourcePosX(Utils.getRowShort(taskWrk.getStartPoint())); // 源库位排 command.setSourcePosY(Utils.getBayShort(taskWrk.getStartPoint())); // 源库位列 int bayS = Utils.getBayShort(taskWrk.getStartPoint()) + 1; command.setSourcePosY((short)bayS); // 源库位列 command.setSourcePosZ(Utils.getLevShort(taskWrk.getStartPoint())); // 源库位层 command.setDestinationPosX(crnStn.getRow().shortValue()); // 目标库位排 command.setDestinationPosY(crnStn.getBay().shortValue()); // 目标库位列 command.setDestinationPosZ(crnStn.getLev().shortValue()); // 目标库位层 command.setCommand((short) 1); // command.setCommand((short) 1); if (!MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command))) { log.error("堆垛机命令生成失败,堆垛机号={},巷道={},任务数据={}", slave.getId(), taskWrk.getCrnNo(), JSON.toJSON(command)); devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机命令生成失败"); CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "运行命令下发失败"); throw new CoolException("堆垛机命令生成失败"); } else { try { @@ -955,6 +1010,9 @@ taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id); taskWrk.setModiTime(now); taskWrk.setExecuteTime(now); devpThread.setErrorDev(staProtocol.getSiteId(), "-"); CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "-"); if (taskWrkMapper.updateById(taskWrk) == 0) { log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo()); } @@ -991,6 +1049,19 @@ } catch (Exception e) { log.error("wcs派发出库任务上报wms失败", JSON.toJSONString(taskWrk)); // throw new CoolException("wcs派发入库任务上报wms失败"); } } } else { CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "-"); if (staProtocol.isAutoing()){ if (staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")){ CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "能出:未打开"); } if (staProtocol.getWorkNo() == 0){ CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "工作号不为0"); } if (staProtocol.isOutEnable()){ CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "没有可出"); } } } @@ -1051,10 +1122,12 @@ crnCommand.setAckFinish((short) 0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 crnCommand.setSourcePosX(Utils.getRowShort(taskWrk.getStartPoint())); // 源库位排 crnCommand.setSourcePosY(Utils.getBayShort(taskWrk.getStartPoint())); // 源库位列 int bayS = Utils.getBayShort(taskWrk.getStartPoint()) + 1; crnCommand.setSourcePosY((short)bayS); // 源库位列 crnCommand.setSourcePosZ(Utils.getLevShort(taskWrk.getStartPoint())); // 源库位层 crnCommand.setDestinationPosX(Utils.getRowShort(taskWrk.getTargetPoint())); // 目标库位排 crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint())); // 目标库位列 int bayE = Utils.getBayShort(taskWrk.getTargetPoint()) + 1; crnCommand.setDestinationPosY((short)bayE); // 目标库位列 crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint())); // 目标库位层 // crnCommand.setCommand((short) 1); if (!MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, crnCommand))) { @@ -1440,7 +1513,51 @@ } return true; } public boolean rgvOtherIDLEOther2(RgvSlave slave) { RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getOtherId()); RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getOtherId()); if (rgvProtocol == null || rgvTaskProtocol == null) { return false; } if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) || rgvProtocol.getRgvPos().equals(0L) || rgvTaskProtocol.getAvoid() == -1) { return false; } if (rgvProtocol.getLoaded()!=0) { return false; } return true; } public boolean rgvOtherIDLE(RgvSlave slave,Integer staNo) { RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId()); RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); if (rgvProtocol == null || rgvTaskProtocol == null) { return false; } if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) || rgvProtocol.getRgvPos().equals(0L) || rgvTaskProtocol.getAvoid() == -1 || ((!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE) || (Math.abs(rgvProtocol.getRgvPos() - rgvProtocol.getRgvPosDestination())>100)) && !rgvProtocol.getStatusType().equals(RgvStatusType.ROAM))) { return false; } RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); if (rgvProtocolOther == null) { return true; } if (rgvProtocolOther.statusEnable) { BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", staNo)); if (Math.abs(basDevpPosition.getPlcPosition()-rgvProtocol.getRgvPos()) >= Math.abs(basDevpPosition.getPlcPosition()-rgvProtocolOther.getRgvPos())){ return false; } } return true; } public boolean rgvOtherIDLE2(RgvSlave slave,Integer staNo) { RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId()); RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); @@ -1477,7 +1594,7 @@ // 判断是否满足取货条件 if (staProtocol.isAutoing() // && staProtocol.isLoading() && staProtocol.isStaOk() // && staProtocol.isStaOk() && staProtocol.getWorkNo() != 0) { TaskWrk taskWrk = taskWrkService.selectByWrkNo(staProtocol.getWorkNo()); if (taskWrk != null) { @@ -1614,6 +1731,14 @@ } } if (!sign && staList.size()==1){ if (rgvOtherIDLEOther2(rgvSlave)){ if (!rgvOtherIDLE2(rgvSlave,staList.get(0))){ sign=true; } } } if (!sign) { for (Integer staNoNow : rangeList) { for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { @@ -1633,7 +1758,7 @@ } } } if (!sign) { if (!sign && staList.size()>1) { // 半边区域内取货任务 for (Integer staNoNow : rangeList) { for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { @@ -1656,26 +1781,26 @@ } } } if (!sign) { // 半边区域内放货任务 for (Integer staNoNow : rangeListOther) { 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)) { sign = taskGenerate(rgvSlave, rgvStn, 0); } } break; } } if (sign) { break; } } } // if (!sign) { // // 半边区域内放货任务 // for (Integer staNoNow : rangeListOther) { // 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)) { // sign = taskGenerate(rgvSlave, rgvStn, 0); // } // } // break; // } // } // if (sign) { // break; // } // } // } } else { //可用区域就近取货 //就近排序 src/main/java/com/zy/core/DevpThread.java
@@ -11,5 +11,6 @@ void setPakMk(Integer siteId, boolean pakMk); void setPakMkWalk(Integer siteId, boolean pakMkWalk); void setGrossWt(Integer siteId, Double grossWt); void setErrorDev(Integer siteId, String msgErr); } src/main/java/com/zy/core/cache/CrnErrCache.java
New file @@ -0,0 +1,101 @@ package com.zy.core.cache; import com.zy.core.model.protocol.CrnErrProtocol; import com.zy.core.model.protocol.RgvErrProtocol; import java.util.concurrent.ConcurrentHashMap; /** * Created by IX on 2025/02/21 */ public class CrnErrCache { // 本地缓存,键为 currentPosition,值为 DeviceStatus private static final ConcurrentHashMap<Integer, CrnErrProtocol> cache = new ConcurrentHashMap<>(); /** * 更新设备状态 */ public static void updateCrnStatus(CrnErrProtocol status) { try { cache.put(status.getCrnNo(), status); } finally { } } /** * 更新设备状态 */ public static void updateCrnErr(Integer crnNo,String error) { try { CrnErrProtocol crnErrProtocol = cache.get(crnNo); if (crnErrProtocol == null){ crnErrProtocol = new CrnErrProtocol(); crnErrProtocol.setCrnNo(crnNo); } if (!crnErrProtocol.getError().equals(error)){ crnErrProtocol.setError(error); cache.put(crnErrProtocol.getCrnNo(), crnErrProtocol); } } finally { } } /** * 更新设备状态 */ public static void updateCrnErr(Integer crnNo) { try { CrnErrProtocol crnErrProtocol = cache.get(crnNo); if (crnErrProtocol == null){ crnErrProtocol = new CrnErrProtocol(); crnErrProtocol.setCrnNo(crnNo); } if (!crnErrProtocol.getError().equals("-")){ crnErrProtocol.setError("-"); cache.put(crnErrProtocol.getCrnNo(), crnErrProtocol); } } finally { } } /** * 更新设备状态 */ public static String getErrorCrn(Integer crnNo) { try { CrnErrProtocol crnErrProtocol = cache.get(crnNo); if (crnErrProtocol == null){ crnErrProtocol = new CrnErrProtocol(); crnErrProtocol.setCrnNo(crnNo); } return crnErrProtocol.getError(); } finally { } } /** * 获取设备状态 */ public static CrnErrProtocol getCrnStatus(Integer crnNo) { try { return cache.get(crnNo); } finally { } } /** * 获取所有设备状态 */ public static ConcurrentHashMap<Integer, CrnErrProtocol> getAllCrnStatus() { try { return new ConcurrentHashMap<>(cache); // 返回副本 } finally { } } } src/main/java/com/zy/core/cache/RgvErrCache.java
New file @@ -0,0 +1,102 @@ package com.zy.core.cache; import com.core.common.Cools; import com.zy.core.model.protocol.RgvErrProtocol; import com.zy.core.model.protocol.RgvRunProtocol; import java.util.concurrent.ConcurrentHashMap; /** * Created by IX on 2025/02/21 */ public class RgvErrCache { // 本地缓存,键为 currentPosition,值为 DeviceStatus private static final ConcurrentHashMap<Integer, RgvErrProtocol> cache = new ConcurrentHashMap<>(); /** * 更新设备状态 */ public static void updateRgvStatus(RgvErrProtocol status) { try { cache.put(status.getRgvNo(), status); } finally { } } /** * 更新设备状态 */ public static void updateRgvErr(Integer rgvNo,String error) { try { RgvErrProtocol rgvErrProtocol = cache.get(rgvNo); if (rgvErrProtocol == null){ rgvErrProtocol = new RgvErrProtocol(); rgvErrProtocol.setRgvNo(rgvNo); } if (!rgvErrProtocol.getError().equals(error)){ rgvErrProtocol.setError(error); cache.put(rgvErrProtocol.getRgvNo(), rgvErrProtocol); } } finally { } } /** * 更新设备状态 */ public static void updateRgvErr(Integer rgvNo) { try { RgvErrProtocol rgvErrProtocol = cache.get(rgvNo); if (rgvErrProtocol == null){ rgvErrProtocol = new RgvErrProtocol(); rgvErrProtocol.setRgvNo(rgvNo); } if (!rgvErrProtocol.getError().equals("-")){ rgvErrProtocol.setError("-"); cache.put(rgvErrProtocol.getRgvNo(), rgvErrProtocol); } } finally { } } /** * 更新设备状态 */ public static String getErrorDev(Integer rgvNo) { try { RgvErrProtocol rgvErrProtocol = cache.get(rgvNo); if (rgvErrProtocol == null){ rgvErrProtocol = new RgvErrProtocol(); rgvErrProtocol.setRgvNo(rgvNo); } return rgvErrProtocol.getError(); } finally { } } /** * 获取设备状态 */ public static RgvErrProtocol getRgvStatus(Integer rgvNo) { try { return cache.get(rgvNo); } finally { } } /** * 获取所有设备状态 */ public static ConcurrentHashMap<Integer, RgvErrProtocol> getAllRgvStatus() { try { return new ConcurrentHashMap<>(cache); // 返回副本 } finally { } } } src/main/java/com/zy/core/cache/RgvRunCache.java
New file @@ -0,0 +1,60 @@ package com.zy.core.cache; import com.core.common.Cools; import com.zy.core.model.protocol.RgvRunProtocol; import com.zy.core.model.protocol.RgvTaskProtocol; import java.util.concurrent.ConcurrentHashMap; /** * Created by IX on 2025/02/21 */ public class RgvRunCache { // 本地缓存,键为 currentPosition,值为 DeviceStatus private static final ConcurrentHashMap<String, RgvRunProtocol> cache = new ConcurrentHashMap<>(); /** * 更新设备状态 */ public static void updateRgvStatus(RgvRunProtocol status) { try { cache.put(status.getDev(), status); } finally { } } /** * 获取设备状态 */ public static RgvRunProtocol getRgvRun() { try { RgvRunProtocol rgv = cache.get("RGV"); if (Cools.isEmpty(rgv)){ rgv = new RgvRunProtocol(); } return rgv; } finally { } } /** * 获取设备状态 */ public static RgvRunProtocol getRgvStatus(String dev) { try { return cache.get(dev); } finally { } } /** * 获取所有设备状态 */ public static ConcurrentHashMap<String, RgvRunProtocol> getAllRgvStatus() { try { return new ConcurrentHashMap<>(cache); // 返回副本 } finally { } } } src/main/java/com/zy/core/cache/RgvStatusCache.java
@@ -2,6 +2,7 @@ import com.zy.core.model.protocol.RgvProtocol; import java.util.Collection; import java.util.concurrent.ConcurrentHashMap; /** @@ -16,6 +17,9 @@ */ public static void updateRgvStatus(RgvProtocol status) { try { if (status.getRgvNo()!=1 && status.getRgvNo() != 2){ return; } cache.put(status.getRgvNo(), status); } finally { } @@ -41,4 +45,19 @@ } } /** * 获取所有设备状态 */ public static void removeAll() { try { ConcurrentHashMap<Integer, RgvProtocol> integerRgvProtocolConcurrentHashMap = new ConcurrentHashMap<>(cache); if (integerRgvProtocolConcurrentHashMap.values().size()>2){ for (RgvProtocol rgvProtocol : integerRgvProtocolConcurrentHashMap.values()){ cache.remove(rgvProtocol.getRgvNo()); } } } finally { } } } src/main/java/com/zy/core/model/protocol/CrnErrProtocol.java
New file @@ -0,0 +1,16 @@ package com.zy.core.model.protocol; import lombok.Data; /** * Created by IX on 2025/02/21 */ @Data public class CrnErrProtocol { private Integer crnNo; public String error = "-"; public CrnErrProtocol(){} } src/main/java/com/zy/core/model/protocol/CrnProtocol.java
@@ -197,6 +197,7 @@ * 堆垛机累计升降时长h */ public Float yDuration; public String errCrn; public void setMode(Short mode) { this.mode = mode; src/main/java/com/zy/core/model/protocol/RgvErrProtocol.java
New file @@ -0,0 +1,16 @@ package com.zy.core.model.protocol; import lombok.Data; /** * Created by IX on 2025/02/21 */ @Data public class RgvErrProtocol { private Integer rgvNo; public String error = "-"; public RgvErrProtocol(){} } src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -116,6 +116,7 @@ // 光电异常 private boolean err6; private String errorRgv; public void setMode(Short mode) { this.mode = mode; src/main/java/com/zy/core/model/protocol/RgvRunProtocol.java
New file @@ -0,0 +1,18 @@ package com.zy.core.model.protocol; import lombok.Data; /** * Created by IX on 2025/02/21 */ @Data public class RgvRunProtocol { private String dev = "RGV"; private Integer RgvNo = 1; public Long currentTimeMilliOld = 0L; public RgvRunProtocol(){} } src/main/java/com/zy/core/model/protocol/RgvTaskProtocol.java
@@ -21,7 +21,5 @@ */ public Long AvoidingTheDestination; public boolean signRun = true; public RgvTaskProtocol(){} } src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -86,6 +86,7 @@ //指令ID private Integer commandId; private Double grossWt = 0D; private String errorDev = "-"; public BasDevp toSqlModel(){ BasDevp basDevp = new BasDevp(); src/main/java/com/zy/core/thread/LedThread.java
@@ -212,7 +212,7 @@ deviceErrorService.addDeviceError("led", slave.getId(), "led连接失败"); } } catch (Exception e){ log.error("e:"+e.getMessage()); // log.error("e:"+e.getMessage()); } return connRes; src/main/java/com/zy/core/thread/RgvThread.java
@@ -25,10 +25,7 @@ import com.zy.core.model.RgvSlave; import com.zy.core.model.Task; import com.zy.core.model.command.RgvCommand; import com.zy.core.model.protocol.RgvProtocol; import com.zy.core.model.protocol.RgvTaskProtocol; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.model.protocol.TaskProtocol; import com.zy.core.model.protocol.*; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -56,7 +53,7 @@ private Long trackBenchmark = 1L; // # 避让距离 private Long avoidDistance = 5000L; private Long currentTimeMilliOld = 0L; private String errorRgv = "-"; /** * 工位1复位信号 @@ -121,7 +118,7 @@ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "rgv连接失败"+e.getMessage()); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } initRgv(); // e.printStackTrace(); @@ -133,7 +130,7 @@ while (true) { try { Thread.sleep(20); System.out.println("读线程"+ slave.getId()); // System.out.println("读线程"+ slave.getId()); readStatus(); @@ -143,7 +140,7 @@ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV数据读取线程异常"+e.getMessage()); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } initRgv(); // e.printStackTrace(); @@ -176,7 +173,7 @@ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV数据任务下发复位线程异常"+e.getMessage()); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } initRgv(); // e.printStackTrace(); @@ -292,19 +289,26 @@ */ private void taskIssued() { while (true) { RgvRunProtocol rgvRun = RgvRunCache.getRgvRun(); if (!rgvRun.getRgvNo().equals(slave.getId())){ continue; } try { Thread.sleep(50); rgvRun = RgvRunCache.getRgvRun(); // System.out.println(JSON.toJSON(rgvRun)); // 休眠 1 秒 if (System.currentTimeMillis() - currentTimeMilliOld > 100) { currentTimeMilliOld = System.currentTimeMillis()+50; if (System.currentTimeMillis() - rgvRun.currentTimeMilliOld > 1000) { rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50; } else { continue; } if (!deviceDetection()) { currentTimeMilliOld = System.currentTimeMillis()+50; continue; } if (!signRunStart()){ currentTimeMilliOld = System.currentTimeMillis()+50; rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50; rgvRun.setRgvNo(slave.getOtherId()); RgvRunCache.updateRgvStatus(rgvRun); RgvErrCache.updateRgvErr(slave.getId(),errorRgv); continue; } @@ -316,13 +320,16 @@ rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); } if (!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE) || (Math.abs(rgvProtocol.getRgvPos() - rgvProtocol.getRgvPosDestination())>100)){ signRunEnd(); currentTimeMilliOld = System.currentTimeMillis()+50; rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50; rgvRun.setRgvNo(slave.getOtherId()); RgvRunCache.updateRgvStatus(rgvRun); continue; } if (rgvProtocol.getLoaded() == -1){ signRunEnd(); currentTimeMilliOld = System.currentTimeMillis()+50; rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50; rgvRun.setRgvNo(slave.getOtherId()); RgvRunCache.updateRgvStatus(rgvRun); RgvErrCache.updateRgvErr(slave.getId(),"小车探物物状态异常"); continue; } if (rgvTaskProtocol.getAvoid() != 0) { @@ -333,14 +340,16 @@ 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); } signRunEnd(); currentTimeMilliOld = System.currentTimeMillis()+50; rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50; rgvRun.setRgvNo(slave.getOtherId()); RgvRunCache.updateRgvStatus(rgvRun); continue; } @@ -353,21 +362,25 @@ if (rgvOtherStatusEnable()) { //另一台车是否允许此台车执行 if (!otherRgvAvoid(taskProtocol.getTargetPosition())) { RgvErrCache.updateRgvErr(slave.getId(),errorRgv); break; } } if (taskProtocol.getTargetPosition()<=rgvProtocol.getRgvPos()+50 && taskProtocol.getTargetPosition()>=rgvProtocol.getRgvPos()-50){ taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection()); RgvErrCache.updateRgvErr(slave.getId()); break; } else { TaskProtocol issued = new TaskProtocol(taskProtocol,true); write(issued); RgvErrCache.updateRgvErr(slave.getId()); taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection()); break; } } } RgvErrCache.updateRgvErr(slave.getId()); } else { for (TaskProtocol taskProtocol : allTakeTaskProtocol) { if (taskProtocol.getIsRunning() == 1) {//准备下发 @@ -375,6 +388,7 @@ if (rgvOtherStatusEnable()) { //另一台车是否允许此台车执行 if (!otherRgvAvoid(taskProtocol.getTargetPosition())) { RgvErrCache.updateRgvErr(slave.getId(),errorRgv); break; } } @@ -384,36 +398,59 @@ DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, taskProtocol.getTargetPositionStaNoPlcId()); StaProtocol staProtocol = devpThread.getStation().get(taskProtocol.getTargetPositionStaNo()); if (staProtocol == null ) { continue; RgvErrCache.updateRgvErr(slave.getId(),"未查到小车作业站"+staProtocol.getStaNo()+"站点"); break; } // 判断是否满足入库条件 if (!staProtocol.isAutoing() || staProtocol.isLoading() ){ continue; RgvErrCache.updateRgvErr(slave.getId(),"小车等待"+staProtocol.getStaNo()+"站点就绪"); break; } } else if (taskProtocol.getTaskStatus()==2){ DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, taskProtocol.getTargetPositionStaNoPlcId()); StaProtocol staProtocol = devpThread.getStation().get(taskProtocol.getTargetPositionStaNo()); if (staProtocol == null ) { RgvErrCache.updateRgvErr(slave.getId(),"未查到小车作业站"+staProtocol.getStaNo()+"站点"); break; } // 判断是否满足入库条件 if (!staProtocol.isAutoing() || !staProtocol.isLoading() || staProtocol.getWorkNo()==0 ){ RgvErrCache.updateRgvErr(slave.getId(),"小车等待"+staProtocol.getStaNo()+"站点就绪"); break; } } TaskProtocol issued = new TaskProtocol(taskProtocol); write(issued); RgvErrCache.updateRgvErr(slave.getId()); taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection()); break; } else { TaskProtocol issued = new TaskProtocol(taskProtocol,true); write(issued); RgvErrCache.updateRgvErr(slave.getId()); break; } } } } signRunEnd(); currentTimeMilliOld = System.currentTimeMillis()+50; rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50; rgvRun.setRgvNo(slave.getOtherId()); RgvRunCache.updateRgvStatus(rgvRun); } 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()); // log.error("e2:"+e2.getMessage()); } rgvRun = RgvRunCache.getRgvRun(); rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50; rgvRun.setRgvNo(slave.getOtherId()); RgvRunCache.updateRgvStatus(rgvRun); continue; // e.printStackTrace(); } } @@ -437,67 +474,31 @@ return true; } public boolean signRunStart() { RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); if (rgvTaskProtocol == null) { return false; } RgvTaskProtocol rgvTaskProtocolOther = RgvTaskCache.getRgvStatus(slave.getOtherId()); if (rgvTaskProtocolOther == null) { return false; } if(!rgvTaskProtocol.isSignRun()) { return false; } if(rgvTaskProtocolOther.isSignRun()) { rgvTaskProtocol.setSignRun(rgvTaskProtocol.getRgvNo()==1); RgvTaskCache.updateRgvStatus(rgvTaskProtocol); return false; } rgvTaskProtocol.setSignRun(false); RgvTaskCache.updateRgvStatus(rgvTaskProtocol); return true; } public boolean signRunEnd() { RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); if (rgvTaskProtocol == null) { return false; } RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); if (rgvProtocolOther == null) { return false; } if (rgvProtocolOther.statusEnable) { RgvTaskProtocol rgvTaskProtocolOther = RgvTaskCache.getRgvStatus(slave.getOtherId()); if (rgvTaskProtocolOther == null) { return false; } rgvTaskProtocol.setSignRun(false); RgvTaskCache.updateRgvStatus(rgvTaskProtocol); rgvTaskProtocolOther.setSignRun(true); RgvTaskCache.updateRgvStatus(rgvTaskProtocolOther); } else { rgvTaskProtocol.setSignRun(true); RgvTaskCache.updateRgvStatus(rgvTaskProtocol); } return true; } public boolean deviceDetection() { RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId()); RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); if (rgvProtocol == null || rgvTaskProtocol == null) { errorRgv = slave.getId()+"号小车连接失败"; return false; } if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) || rgvProtocol.getRgvPos().equals(0L) || rgvTaskProtocol.getAvoid() == -1 || rgvProtocol.getRgvPosDestination() == 0L || ((!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE) || (Math.abs(rgvProtocol.getRgvPos() - rgvProtocol.getRgvPosDestination())>100)) && !rgvProtocol.getStatusType().equals(RgvStatusType.ROAM))) { if (signRunStart()){ signRunEnd(); } if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO)) { errorRgv = slave.getId()+"号小车非自动"; return false; } if (rgvProtocol.getRgvPos().equals(0L) || rgvTaskProtocol.getAvoid() == -1 || rgvProtocol.getRgvPosDestination() == 0L) { errorRgv = slave.getId()+"号小车状态异常"; return false; } if (!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE) && !rgvProtocol.getStatusType().equals(RgvStatusType.ROAM)) { errorRgv = slave.getId()+"号小车非空闲"; return false; } if ( (Math.abs(rgvProtocol.getRgvPos() - rgvProtocol.getRgvPosDestination())>100) && !rgvProtocol.getStatusType().equals(RgvStatusType.ROAM)) { errorRgv = slave.getId()+"号小车存在运行目标值,需要复位!!!"; return false; } RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); @@ -506,13 +507,12 @@ // "rgvTaskProtocolOther:"+slave.getOtherId()+"sign:"+rgvTaskProtocolOther.isSignRun()+"/n"); if (rgvProtocolOther == null) { errorRgv = slave.getOtherId()+"号小车连接失败"; return false; } if (rgvProtocolOther.statusEnable) { if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L) || rgvTaskProtocolOther.getAvoid() == -1 || rgvProtocolOther.getRgvPosDestination() == 0L) { if (signRunStart()){ signRunEnd(); } errorRgv = slave.getOtherId()+"号小车状态异常"; return false; } } @@ -568,11 +568,12 @@ long avoid = rgvProtocolOther.getRgvPos() - rgvProtocolOther.getCarBodyJiaoMing() - avoidDistance - rgvProtocol.getCarBodyKunPeng(); if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[1])) { log.error("RGV行走超出范围!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); errorRgv = "RGV行走目标超出范围"; try{ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV行走超出范围"); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } return false; } @@ -591,17 +592,20 @@ } } 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()); errorRgv = "RGV行走目标超出范围"; try{ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV行走超出范围"); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } return false; } @@ -623,11 +627,13 @@ 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()); errorRgv = "RGV行走目标超出范围"; try{ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV行走超出范围"); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } return false; } @@ -650,11 +656,13 @@ long avoid = rgvProtocolOther.getRgvPos() - rgvProtocolOther.getCarBodyJiaoMing() - avoidDistance - rgvProtocol.getCarBodyKunPeng(); if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[1])) { log.error("RGV行走超出范围!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); errorRgv = "RGV行走目标超出范围"; try{ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV行走超出范围"); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } return false; } @@ -667,6 +675,8 @@ RgvTaskCache.updateRgvStatus(rgvTaskProtocol); return false; } errorRgv = slave.getOtherId()+"号RGV影响,等待中..."; return false; } } else { @@ -703,11 +713,13 @@ long avoid = rgvProtocolOther.getRgvPos() + rgvProtocolOther.getCarBodyKunPeng() + avoidDistance + rgvProtocol.getCarBodyJiaoMing(); if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[0])) { log.error("RGV行走超出范围!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); errorRgv = "RGV行走目标超出范围"; try{ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV行走超出范围"); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } return false; } @@ -726,17 +738,20 @@ } } if (signNowPosRun){ errorRgv = slave.getOtherId()+"号RGV等待作业..."; return false; } } long avoid = targetPosition - rgvProtocol.getCarBodyJiaoMing() - avoidDistance - rgvProtocolOther.getCarBodyKunPeng(); if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[1])) { log.error("RGV行走超出范围!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); errorRgv = "RGV行走目标超出范围"; try{ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV行走超出范围"); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } return false; } @@ -758,11 +773,13 @@ long avoid = targetPosition - rgvProtocol.getCarBodyJiaoMing() - avoidDistance - rgvProtocolOther.getCarBodyKunPeng(); if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[1])) { log.error("RGV行走超出范围!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); errorRgv = "RGV行走目标超出范围"; try{ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV行走超出范围"); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } return false; } @@ -786,11 +803,13 @@ long avoid = rgvProtocolOther.getRgvPos() + rgvProtocolOther.getCarBodyKunPeng() + avoidDistance + rgvProtocol.getCarBodyJiaoMing(); if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[0])) { log.error("RGV行走超出范围!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); errorRgv = "RGV行走目标超出范围"; try{ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV行走超出范围"); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } return false; } @@ -803,6 +822,7 @@ RgvTaskCache.updateRgvStatus(rgvTaskProtocol); return false; } errorRgv = slave.getOtherId()+"号RGV等待中..."; return false; } } else { @@ -813,6 +833,8 @@ } } } errorRgv = slave.getOtherId()+"号RGV影响,等待中..."; return false; } @@ -849,7 +871,7 @@ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV异常"+e.getMessage()); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } rgvProtocol.setStatusEnable(true); } @@ -887,7 +909,7 @@ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGVplc连接失败"); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } } initRgv(); @@ -916,6 +938,7 @@ if (rgvProtocol.getRgvPosDestination()==0L){ rgvProtocol.setRgvPosDestination(rgvProtocol.getRgvPos()); } rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 8)); rgvProtocol.setTaskNo((long)siemensNet.getByteTransform().TransInt32(result.Content, 10)); @@ -935,7 +958,7 @@ rgvProtocol.setErr4(status[11]); rgvProtocol.setErr5(status[12]); rgvProtocol.setErr6(status[13]); System.out.println("读线程"+ slave.getId()+"---"+JSON.toJSONString(rgvProtocol)); // System.out.println("读线程"+ slave.getId()+"---"+JSON.toJSONString(rgvProtocol)); OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功", DateUtils.convert(new Date()), slave.getId())); // // 工位1复位信号 @@ -949,6 +972,9 @@ // } // } // } if (rgvProtocol.getAlarm$()!=0){ RgvErrCache.updateRgvErr(slave.getId(),rgvProtocol.getAlarmM()); } try { // 根据实时信息更新数据库 @@ -969,7 +995,7 @@ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV plc数据库更新失败"); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } } } catch (Exception ignore) { @@ -990,7 +1016,7 @@ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "读取RGV plc状态信息失败"); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } } } catch (Exception e) { @@ -1002,7 +1028,7 @@ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "读取RGV plc状态信息失败"); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } initRgv(); } @@ -1019,7 +1045,7 @@ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV写入命令为空"); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } return false; } @@ -1078,7 +1104,7 @@ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV 命令下发"+JSON.toJSON(taskProtocol)); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); // log.error("e2:"+e2.getMessage()); } OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(taskProtocol))); return true; src/main/java/com/zy/core/thread/ScaleThread.java
@@ -55,7 +55,7 @@ String s = new String(read); if (!Cools.isEmpty(s) && s.startsWith("\u0002+")) { // if (!Cools.isEmpty(s) && s.startsWith("=")) { scale = Double.parseDouble(s.substring(1))/100; scale = Double.parseDouble(s.substring(1)); // System.out.println("scale:"+scale+ "ip:"+slave.getIp()); // String substring = s.substring(1); @@ -124,20 +124,20 @@ // log.info("条码扫描仪连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); try{ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.deleteDeviceError("devp", slave.getId()); deviceErrorService.deleteDeviceError("Scale", slave.getId()); } catch (Exception e){ log.error("e:"+e.getMessage()); // log.error("e:"+e.getMessage()); } } catch (Exception e) { socket = null; log.error("磅秤连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); // log.error("磅秤连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); // DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); // deviceErrorService.addDeviceError("scale", slave.getId(), "磅秤连接失败"); try{ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.deleteDeviceError("devp", slave.getId()); deviceErrorService.deleteDeviceError("Scale", slave.getId()); } catch (Exception e1){ log.error("e:"+e1.getMessage()); // log.error("e:"+e1.getMessage()); } return false; } src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -13,6 +13,7 @@ import com.zy.asrs.service.BasCrnOptService; import com.zy.asrs.service.BasCrnpService; import com.zy.core.CrnThread; import com.zy.core.cache.CrnErrCache; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.enums.CrnStatusType; @@ -243,6 +244,8 @@ log.error("堆垛机写入命令为空"); return false; } CrnErrCache.updateCrnErr(slave.getId(), "-"); // convertRow(command); command.setCrnNo(slave.getId()); short[] array = new short[10]; @@ -276,6 +279,8 @@ if (!command.getTaskNo().equals(one.getTaskNo()) ){ i++; CrnErrCache.updateCrnErr(slave.getId(), "堆垛机命令地址写入后回读失败"); log.error("堆垛机命令地址写入后回读失败[id:{}]>>>>重写[{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), i,JSON.toJSON(command),JSON.toJSON(one)); result = siemensNet.Write("DB100.0", array); }else{ @@ -297,6 +302,8 @@ if (transInt16 != commandFinish){ log.info("下发DB100.18 回读失败" + "commandFinish:"+commandFinish); log.info("下发DB100.18 回读失败" + "array:"+ JSON.toJSONString(array)); CrnErrCache.updateCrnErr(slave.getId(), "下发DB100.18 回读失败"); result = siemensNet.Write("DB100.18", commandFinish); signFinish++; }else { @@ -339,6 +346,8 @@ } else { OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); CrnErrCache.updateCrnErr(slave.getId(), "写入堆垛机plc数据失败"); return false; } } src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -264,7 +264,7 @@ throw new Exception("更新数据库数据失败"); } } catch (Exception e){ log.error("e:"+e.getMessage()); // log.error("e:"+e.getMessage()); } } catch (Exception e) { @@ -277,7 +277,7 @@ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.deleteDeviceError("devp", slave.getId()); } catch (Exception e){ log.error("e:"+e.getMessage()); // log.error("e:"+e.getMessage()); } } else { OutputQueue.DEVP.offer(MessageFormat.format("【{0}】读取输送线plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot())); @@ -460,6 +460,17 @@ } } /** * 设置入库标记 */ @Override public void setErrorDev(Integer siteId, String msgErr) { StaProtocol staProtocol = station.get(siteId); if (null != staProtocol) { staProtocol.setErrorDev(msgErr); } } @Override public void close() { siemensS7Net.ConnectClose(); src/main/webapp/static/wcs/js/console.map.js
@@ -14,8 +14,8 @@ "width": 1295, "height": 23, "minBayNo": 1, "maxBayNo": 65, "hiddenArr": [1,65] "maxBayNo": 55, "hiddenArr": [1,55] }, { "type": "rack", "id": "rack2", @@ -24,8 +24,8 @@ "width": 1295, "height": 23, "minBayNo": 1, "maxBayNo": 65, "hiddenArr": [1,65] "maxBayNo": 55, "hiddenArr": [1,55] }, { "type": "rack", "id": "rack3", @@ -34,8 +34,8 @@ "width": 1295, "height": 23, "minBayNo": 1, "maxBayNo": 65, "hiddenArr": [1,65] "maxBayNo": 55, "hiddenArr": [1,55] }, { "type": "rack", "id": "rack4", @@ -44,8 +44,8 @@ "width": 1295, "height": 23, "minBayNo": 1, "maxBayNo": 65, "hiddenArr": [1,65] "maxBayNo": 55, "hiddenArr": [1,55] }, { "type": "rack", "id": "rack5", @@ -54,8 +54,8 @@ "width": 1295, "height": 23, "minBayNo": 1, "maxBayNo": 65, "hiddenArr": [1,65] "maxBayNo": 55, "hiddenArr": [1,55] }, { "type": "rack", "id": "rack6", @@ -64,8 +64,8 @@ "width": 1295, "height": 23, "minBayNo": 1, "maxBayNo": 65, "hiddenArr": [1,65] "maxBayNo": 55, "hiddenArr": [1,55] }, { "type": "rack", "id": "rack7", @@ -74,8 +74,8 @@ "width": 1295, "height": 23, "minBayNo": 1, "maxBayNo": 65, "hiddenArr": [1,65] "maxBayNo": 55, "hiddenArr": [1,55] }, { "type": "rack", "id": "rack8", @@ -84,8 +84,8 @@ "width": 1295, "height": 23, "minBayNo": 1, "maxBayNo": 65, "hiddenArr": [1,65] "maxBayNo": 55, "hiddenArr": [1,55] }, { "type": "rack", "id": "rack9", @@ -94,8 +94,8 @@ "width": 1295, "height": 23, "minBayNo": 1, "maxBayNo": 65, "hiddenArr": [1,65] "maxBayNo": 55, "hiddenArr": [1,55] }, { "type": "rack", "id": "rack10", @@ -104,8 +104,8 @@ "width": 1295, "height": 23, "minBayNo": 1, "maxBayNo": 65, "hiddenArr": [1,65] "maxBayNo": 55, "hiddenArr": [1,55] }], "crns": [{ "type": "crane", src/main/webapp/views/deviceOperate/crnOperate.html
@@ -28,6 +28,8 @@ </el-table-column> <el-table-column property="deviceStatus" label="设备状态"> </el-table-column> <el-table-column property="errorCrn" label="异常提示"> </el-table-column> </el-table> </div> @@ -166,6 +168,8 @@ </el-descriptions-item> <el-descriptions-item label="升降时长(H)">{{ tableData[currentIndex].yduration }} </el-descriptions-item> <el-descriptions-item label="异常提示">{{ tableData[currentIndex].errorCrn }} </el-descriptions-item> </el-descriptions> </div> </div> src/main/webapp/views/deviceOperate/devpOperate.html
@@ -24,6 +24,10 @@ </el-table-column> <el-table-column property="pakMk" label="入库标记"> </el-table-column> <el-table-column property="weight" label="称重"> </el-table-column> <el-table-column property="errorDev" label="异常提示"> </el-table-column> </el-table> </div> @@ -93,6 +97,10 @@ </el-descriptions-item> <el-descriptions-item label="高低库位">{{ tableData[currentIndex].locType1 }} </el-descriptions-item> <el-descriptions-item label="重量">{{ tableData[currentIndex].weight }} </el-descriptions-item> <el-descriptions-item label="异常提示">{{ tableData[currentIndex].errorDev }} </el-descriptions-item> </el-descriptions> </div> </div> src/main/webapp/views/deviceOperate/rgvOperate.html
@@ -28,7 +28,9 @@ </el-table-column> <el-table-column property="rgvPosDestination" label="目标定位置"> </el-table-column> <el-table-column property="loaded" label="有物"> <el-table-column property="loaded" label="探物"> </el-table-column> <el-table-column property="errorRgv" label="提示"> </el-table-column> </el-table> </div>