src/main/java/com/zy/asrs/entity/BasRgvOpt.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/RgvSlave.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/command/RgvCommand.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/protocol/RgvProtocol.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/RgvThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/mapper/WrkMastMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/entity/BasRgvOpt.java
@@ -165,6 +165,13 @@ this.updateBy = updateBy; this.memo = memo; } public BasRgvOpt(Integer wrkNo1, Integer wrkNo2, Integer rgvNo, Date sendTime, Integer posSta){ this.wrkNo1 = wrkNo1; this.wrkNo2 = wrkNo2; this.rgvNo = rgvNo; this.sendTime = sendTime; this.posSta = posSta; } public BasRgvOpt(Integer wrkNo1, Integer wrkNo2, Integer rgvNo, Date sendTime, String mode, Integer sourceSta, Integer posSta, Integer sourceRow, Integer posRow, Integer response, Date updateTime, Long updateBy) { this.wrkNo1 = wrkNo1; src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -113,4 +113,5 @@ WrkMast selectPickStep3(@Param("barcode")String barcode); WrkMast selectByWrkNo(@Param("wrkNo")Integer wrkNo); Integer countPakOutEmpty(@Param("staNo")Integer outSite); } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -2535,16 +2535,20 @@ public synchronized void autoEmptyOut() { SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); List<Integer> list = new ArrayList<>(); list.add(1108);list.add(112); Map<Integer,Integer> map = new HashMap<>(); map.put(101,102);map.put(112,111); list.add(1108);list.add(2031); for (Integer site:list){ WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("sta_no", map.get(site))); if (!Cools.isEmpty(wrkMast)){ Integer emptyCount = wrkMastMapper.countPakOutEmpty(site); StaProtocol staProtocol = null; if(emptyCount >= 2 && site == 1108){ continue; }else if(emptyCount == 1 && site == 2031){ continue; } //如果站点可出禁用,则不生成空盘出库任务 StaProtocol staProtocol = devpThread.getStation().get(site); switch (site){ case 1108:staProtocol = devpThread.getStation().get(site - 2);break; case 2031:staProtocol = devpThread.getStation().get(site);break; } if (staProtocol == null) { return; } else { @@ -2555,10 +2559,6 @@ && staProtocol.isOutEnable() //可出信号 && staProtocol.getWorkNo() == 0 ) { WrkMast pakoutEmpty = wrkMastMapper.selectPakoutEmpty(site); if (null != pakoutEmpty) { return; } Short loctype1 = 1; LocTypeDto locTypeDto = new LocTypeDto(loctype1, (short) 1, (short) 1); locTypeDto.setSiteId(site); @@ -2799,17 +2799,16 @@ StaProtocol staProtocol = devpThread.getStation().get(staNo); boolean rgvComplete = false; long now = System.currentTimeMillis(); if (staProtocol.isLoading()) { rgvProtocol.setLoadingStartTime(null); // 已到位,清空时间戳 } else { if (rgvProtocol.getLoadingStartTime() == null) { rgvProtocol.setLoadingStartTime(now); } } // long now = System.currentTimeMillis(); // if (staProtocol.isLoading()) { // rgvProtocol.setLoadingStartTime(null); // 已到位,清空时间戳 // } else { // if (rgvProtocol.getLoadingStartTime() == null) { // rgvProtocol.setLoadingStartTime(now); // } // } if (staProtocol.isLoading() || (rgvProtocol.getLoadingStartTime() != null && now - rgvProtocol.getLoadingStartTime() > 10000)) { if (staProtocol.isLoading()) { rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(), 3); if (!rgvComplete){ log.error("小车复位失败,小车号{}!等待入库取货", rgvProtocol.getRgvNo()); @@ -3062,7 +3061,7 @@ } } //入库放货 //出库放货 if( rgvThread.isPakOut()){ for(RgvSlave.RgvStn rgvStn : rgv.getRgvOutPStn()){//入库放货站点 boolean flag = false; @@ -3070,7 +3069,7 @@ DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, rgvStn.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(rgvStn.getStaNo()); if (staProtocol == null) { News.infoNoLog( " - 1" + " - 1" + " - Rgv入库放货站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol); News.infoNoLog( " - 1" + " - 1" + " - Rgv出库放货站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol); continue; } else { staProtocol = staProtocol.clone(); @@ -3078,7 +3077,7 @@ // 查询站点详细信息 BasDevp staDetl = basDevpService.selectById(rgvStn.getStaNo()); if (staDetl == null) { News.error( " - 1" + " - 2" + " - 入库 ===>>Rgv放货站点在数据库不存在, 站点编号={}", rgvStn.getStaNo()); News.error( " - 1" + " - 2" + " - 出库 ===>>Rgv放货站点在数据库不存在, 站点编号={}", rgvStn.getStaNo()); continue; } @@ -3087,7 +3086,7 @@ flag = true; } if (!flag) { News.errorNoLog( " - 1" + " - 3" + " - Rgv入库放货站信息(以下需要全true):" News.errorNoLog( " - 1" + " - 3" + " - Rgv出库放货站信息(以下需要全true):" + "自动信号" + staProtocol.isAutoing() + "有物信号" + staProtocol.isLoading() + "工作号>0" + staProtocol.getWorkNo() + "可入信号" + staProtocol.isOutEnable() + "能入信号(wms设置).equals(\"Y\")" + staDetl.getCanouting()); @@ -3104,7 +3103,7 @@ } WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(wrkNo));//根据站点工作号和小车工作范围检索任务档 if( null == wrkMastSta ) { News.infoNoLog( " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo()); News.infoNoLog( " - 1" + " - 4" + " - 查询无待出库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo()); continue; } wrkMastSta.setWrkSts(2); @@ -3202,17 +3201,34 @@ public synchronized void rgvRunWrkMastIn(RgvSlave slave, RgvProtocol rgvProtocol,Integer mark) { for (RgvSlave.RgvStn rgvStn : slave.getRgvInTStn()) {//rgv入库取货站点 boolean flag = false; boolean ds = 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; RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, (int) rgvProtocol.getRgvNo()); 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) { @@ -3236,12 +3252,13 @@ List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute()); basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档 if( null == wrkMastSta ) { News.infoNoLog("" + mark + " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo()); continue; } WrkMastSta wrkMastSta2 = wrkMastStaMapper.selectByWorkSta(2, (int) rgvProtocol.getRgvNo()); boolean result = true; boolean result = false; if(wrkMastSta2 != null && rgvProtocol.getRgvNo() == 1){ //距离计算 2楼单入库口不需要计算 result = rgvCalcDistance((int) rgvProtocol.getRgvNo(),wrkMastSta2.getStaEnd(),wrkMastSta.getStaStart());//工位2放货站点,工位1取货站点 } @@ -3252,7 +3269,16 @@ wrkMastSta.setWorkSta(wrkMastSta2 != null ? 1 : 2); wrkMastSta.setRgvNo((int) rgvProtocol.getRgvNo()); Short direction = 2;//双工位最终抵达位置 boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,direction); //命令下发 boolean sign = false; //若取货为工位2且取货口前一站点有物,给双工位同时下发指令 if(wrkMastSta.getWorkSta() == 2 && staProtocol2 != null && staProtocol2.isLoading() && staProtocol2.getWorkNo() > 0){ WrkMastSta wrkMastSta3 = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol2.getWorkNo()));//根据站点工作号和小车工作范围检索任务档 wrkMastSta3.setWorkSta(1); wrkMastSta3.setRgvNo((int) rgvProtocol.getRgvNo()); sign = rgvTakeFullAll2(basRgvMap.getRgvNo(), wrkMastSta, wrkMastSta3); }else{ sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,direction); //命令下发 } if (sign){ wrkMastSta.setWrkSts(1); try{ @@ -3283,7 +3309,21 @@ 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; @@ -3316,12 +3356,29 @@ News.infoNoLog("" + mark + " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo()); continue; } WrkMastSta wrkMastSta2 = wrkMastStaMapper.selectByWorkSta(2, (int) rgvProtocol.getRgvNo()); boolean result = false; if(wrkMastSta2 != null && rgvProtocol.getRgvNo() == 1){ //距离计算 2楼单入库口不需要计算 result = rgvCalcDistance((int) rgvProtocol.getRgvNo(),wrkMastSta2.getStaEnd(),wrkMastSta.getStaStart());//工位2放货站点,工位1取货站点 } if(result){//若小车距离放货点距离近于取货点则跳过取货 true跳过取货/false优先取货 rgvThread.setPakRgv(false); continue; } WrkMastSta wrkMastSta1 = wrkMastStaMapper.selectByWorkSta(1, (int) rgvProtocol.getRgvNo()); wrkMastSta.setWorkSta(wrkMastSta1 != null ? 2 : 1);//若1号工位有任务给2号工位 wrkMastSta.setRgvNo((int) rgvProtocol.getRgvNo()); boolean sign = false; Short direction = 1;//工位1方向 boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta, direction); //命令下发 //若取货为工位2且取货口前一站点有物,给双工位同时下发指令 if(wrkMastSta.getWorkSta() == 1 && staProtocol2 != null && staProtocol2.isLoading() && staProtocol2.getWorkNo() > 0){ WrkMastSta wrkMastSta3 = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol2.getWorkNo()));//根据站点工作号和小车工作范围检索任务档 wrkMastSta3.setWorkSta(2); wrkMastSta3.setRgvNo((int) rgvProtocol.getRgvNo()); sign = rgvTakeFullAll2(basRgvMap.getRgvNo(), wrkMastSta, wrkMastSta3); }else{ sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,direction); //命令下发 } if (sign){ wrkMastSta.setWrkSts(1); try{ @@ -3509,7 +3566,7 @@ // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { // 遍历入库口 入库预调度 List<Integer> staNos = Arrays.asList(1042, 1043, 1105, 1104); List<Integer> staNos = Arrays.asList( 1043, 1104,1037); for (Integer staNo : staNos) { SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(staNo); @@ -3520,10 +3577,14 @@ rgvCommand.setTaskNo1(9999); // 工位1工作号 rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式: 移动 rgvCommand.setEndStaNo1(0); //工位1 放货后要去的位置 if(staNo == 1042 || staNo ==1043){ rgvCommand.setTargetPosition1(1042); //工位1目标站点 }else{ rgvCommand.setTargetPosition1(1105); //工位1目标站点 switch (staNo){ case 1043: rgvCommand.setTargetPosition1(1042);break; //工位1目标站点 case 1104: rgvCommand.setTargetPosition1(1105);break; case 1037: rgvCommand.setTargetPosition1(1036);break; } if(Objects.equals(basRgvMap.getNowRoute(), staNo)){ continue; } rgvCommand.setCommand(true); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Rgv, (int) rgvProtocol.getRgvNo(), new Task(4, rgvCommand))) { @@ -3864,6 +3925,96 @@ } } /* * 小车取货至双工位任务 * */ public synchronized boolean rgvTakeFullAll2(Integer rgvId,WrkMastSta wrkMastSta,WrkMastSta wrkMastSta2){ try{ // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); boolean pakIn1 = true; boolean pakIn2 = true; rgvCommand.setRgvNo(rgvId); // RGV编号 if(wrkMastSta.getWrkSts() == 0) {//取货 if (wrkMastSta.getWorkSta() == 2) {//入库RGV取货 rgvCommand.setAckFinish2(false); // 工位2任务完成确认位 rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号 rgvCommand.setTaskStatus2(RgvTaskStatusType.FETCH); // 工位2任务模式: 取放货 rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd()); //工位2 放货后要去的位置 rgvCommand.setTargetPosition2(wrkMastSta.getStaStart()); //工位2目标站点 rgvCommand.setCommand(true); //工位1任务确认 rgvCommand.setAckFinish1(false); // 工位1任务完成确认位 rgvCommand.setTaskNo1(Math.toIntExact(wrkMastSta2.getWrkNo())); // 工位1工作号 rgvCommand.setTaskStatus1(RgvTaskStatusType.FETCH); // 工位1任务模式: 取放货 rgvCommand.setEndStaNo1(wrkMastSta2.getWrkEnd()); //工位1 放货后要去的位置 rgvCommand.setTargetPosition1(wrkMastSta2.getStaStart()); //工位1目标站点 rgvCommand.setCommand(true); //工位1任务确认 rgvCommand.setWrkTaskPri((short) 2); //优先执行工位2任务 } else { //出库RGV取货 rgvCommand.setAckFinish1(false); // 工位1任务完成确认位 rgvCommand.setTaskNo1(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位1工作号 rgvCommand.setTaskStatus1(RgvTaskStatusType.FETCH); // 工位1任务模式: 取放货 rgvCommand.setEndStaNo1(wrkMastSta.getWrkEnd()); //工位1 放货后要去的位置 rgvCommand.setTargetPosition1(wrkMastSta.getStaStart()); //工位1目标站点 rgvCommand.setAckFinish2(false); // 工位2任务完成确认位 rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号 rgvCommand.setTaskStatus2(RgvTaskStatusType.FETCH); // 工位2任务模式: 取放货 rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd()); //工位2 放货后要去的位置 rgvCommand.setTargetPosition2(wrkMastSta.getStaStart()); //工位2目标站点 rgvCommand.setWrkTaskPri((short) 1); //出库取货优先执行工位1任务 rgvCommand.setCommand(true); //工位1任务确认 } if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(2, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); return false; } else { return true; } } // if(wrkMastSta.getWrkSts() == 2) {//放货 // if((wrkMastSta.getWorkSta() == 2)){ //工位2任务放货 // rgvCommand.setAckFinish2(false); // 工位2任务完成确认位 // rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号 // rgvCommand.setTaskStatus2(RgvTaskStatusType.PUT); // 工位2任务模式: 放货 // rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd()); //工位2 放货后要去的位置 // rgvCommand.setTargetPosition2(wrkMastSta.getStaEnd()); //工位2目标站点 // rgvCommand.setCommand(true); //工位1任务确认 // pakIn2 = false; // }else{ //工位1任务放货 // rgvCommand.setAckFinish1(false); // 工位1任务完成确认位 // rgvCommand.setTaskNo1(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位1工作号 // rgvCommand.setTaskStatus1(RgvTaskStatusType.PUT); // 工位1任务模式: 放货 // rgvCommand.setEndStaNo1(wrkMastSta.getWrkEnd()); //工位1 放货后要去的位置 // rgvCommand.setTargetPosition1(wrkMastSta.getStaEnd()); //工位1目标站点 // rgvCommand.setCommand(true); //工位1任务确认 // } // if(!pakIn2){ // if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) { // //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 // log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); // return false; // } else { // return true; // } // }else{ // if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) { // //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 // log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); // return false; // } else { // return true; // } // } // } return true; }catch (Exception e){ return false; } } /* * 小车取货至工位任务 * */ src/main/java/com/zy/core/model/RgvSlave.java
@@ -54,6 +54,8 @@ // RGV站点编号 private Integer staNo; // RGV二站点编号 private Integer staNo2; // // 排 // private Integer row; src/main/java/com/zy/core/model/command/RgvCommand.java
@@ -132,6 +132,14 @@ */ private Boolean command = false; /** * 同时下发时作业顺序 * 0:无(不判断) * 1:工位1先执行 * 2:工位2先执行 */ Short wrkTaskPri = 0; public void setTaskMode1(Short taskMode1){ this.taskMode1 = taskMode1; this.taskModeType1 = RgvTaskModeType.get(taskModeType1); src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -28,6 +28,14 @@ private transient Long loadingStartTime; /** * 执行优先级 * 0:不判断 * 1:工位1先执行 * 2:工位2先执行 */ public Short wrkTaskPri; /** * RGV当前状态工位1 src/main/java/com/zy/core/thread/RgvThread.java
@@ -80,10 +80,10 @@ case 1: readStatus(); break; // // 工位1、2写入数据 // case 2: // write((RgvCommand) task.getData()); // break; // 工位1、2写入数据 case 2: write12((RgvCommand) task.getData()); break; //工位1写入数据 case 4: write1((RgvCommand) task.getData()); @@ -104,6 +104,7 @@ command.setTaskStatus1(RgvTaskStatusType.NONE); // 任务模式 command.setTargetPosition1( 0); // 源站 command.setEndStaNo1(0); // 目标站 command.setWrkTaskPri((short)0); command.setCommand(false); write1(command); break; @@ -118,6 +119,7 @@ command2.setTaskStatus2(RgvTaskStatusType.NONE); // 任务模式 command2.setTargetPosition2( 0); // 源站 command2.setEndStaNo2(0); // 目标站 command2.setWrkTaskPri((short)0); command2.setCommand(false); write2(command2); break; @@ -131,6 +133,7 @@ command3.setTaskStatus1(RgvTaskStatusType.NONE); // 任务模式 command3.setTargetPosition1( 0); // 源站 command3.setCommand(false); command3.setWrkTaskPri((short)0); write1(command3); break; case 8 : @@ -143,6 +146,7 @@ command4.setTaskStatus2(RgvTaskStatusType.NONE); // 任务模式 command4.setTargetPosition2( 0); // 小车目标站清零 command4.setCommand(false); command4.setWrkTaskPri((short)0); write2(command4); break; // 回原点 避让 @@ -195,6 +199,7 @@ rgvProtocol.setErr5(false); rgvProtocol.setErr6(false); rgvProtocol.setErr7(false); rgvProtocol.setWrkTaskPri((short)0); //工位1状态 rgvProtocol.setTaskNo1(0); rgvProtocol.setStatus1((short)-1); @@ -242,7 +247,7 @@ */ private void readStatus(){ try { OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 30); OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 27); if (result.IsSuccess) { if (null == rgvProtocol) { rgvProtocol = new RgvProtocol(); @@ -276,6 +281,7 @@ rgvProtocol.setErr5(status3[4]); rgvProtocol.setErr6(status3[5]); rgvProtocol.setErr7(status3[6]); // rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 12)); // rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 14)); @@ -346,73 +352,179 @@ } } // /** // * 工位1、2同时写入数据 // */ // private boolean write(RgvCommand command) throws InterruptedException { // if (null == command) { // log.error("RGV写入命令为空"); // return false; // } //// convertRow(command); // command.setRgvNo(slave.getId()); // short[] array = new short[11]; // array[0] = command.getAckFinish1(); // array[1] = command.getTaskNo1(); // array[2] = command.getTaskMode1(); // array[3] = command.getSourceStaNo1(); // array[4] = command.getDestinationStaNo1(); //// array[0] = command.getAckFinish1(); //// array[1] = command.getTaskNo1(); //// array[2] = command.getTaskMode1(); //// array[3] = command.getSourceStaNo1(); //// array[4] = command.getDestinationStaNo1(); //// array[5] = command.getAckFinish2(); //// array[6] = command.getTaskNo2(); //// array[7] = command.getTaskMode2(); //// array[8] = command.getSourceStaNo2(); //// array[9] = command.getDestinationStaNo2(); //// array[10] = command.getCommand(); // OperateResult result = siemensNet.Write("DB100.0", array); // //// if (command.getAckFinish1() == 0 && command.getAckFinish2() == 0) { //// short commandFinish = 3; //工位1、2任务同时写入 //// Thread.sleep(100L); //// result = siemensNet.Write("DB100.20", commandFinish); //// } // // try { // // 日志记录 // BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class); // BasRgvOpt basRgvOpt = new BasRgvOpt( // command.getTaskNo1().intValue(), // command.getTaskNo2().intValue(), // command.getRgvNo(), // new Date(), // command.getTaskModeType1().toString(), // command.getSourceStaNo1().intValue(), // command.getDestinationStaNo1().intValue(), // command.getSourceStaNo2().intValue(), // command.getDestinationStaNo2().intValue(), // null, // new Date(), // null // ); // bean.insert(basRgvOpt); // } catch (Exception ignore) {} // // if (result != null && result.IsSuccess) { // Thread.sleep(200); // this.readStatus(); // log.info("RGV 命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); // OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); // return true; // } else { // OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); // log.error("写入RGV plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); // return false; // } // } /** * 工位1、2同时写入数据 */ private boolean write12(RgvCommand command) throws InterruptedException { if (null == command) { log.error("RGV写入命令为空"); return false; } OperateResultExOne<byte[]> result1 = siemensNet.Read("DB100.0", (short) 34); // OperateResultExOne<byte[]> result4 = siemensNet.Read("DB100.10", (short) 2); if (result1.IsSuccess){ RgvCommand one = new RgvCommand(); one.setTargetPosition1(siemensNet.getByteTransform().TransInt32(result1.Content, 0)); one.setEndStaNo1(siemensNet.getByteTransform().TransInt32(result1.Content, 4)); one.setTaskStatus1(siemensNet.getByteTransform().TransInt16(result1.Content, 8)); one.setTaskNo1(siemensNet.getByteTransform().TransInt32(result1.Content, 10)); one.setDirection1(siemensNet.getByteTransform().TransInt16(result1.Content, 14)); one.setTargetPosition2(siemensNet.getByteTransform().TransInt32(result1.Content, 16)); one.setEndStaNo2(siemensNet.getByteTransform().TransInt32(result1.Content, 20)); one.setTaskStatus2(siemensNet.getByteTransform().TransInt16(result1.Content, 24)); one.setTaskNo2(siemensNet.getByteTransform().TransInt32(result1.Content, 26)); one.setDirection2(siemensNet.getByteTransform().TransInt16(result1.Content, 30)); News.error("RGV命令下发前读取状态[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); } OperateResult result2 = siemensNet.Write("DB100.34", false); if (result2.IsSuccess){ News.error("下发前把车子确认位置为false"); } byte[] writeBytes = new byte[36]; command.setRgvNo(slave.getId()); siemensNet.getByteTransform().TransInt32(writeBytes, 0, command.getTargetPosition1()); siemensNet.getByteTransform().TransInt32(writeBytes, 4, command.getEndStaNo1()); siemensNet.getByteTransform().TransInt16(writeBytes, 8, command.getTaskStatus1()); siemensNet.getByteTransform().TransInt32(writeBytes, 10, command.getTaskNo1()); siemensNet.getByteTransform().TransInt16(writeBytes, 14, command.getDirection1()); setBool(writeBytes, 32, 0, command.getAckFinish1()); siemensNet.getByteTransform().TransInt32(writeBytes, 16, command.getTargetPosition2()); siemensNet.getByteTransform().TransInt32(writeBytes, 20, command.getEndStaNo2()); siemensNet.getByteTransform().TransInt16(writeBytes, 24, command.getTaskStatus2()); siemensNet.getByteTransform().TransInt32(writeBytes, 26, command.getTaskNo2()); siemensNet.getByteTransform().TransInt16(writeBytes, 30, command.getDirection2()); setBool(writeBytes, 32, 1, command.getAckFinish2()); siemensNet.getByteTransform().TransInt16(writeBytes, 36, command.getWrkTaskPri()); OperateResult result = siemensNet.Write("DB100.0", writeBytes); if (!result.IsSuccess){ News.error("写入RGVplc数据失败,重新添加任务到队列 ===> [id:{}],{}",slave.getId(),JSON.toJSON(command)); MessageQueue.offer(SlaveType.Rgv,slave.getId(),new Task(2,command)); Thread.sleep(100); readStatus(); return false; } //RGV任务写入后,回读一次,看是否成功 Thread.sleep(400); try { OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 36); if (resultRead.IsSuccess){ RgvCommand one = new RgvCommand(); one.setDirection1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14)); one.setTaskNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 10)); one.setTaskStatus1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8)); one.setEndStaNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 4)); one.setTargetPosition1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 0)); one.setWrkTaskPri(siemensNet.getByteTransform().TransInt16(resultRead.Content, 36)); one.setDirection2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 30)); one.setTaskNo2(siemensNet.getByteTransform().TransInt32(resultRead.Content, 26)); one.setTaskStatus2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 24)); one.setEndStaNo2(siemensNet.getByteTransform().TransInt32(resultRead.Content, 20)); one.setTargetPosition2(siemensNet.getByteTransform().TransInt32(resultRead.Content, 16)); if ( !command.getDirection1().equals(one.getDirection1()) || !command.getTaskNo1().equals(one.getTaskNo1()) || !command.getTaskStatus1().equals(one.getTaskStatus1()) || !command.getEndStaNo1().equals(one.getEndStaNo1()) || !command.getTargetPosition1().equals(one.getTargetPosition1()) || !command.getDirection2().equals(one.getDirection2()) || !command.getTaskNo2().equals(one.getTaskNo2()) || !command.getTaskStatus2().equals(one.getTaskStatus2()) || !command.getEndStaNo2().equals(one.getEndStaNo2()) || !command.getTargetPosition2().equals(one.getTargetPosition2()) ) { try{ News.error("RGV命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); }catch (Exception e){ try{ News.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead)); }catch (Exception e1){ News.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); } } News.error("Rgv命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); MessageQueue.offer(SlaveType.Rgv, slave.getId(), new Task(4, command)); Thread.sleep(100); readStatus(); return false; }else { News.info("RGV命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); } } }catch (Exception e){ News.error("RGV命令地址写入后回读出错"); } if (command.getAckFinish1() || command.getAckFinish2()) { if (result.IsSuccess) { Thread.sleep(300); //任务下发次数 int writeCount2 = 0; do { writeCount2++; boolean commandFinish = false; boolean commandFinish2 = false; result = siemensNet.Write("DB100.DBX32.0", commandFinish); OperateResult result3 = siemensNet.Write("DB100.DBX32.1", commandFinish); if(result.IsSuccess && result3.IsSuccess){ //RGV任务写入后,回读一次,看是否成功 Thread.sleep(200); OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.32", (short) 2); if (resultRead.IsSuccess) { commandFinish=siemensNet.getByteTransform().TransBool(resultRead.Content, 0); commandFinish2=siemensNet.getByteTransform().TransBool(resultRead.Content, 1); if (!commandFinish && !commandFinish2) { News.error("RGV任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次"); }else{ //任务命令写入成功 News.info("RGV任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次"); break; } }else { News.error("RGV任务确认位"+commandFinish+"回读失败!"+"循环执行次数:"+writeCount2+"次"); } } else { News.error("RGV任务确认位"+commandFinish+"写入失败!"+"循环执行次数:"+writeCount2+"次"); } }while (writeCount2<5); } } try { // 日志记录 BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class); BasRgvOpt basRgvOpt = new BasRgvOpt( command.getTaskNo1(), command.getTaskNo2(), command.getRgvNo(), new Date(), command.getTargetPosition1() ); bean.insert(basRgvOpt); } catch (Exception ignore) { log.error(ignore.getMessage()); } if (result != null && result.IsSuccess) { Thread.sleep(200); this.readStatus(); log.info("RGV 工位1命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 工位12命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); return true; } else { OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV plc工位12数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.error("写入RGV plc工位1数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); return false; } } /** * 工位1写入数据 @@ -445,7 +557,7 @@ OperateResult result2 = siemensNet.Write("DB100.34", false); if (result2.IsSuccess){ News.error("下发前把车子确认位置为0"); News.error("下发前把车子确认位置为false"); } byte[] writeBytes = new byte[34]; command.setRgvNo(slave.getId()); @@ -636,11 +748,11 @@ OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 34); if (resultRead.IsSuccess){ RgvCommand one = new RgvCommand(); one.setDirection1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 30)); one.setTaskNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 26)); one.setTaskStatus1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 24)); one.setEndStaNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 20)); one.setTargetPosition1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 16)); one.setDirection2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 30)); one.setTaskNo2(siemensNet.getByteTransform().TransInt32(resultRead.Content, 26)); one.setTaskStatus2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 24)); one.setEndStaNo2(siemensNet.getByteTransform().TransInt32(resultRead.Content, 20)); one.setTargetPosition2(siemensNet.getByteTransform().TransInt32(resultRead.Content, 16)); if ( !command.getDirection2().equals(one.getDirection2()) || !command.getTaskNo2().equals(one.getTaskNo2()) || src/main/resources/application.yml
@@ -178,9 +178,11 @@ rgvInTStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 1042 staNo2: 1043 rgvInTStn[1]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 1105 staNo2: 1104 rgvInTStn[2]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 1038 @@ -207,18 +209,23 @@ rgvOutTStn[0]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 1007 staNo2: 1005 rgvOutTStn[1]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 1010 staNo2: 1008 rgvOutTStn[2]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 1021 staNo2: 1019 rgvOutTStn[3]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 1024 staNo2: 1022 rgvOutTStn[4]: devpPlcId: ${wcs-slave.devp[0].id} staNo: 1031 staNo2: 1029 #RGV出库放货站点 rgvOutPStn[0]: devpPlcId: ${wcs-slave.devp[0].id} src/main/resources/mapper/WrkMastMapper.xml
@@ -185,6 +185,12 @@ <select id="selectPakoutEmpty" resultMap="BaseResultMap"> select top 1 * from dbo.asr_wrk_mast where io_type = 110 and sta_no = #{staNo} order by io_time,wrk_no </select> <select id="countPakOutEmpty" resultType="int"> select count(*) from dbo.asr_wrk_mast where io_type = 110 and sta_no = #{staNo} </select> <select id="selectPickStep2" resultMap="BaseResultMap"> select top 1 * from asr_wrk_mast where barcode = #{barcode} and (wrk_sts=14 and io_type=107) or (wrk_sts=2 and io_type=57) </select>