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/ConsoleController.java
@@ -137,11 +137,11 @@ continue; } CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol == null) { if (crnProtocol == null || Cools.isEmpty(crnProtocol.getLaneNo())) { continue; } CrnLatestDataVo vo = new CrnLatestDataVo(); vo.setCrnId(crn.getId()); // 堆垛机编号 vo.setCrnId(crnProtocol.getLaneNo()); // 堆垛机编号 // Short totalBay = locMastMapper.selectTotalBay(); @@ -318,15 +318,22 @@ } CrnDetailVo vo = new CrnDetailVo(); for (CrnSlave crnSlave : slaveProperties.getCrn()) { if (crnSlave.getId().equals(crnNo)) { BasCrnp basCrnp = basCrnpService.selectById(crnNo); // 获取堆垛机信息 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId()); CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol == null || Cools.isEmpty(crnProtocol.getLaneNo())) { continue; } if (crnProtocol.getLaneNo().equals(crnNo)) { BasCrnp basCrnp = basCrnpService.selectById(crnProtocol.getCrnNo()); if (basCrnp == null) { return R.error("数据库维护异常"); } SiemensCrnThread crnThread = (SiemensCrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId()); CrnProtocol crnProtocol = crnThread.getCrnProtocol(); vo.setCrnNo(crnNo); vo.setCrnNo(crnProtocol.getCrnNo()); vo.setLaneNo(crnProtocol.getLaneNo()); vo.setWorkNo(crnProtocol.getTaskNo()); vo.setCrnStatus(crnProtocol.getStatusType().desc); src/main/java/com/zy/asrs/domain/vo/CrnDetailVo.java
@@ -11,6 +11,7 @@ // 堆垛机号 private Integer crnNo; private Integer laneNo; // 工作号 private Short workNo; src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -563,20 +563,23 @@ * 堆垛机站出库到出库站 */ public void crnStnToOutStn() { for (CrnSlave crnSlave : slaveProperties.getCrn()) { for (CrnSlave crn : slaveProperties.getCrn()) { // 获取堆垛机信息 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId()); CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol == null) { continue; } BasCrnp basCrnp = basCrnpService.selectById(crnSlave.getId()); BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); if (basCrnp == null) { log.error("{}号堆垛机尚未在数据库进行维护!", crnSlave.getId()); log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); continue; } if (!crnSlave.getId().equals(crnProtocol.getLaneNo())) { CrnSlave crnSlave = new CrnSlave(crn); if (!crn.getId().equals(crnProtocol.getLaneNo())) { for (CrnSlave crnOther : slaveProperties.getCrn()) { if (crnOther.getId().equals(crnProtocol.getLaneNo())) { crnSlave.updateCrnInStn(crnOther); @@ -641,30 +644,28 @@ * 入出库 ===>> 堆垛机入出库作业下发 */ public synchronized void crnIoExecute() throws IOException { for (CrnSlave crn : slaveProperties.getCrn()) { for (CrnSlave crnSlave : slaveProperties.getCrn()) { // 获取堆垛机信息 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId()); CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol == null) { continue; } BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); BasCrnp basCrnp = basCrnpService.selectById(crnSlave.getId()); if (basCrnp == null) { log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); log.error("{}号堆垛机尚未在数据库进行维护!", crnSlave.getId()); continue; } CrnSlave crnSlave = new CrnSlave(crn); CrnSlave crn = new CrnSlave(crnSlave); if (!crn.getId().equals(crnProtocol.getLaneNo())) { if (!crnSlave.getId().equals(crnProtocol.getLaneNo())) { for (CrnSlave crnOther : slaveProperties.getCrn()) { if (crnOther.getId().equals(crnProtocol.getLaneNo())) { crnSlave.updateCrnInStn(crnOther); crn.updateCrnInStn(crnOther); } } } crn = crnSlave; // 库位移转 this.locToLoc(crn, crnProtocol); @@ -800,7 +801,7 @@ crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint())); // 目标库位层 crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint())); // 目标库位排 crnCommand.setCommand((short) 1); if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { if (!MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, crnCommand))) { log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); throw new CoolException("堆垛机命令生成失败"); } else { @@ -915,7 +916,7 @@ command.setDestinationPosY(crnStn.getBay().shortValue()); // 目标库位列 command.setDestinationPosZ(crnStn.getLev().shortValue()); // 目标库位层 command.setCommand((short) 1); if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, command))) { if (!MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command))) { log.error("堆垛机命令生成失败,堆垛机号={},巷道={},任务数据={}", slave.getId(), taskWrk.getCrnNo(), JSON.toJSON(command)); throw new CoolException("堆垛机命令生成失败"); } else { @@ -1028,7 +1029,7 @@ crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint())); // 目标库位列 crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint())); // 目标库位层 crnCommand.setCommand((short) 1); if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { if (!MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, crnCommand))) { log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); } else { // 修改工作档状态 11.生成出库ID => 12.吊车出库中 @@ -1082,15 +1083,17 @@ * 执行对工作档的完成操作 */ public void storeFinished() throws InterruptedException { for (CrnSlave crn : slaveProperties.getCrn()) { for (CrnSlave crnSlave : slaveProperties.getCrn()) { // 获取堆垛机信息 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId()); CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol == null) { continue; } if (!crn.getId().equals(crnProtocol.getLaneNo())) { CrnSlave crn = new CrnSlave(crnSlave); if (!crnSlave.getId().equals(crnProtocol.getLaneNo())) { for (CrnSlave crnOther : slaveProperties.getCrn()) { if (crnOther.getId().equals(crnProtocol.getLaneNo())) { crn.updateCrnInStn(crnOther); @@ -1532,7 +1535,16 @@ for (Integer staNoNow : belongToRange) { for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { if (rgvStn.getStaNo().equals(staNoNow)) { sign = taskGenerate(rgvSlave, rgvStn, 0); TaskWrk taskWrk = deviceDetection(rgvStn); if (taskWrk != null) { Integer outStaNo = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()); for (RgvSlave.RgvStn rgvStnOut : rgvSlave.getRgvOutSta()) { if (rgvStnOut.getStaNo().equals(outStaNo)) { sign = taskGenerate(rgvSlave, rgvStn, 0); break; } } } break; } } @@ -1541,10 +1553,29 @@ } } } if (!sign && belongToRange.size()==1){ if (!sign && staList.size()==1){ if (rgvOtherIDLEOther(rgvSlave)){ if (!rgvOtherIDLE(rgvSlave,belongToRange.get(0))){ if (!rgvOtherIDLE(rgvSlave,staList.get(0))){ sign=true; } } if (sign){ for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { if (rgvStn.getStaNo().equals(staList.get(0))) { TaskWrk taskWrk = deviceDetection(rgvStn); if (taskWrk != null) { Integer outStaNo = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()); for (RgvSlave.RgvStn rgvSuper : rgvSlave.getRgvSuperSta()){ if (rgvSuper.getStaNo().equals(outStaNo)){ sign=false; break; } } } else { return; } break; } } } } @@ -1573,7 +1604,16 @@ for (Integer staNoNow : rangeList) { for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { if (rgvStn.getStaNo().equals(staNoNow)) { sign = taskGenerate(rgvSlave, rgvStn, 0); TaskWrk taskWrk = deviceDetection(rgvStn); if (taskWrk != null) { Integer outStaNo = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()); for (RgvSlave.RgvStn rgvStnOut : rgvSlave.getRgvOutSta()) { if (rgvStnOut.getStaNo().equals(outStaNo)) { sign = taskGenerate(rgvSlave, rgvStn, 0); break; } } } break; } } @@ -1611,7 +1651,16 @@ for (Integer staNoNow : rangeList) { for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { if (rgvStn.getStaNo().equals(staNoNow)) { sign = taskGenerate(rgvSlave, rgvStn, 0); TaskWrk taskWrk = deviceDetection(rgvStn); if (taskWrk != null) { Integer outStaNo = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()); for (RgvSlave.RgvStn rgvStnOut : rgvSlave.getRgvOutSta()) { if (rgvStnOut.getStaNo().equals(outStaNo)) { sign = taskGenerate(rgvSlave, rgvStn, 0); break; } } } break; } } src/main/java/com/zy/asrs/utils/RouteUtils.java
@@ -1,10 +1,13 @@ package com.zy.asrs.utils; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.SpringUtils; import com.zy.asrs.entity.BasDevpPosition; import com.zy.asrs.entity.TaskWrk; import com.zy.asrs.entity.WrkMast; import com.zy.core.enums.RouteCollectCountType; import com.zy.core.model.RgvSlave; import com.zy.system.service.UserService; import java.util.ArrayList; import java.util.Collections; @@ -138,6 +141,7 @@ //检测是否在范围 public static boolean CheckIfItIsWithinTheRange(List<Integer> staNoList, Long staNoNowPos, List<BasDevpPosition> basDevpPositionList, boolean itSmall) { List<Integer> siteList = new ArrayList<>(); Long maxOrMin = 0L; Integer[] rangeList = new Integer[staNoList.size()]; @@ -151,11 +155,28 @@ } } } if (itSmall) { return staNoNowPos <= rangeList[rangeList.length - 1]; for (BasDevpPosition basDevpPosition : basDevpPositionList) { if (basDevpPosition.getDevNo().equals(rangeList[rangeList.length - 1])) { maxOrMin = basDevpPosition.getPlcPosition(); break; } } if (maxOrMin == 0){ return false; } return staNoNowPos <= maxOrMin+50; } return staNoNowPos >= rangeList[0]; for (BasDevpPosition basDevpPosition : basDevpPositionList) { if (basDevpPosition.getDevNo().equals(rangeList[0])) { maxOrMin = basDevpPosition.getPlcPosition(); break; } } if (maxOrMin == 0){ return false; } return staNoNowPos >= maxOrMin-50; } public static long absoluteDifference(Long a, Long b) { src/main/java/com/zy/core/model/CrnSlave.java
@@ -55,6 +55,11 @@ } public CrnSlave(CrnSlave crnSlave) { this.setId(crnSlave.getId()); this.setIp(crnSlave.getIp()); this.setPort(crnSlave.getPort()); this.setStaNo(crnSlave.getStaNo()); this.setDevpPlcId(crnSlave.getDevpPlcId()); this.rack = crnSlave.getRack(); this.slot = crnSlave.getSlot(); this.offset = crnSlave.getOffset(); src/main/java/com/zy/core/model/RgvSlave.java
@@ -31,6 +31,7 @@ // RGV入库源站点 private List<RgvStn> rgvInSta = new ArrayList<>(); private List<RgvStn> rgvOutSta = new ArrayList<>(); private List<RgvStn> rgvSuperSta = new ArrayList<>(); @Data public static class RgvStn { src/main/resources/application-prod.yml
@@ -151,6 +151,14 @@ devpPlcId: ${wcs-slave.devp[0].id} staNo: 1017 direction: false rgvSuperSta[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 1001 direction: false rgvSuperSta[1]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 1002 direction: false # RGV穿梭车2 rgv[1]: id: 2 @@ -227,6 +235,14 @@ devpPlcId: ${wcs-slave.devp[0].id} staNo: 1017 direction: false rgvSuperSta[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 1023 direction: false rgvSuperSta[1]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 1022 direction: false barcode[0]: #条码扫描仪1004 port: 51236 src/main/webapp/static/wcs/css/console-0.css
@@ -46,10 +46,10 @@ cursor: pointer; } .system-icon-open { background-image: url("../image/stop48.png"); background-image: url("../images/stop48.png"); } .system-icon-close { background-image: url("../image/start48.png"); background-image: url("../images/start48.png"); } #system-run-desc { @@ -323,7 +323,7 @@ background-color: #fff; height: 20px; width: 80px; background-image: url("../image/Crane_auto.png"); background-image: url("../images/Crane_auto.png"); background-repeat: no-repeat; background-size:100% 100%; background-position: top center; @@ -332,35 +332,35 @@ /* 入库 */ .machine-pakin { background-image: url("../image/Crane_store.png"); background-image: url("../images/Crane_store.png"); } /* 出库 */ .machine-pakout { background-image: url("../image/Crane_retrieve.png"); background-image: url("../images/Crane_retrieve.png"); } /* 库到库 */ .machine-stock-move { background-image: url("../image/Crane_loctoloc.png"); background-image: url("../images/Crane_loctoloc.png"); } /* 站到站 */ .machine-site-move { background-image: url("../image/Crane_stntostn.png"); background-image: url("../images/Crane_stntostn.png"); } /* p to p */ .machine-p-move { background-image: url("../image/Crane_hptoohp.png"); background-image: url("../images/Crane_hptoohp.png"); } /* 异常 */ .machine-error { background-image: url("../image/Crane_error.png"); background-image: url("../images/Crane_error.png"); } /* 自动 */ .machine-auto { background-image: url("../image/Crane_auto.png"); background-image: url("../images/Crane_auto.png"); } /* 非自动/收到 */ .machine-un-auto { background-image: url("../image/Crane_manual.png"); background-image: url("../images/Crane_manual.png"); } @@ -384,7 +384,7 @@ } /* PToP */ .machine-p-move-flag { background-color: #128014; background-color: #aaaaaa; color: #fff; } /* 异常 */ src/main/webapp/static/wcs/css/console.css
@@ -235,7 +235,7 @@ /* PToP */ .machine-p-move-flag { padding: 0 10px; background-color: rgb(29,152,23); background-color: rgb(184,184,184); } /* 异常 */ .machine-error-flag { src/main/webapp/static/wcs/css/crn.css
@@ -39,7 +39,7 @@ display: inline-block; width: 20px; height: 20px; background-color: #2e9926; background-color: #fff; border-radius: 5px; vertical-align: middle; } src/main/webapp/views/old_page/console-old.html
@@ -869,7 +869,7 @@ $("#crnWindow").attr('style', 'display:block;'); $("#siteWindow").attr("style", "display:none;"); $('.detailed').empty(); $('.detailed').append(id + '号堆垛机'); $('.detailed').append(id + '号巷道堆垛机'); $.ajax({ url: baseUrl + "/console/crn/detail", headers: { src/main/webapp/views/old_page/console.html
@@ -420,7 +420,7 @@ $("#crnWindow").attr('style', 'display:block;'); $("#siteWindow").attr("style", "display:none;"); $('.detailed').empty(); $('.detailed').append(id + '号堆垛机'); $('.detailed').append(id + '号巷道堆垛机'); $.ajax({ url: baseUrl + "/console/crn/detail", headers: { src/main/webapp/views/realtimeWatch/console.html
@@ -136,6 +136,15 @@ <input type="text" name="crnNo" value="" id="crnNo"> </div> </div> <!-- 巷道号 --> <div class="form-item"> <div class="form-item-label" style> <span>巷道号:</span> </div> <div class="form-item-input"> <input type="text" name="laneNo" value="" id="laneNo"> </div> </div> <!-- 工作号 --> <div class="form-item"> <div class="form-item-label"> @@ -445,7 +454,7 @@ $("#crnWindow").attr('style', 'display:block;'); $("#siteWindow").attr("style", "display:none;"); $('.detailed').empty(); $('.detailed').append(id + '号堆垛机'); $('.detailed').append(id + '号巷道堆垛机'); $.ajax({ url: baseUrl + "/console/crn/detail", headers: { @@ -642,7 +651,7 @@ // crnEl.animate({left: (crns[i].bay * unit) + 'px'}, 1000); // crns[i].bay = 1; var offSet = 390; var offSet = 500; // crns[i].bay = 41; if(crns[i].bay === 1){ crnEl.animate({left: offSet + 'px'}, 1000);