src/main/java/com/zy/asrs/controller/RgvController.java
@@ -35,8 +35,10 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Objects; /** * RGV接口 @@ -73,41 +75,62 @@ public R rgvStateTable(){ List<RgvStateTableVo> list = new ArrayList<>(); List<BasRgv> rgvs = basRgvService.selectList(new EntityWrapper<BasRgv>().orderBy("rgv_no")); for (BasRgv basRgv : rgvs) { // 表格行 RgvStateTableVo vo = new RgvStateTableVo(); vo.setRgvNo(basRgv.getRgvNo()); // RGV号 list.add(vo); // 获取RGV信息 RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basRgv.getRgvNo()); if (rgvThread == null) { continue; } if (rgvThread == null) continue; RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; } if (rgvProtocol == null) continue; vo.setStatusType(rgvProtocol.modeType.desc); // 模式状态 vo.setStatus(rgvProtocol.getStatusType().desc); // 状态 vo.setWorkNo1(rgvProtocol.getTaskNo1()); // 工位1任务号 vo.setStatus1(rgvProtocol.getStatusType1().desc); // 工位1状态 vo.setLoading1(rgvProtocol.getLoaded1()==1?"有物":"无物"); // 工位1有物 vo.setLoading1(rgvProtocol.getLoaded1() ? "有物" : "无物"); // 工位1有物 vo.setRgvPos(rgvProtocol.getRgvPos()); vo.setRgvPos1(rgvProtocol.getRgvPosI()); vo.setWalkPos(rgvProtocol.getWalkPos()==1?"在定位":"不在定位"); vo.setWalkPos(Objects.equals(rgvProtocol.getWalkPos(), 1) ? "在定位" : "不在定位"); vo.setPakMk(rgvThread.isPakMk()?"无锁":"锁定"); // vo.setWorkNo2(rgvProtocol.getTaskNo2()); // 工位2任务号 // vo.setStatus2(rgvProtocol.getStatusType2().desc); // 工位2状态 // vo.setLoading2(rgvProtocol.getLoaded2()==1?"有物":"无物"); // 工位2有物 vo.setWorkNo2(rgvProtocol.getTaskNo2()); // 工位2任务号 vo.setStatus2(rgvProtocol.getStatusType2().desc); // 工位2状态 vo.setLoading2(rgvProtocol.getLoaded2() ? "有物" : "无物"); // 工位2有物 vo.setWarnCode(String.valueOf(rgvProtocol.getAlarm())); if (rgvProtocol.getAlarm() > 0) { BasRgvErr rgvErr = basRgvErrMapper.selectById(rgvProtocol.getAlarm()); vo.setAlarm(rgvErr==null?"未知异常":rgvErr.getErrName()); // --- 遍历 errX 字段生成 warnCode 和 alarm --- List<String> alarms = new ArrayList<>(); List<String> warnCodes = new ArrayList<>(); Field[] fields = rgvProtocol.getClass().getDeclaredFields(); for (Field field : fields) { if (field.getName().startsWith("err") && field.getType().equals(Boolean.class)) { field.setAccessible(true); try { Boolean value = (Boolean) field.get(rgvProtocol); if (Boolean.TRUE.equals(value)) { String numPart = field.getName().substring(3); int errId = Integer.parseInt(numPart); warnCodes.add(String.valueOf(errId)); BasRgvErr rgvErr = basRgvErrMapper.selectById(errId); alarms.add(rgvErr == null ? "未知异常(" + errId + ")" : rgvErr.getErrName()); } } catch (IllegalAccessException e) { e.printStackTrace(); } } } vo.setWarnCode(String.join(",", warnCodes)); vo.setAlarm(alarms.isEmpty() ? "" : String.join(",", alarms)); } return R.ok().add(list); } @PostMapping("/table/rgv/msg") @ManagerAuth(memo = "RGV数据表") @@ -171,17 +194,17 @@ public R rgvFetchPut(RgvOperatorParam param){ RgvCommand command = new RgvCommand(); command.setRgvNo(param.getRgvNo()); // RGV编号 command.setAckFinish1((short) 0); // 任务完成确认位 command.setTaskNo1((short) 0); // 工作号 command.setAckFinish1(false); // 任务完成确认位 command.setTaskNo1(0); // 工作号 command.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货 command.setSourceStaNo1(param.getSourceStaNo1()); // 源站 command.setDestinationStaNo1(param.getStaNo1()); // 目标站 // command.setAckFinish2((short) 0); // 任务完成确认位 // command.setTaskNo2((short) 0); // 工作号 // command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货 // command.setSourceStaNo2(param.getSourceStaNo2()); // 源站 // command.setDestinationStaNo2(param.getStaNo2()); // 目标站 command.setCommand((short) 0); command.setAckFinish2(false); // 任务完成确认位 command.setTaskNo2(0); // 工作号 command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货 command.setSourceStaNo2(param.getSourceStaNo2()); // 源站 command.setDestinationStaNo2(param.getStaNo2()); // 目标站 command.setCommand(true); return rgvControl(command)? R.ok(): R.error(); } @@ -191,17 +214,17 @@ public R rgvFetch(RgvOperatorParam param){ RgvCommand command = new RgvCommand(); command.setRgvNo(param.getRgvNo()); // RGV编号 command.setAckFinish1((short) 0); // 任务完成确认位 command.setTaskNo1((short) 0); // 工作号 command.setAckFinish1(false); // 任务完成确认位 command.setTaskNo1(0); // 工作号 command.setTaskMode1(RgvTaskModeType.FETCH); // 任务模式: 取货 command.setSourceStaNo1(param.getSourceStaNo1()); // 源站 command.setDestinationStaNo1(param.getStaNo1()); // 目标站 command.setAckFinish2((short) 0); // 任务完成确认位 command.setTaskNo2((short) 0); // 工作号 command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货 command.setAckFinish2(false); // 任务完成确认位 command.setTaskNo2( 0); // 工作号 command.setTaskMode2(RgvTaskModeType.FETCH); // 任务模式: 取放货 command.setSourceStaNo2(param.getSourceStaNo2()); // 源站 command.setDestinationStaNo2(param.getStaNo2()); // 目标站 command.setCommand((short) 0); command.setCommand(true); return rgvControl(command)? R.ok(): R.error(); } @@ -211,17 +234,17 @@ public R rgvPut(RgvOperatorParam param){ RgvCommand command = new RgvCommand(); command.setRgvNo(param.getRgvNo()); // RGV编号 command.setAckFinish1((short) 0); // 任务完成确认位 command.setTaskNo1((short) 0); // 工作号 command.setAckFinish1(false); // 任务完成确认位 command.setTaskNo1(0); // 工作号 command.setTaskMode1(RgvTaskModeType.PUT); // 任务模式: 放货 command.setSourceStaNo1(param.getSourceStaNo1()); // 源站 command.setDestinationStaNo1(param.getStaNo1()); // 目标站 command.setAckFinish2((short) 0); // 任务完成确认位 command.setTaskNo2((short) 0); // 工作号 command.setAckFinish2(false); // 任务完成确认位 command.setTaskNo2( 0); // 工作号 command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货 command.setSourceStaNo2(param.getSourceStaNo2()); // 源站 command.setDestinationStaNo2(param.getStaNo2()); // 目标站 command.setCommand((short) 0); command.setCommand(true); return rgvControl(command)? R.ok(): R.error(); } @@ -233,17 +256,17 @@ public R rgvTaskComplete(RgvOperatorParam param){ RgvCommand command = new RgvCommand(); command.setRgvNo(param.getRgvNo()); // RGV编号 command.setAckFinish1((short) 1); // 任务完成确认位 command.setTaskNo1((short) 0); // 工作号 command.setAckFinish1(true); // 任务完成确认位 command.setTaskNo1(0); // 工作号 command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo1((short) 0); // 源站 command.setDestinationStaNo1((short) 0); // 目标站 command.setAckFinish2((short) 1); // 任务完成确认位 command.setTaskNo2((short) 0); // 工作号 command.setAckFinish2(true); // 任务完成确认位 command.setTaskNo2( 0); // 工作号 command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo2((short) 0); // 源站 command.setDestinationStaNo2((short) 0); // 目标站 command.setCommand((short) 0); command.setCommand(true); return rgvControl(command)? R.ok(): R.error(); } @@ -256,17 +279,17 @@ } RgvCommand command = new RgvCommand(); command.setRgvNo(param.getRgvNo()); // RGV编号 command.setAckFinish1((short) 0); // 任务完成确认位 command.setTaskNo1((short) 0); // 工作号 command.setAckFinish1(true); // 任务完成确认位 command.setTaskNo1( 0); // 工作号 command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo1((short) 0); // 源站 command.setDestinationStaNo1((short) 0); // 目标站 command.setAckFinish2((short) 0); // 任务完成确认位 command.setTaskNo2((short) 0); // 工作号 command.setAckFinish2(true); // 任务完成确认位 command.setTaskNo2(0); // 工作号 command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo2((short) 0); // 源站 command.setDestinationStaNo2((short) 0); // 目标站 command.setCommand((short) 0); command.setCommand(true); return rgvControl(command)? R.ok(): R.error(); } @@ -292,9 +315,9 @@ RgvCommand Command = new RgvCommand(); Command.setRgvNo(rgv.getId()); // RGV编号 Command.setTaskMode1(RgvTaskModeType.NONE); Command.setAckFinish1((short) 0); // 任务完成确认位 Command.setAckFinish2((short) 0); // 任务完成确认位 Command.setCommand((short) 0); // 任务完成确认位 Command.setAckFinish1(true); // 任务完成确认位 Command.setAckFinish2(true); // 任务完成确认位 Command.setCommand(true); // 任务完成确认位 // 延时发送 Thread.sleep(1000L); if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, Command))) { src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java
@@ -13,7 +13,7 @@ private Integer rgvNo; // 工作号 private Short workNo = 0; private Integer workNo = 0; // 状态 private String status = "-"; src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java
@@ -18,7 +18,7 @@ private String status = "-"; // 任务号 private Short workNo1 = 0; private Integer workNo1 = 0; // 状态 private String status1 = "-"; @@ -27,13 +27,13 @@ private String loading1 = "-"; // RGV位置 private Short RgvPos = 0; private Integer RgvPos = 0; // 走行定位 private String walkPos = "-"; // 任务号 private Short workNo2 = 0; private Integer workNo2 = 0; // 状态 private String status2 = "-"; src/main/java/com/zy/asrs/entity/BasRgvOpt.java
@@ -181,6 +181,18 @@ this.updateBy = updateBy; } public BasRgvOpt(Integer wrkNo1, Integer rgvNo, Date sendTime, String mode, Integer sourceSta, Integer posSta, Integer response, Date updateTime, Long updateBy) { this.wrkNo1 = wrkNo1; this.rgvNo = rgvNo; this.sendTime = sendTime; this.mode = mode; this.sourceSta = sourceSta; this.posSta = posSta; this.response = response; this.updateTime = updateTime; this.updateBy = updateBy; } // BasRgvOpt basRgvOpt = new BasRgvOpt( // null, // ID[非空] // null, // 任务号 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -46,7 +46,6 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -2699,13 +2698,13 @@ // 只有当RGV空闲、自动,工位一无物//rgv可用 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getLoaded1()==0 //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接 && !rgvProtocol.isLoaded1ing() //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接 && (rgvProtocol.getTaskNo1()==0) &&rgvThread.isPakMk() ) { BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); Integer rgvNoOther = basRgvMap.getRgvNoOther(rgvProtocol.getRgvNo()); Integer rgvNoOther = basRgvMap.getRgvNoOther((int) rgvProtocol.getRgvNo()); RgvThread rgvThreadOther = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNoOther); RgvProtocol rgvProtocolOther = rgvThreadOther.getRgvProtocol(); if (rgvProtocolOther == null) { @@ -2715,7 +2714,7 @@ } if (rgvProtocolOther.getStatusType() == RgvStatusType.IDLE && rgvProtocolOther.getModeType() == RgvModeType.AUTO && rgvProtocolOther.getLoaded1()==0 && !rgvProtocolOther.isLoaded1ing() && (rgvProtocolOther.getTaskNo1()==0) &&rgvThreadOther.isPakMk() ){ @@ -2788,7 +2787,22 @@ && (rgvProtocol.getStatusType() == RgvStatusType.WORKING1) ){ log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol); if (rgvProtocol.getTaskNo1()!=0){ if(rgvProtocol.getTaskNo1() == 9999){ List<Integer> staNos = Arrays.asList( 1043, 1104); for (Integer staNo : staNos) { SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(staNo); boolean rgvComplete = false; if(!staProtocol.isLoading()){ rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),3);//工位1复位 } if (!rgvComplete){ log.error("小车复位失败,小车号{}!等待入库取货",rgvProtocol.getRgvNo()); break; } } } if (rgvProtocol.getTaskNo1()!=0 && rgvProtocol.getTaskNo1()!=9999){ // if (rgvProtocol.getTaskNo1()==32222){ // boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo()); // if (!rgvComplete){ @@ -2849,9 +2863,9 @@ //双工位出入库不同工位复位 if((sourceSta >= 1001 && sourceSta <= 1035) || (sourceSta >= 2001 && sourceSta <= 2030)){ rgvComplete = rgvComplete(rgvProtocol.getRgvNo(),6); rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),6); }else{ rgvComplete = rgvComplete(rgvProtocol.getRgvNo(),3); rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),3); } if (!rgvComplete){ @@ -2883,6 +2897,8 @@ } /** * 执行小车搬运任务 * * @return */ public synchronized boolean rgvRunWrkMastFullSta() { boolean wrkEnable = false; @@ -2902,14 +2918,13 @@ continue; } // 只有当RGV空闲、自动,工位一无物//rgv可用 // 只有当RGV空闲、自动,工位一无物//rgv可用 入库取货 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getLoaded1() == 0 && !rgvProtocol.isLoaded1ing() && rgvProtocol.getTaskNo1() == 0 && rgvProtocol.getTaskNo2() == 0 && rgvProtocol.getLoaded2() == 0 && rgvThread.isPakMk() && rgvThread.isPakIn() ) { BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); if (basRgvMap == null) { @@ -2920,35 +2935,10 @@ basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route); for (WrkMastSta wrkMastSta : wrkMastStaList){ // if (wrkMastSta.getType()!=0 || wrkMastSta.getWrkType()!=3 || wrkMastSta.getWrkSts()!=0){//1:满版 3:取放 // continue; // } //判断工作结束位置状态 // boolean signDev = false; // BasDevp devNo = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", wrkMastSta.getStaEnd())); // if (devNo.getDevNo()==113){ // BasDevp devNo114 = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", 114)); // if (!Cools.isEmpty(devNo114)){ // if (devNo114.getOutEnable().equals("Y")){ // signDev = true; // } // } // } // if (!Cools.isEmpty(devNo)){ // if (devNo.getAutoing().equals("Y") && !devNo.getWrkNo().equals(0) && !devNo.getLoading().equals("N")){ // continue; // } // if (!signDev && devNo.getDevNo()==113){ // if (!devNo.getAutoing().equals("Y") || !devNo.getWrkNo().equals(0) || !devNo.getLoading().equals("N")){ // wrkEnable = true; // continue; // } // if (!devNo.getOutEnable().equals("Y")){ // wrkEnable = true; // continue; // } // } // } List<Integer> staNos = Arrays.asList(1042, 1105, 1038, 1036, 2037);//入库口 if (!staNos.contains(wrkMastSta.getStaStart())) { continue; } boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发 wrkEnable = true; if (sign){ @@ -2960,12 +2950,13 @@ log.error("更新小车任务失败"); } rgvThread.setPakMk(false); rgvThread.setPakOut(false); boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd(),"2526"); if (signMap){ return wrkEnable; // break; }else { log.error("3864行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo()); log.error("货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo()); Thread.sleep(500); } } else { @@ -2976,15 +2967,132 @@ } } // 只有当RGV空闲、自动,工位一无物//rgv可用 出库取货 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && !rgvProtocol.isLoaded2ing() && rgvProtocol.getTaskNo2() == 0 && rgvThread.isPakMk() && rgvThread.isPakOut() ){ BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); if (basRgvMap == null) { log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo()); continue; } // if (!wrkEnable){ // rgvRunWrkMastEmptyStaAvoidance(); // } List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute()); basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route); for (WrkMastSta wrkMastSta : wrkMastStaList){ List<Integer> staNos = Arrays.asList(1042, 1105, 1038, 1036, 2037);//入库口 if (staNos.contains(wrkMastSta.getStaStart())) { continue; } boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发 wrkEnable = true; if (sign){ wrkMastSta.setWrkSts(1); try{ wrkMastStaMapper.updateById(wrkMastSta); log.error("更新小车任务成功"); }catch (Exception e){ log.error("3875行执行小车搬运任务下发失败"); log.error("3875行"+e); log.error("更新小车任务失败"); } rgvThread.setPakMk(false); rgvThread.setPakOut(false); boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd(),"2526"); if (signMap){ return wrkEnable; // break; }else { log.error("货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo()); Thread.sleep(500); } } else { log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo()); Thread.sleep(500); } break; } } } }catch (Exception e){ log.error("执行小车搬运任务下发失败"); } return wrkEnable; } /** * 小车预调度 */ public synchronized void rgvPreScheduling(){ try{ List<BasRgvMap> basRgvMaps = basRgvMapService.selectList(new EntityWrapper<>()); for (BasRgvMap rgvSlave:basRgvMaps) { RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getRgvNo()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; }else { rgvProtocol = rgvProtocol.clone(); } BasRgv basRgv = basRgvService.selectById(rgvSlave.getRgvNo()); if (basRgv == null) { log.error("{}号RGV尚未在数据库进行维护!4", rgvSlave.getRgvNo()); continue; } // 只有当RGV空闲、自动,工位一无物//rgv可用 才进行预调度 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && !rgvProtocol.isLoaded1ing() && rgvProtocol.getTaskNo1() == 0 && !rgvProtocol.isLoaded2ing() && rgvProtocol.getTaskNo2() == 0 && rgvThread.isPakMk() ) { BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); if (basRgvMap == null) { log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo()); continue; } List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute()); basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号 // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { // 遍历入库口 入库预调度 List<Integer> staNos = Arrays.asList(1042, 1043, 1105, 1104); for (Integer staNo : staNos) { SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(staNo); if(staProtocol.isLoading()){ RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo((int) rgvProtocol.getRgvNo()); // RGV编号 rgvCommand.setAckFinish1(false); // 工位1任务完成确认位 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目标站点 } rgvCommand.setCommand(true); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Rgv, (int) rgvProtocol.getRgvNo(), new Task(4, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={},任务数据={}", (int) rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand)); } } } } } } }catch (Exception e){ log.error("执行小车移动下发失败"); } } /** * 执行小车搬运任务 @@ -3118,107 +3226,107 @@ /* * 有任务但未执行 此时需要调整小车位置 * */ public synchronized void rgvRunWrkMastEmptyStaAvoidance() { try{ Integer integer = wrkMastStaMapper.selectAllWrkStsCount(null,0);//查询状态为0的任务 if (integer==0){ return; } List<BasRgvMap> basRgvMaps = basRgvMapService.selectList(new EntityWrapper<>()); for (BasRgvMap rgvSlave:basRgvMaps) { RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getRgvNo()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; }else { rgvProtocol = rgvProtocol.clone(); } BasRgv basRgv = basRgvService.selectById(rgvSlave.getRgvNo()); if (basRgv == null) { log.error("{}号RGV尚未在数据库进行维护!1", rgvSlave.getRgvNo()); continue; } // 只有当RGV空闲、自动,工位一无物//rgv可用 if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getLoaded1()==0 //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接 && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvThread.isPakMk() // && rgvProtocol.getTaskNo2()==0 ){ BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); if (rgvProtocol.getRgvPosI().equals(basRgvMap.getStartRoute())){ continue; } // if (rgvProtocol.getRgvNo()==1 && rgvProtocol.getRgvPosI().equals(100)){ // public synchronized void rgvRunWrkMastEmptyStaAvoidance() { // try{ // Integer integer = wrkMastStaMapper.selectAllWrkStsCount(null,0);//查询状态为0的任务 // if (integer==0){ // return; // } // List<BasRgvMap> basRgvMaps = basRgvMapService.selectList(new EntityWrapper<>()); // for (BasRgvMap rgvSlave:basRgvMaps) { // RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getRgvNo()); // RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); // if (rgvProtocol == null) { // continue; // } else if (rgvProtocol.getRgvNo()==2 && rgvProtocol.getRgvPosI().equals(157) ){ // }else { // rgvProtocol = rgvProtocol.clone(); // } // BasRgv basRgv = basRgvService.selectById(rgvSlave.getRgvNo()); // if (basRgv == null) { // log.error("{}号RGV尚未在数据库进行维护!1", rgvSlave.getRgvNo()); // continue; // } rgvAvoidanceXY(rgvProtocol.getRgvNo()); rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute(),"2727"); } } }catch (Exception e){ log.error("4109行执行小车初始化任务下发失败"); log.error("4109行"+e); } } // // // 只有当RGV空闲、自动,工位一无物//rgv可用 // if (rgvProtocol.getStatusType() == RgvStatusType.IDLE // && rgvProtocol.getModeType() == RgvModeType.AUTO // && !rgvProtocol.isLoaded1ing() //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接 // && rgvProtocol.getTaskNo1()==0 // && rgvProtocol.getStatusType1() == RgvStatusType.IDLE // && rgvThread.isPakMk() //// && rgvProtocol.getTaskNo2()==0 // ){ // BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo()); // if (rgvProtocol.getRgvPosI().equals(basRgvMap.getStartRoute())){ // continue; // } //// if (rgvProtocol.getRgvNo()==1 && rgvProtocol.getRgvPosI().equals(100)){ //// continue; //// } else if (rgvProtocol.getRgvNo()==2 && rgvProtocol.getRgvPosI().equals(157) ){ //// continue; //// } // rgvAvoidanceXY((int) rgvProtocol.getRgvNo()); // rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute(),"2727"); // } // } // }catch (Exception e){ // log.error("4109行执行小车初始化任务下发失败"); // log.error("4109行"+e); // } // } /* * 小车XY移动 避让 * */ public synchronized boolean rgvAvoidanceXY(Integer rgvId){ BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo(rgvId); if (basRgvMap.getStartRoute() == 100 || basRgvMap.getStartRoute() == 101){ try{ // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgvId); // RGV编号 rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 rgvCommand.setTaskNo1((short)32222); // 工位1工作号 rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式: 回原点 //basRgvMap.getLockStartRoute().shortValue() rgvCommand.setSourceStaNo1(basRgvMap.getStartRoute().shortValue()); rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 step=9,回原点 9999任务号 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); return false; } else { return true; } }catch (Exception e){ return false; } }else { try{ // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgvId); // RGV编号 rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 rgvCommand.setTaskNo1((short)32222); // 工位1工作号 rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式: 回原点 //basRgvMap.getLockStartRoute().shortValue() rgvCommand.setSourceStaNo1(basRgvMap.getStartRoute().shortValue()); rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 step=9,回原点 9999任务号 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); return false; } else { return true; } }catch (Exception e){ return false; } } } // public synchronized boolean rgvAvoidanceXY(Integer rgvId){ // BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo(rgvId); // if (basRgvMap.getStartRoute() == 100 || basRgvMap.getStartRoute() == 101){ // try{ // // // 命令下发区 -------------------------------------------------------------------------- // RgvCommand rgvCommand = new RgvCommand(); // rgvCommand.setRgvNo(rgvId); // RGV编号 // rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 // rgvCommand.setTaskNo1((short)32222); // 工位1工作号 // rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式: 回原点 // //basRgvMap.getLockStartRoute().shortValue() // rgvCommand.setSourceStaNo1(basRgvMap.getStartRoute().shortValue()); // rgvCommand.setCommand((short) 1); //工位1任务确认 // if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) { // //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 step=9,回原点 9999任务号 // log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); // return false; // } else { // return true; // } // }catch (Exception e){ // return false; // // } // }else { // try{ // // 命令下发区 -------------------------------------------------------------------------- // RgvCommand rgvCommand = new RgvCommand(); // rgvCommand.setRgvNo(rgvId); // RGV编号 // rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 // rgvCommand.setTaskNo1((short)32222); // 工位1工作号 // rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式: 回原点 // //basRgvMap.getLockStartRoute().shortValue() // rgvCommand.setSourceStaNo1(basRgvMap.getStartRoute().shortValue()); // rgvCommand.setCommand((short) 1); //工位1任务确认 // if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) { // //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 step=9,回原点 9999任务号 // log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); // return false; // } else { // return true; // } // }catch (Exception e){ // return false; // // } // } // } /* @@ -3229,23 +3337,27 @@ int startSta = wrkMastSta.getStaStart(); // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); boolean pakIn1 = true; boolean pakIn2 = true; rgvCommand.setRgvNo(rgvId); // RGV编号 if(wrkMastSta.getWrkSts() == 1){//取货 if((startSta >= 1001 && startSta <= 1035) || (startSta >= 2001 && startSta <= 2030)){//出库RGV取货 rgvCommand.setAckFinish2((short) 0); // 工位1任务完成确认位 rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 工位2工作号 rgvCommand.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 工位2任务模式: 取放货 rgvCommand.setSourceStaNo2(wrkMastSta.getStaStart().shortValue()); //工位2起点 rgvCommand.setDestinationStaNo2(wrkMastSta.getStaEnd().shortValue()); //工位2目标站点 rgvCommand.setCommand((short) 2); //工位1任务确认 rgvCommand.setAckFinish2(false); // 工位2任务完成确认位 rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号 rgvCommand.setTaskMode2(RgvTaskModeType.FETCH); // 工位2任务模式: 取放货 rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd()); //工位2 放货后要去的位置 rgvCommand.setTargetPosition2(wrkMastSta.getStaStart()); //工位2目标站点 rgvCommand.setCommand(true); //工位1任务确认 pakIn1 = false; }else{ //入库RGV取货 rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 rgvCommand.setTaskNo1(wrkMastSta.getWrkNo().shortValue()); // 工位1工作号 rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式: 取放货 rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue()); //工位1起点 rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue()); //工位1目标站点 rgvCommand.setCommand((short) 1); //工位1任务确认 rgvCommand.setAckFinish1(false); // 工位1任务完成确认位 rgvCommand.setTaskNo1(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位1工作号 rgvCommand.setTaskMode1(RgvTaskModeType.FETCH); // 工位1任务模式: 取放货 rgvCommand.setEndStaNo1(wrkMastSta.getWrkEnd()); //工位1 放货后要去的位置 rgvCommand.setTargetPosition1(wrkMastSta.getStaStart()); //工位1目标站点 rgvCommand.setCommand(true); //工位1任务确认 } if(rgvCommand.getCommand() == 1){ if(!pakIn1){ 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)); @@ -3262,6 +3374,43 @@ return true; } } } if(wrkMastSta.getWrkSts() == 2) {//放货 if((startSta >= 1001 && startSta <= 1035) || (startSta >= 2001 && startSta <= 2030)){//出库RGV取货 rgvCommand.setAckFinish2(false); // 工位2任务完成确认位 rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号 rgvCommand.setTaskMode2(RgvTaskModeType.PUT); // 工位2任务模式: 取放货 rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd()); //工位2 放货后要去的位置 rgvCommand.setTargetPosition2(wrkMastSta.getStaEnd()); //工位2目标站点 rgvCommand.setCommand(true); //工位1任务确认 pakIn2 = false; }else{ //入库RGV取货 rgvCommand.setAckFinish1(false); // 工位1任务完成确认位 rgvCommand.setTaskNo1(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位1工作号 rgvCommand.setTaskMode1(RgvTaskModeType.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/MainProcess.java
@@ -124,12 +124,7 @@ // RGV ===>> 小车任务作业下发 try{ mainService.rgvRunWrkMastFullSta(); // if (rgvIoExecuteSign){ // k = 0; // } else if (k>4){ // k = 0; // mainService.rgvRunWrkMastEmptyStaAvoidance();//避让 // } mainService.rgvPreScheduling(); }catch (Exception e){ log.error("RGV ===>> 小车任务作业下发异常"+e); } src/main/java/com/zy/core/enums/RgvTaskStatusType.java
New file @@ -0,0 +1,37 @@ package com.zy.core.enums; public enum RgvTaskStatusType { NONE(0),//无 X_MOVE(1),//行走 FETCH(2),//取货 PUT(3),//放货 FETCH_PUT(4);//取放货 public Integer id; RgvTaskStatusType(Integer id) { this.id = id; } public static RgvTaskStatusType get(Short id) { if (null == id){ return null; } for(RgvTaskStatusType type : RgvTaskStatusType.values()){ if(type.id.equals(id.intValue())){ return type; } } return null; } public static RgvTaskStatusType get(RgvTaskStatusType type) { if (null == type){ return null; } for(RgvTaskStatusType rgvTaskStatusType : RgvTaskStatusType.values()){ if(rgvTaskStatusType == type){ return rgvTaskStatusType; } } return null; } } src/main/java/com/zy/core/model/command/RgvCommand.java
@@ -2,6 +2,7 @@ import com.alibaba.fastjson.annotation.JSONField; import com.zy.core.enums.RgvTaskModeType; import com.zy.core.enums.RgvTaskStatusType; import lombok.Data; import java.util.Calendar; @@ -18,10 +19,10 @@ private Integer rgvNo = 0; // 工位1任务完成确认位 private Short ackFinish1 = 0; private Boolean ackFinish1 = true; // 工位1任务号 private Short taskNo1 = 0; private Integer taskNo1 = 0; /** * 任务模式: @@ -32,8 +33,16 @@ */ private Short taskMode1 = 0; /** * 作业模式 */ private Short taskStatus1 = 0; @JSONField(serialize = false) private RgvTaskModeType taskModeType1; @JSONField(serialize = false) private RgvTaskStatusType taskStatusType1; /* 工位1源站 @@ -45,12 +54,26 @@ */ private Short destinationStaNo1 = 0; /** * 工位1目标位置 */ private Integer targetPosition1 = 0; /** * RGV放货后货物要去的目的地 */ private Integer endStaNo1 = 0; /** * 执行方向 */ private Short direction1 = 0; ////////////////////// 工位2定义 ////////////////////////////////////////////////// // 工位1任务完成确认位 private Short ackFinish2 = 0; // 工位2任务完成确认位 private Boolean ackFinish2 = true; // 工位2任务号 private Short taskNo2 = 0; private Integer taskNo2 = 0; /** * 任务模式: @@ -61,8 +84,16 @@ */ private Short taskMode2 = 0; /** * 作业模式 */ private Short taskStatus2 = 0; @JSONField(serialize = false) private RgvTaskModeType taskModeType2; @JSONField(serialize = false) private RgvTaskStatusType taskStatusType2; /* 工位2源站 @@ -73,6 +104,21 @@ 工位2目标站 */ private Short destinationStaNo2 = 0; /** * 工位2目标位置 */ private Integer targetPosition2 = 0; /** * RGV放货后货物要去的目的地 */ private Integer endStaNo2 = 0; /** * 执行方向 */ private Short direction2 = 0; /////////////////////////////////////////////////////////////////////////////////////// /** @@ -81,8 +127,10 @@ * 1 = 工位1任务确认 * 2 = 工位2任务确认 * 3 = 工位1、2任务同时确认 * false 未确认 * true 执行 */ private Short command = 0; private Boolean command = false; public void setTaskMode1(Short taskMode1){ this.taskMode1 = taskMode1; @@ -104,6 +152,26 @@ this.taskMode2 = RgvTaskModeType.get(type2).id.shortValue(); } public void setTaskStatus1(Short taskStatus1){ this.taskStatus1 = taskStatus1; this.taskStatusType1 = RgvTaskStatusType.get(taskStatusType1); } public void setTaskStatus1(RgvTaskStatusType type1) { this.taskStatusType1 = type1; this.taskStatus1 = RgvTaskStatusType.get(type1).id.shortValue(); } public void setTaskStatus2(Short taskStatus2){ this.taskStatus2 = taskStatus2; this.taskStatusType2 = RgvTaskStatusType.get(taskStatusType2); } public void setTaskStatus2(RgvTaskStatusType type2) { this.taskStatusType2 = type2; this.taskStatus2 = RgvTaskStatusType.get(type2).id.shortValue(); } public static void main(String[] args) { Date date = new Date(); Calendar cal = Calendar.getInstance(); src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -5,6 +5,7 @@ import com.zy.core.enums.RgvStatusType; import lombok.Data; import javax.swing.*; import java.util.HashMap; import java.util.Map; @@ -14,7 +15,7 @@ @Data public class RgvProtocol implements Cloneable{ private Integer RgvNo; private short RgvNo; /** * 1 = 手动模式 @@ -26,12 +27,13 @@ public RgvModeType modeType; /** * RGV当前状态 * RGV当前状态工位1 * 0:空闲,无任务 * 1:作业中 * 2:报警 */ public Short status; /** * 状态枚举 @@ -41,7 +43,7 @@ /** * 工位1任务号 */ public Short taskNo1 = 0; public Integer taskNo1 = 0; /** * RGV工位1当前状态 @@ -60,12 +62,18 @@ /** * 工位1有物 */ public Short loaded1; public Boolean loaded1; /** * RGV当前位置 */ public Short RgvPos; public Integer RgvPos; /** * RGV当前目的位置 */ public Integer RgvPosDestination; /** * 走行在定位 @@ -74,11 +82,46 @@ */ public Short walkPos; /** * 急停 */ public Boolean err1; /** * 有物无资料 */ public Boolean err2; /** * 有资料无物 */ public Boolean err3; /** * 命令错误走行联调冲突 */ public Boolean err4; /** * 目标为超过行走极限 */ public Boolean err5; /** * 变频器异常 */ public Boolean err6; /** * 光电异常 */ public Boolean err7; ////////////////////// 工位2定义 ////////////////////////////////////////////////// /** * 工位2任务号 */ public Short taskNo2 = 0; public Integer taskNo2 = 0; /** * RGV工位2当前状态 @@ -97,7 +140,44 @@ /** * 工位2有物 */ public Short loaded2; public Boolean loaded2; // /** // * 急停 // */ // public Boolean err21; // // /** // * 有物无资料 // */ // public Boolean err22; // // /** // * 有资料无物 // */ // public Boolean err23; // // /** // * 命令错误走行联调冲突 // */ // public Boolean err24; // // /** // * 目标为超过行走极限 // */ // public Boolean err25; // // /** // * 变频器异常 // */ // public Boolean err26; // // /** // * 光电异常 // */ // public Boolean err27; /////////////////////////////////////////////////////////////////////////////////////// /** @@ -165,15 +245,24 @@ this.status1 = RgvStatusType.get(type1).id.shortValue(); } // public void setStatus2(Short status2){ // this.status2 = status2; // this.statusType2 = RgvStatusType.get(status2); // } // // public void setStatus2(RgvStatusType type2){ // this.statusType2 = type2; // this.status2 = RgvStatusType.get(type2).id.shortValue(); // } public void setStatus2(Short status2){ this.status2 = status2; this.statusType2 = RgvStatusType.get(status2); } public void setStatus2(RgvStatusType type2){ this.statusType2 = type2; this.status2 = RgvStatusType.get(type2).id.shortValue(); } public boolean isLoaded1ing() { return Boolean.TRUE.equals(this.loaded1); } public boolean isLoaded2ing() { return Boolean.TRUE.equals(this.loaded2); } /** * 最近一次入出库类型 @@ -188,7 +277,7 @@ basRgv.setRgvErr(alarm.longValue()); } basRgv.setWrkNo1(taskNo1.intValue()); // basRgv.setWrkNo2(taskNo2.intValue()); basRgv.setWrkNo2(taskNo2.intValue()); return basRgv; } src/main/java/com/zy/core/thread/RgvThread.java
@@ -18,6 +18,7 @@ import com.zy.core.cache.OutputQueue; import com.zy.core.enums.RgvStatusType; import com.zy.core.enums.RgvTaskModeType; import com.zy.core.enums.RgvTaskStatusType; import com.zy.core.enums.SlaveType; import com.zy.core.model.RgvSlave; import com.zy.core.model.Task; @@ -52,6 +53,10 @@ //锁定标记 private boolean PakMk = true; //入库标记 private boolean PakIn = true; //出库标记 private boolean PakOut = true; public RgvThread(RgvSlave slave) { this.slave = slave; @@ -92,12 +97,12 @@ command = new RgvCommand(); } command.setRgvNo(slave.getId()); // RGV编号 command.setTaskNo1((short) 0); // 工作号 command.setAckFinish1((short) 1); // 任务完成确认位 command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo1((short)0); // 源站 command.setDestinationStaNo1((short)0); // 目标站 command.setCommand((short)0); command.setTaskNo1(0); // 工作号 command.setAckFinish1(true); // 任务完成确认位 command.setTaskStatus1(RgvTaskStatusType.NONE); // 任务模式 command.setTargetPosition1( 0); // 源站 command.setEndStaNo1(0); // 目标站 command.setCommand(false); write1(command); break; case 6: @@ -106,33 +111,33 @@ command2 = new RgvCommand(); } command2.setRgvNo(slave.getId()); // RGV编号 command2.setTaskNo2((short) 0); // 工作号 command2.setAckFinish2((short) 1); // 任务完成确认位 command2.setTaskMode2(RgvTaskModeType.NONE); // 任务模式 command2.setTaskNo2(0); // 工作号 command2.setAckFinish2(true); // 任务完成确认位 command2.setTaskStatus2(RgvTaskStatusType.NONE); // 任务模式 command2.setSourceStaNo2((short)0); // 源站 command2.setDestinationStaNo2((short)0); // 目标站 command2.setCommand((short)0); command2.setCommand(false); write2(command2); break; // 回原点 避让 case 9: RgvCommand commandAvoidanceXY = (RgvCommand) task.getData(); if (null == commandAvoidanceXY) { commandAvoidanceXY = new RgvCommand(); } commandAvoidanceXY.setRgvNo(slave.getId()); // RGV编号 commandAvoidanceXY.setTaskNo1((short) 9999); // 工作号 commandAvoidanceXY.setAckFinish1((short) 1); // 任务完成确认位 commandAvoidanceXY.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 任务模式 commandAvoidanceXY.setSourceStaNo1((short)0); // 源站 commandAvoidanceXY.setDestinationStaNo1((short)0); // 目标站 // commandAvoidanceXY.setTaskNo2((short) 0); // 工作号 // commandAvoidanceXY.setAckFinish2((short) 1); // 任务完成确认位 // commandAvoidanceXY.setTaskMode2(RgvTaskModeType.GO_ORIGIN); // 任务模式 // commandAvoidanceXY.setSourceStaNo2((short)0); // 源站 // commandAvoidanceXY.setDestinationStaNo2((short)0); // 目标站 commandAvoidanceXY.setCommand((short)0); write(commandAvoidanceXY); // RgvCommand commandAvoidanceXY = (RgvCommand) task.getData(); // if (null == commandAvoidanceXY) { // commandAvoidanceXY = new RgvCommand(); // } // commandAvoidanceXY.setRgvNo(slave.getId()); // RGV编号 // commandAvoidanceXY.setTaskNo1((short) 9999); // 工作号 // commandAvoidanceXY.setAckFinish1((short) 1); // 任务完成确认位 // commandAvoidanceXY.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 任务模式 // commandAvoidanceXY.setSourceStaNo1((short)0); // 源站 // commandAvoidanceXY.setDestinationStaNo1((short)0); // 目标站 //// commandAvoidanceXY.setTaskNo2((short) 0); // 工作号 //// commandAvoidanceXY.setAckFinish2((short) 1); // 任务完成确认位 //// commandAvoidanceXY.setTaskMode2(RgvTaskModeType.GO_ORIGIN); // 任务模式 //// commandAvoidanceXY.setSourceStaNo2((short)0); // 源站 //// commandAvoidanceXY.setDestinationStaNo2((short)0); // 目标站 // commandAvoidanceXY.setCommand((short)0); // write(commandAvoidanceXY); break; default: break; @@ -152,21 +157,30 @@ if (null == rgvProtocol) { rgvProtocol = new RgvProtocol(); } rgvProtocol.setMode((short) -1); //小车状态 rgvProtocol.setStatus((short)-1); rgvProtocol.setTaskNo1((short)0); rgvProtocol.setRgvPosDestination(0); rgvProtocol.setMode((short) -1); rgvProtocol.setRgvPos(0); rgvProtocol.setErr1(false); rgvProtocol.setErr2(false); rgvProtocol.setErr3(false); rgvProtocol.setErr4(false); rgvProtocol.setErr5(false); rgvProtocol.setErr6(false); rgvProtocol.setErr7(false); //工位1状态 rgvProtocol.setTaskNo1(0); rgvProtocol.setStatus1((short)-1); rgvProtocol.setLoaded1((short)0); rgvProtocol.setWalkPos((short)0); rgvProtocol.setRgvPos((short)0); rgvProtocol.setLoaded1(false); //工位2状态 rgvProtocol.setTaskNo2((short)0); rgvProtocol.setTaskNo2(0); rgvProtocol.setStatus2((short)-1); rgvProtocol.setLoaded2((short)0); rgvProtocol.setAlarm((short)0); rgvProtocol.setxSpeed((short) 0); rgvProtocol.setxDistance((short) 0); rgvProtocol.setxDuration((short) 0); rgvProtocol.setLoaded2(false); // rgvProtocol.setAlarm((short)0); // rgvProtocol.setxSpeed((short) 0); // rgvProtocol.setxDistance((short) 0); // rgvProtocol.setxDuration((short) 0); } @Override @@ -189,6 +203,14 @@ return result; } private void setBool(byte[] buffer, int byteIndex, int bitIndex, boolean value) { if (value) { buffer[byteIndex] |= (1 << bitIndex); // 置位 } else { buffer[byteIndex] &= ~(1 << bitIndex); // 清零 } } /** * 读取状态 */ @@ -196,26 +218,49 @@ try { OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 30); if (result.IsSuccess) { if (null == rgvProtocol || rgvProtocol.getRgvNo() == null) { if (null == rgvProtocol) { rgvProtocol = new RgvProtocol(); rgvProtocol.setRgvNo(slave.getId()); rgvProtocol.setRgvNo(siemensNet.getByteTransform().TransInt16(result.Content, 0)); } rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0)); rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 2)); rgvProtocol.setTaskNo1(siemensNet.getByteTransform().TransInt16(result.Content, 4)); rgvProtocol.setStatus1(siemensNet.getByteTransform().TransInt16(result.Content, 6)); rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 8)); rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt16(result.Content, 10)); rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 12)); rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 14)); rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 2)); rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt32(result.Content, 4)); rgvProtocol.setRgvPosDestination( siemensNet.getByteTransform().TransInt32(result.Content, 8)); rgvProtocol.setStatus1(siemensNet.getByteTransform().TransInt16(result.Content, 12)); rgvProtocol.setStatus2(siemensNet.getByteTransform().TransInt16(result.Content, 14)); rgvProtocol.setTaskNo1(siemensNet.getByteTransform().TransInt32(result.Content, 16)); rgvProtocol.setTaskNo2(siemensNet.getByteTransform().TransInt32(result.Content, 20)); boolean[] status1 = siemensNet.getByteTransform().TransBool(result.Content, 24, 2); rgvProtocol.setLoaded1(status1[0]); rgvProtocol.setLoaded2(status1[1]); boolean[] status2 = siemensNet.getByteTransform().TransBool(result.Content, 26, 1); rgvProtocol.setErr1(status2[0]); rgvProtocol.setErr2(status2[1]); rgvProtocol.setErr3(status2[2]); rgvProtocol.setErr4(status2[3]); rgvProtocol.setErr5(status2[4]); rgvProtocol.setErr6(status2[5]); rgvProtocol.setErr7(status2[6]); boolean[] status3 = siemensNet.getByteTransform().TransBool(result.Content, 27, 1); rgvProtocol.setErr1(status3[0]); rgvProtocol.setErr2(status3[1]); rgvProtocol.setErr3(status3[2]); rgvProtocol.setErr4(status3[3]); 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)); // rgvProtocol.setTaskNo2(siemensNet.getByteTransform().TransInt16(result.Content, 4)); // rgvProtocol.setLoaded2(siemensNet.getByteTransform().TransInt16(result.Content, 8)); // rgvProtocol.setStatus2(siemensNet.getByteTransform().TransInt16(result.Content, 16)); rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 18)); // rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 18)); // rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 20)); rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 22)); // rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 22)); // rgvProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 24)); rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 26)); // rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 26)); // rgvProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 28)); // rgvProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 30)); // rgvProtocol.setTemp5(siemensNet.getByteTransform().TransInt16(result.Content, 32)); @@ -230,8 +275,8 @@ || rgvProtocol.getStatusType1().equals(RgvStatusType.FETCHWAITING)) { if (resetFlag1) { RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setAckFinish1((short)1); if (write(rgvCommand)) { rgvCommand.setAckFinish1(true); if (write1(rgvCommand)) { resetFlag1 = false; } } @@ -242,8 +287,8 @@ || rgvProtocol.getStatusType2().equals(RgvStatusType.FETCHWAITING)) { if (resetFlag2) { RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setAckFinish2((short)1); if (write(rgvCommand)) { rgvCommand.setAckFinish2(true); if (write2(rgvCommand)) { resetFlag2 = false; } } @@ -275,73 +320,73 @@ } } /** * 工位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(); // /** // * 工位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[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); //// 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; // } 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写入数据 @@ -352,38 +397,49 @@ return false; } OperateResultExOne<byte[]> result3 = siemensNet.Read("DB100.0", (short) 12); OperateResultExOne<byte[]> result4 = siemensNet.Read("DB100.10", (short) 2); if (result3.IsSuccess){ 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.setAckFinish1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0)); one.setTaskNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 2)); one.setTaskMode1(siemensNet.getByteTransform().TransInt16(result3.Content, 4)); one.setSourceStaNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 6)); one.setDestinationStaNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 8)); one.setCommand(siemensNet.getByteTransform().TransInt16(result4.Content, 0)); // one.setTaskNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 2)); // one.setTaskMode1(siemensNet.getByteTransform().TransInt16(result3.Content, 4)); // one.setSourceStaNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 6)); // one.setDestinationStaNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 8)); // one.setCommand(siemensNet.getByteTransform().TransInt16(result4.Content, 0)); News.error("RGV命令下发前读取状态[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); } OperateResult result8 = siemensNet.Write("DB100.10", (short) 0); if (result8.IsSuccess){ OperateResult result2 = siemensNet.Write("DB100.34", false); if (result2.IsSuccess){ News.error("下发前把车子确认位置为0"); } // siemensNet.Write("DB100.20", command.getCommand()); byte[] writeBytes = new byte[34]; command.setRgvNo(slave.getId()); short[] array = new short[5]; array[0] = command.getAckFinish1(); array[1] = command.getTaskNo1(); array[2] = command.getTaskMode1(); array[3] = command.getSourceStaNo1(); array[4] = command.getDestinationStaNo1(); 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()); // command.setRgvNo(slave.getId()); // short[] array = new short[5]; // array[0] = command.getAckFinish1(); // array[1] = command.getTaskNo1(); // array[2] = command.getTaskMode1(); // array[3] = command.getSourceStaNo1(); // array[4] = command.getDestinationStaNo1(); // siemensNet.Write("DB100.10", command.getCommand()); OperateResult result = siemensNet.Write("DB100.0", array); OperateResult result = siemensNet.Write("DB100.0", writeBytes); if (!result.IsSuccess){ News.error("写入RGVplc数据失败,重新添加任务到队列 ===> [id:{}],{}",slave.getId(),JSON.toJSON(command)); @@ -396,19 +452,20 @@ //RGV任务写入后,回读一次,看是否成功 Thread.sleep(400); try { OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 12); OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 34); if (resultRead.IsSuccess){ RgvCommand one = new RgvCommand(); // one.setAckFinish1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0)); one.setTaskNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2)); one.setTaskMode1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4)); one.setSourceStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6)); one.setDestinationStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8)); 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)); if ( !command.getDirection1().equals(one.getDirection1()) || !command.getTaskNo1().equals(one.getTaskNo1()) || !command.getTaskMode1().equals(one.getTaskMode1()) || !command.getSourceStaNo1().equals(one.getSourceStaNo1()) || !command.getDestinationStaNo1().equals(one.getDestinationStaNo1()) !command.getTaskStatus1().equals(one.getTaskStatus1()) || !command.getEndStaNo1().equals(one.getEndStaNo1()) || !command.getTargetPosition1().equals(one.getTargetPosition1()) ){ try{ News.error("RGV命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); @@ -432,7 +489,7 @@ News.error("RGV命令地址写入后回读出错"); } if (command.getAckFinish1() == 0) { if (command.getAckFinish1()) { if (result.IsSuccess) { Thread.sleep(300); //任务下发次数 @@ -440,15 +497,15 @@ do { writeCount2++; short commandFinish = (short) 1; result = siemensNet.Write("DB100.10", commandFinish); boolean commandFinish = false; result = siemensNet.Write("DB100.32.0", commandFinish); if(result.IsSuccess){ //RGV任务写入后,回读一次,看是否成功 Thread.sleep(200); OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.10", (short) 2); OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.32", (short) 2); if (resultRead.IsSuccess) { commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0); if (commandFinish != 1){ commandFinish=siemensNet.getByteTransform().TransBool(resultRead.Content, 0); if (!commandFinish){ News.error("RGV任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次"); }else{ //任务命令写入成功 @@ -475,15 +532,12 @@ // 日志记录 BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class); BasRgvOpt basRgvOpt = new BasRgvOpt( command.getTaskNo1().intValue(), command.getTaskNo2().intValue(), command.getTaskNo1(), command.getRgvNo(), new Date(), command.getTaskModeType1().toString(), command.getSourceStaNo1().intValue(), command.getDestinationStaNo1().intValue(), command.getSourceStaNo2().intValue(), command.getDestinationStaNo2().intValue(), command.getTaskStatus1().toString(), command.getTargetPosition1(), command.getEndStaNo1(), null, new Date(), null @@ -515,36 +569,124 @@ return false; } OperateResultExOne<byte[]> result1 = siemensNet.Read("DB100.0", (short) 34); if (result1.IsSuccess){ RgvCommand one = new RgvCommand(); 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("下发前把车子确认位置为0"); } byte[] writeBytes = new byte[34]; command.setRgvNo(slave.getId()); short[] array = new short[6]; array[0] = command.getAckFinish2(); array[1] = command.getTaskNo2(); array[2] = command.getTaskMode2(); array[3] = command.getSourceStaNo2(); array[4] = command.getDestinationStaNo2(); array[5] = command.getCommand(); 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()); OperateResult result = siemensNet.Write("DB100.10", array); OperateResult result = siemensNet.Write("DB100.0", writeBytes); if (command.getAckFinish2() == 0) { short commandFinish = 2; //工位2任务写入 Thread.sleep(100L); result = siemensNet.Write("DB100.20", commandFinish); if (!result.IsSuccess){ News.error("写入RGVplc数据失败,重新添加任务到队列 ===> [id:{}],{}",slave.getId(),JSON.toJSON(command)); MessageQueue.offer(SlaveType.Rgv,slave.getId(),new Task(5,command)); Thread.sleep(100); readStatus(); return false; } //RGV任务写入后,回读一次,看是否成功 Thread.sleep(400); try { 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)); if ( !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(5, 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()) { if (result.IsSuccess) { Thread.sleep(300); //任务下发次数 int writeCount2 = 0; do { writeCount2++; boolean commandFinish = false; result = siemensNet.Write("DB100.32.1", commandFinish); if(result.IsSuccess){ //RGV任务写入后,回读一次,看是否成功 Thread.sleep(200); OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.32", (short) 2); if (resultRead.IsSuccess) { commandFinish=siemensNet.getByteTransform().TransBool(resultRead.Content, 1); if (!commandFinish){ 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().intValue(), command.getTaskNo2().intValue(), command.getTaskNo2(), command.getRgvNo(), new Date(), command.getTaskModeType1().toString(), command.getSourceStaNo1().intValue(), command.getDestinationStaNo1().intValue(), command.getSourceStaNo2().intValue(), command.getDestinationStaNo2().intValue(), command.getTaskStatus2().toString(), command.getTargetPosition2(), command.getEndStaNo2(), null, new Date(), null src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -269,23 +269,23 @@ } } //RGV小车3 // Thread.sleep(100); OperateResultExOne<byte[]> result5 = siemensS7Net.Read("DB50.224",(short)10); if (result5.IsSuccess) { BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result5.Content, 0)); if (!Cools.isEmpty(basRgvMap)){ Integer siteId = 3; StaProtocol staProtocol = station.get(siteId); if (null == staProtocol) { staProtocol = new StaProtocol(); staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } staProtocol.setAutoing(true); staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result5.Content, 8))); } } // //RGV小车3 //// Thread.sleep(100); // OperateResultExOne<byte[]> result5 = siemensS7Net.Read("DB50.224",(short)10); // if (result5.IsSuccess) { // BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result5.Content, 0)); // if (!Cools.isEmpty(basRgvMap)){ // Integer siteId = 3; // StaProtocol staProtocol = station.get(siteId); // if (null == staProtocol) { // staProtocol = new StaProtocol(); // staProtocol.setSiteId(siteId); // station.put(siteId, staProtocol); // } // staProtocol.setAutoing(true); // staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result5.Content, 8))); // } // } //条码扫描器 ArrayList<Integer> barcodeList = BarcodeList; src/main/webapp/static/js/console.map.js
@@ -309,7 +309,9 @@ "stns": [ {"type": "track", "id": "lb_trCart11", "text": "", "top": 65, "left": 1000, "width": 6, "height": 560}, {"type": "track", "id": "lb_trCart12", "text": "", "top": 65, "left": 1020, "width": 6, "height": 560}, { "type": "stn", "id": "site-1", "text": "1", "top": 84, "left": 1000, "width": 35, "height": 20 }, { "type": "stn", "id": "site-1", "text": "1", "top": 84, "left": 984, "width": 30, "height": 20 }, { "type": "stn", "id": "site-2", "text": "2", "top": 84, "left": 1016, "width": 30, "height": 20 }, { "type": "stn", "id": "site-1001", "text": "1001", "top": 84, "left": 870, "width": 35, "height": 20 }, { "type": "stn", "id": "site-1002", "text": "1002", "top": 84, "left": 907, "width": 35, "height": 20 }, { "type": "stn", "id": "site-1004", "text": "1004", "top": 84, "left": 944, "width": 35, "height": 20 }, @@ -444,8 +446,8 @@ "width": 2900, "height": 600, "stns": [ { "type": "stn", "id": "site-2", "text": "2", "top": 84, "left": 1000, "width": 35, "height": 20 }, { "type": "stn", "id": "site-3", "text": "1", "top": 84, "left": 984, "width": 30, "height": 20 }, { "type": "stn", "id": "site-4", "text": "2", "top": 84, "left": 1016, "width": 30, "height": 20 }, {"type": "track", "id": "lb_trCart21", "text": "", "top": 65, "left": 1000, "width": 6, "height": 560}, {"type": "track", "id": "lb_trCart22", "text": "", "top": 65, "left": 1020, "width": 6, "height": 560}, { "type": "stn", "id": "site-2003", "text": "2003", "top": 84, "left": 926, "width": 54, "height": 20 },