src/main/java/com/zy/asrs/controller/RgvController.java
@@ -98,6 +98,14 @@ vo.setRgvPos1(rgvProtocol.getRgvPosI2()); vo.setWalkPos(Objects.equals(rgvProtocol.getWalkPos(), 1) ? "在定位" : "不在定位"); vo.setPakMk(rgvThread.isPakMk() ? "无锁" : "锁定"); // vo.setPakIn(rgvThread.isPakIn() ? "可入" : "不可入"); // vo.setPakOut(rgvThread.isPakOut() ? "可出" : "不可出"); // vo.setPakRgv(rgvThread.isPakRgv() ? "无锁" : "锁定"); vo.setPaking(rgvThread.isPaking()? "无锁" : "锁定"); // vo.setPakAll(rgvThread.isPakAll() ? "无锁" : "锁定"); // vo.setPakToCrn(rgvThread.isPakToCrn() ? "无锁" : "锁定"); vo.setWorkNo2(rgvProtocol.getTaskNo2()); // 工位2任务号 // vo.setStatus2(rgvProtocol.getStatusType2().desc); // 工位2状态 vo.setLoading2(rgvProtocol.getLoaded2() ? "有物" : "无物"); // 工位2有物 src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java
@@ -49,5 +49,17 @@ private Integer RgvPos1 = 0; private String pakMk="-"; private String pakIn="-"; private String pakOut="-"; private String pakRgv="-"; private String pakToCrn="-"; private String paking="-"; private String pakAll="-"; } src/main/java/com/zy/asrs/entity/BasRgv.java
@@ -118,9 +118,30 @@ @ApiModelProperty(value= "备注") private String memo; @ApiModelProperty(value = "入库标记(1=启用,0=禁用)") private String pakIn; @ApiModelProperty(value = "出库标记(1=启用,0=禁用)") private String pakOut; @ApiModelProperty(value = "距离跳过取货标记(1=启用,0=禁用)") private String pakRgv; @ApiModelProperty(value = "接驳标记(1=启用,0=禁用)") private String pakToCrn; @ApiModelProperty(value = "接驳标记(1=启用,0=禁用)") private String paking; @ApiModelProperty(value = "接驳标记(1=启用,0=禁用)") private String pakAll; public BasRgv() {} public BasRgv(Integer rgvNo, String inEnable, String outEnable, Integer rgvSts, Integer wrkNo1, Integer wrkNo2, Long rgvErr, String pakMk, Integer status, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo) { public BasRgv(Integer rgvNo, String inEnable, String outEnable, Integer rgvSts, Integer wrkNo1, Integer wrkNo2, Long rgvErr, String pakMk, Integer status, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo, String pakIn, String pakOut,String pakRgv,String pakToCrn,String paking,String pakAll) { this.rgvNo = rgvNo; this.inEnable = inEnable; this.outEnable = outEnable; @@ -135,6 +156,12 @@ this.updateBy = updateBy; this.updateTime = updateTime; this.memo = memo; this.pakIn = pakIn; this.pakOut = pakOut; this.pakRgv = pakRgv; this.pakToCrn = pakToCrn; this.paking = paking; this.pakAll = pakAll; } // BasRgv basRgv = new BasRgv( src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java
@@ -40,5 +40,7 @@ List<WrkMastSta> selectByWorkStaList(@Param("workSta") Integer workSta, @Param("rgvNo") Short rgvNo); WrkMastSta selectByWorkSta(@Param("workSta") Integer workSta, @Param("rgvNo") Integer rgvNo); List<WrkMastSta> selectLockWrk(@Param("rgvNo") Integer rgvNo); List<WrkMastSta> selectLockWrk(); List<WrkMastSta> selectLockWrkT(); } src/main/java/com/zy/asrs/service/BasRgvService.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.service.IService; import com.zy.asrs.entity.BasRgv; import com.zy.common.utils.RedisUtil; public interface BasRgvService extends IService<BasRgv> { src/main/java/com/zy/asrs/service/WrkMastStaService.java
@@ -6,5 +6,7 @@ import java.util.List; public interface WrkMastStaService extends IService<WrkMastSta> { List<WrkMastSta> selectLockWrk(Integer rgvNo); List<WrkMastSta> selectLockWrk(); List<WrkMastSta> selectLockWrkT(); } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.mapper.Wrapper; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.common.R; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.ArmOrderAssignmentParam; @@ -197,7 +198,9 @@ wrkNo++; staProtocol.setStaNo(inSta.getBackSta().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); staProtocol.setPakMk(false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); System.out.println(staProtocol); log.error("输送线下发1:"+wrkNo+","+inSta.getBackSta()); } @@ -244,6 +247,11 @@ int wrkNo1 = basDevpService.selectCount(new EntityWrapper<BasDevp>().eq("wrk_no", wrkMast.getWrkNo())); if (wrkNo1 != 0){ News.error(barcode + "条码已存在状态为( 2.设备上走 )的数据,请查看WCS输送线界面,工作号={}", wrkMast.getWrkNo()); StaProtocol staProtocolNew = new StaProtocol(); staProtocolNew.setWorkNo(wrkNo1); staProtocolNew.setStaNo(RouteUtils.SouStaEnd(wrkMast.getStaNo(),wrkMast.getSourceStaNo())); staProtocolNew.setSiteId(staProtocol.getSiteId()); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocolNew)); if (ledThread != null) { News.error(methodName + ":扫码失败,请重试"); MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, barcode + "条码已存在状态为( 2.设备上走 )的任务,工作号="+ wrkMast.getWrkNo())); @@ -1351,7 +1359,7 @@ // if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") // && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { if (staProtocol.isAutoing() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") if (staProtocol.isAutoing() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") && !staProtocol.isLoading() ) { // if (slave.getId() == 1 || slave.getId() == 2){ // if (staProtocol.isLoading() || staProtocol.getWorkNo() != 0 || !staProtocol.isOutEnable()){ @@ -3053,18 +3061,21 @@ log.error("{}号RGV尚未在数据库进行维护!4", rgv.getId()); continue; } if(rgvProtocol.getStatusType1() == RgvStatusType.WORKING){ rgvThread.setPaking(true); } //小车无任务时跳过 if(rgvProtocol.getTaskNo1() ==0 && rgvProtocol.getTaskNo2() == 0 ){ continue; } if(!rgvThread.isPaking()){ continue; } List<WrkMastSta> wrkMastStaLock = wrkMastStaService.selectLockWrk(rgv.getId()); if(wrkMastStaLock.size() == 1){ if(!basRgv.getPakAll().equals("1")){ continue; } if(rgvThread.isPakIn()){ if(basRgv.getPakIn().equals("1")){ for(RgvSlave.RgvStn rgvStn : rgv.getRgvInPStn()){//入库放货站点 boolean flag = false; @@ -3121,9 +3132,11 @@ } } basRgv.setPakRgv("1"); basRgvService.updateById(basRgv); } //出库放货 if( rgvThread.isPakOut()){ if( basRgv.getPakOut().equals("1")){ for(RgvSlave.RgvStn rgvStn : rgv.getRgvOutPStn()){//入库放货站点 boolean flag = false; @@ -3155,7 +3168,7 @@ BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 Integer workNo = 0; if(rgvThread.isPakToCrn()){ if(basRgv.getPakToCrn().equals("1")){ workNo = rgvProtocol.getTaskNo1() !=0 ? rgvProtocol.getTaskNo1():rgvProtocol.getTaskNo2(); //正常情况出库放货优先工位1放 }else{ workNo = rgvProtocol.getTaskNo2() !=0 ? rgvProtocol.getTaskNo2():rgvProtocol.getTaskNo1(); //接驳情况优先工位2放 @@ -3183,8 +3196,9 @@ } } basRgv.setPakRgv("1"); basRgvService.updateById(basRgv); } rgvThread.setPakRgv(true);//优先放货完成,开启预调度 } } /** @@ -3196,6 +3210,11 @@ RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; } BasRgv basRgv = basRgvService.selectById(rgv.getId()); if (basRgv == null) { log.error("{}号RGV尚未在数据库进行维护!4", rgv.getId()); continue; } Long taskNo1 = Long.valueOf(rgvProtocol.getTaskNo1()); @@ -3221,11 +3240,22 @@ && rgvProtocol.getTaskNo1() == 0 && rgvProtocol.getTaskNo2() == 0 && !rgvProtocol.isLoaded1ing() && !rgvProtocol.isLoaded2ing()){ rgvThread.setPakRgv(true); List<WrkMastSta> wrkMastStaLock = wrkMastStaService.selectLockWrk(); List<WrkMastSta> wrkMastStaLockT = wrkMastStaService.selectLockWrkT(); if(wrkMastStaLock.size() > 0 && rgvProtocol.getRgvNo() == 1){ continue ; } if(wrkMastStaLockT.size() > 0 && rgvProtocol.getRgvNo() == 2){ continue ; } basRgv.setPakRgv("1"); basRgv.setPakToCrn("1"); basRgv.setPakIn("1"); basRgv.setPakOut("1"); basRgv.setPakAll("1"); basRgvService.updateById(basRgv); rgvThread.setPakMk(true); rgvThread.setPakIn(true); rgvThread.setPakOut(true); rgvThread.setPakToCrn(true); } } @@ -3243,39 +3273,53 @@ if (rgvProtocol == null) { continue; } BasRgv basRgv = basRgvService.selectById(rgv.getId()); if (basRgv == null) { log.error("{}号RGV尚未在数据库进行维护!4", rgv.getId()); continue; } if(rgvProtocol.getStatusType1() == RgvStatusType.WORKING){ // log.error("解锁"); rgvThread.setPaking(true); } if(rgvProtocol.isLoaded1ing() && rgvProtocol.isLoaded2ing()){ basRgv.setPakAll("1"); basRgvService.updateById(basRgv); } // 只有当RGV空闲 并且 无任务时才继续执行 if (rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvThread.isPakMk() && rgvThread.isPakToCrn() && rgvThread.isPaking()) { if (rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvThread.isPakMk() && basRgv.getPakToCrn().equals("1") && rgvThread.isPaking()) { News.warnNoLog(""+mark+" - 0"+" - 开始执行RGV入出库作业下发"); // 如果最近一次是入库模式 // rgvRunWrkMastInTest(); if (rgvProtocol.getLastIo().equals("I")) { if (basRgv.getInEnable().equals("1") && rgvThread.isPakIn()) { if (basRgv.getInEnable().equals("1") && basRgv.getPakIn().equals("1")) { //mark - 1 - .... this.rgvRunWrkMastIn(rgv, rgvProtocol,mark); // 入库 if (rgvProtocol.getTaskNo1()==0){ this.rgvRunWrkMastIn(rgv, rgvProtocol,mark); // 入库 } rgvProtocol.setLastIo("O"); } else if (basRgv.getOutEnable().equals("1") && rgvThread.isPakOut()) { } else if (basRgv.getOutEnable().equals("1") && basRgv.getPakOut().equals("1")) { //mark - 2 - .... this.rgvRunWrkMastOut(rgv, rgvProtocol,mark); // 出库 if (rgvProtocol.getTaskNo2()==0){ this.rgvRunWrkMastOut(rgv, rgvProtocol,mark); // 出库 } rgvProtocol.setLastIo("I"); } } // 如果最近一次是出库模式 else if (rgvProtocol.getLastIo().equals("O")) { if (basRgv.getOutEnable().equals("1") && rgvThread.isPakOut()) { this.rgvRunWrkMastOut(rgv, rgvProtocol,mark); // 出库 if (basRgv.getOutEnable().equals("1") && basRgv.getPakOut().equals("1")) { if (rgvProtocol.getTaskNo2()==0){ this.rgvRunWrkMastOut(rgv, rgvProtocol,mark); // 出库 } rgvProtocol.setLastIo("I"); } else if (basRgv.getInEnable().equals("1") && rgvThread.isPakIn()) { this.rgvRunWrkMastIn(rgv, rgvProtocol,mark); // 入库 } else if (basRgv.getInEnable().equals("1") && basRgv.getPakIn().equals("1")) { if (rgvProtocol.getTaskNo1()==0){ this.rgvRunWrkMastIn(rgv, rgvProtocol,mark); // 入库 } rgvProtocol.setLastIo("O"); } } @@ -3285,9 +3329,9 @@ if(wrkMastSta1 != null && wrkMastSta2 != null){ rgvThread.setPakMk(false); //小车双工位锁定 } if(!rgvThread.isPakToCrn()){ rgvRunWrkToCrn(rgv, rgvProtocol,mark); //若小车取到一个接驳任务,第二个工位只能取接驳任务 } // if(!rgvThread.isPakToCrn()){ // rgvRunWrkToCrn(rgv, rgvProtocol,mark); //若小车取到一个接驳任务,第二个工位只能取接驳任务 // } // if(rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getTaskNo1() == 0 && rgvThread.isPakIn() && rgvThread.isPakRgv()){ // rgvPreScheduling();//若暂无下发任务预调度提前到取货点 // } @@ -3344,6 +3388,11 @@ public synchronized void rgvRunWrkMastIn(RgvSlave slave, RgvProtocol rgvProtocol,Integer mark) { for (RgvSlave.RgvStn rgvStn : slave.getRgvInTStn()) {//rgv入库取货站点 boolean flag = false; BasRgv basRgv = basRgvService.selectById(slave.getId()); if (basRgv == null) { log.error("{}号RGV尚未在数据库进行维护!4", slave.getId()); continue; } //遍历rgv入库取货站点 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, rgvStn.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(rgvStn.getStaNo()); @@ -3409,7 +3458,10 @@ result = rgvCalcDistance((int) rgvProtocol.getRgvNo(),wrkMastSta2.getStaEnd(),wrkMastSta.getStaStart());//工位2放货站点,工位1取货站点 } if(result){//若小车距离放货点距离近于取货点则跳过取货 true跳过取货/false优先取货 rgvThread.setPakRgv(false); basRgv.setPakRgv("0"); basRgvService.updateById(basRgv); // rgvThread.setPakRgv(false); continue; } wrkMastSta.setWorkSta(wrkMastSta2 !=null ? 1 : 2); @@ -3419,6 +3471,9 @@ if (sign){ if(wrkMastSta3 != null){ wrkMastSta3.setMk(1); basRgv.setPakAll("0"); basRgvService.updateById(basRgv); try{ wrkMastStaMapper.updateById(wrkMastSta3); log.error("锁定相隔站点任务"); @@ -3427,8 +3482,12 @@ } } basRgv.setPakOut("0"); basRgvService.updateById(basRgv); rgvThread.setPaking(false); rgvThread.setPakOut(false);//出库不允许 // rgvThread.setPakOut(false);//出库不允许 // basRgvService.updateById(basRgv); try{ wrkMastSta.setWrkSts(1); wrkMastStaMapper.updateById(wrkMastSta); @@ -3453,6 +3512,11 @@ DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, rgvStn.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(rgvStn.getStaNo()); RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, (int) rgvProtocol.getRgvNo()); BasRgv basRgv = basRgvService.selectById(slave.getId()); if (basRgv == null) { log.error("{}号RGV尚未在数据库进行维护!4", slave.getId()); continue; } StaProtocol staProtocol2 = null; WrkMastSta wrkMastSta3 = null; @@ -3515,7 +3579,10 @@ result = rgvCalcDistance((int) rgvProtocol.getRgvNo(),wrkMastSta1.getStaEnd(),wrkMastSta.getStaStart());//工位2放货站点,工位1取货站点 } if(result){//若小车距离放货点距离近于取货点则跳过取货 true跳过取货/false优先取货 rgvThread.setPakRgv(false); basRgv.setPakRgv("0"); basRgvService.updateById(basRgv); // rgvThread.setPakRgv(false); continue; } wrkMastSta.setWorkSta(wrkMastSta1 !=null ? 2 : 1);//若1号工位有任务给2号工位 @@ -3524,7 +3591,10 @@ sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发 if (sign){ if(LEFT_POSITION.contains(wrkMastSta.getStaEnd())){ rgvThread.setPakToCrn(false); //锁定小车只能接接驳任务 basRgv.setPakToCrn("0"); basRgvService.updateById(basRgv); // rgvThread.setPakToCrn(false); //锁定小车只能接接驳任务 } if(wrkMastSta3 != null){ wrkMastSta3.setMk(1); @@ -3536,8 +3606,11 @@ } } basRgv.setPakIn("0"); basRgvService.updateById(basRgv); rgvThread.setPaking(false); rgvThread.setPakIn(false);//入库不允许 // rgvThread.setPakIn(false);//入库不允许 try{ wrkMastSta.setWrkSts(1); wrkMastStaMapper.updateById(wrkMastSta); @@ -3556,94 +3629,94 @@ /** * 小车出库接驳任务取货下发 */ public synchronized void rgvRunWrkToCrn(RgvSlave slave, RgvProtocol rgvProtocol,Integer mark){ for (RgvSlave.RgvStn rgvStn : slave.getRgvOutTStn()) {//rgv出库取货站点 boolean flag = false; //遍历rgv入库取货站点 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, rgvStn.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(rgvStn.getStaNo()); RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, (int) rgvProtocol.getRgvNo()); StaProtocol staProtocol2 = null; if(rgvStn.getStaNo2()!= null ){ staProtocol2 = devpThread.getStation().get(rgvStn.getStaNo2()); if (staProtocol2 == null) { News.infoNoLog("" + mark + " - 1" + " - 1" + " - Rgv入库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol); continue; } else { staProtocol2 = staProtocol2.clone(); } BasDevp staDetl2 = basDevpService.selectById(rgvStn.getStaNo2()); if (staDetl2 == null) { News.error("" + mark + " - 1" + " - 2" + " - 入库 ===>>Rgv站点在数据库不存在, 站点编号={}", rgvStn.getStaNo()); continue; } } if (staProtocol == null) { News.infoNoLog("" + mark + " - 1" + " - 1" + " - Rgv出库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol); continue; } else { staProtocol = staProtocol.clone(); } // 查询站点详细信息 BasDevp staDetl = basDevpService.selectById(rgvStn.getStaNo()); if (staDetl == null) { News.error("" + mark + " - 1" + " - 2" + " - 出库 ===>>Rgv站点在数据库不存在, 站点编号={}", rgvStn.getStaNo()); continue; } if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")) { flag = true; } if (!flag) { News.errorNoLog("" + mark + " - 1" + " - 3" + " - Rgv出库取货站信息(以下需要全true):" + "自动信号" + staProtocol.isAutoing() + "有物信号" + staProtocol.isLoading() + "工作号>0" + staProtocol.getWorkNo() + "可入信号" + staProtocol.isOutEnable() + "能入信号(wms设置).equals(\"Y\")" + staDetl.getCanouting()); continue; } BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); List<Integer> route = new ArrayList<>(); switch (rgvProtocol.getRgvNo()){ case 1: route = RouteUtils.getRouteOne();break; case 2: route = RouteUtils.getRouteTwo();break; } basRgvMap.setNowRoute(rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfereToCrn(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档 if( null == wrkMastSta ) { News.infoNoLog("" + mark + " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo()); continue; } WrkMastSta wrkMastSta1 = wrkMastStaMapper.selectByWrkNo( rgvProtocol.getTaskNo1()); boolean result = false; if(wrkMastSta1!= null && rgvProtocol.getRgvNo() == 1){ //距离计算 2楼单入库口不需要计算 result = rgvCalcDistance((int) rgvProtocol.getRgvNo(),wrkMastSta1.getStaEnd(),wrkMastSta.getStaStart());//工位2放货站点,工位1取货站点 } if(result){//若小车距离放货点距离近于取货点则跳过取货 true跳过取货/false优先取货 rgvThread.setPakRgv(false); continue; } wrkMastSta.setWorkSta(wrkMastSta1 !=null ? 2 : 1);//若1号工位有任务给2号工位 wrkMastSta.setRgvNo((int) rgvProtocol.getRgvNo()); boolean sign = false; sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发 if (sign){ rgvThread.setPakIn(false);//入库不允许 try{ wrkMastSta.setWrkSts(1); wrkMastStaMapper.updateById(wrkMastSta); log.error("更新小车任务成功"); }catch (Exception e){ log.error("更新小车任务失败"); } } else { log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo()); } } } // public synchronized void rgvRunWrkToCrn(RgvSlave slave, RgvProtocol rgvProtocol,Integer mark){ // for (RgvSlave.RgvStn rgvStn : slave.getRgvOutTStn()) {//rgv出库取货站点 // boolean flag = false; // //遍历rgv入库取货站点 // DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, rgvStn.getDevpPlcId()); // StaProtocol staProtocol = devpThread.getStation().get(rgvStn.getStaNo()); // RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, (int) rgvProtocol.getRgvNo()); // StaProtocol staProtocol2 = null; // if(rgvStn.getStaNo2()!= null ){ // staProtocol2 = devpThread.getStation().get(rgvStn.getStaNo2()); // if (staProtocol2 == null) { // News.infoNoLog("" + mark + " - 1" + " - 1" + " - Rgv入库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol); // continue; // } else { // staProtocol2 = staProtocol2.clone(); // } // BasDevp staDetl2 = basDevpService.selectById(rgvStn.getStaNo2()); // if (staDetl2 == null) { // News.error("" + mark + " - 1" + " - 2" + " - 入库 ===>>Rgv站点在数据库不存在, 站点编号={}", rgvStn.getStaNo()); // continue; // } // } // if (staProtocol == null) { // News.infoNoLog("" + mark + " - 1" + " - 1" + " - Rgv出库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol); // continue; // } else { // staProtocol = staProtocol.clone(); // } // // // 查询站点详细信息 // BasDevp staDetl = basDevpService.selectById(rgvStn.getStaNo()); // if (staDetl == null) { // News.error("" + mark + " - 1" + " - 2" + " - 出库 ===>>Rgv站点在数据库不存在, 站点编号={}", rgvStn.getStaNo()); // continue; // } // // if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 // && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")) { // flag = true; // } // if (!flag) { // News.errorNoLog("" + mark + " - 1" + " - 3" + " - Rgv出库取货站信息(以下需要全true):" // + "自动信号" + staProtocol.isAutoing() + "有物信号" + staProtocol.isLoading() // + "工作号>0" + staProtocol.getWorkNo() + "可入信号" + staProtocol.isOutEnable() // + "能入信号(wms设置).equals(\"Y\")" + staDetl.getCanouting()); // continue; // } // BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); // List<Integer> route = new ArrayList<>(); // switch (rgvProtocol.getRgvNo()){ // case 1: route = RouteUtils.getRouteOne();break; // case 2: route = RouteUtils.getRouteTwo();break; // } // basRgvMap.setNowRoute(rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号 // WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfereToCrn(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档 // if( null == wrkMastSta ) { // News.infoNoLog("" + mark + " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo()); // continue; // } // WrkMastSta wrkMastSta1 = wrkMastStaMapper.selectByWrkNo( rgvProtocol.getTaskNo1()); // boolean result = false; // if(wrkMastSta1!= null && rgvProtocol.getRgvNo() == 1){ //距离计算 2楼单入库口不需要计算 // result = rgvCalcDistance((int) rgvProtocol.getRgvNo(),wrkMastSta1.getStaEnd(),wrkMastSta.getStaStart());//工位2放货站点,工位1取货站点 // } // if(result){//若小车距离放货点距离近于取货点则跳过取货 true跳过取货/false优先取货 // rgvThread.setPakRgv(false); // continue; // } // wrkMastSta.setWorkSta(wrkMastSta1 !=null ? 2 : 1);//若1号工位有任务给2号工位 // wrkMastSta.setRgvNo((int) rgvProtocol.getRgvNo()); // boolean sign = false; // sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发 // if (sign){ // rgvThread.setPakIn(false);//入库不允许 // try{ // wrkMastSta.setWrkSts(1); // wrkMastStaMapper.updateById(wrkMastSta); // log.error("更新小车任务成功"); // }catch (Exception e){ // log.error("更新小车任务失败"); // } // } else { // log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo()); // } // // // } // } /** * 执行小车搬运任务 * src/main/java/com/zy/asrs/service/impl/WrkMastStaServiceImpl.java
@@ -11,8 +11,11 @@ @Service("wrkMastStaService") public class WrkMastStaServiceImpl extends ServiceImpl<WrkMastStaMapper, WrkMastSta> implements WrkMastStaService { @Override public List<WrkMastSta> selectLockWrk(Integer rgvNo){ Integer rgvNo1 = rgvNo; return this.baseMapper.selectLockWrk(rgvNo); public List<WrkMastSta> selectLockWrk(){ return this.baseMapper.selectLockWrk(); } @Override public List<WrkMastSta> selectLockWrkT(){ return this.baseMapper.selectLockWrkT(); } } src/main/java/com/zy/asrs/utils/RouteUtils.java
@@ -50,7 +50,7 @@ //1楼战站点 public static final List<Integer> TRACK_POSITION_ONE = Arrays.asList( 1004, 1007, 1010, 1014, 1018, 1021, 1024, 1028, 1031, 1035,1042,1105,1106,1041, 1038,1036 1038,1036,1108,1109 ); //2楼战站点 public static final List<Integer> TRACK_POSITION_TWO = Arrays.asList( src/main/java/com/zy/core/MainProcess.java
@@ -132,7 +132,7 @@ try{ //RGV小车出入库取货下发 mainService.rgvIoExecute(11); if(k > 2){ if(k > 3){ mainService.rgvOutExecute(); k = 0; } src/main/java/com/zy/core/thread/RgvThread.java
@@ -5,6 +5,7 @@ import HslCommunication.Profinet.Siemens.SiemensPLCS; import HslCommunication.Profinet.Siemens.SiemensS7Net; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.common.SpringUtils; @@ -35,6 +36,7 @@ import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.sql.Wrapper; import java.text.MessageFormat; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -64,15 +66,17 @@ //锁定标记 private boolean PakMk = true; //入库标记 private boolean PakIn = true; //出库标记 private boolean PakOut = true; //根据距离跳过取货 private boolean PakRgv = true; //接驳标记 private boolean PakToCrn = true; // private boolean PakIn = true; // //出库标记 // private boolean PakOut = true; // //根据距离跳过取货 // private boolean PakRgv = true; // //接驳标记 // private boolean PakToCrn = true; // 任务锁定 private boolean Paking = true; private boolean Paking = true; // //连续任务下发 // private boolean PakAll = true; public RgvThread(RgvSlave slave) { this.slave = slave; @@ -234,6 +238,40 @@ buffer[byteIndex] &= ~(1 << bitIndex); // 清零 } } private void updateFlagInDb(String field, boolean value) { try { BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class); EntityWrapper<BasRgv> wrapper = new EntityWrapper<>(); wrapper.eq("rgv_no", slave.getId()); BasRgv entity = new BasRgv(); switch (field) { case "pak_mk": entity.setPakMk(value ? "1" : "0"); break; case "pak_in": entity.setPakIn(value ? "1" : "0"); break; case "pak_out": entity.setPakOut(value ? "1" : "0"); break; case "pak_rgv": entity.setPakRgv(value ? "1" : "0"); break; case "pak_to_crn":entity.setPakToCrn(value ? "1" : "0"); break; case "paking":entity.setPaking(value ? "1" : "0"); break; case "pak_all":entity.setPakAll(value ? "1" : "0"); break; default: log.warn("未知标志位字段: {}", field); return; } basRgvService.update(entity, wrapper); // log.info("RGV标志位更新成功 [rgv_no:{}] {}={}", slave.getId(), field, value ? "1" : "0"); } catch (Exception e) { log.error("更新RGV标志位异常 [rgv_no:{}] {}={} 错误:{}", slave.getId(), field, value, e.getMessage()); } } public void setPakMk(boolean pakMk) { this.PakMk = pakMk; updateFlagInDb("pak_mk", pakMk); } /** * 读取状态 @@ -274,8 +312,7 @@ rgvProtocol.setErr10(status3[1]); rgvProtocol.setErr11(status3[2]); rgvProtocol.setErr12(status3[3]); BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class); // BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class); OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功", DateUtils.convert(new Date()), slave.getId())); try { // 根据实时信息更新数据库 src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -107,7 +107,17 @@ put(1101, 2508);put(1102, 2600);put(1103, 2692);put(1104, 2784);put(1105, 2876); put(1106, 2968);put(1107, 3060);put(1108, 3152);put(1109, 3244);put(1110, 3336); put(2001, 392);put(2002, 116);put(2003, 208);put(2004, 0);put(2005, 300); put(2006, 508);put(2007, 692);put(2008, 600);put(2009, 808);put(2010, 992); put(2011, 900);put(2012, 1108);put(2013, 1500);put(2014, 1292);put(2015, 1200); put(2016, 1384);put(2017, 1616);put(2018, 1708);put(2019, 1800);put(2020, 1916); put(2021, 2008);put(2022, 2100);put(2023, 2216);put(2024, 2308);put(2025, 2400); put(2026, 2516);put(2027, 2608);put(2028, 2792);put(2029, 2700);put(2030, 2908); put(2031, 464);put(2032, 348);put(2033, 556);put(2034, 92);put(2035, 0); put(2037, 256); put(4001, 0);put(4002, 116);put(4003, 508);put(4004, 392);put(4005, 300); put(4006, 208); // 其他站点同理继续加 }}; @@ -118,11 +128,11 @@ // 特殊站点集合 private static final Set<Integer> specialSites = new HashSet<>( Arrays.asList(1001,1005,1008,1011,1015,1019,1022,1025,1029, 1032,1039)); Arrays.asList(1001,1005,1008,1011,1015,1019,1022,1025,1029, 1032,1039,2004,2001,2007,2010,2016,2013,2019,2022,2025,2030,4001,4004)); // 特殊站点集合 private static final Set<Integer> specialSites2 = new HashSet<>( Arrays.asList(1051,1055,1057,1065,1067,1069,1077,1081,1083,1086,1089,1092,1095,1097,1100)); Arrays.asList(1051,1055,1057,1065,1067,1069,1077,1081,1083,1086,1089,1092,1095,1097,1100,2034)); private static final Set<Integer> specialSites3 = new HashSet<>(//机械臂站点 Arrays.asList(1098,1093,1087,1082,1074,1071,1061,1058)); @@ -250,7 +260,7 @@ staProtocol.setEmptyMk(false); // 空板信号 staProtocol.setStaNo((short) 0); // 目标站 if (!staProtocol.isPakMk() && !staProtocol.isLoading()) { if (!staProtocol.isPakMk() && staProtocol.isLoading()) { staProtocol.setPakMk(true); } } @@ -287,12 +297,25 @@ ArrayList<Integer> staNos = getStaNo(); int staNoSize = staNos.size(); OperateResultExOne<byte[]> result = null; OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB100.0", (short) (2768));//1001-1028 OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.0", (short) (1268));//1029-1037 OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB104.0", (short) (1268));//1042-1053 OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB103.0", (short) (2824));//1054-1079 OperateResultExOne<byte[]> result5 = siemensS7Net.Read("DB102.0", (short) (3428));//1080-1110 OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB3.0", (short) (536));//1080-1110 OperateResultExOne<byte[]> result1 = null; OperateResultExOne<byte[]> result2 = null;//1029-1037 OperateResultExOne<byte[]> result3 = null;//1042-1053 OperateResultExOne<byte[]> result4 = null;//1054-1079 OperateResultExOne<byte[]> result5 = null;//1080-1110 OperateResultExOne<byte[]> resultErr = null;//1080-1110 if(staNoSize == 99){ result1 = siemensS7Net.Read("DB100.0", (short) (2768));//1001-1028 result2 = siemensS7Net.Read("DB101.0", (short) (1268));//1029-1037 result3 = siemensS7Net.Read("DB104.0", (short) (1268));//1042-1053 result4 = siemensS7Net.Read("DB103.0", (short) (2824));//1054-1079 result5 = siemensS7Net.Read("DB102.0", (short) (3428));//1080-1110 resultErr = siemensS7Net.Read("DB3.0", (short) (536));//1080-1110 }else{ result1 = siemensS7Net.Read("DB200.0", (short) (3000));//2001-2030 result2 = siemensS7Net.Read("DB201.0", (short) (720));//2031-2037 result3 = siemensS7Net.Read("DB400.0", (short) (600));//4001-4006 } @@ -305,16 +328,26 @@ staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } if(siteId < 1029){ result = result1; }else if(siteId < 1042){ result = result2; }else if(siteId < 1054){ result = result3; }else if(siteId < 1080){ result = result4; }else if(siteId < 1111){ result = result5; if (staNoSize == 99) { if (siteId < 1029) { result = result1; } else if (siteId < 1042) { result = result2; } else if (siteId < 1054) { result = result3; } else if (siteId < 1080) { result = result4; } else if (siteId < 1111) { result = result5; } }else{ if (siteId < 2031) { result = result1; } else if (siteId < 4001) { result = result2; } else { result = result3; } } // 获取该站点对应的偏移量 Integer offset = siteOffsetMap.get(siteId); @@ -367,7 +400,7 @@ // staProtocol.setHigh(status[6]); // 高库位 // staProtocol.setLow(status[7]); // 低库位 if (!staProtocol.isPakMk() && (!staProtocol.isLoading() || !staProtocol.isInEnable())) { if (!staProtocol.isPakMk() && (!staProtocol.isLoading() || staProtocol.getWorkNo()==0)) { staProtocol.setPakMk(true); } } @@ -490,7 +523,32 @@ write1 = siemensS7Net.Write("DB102." + (offset + offset2 + 48), staProtocol.getStaNo().intValue()); // 目标站 }else{ write1 = siemensS7Net.Write("DB102." + (offset + offset2 + 12), staProtocol.getStaNo().intValue()); // 目标站 } } } }else if(siteId < 2031){ write = siemensS7Net.Write("DB200." + (offset + offset2), staProtocol.getWorkNo()); // 工作号 Thread.sleep(200); if(specialSites2.contains(siteId)){ write1 = siemensS7Net.Write("DB200." + (offset + offset2 + 48), staProtocol.getStaNo().intValue()); // 目标站 }else{ write1 = siemensS7Net.Write("DB200." + (offset + offset2 + 12), staProtocol.getStaNo().intValue()); // 目标站 } }else if(siteId < 4000){ write = siemensS7Net.Write("DB201." + (offset + offset2), staProtocol.getWorkNo()); // 工作号 Thread.sleep(200); if(specialSites2.contains(siteId)){ write1 = siemensS7Net.Write("DB201." + (offset + offset2 + 48), staProtocol.getStaNo().intValue()); // 目标站 }else{ write1 = siemensS7Net.Write("DB201." + (offset + offset2 + 12), staProtocol.getStaNo().intValue()); // 目标站 } }else{ write = siemensS7Net.Write("DB400." + (offset + offset2), staProtocol.getWorkNo()); // 工作号 Thread.sleep(200); if(specialSites2.contains(siteId)){ write1 = siemensS7Net.Write("DB400." + (offset + offset2 + 48), staProtocol.getStaNo().intValue()); // 目标站 }else{ write1 = siemensS7Net.Write("DB400." + (offset + offset2 + 12), staProtocol.getStaNo().intValue()); // 目标站 } } if(write.IsSuccess && write1.IsSuccess){ log.error("写入输送线命令成功。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); break; src/main/resources/application.yml
@@ -477,7 +477,7 @@ # 输送线1 devp[1]: id: 2 ip: 10.10.10.50 ip: 10.10.10.61 port: 102 rack: 0 slot: 0 src/main/resources/mapper/WrkMastStaMapper.xml
@@ -153,8 +153,13 @@ </select> <select id="selectLockWrk" resultMap="BaseResultMap"> select * from asr_wrk_mast_sta where mk = 1 and rgv_no = #{rgvNo} where wrk_sts > 0 and sta_end < 2000 </select> <select id="selectLockWrkT" resultMap="BaseResultMap"> select * from asr_wrk_mast_sta where wrk_sts > 0 and sta_end > 2000 </select> src/main/webapp/views/rgv.html
@@ -91,18 +91,19 @@ <tr> <th>RGV</th> <th>当前模式</th> <th>当前状态</th> <!-- <th>当前状态</th>--> <th>任务号</th> <th>工作状态</th> <th>有物</th> <th>RGV位置</th> <th>走行定位</th> <!-- <th>任务号2</th>--> <!-- <th>状态2</th>--> <!-- <th>有物2</th>--> <!-- <th>走行定位</th>--> <th>故障代码</th> <th>故障描述</th> <th>锁定状态</th> <th>入库标记</th> <th>出库标记</th> <th>优先放货</th> <!-- <th>接驳标记</th>--> <th>连续取货</th> </tr> </thead> <tbody> @@ -326,7 +327,7 @@ headers: {'token': localStorage.getItem('token')}, method: 'POST', success: function (res) { // console.log(res) // console.log(res); if (res.code === 200){ var table = res.data; if (table.length > rgvStateTableBlankRows && table.length !== rgvStateTableFullRows) { @@ -337,18 +338,21 @@ var tr = tableEl.find("tr").eq(i); setVal(tr.children("td").eq(0), table[i-1].rgvNo); setVal(tr.children("td").eq(1), table[i-1].statusType); setVal(tr.children("td").eq(2), table[i-1].status); setVal(tr.children("td").eq(3), table[i-1].workNo1); setVal(tr.children("td").eq(4), table[i-1].status1); setVal(tr.children("td").eq(5), table[i-1].loading1); setVal(tr.children("td").eq(6), table[i-1].rgvPos1); setVal(tr.children("td").eq(7), table[i-1].walkPos); setVal(tr.children("td").eq(2), table[i-1].workNo1); setVal(tr.children("td").eq(3), table[i-1].status1); setVal(tr.children("td").eq(4), table[i-1].loading1); setVal(tr.children("td").eq(5), table[i-1].rgvPos1); // setVal(tr.children("td").eq(6), table[i-1].walkPos); // setVal(tr.children("td").eq(8), table[i-1].workNo2); // setVal(tr.children("td").eq(9), table[i-1].status2); // setVal(tr.children("td").eq(10), table[i-1].loading2); setVal(tr.children("td").eq(8), table[i-1].warnCode); setVal(tr.children("td").eq(9), table[i-1].alarm); setVal(tr.children("td").eq(10), table[i-1].pakMk); setVal(tr.children("td").eq(6), table[i-1].warnCode); setVal(tr.children("td").eq(7), table[i-1].alarm); setVal(tr.children("td").eq(8), table[i-1].pakIn); setVal(tr.children("td").eq(9), table[i-1].pakOut); setVal(tr.children("td").eq(10), table[i-1].pakRgv); setVal(tr.children("td").eq(11), table[i-1].pakAll); } } else if (res.code === 403){ window.location.href = baseUrl+"/login";