src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -147,7 +147,7 @@ /** * 堆垛机状态判断 */ if (crnProtocol.getAlarm1() > 0) { if (crnProtocol.getAlarm() > 0) { vo.setCrnStatus(CrnStatusType.MACHINE_ERROR); } else { if (crnProtocol.getTaskNo()>0) { @@ -324,8 +324,8 @@ vo.setWorkNo(crnProtocol.getTaskNo()); vo.setCrnStatus(crnProtocol.getStatusType().desc); if (crnProtocol.getAlarm1() > 0) { BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm1()); if (crnProtocol.getAlarm() > 0) { BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm()); vo.setError(crnError == null ? "未知异常" : crnError.getErrName()); } src/main/java/com/zy/asrs/controller/CrnController.java
@@ -130,7 +130,7 @@ vo.setForkOffset(crnProtocol.getForkPosType().desc); // 货叉位置 vo.setLiftPos(crnProtocol.getLiftPosType().desc); vo.setWalkPos(crnProtocol.getWalkPos()==1?"不在定位":"在定位"); vo.setWarnCode(String.valueOf(crnProtocol.getAlarm1())); vo.setWarnCode(String.valueOf(crnProtocol.getAlarm())); if (crnProtocol.getAlarm() > 0) { BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm()); vo.setAlarm(crnError==null?"未知异常":crnError.getErrName()); @@ -165,9 +165,9 @@ vo.setForkOffset(crnProtocol.getForkPosType().desc); // 货叉位置 vo.setLiftPos(crnProtocol.getLiftPosType().desc); vo.setWalkPos(crnProtocol.getWalkPos()==1?"不在定位":"在定位"); vo.setWarnCode(String.valueOf(crnProtocol.getAlarm1())); if (crnProtocol.getAlarm1() > 0) { BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm1()); vo.setWarnCode(String.valueOf(crnProtocol.getAlarm())); if (crnProtocol.getAlarm() > 0) { BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm()); vo.setAlarm(crnError==null?"未知异常":crnError.getErrName()); } return R.ok().add(vo); @@ -307,9 +307,9 @@ vo.setForkOffset(crnProtocol.getForkPosType().desc); // 货叉位置 vo.setLiftPos(crnProtocol.getLiftPosType().desc); vo.setWalkPos(crnProtocol.getWalkPos()==1?"不在定位":"在定位"); vo.setWarnCode(String.valueOf(crnProtocol.getAlarm1())); if (crnProtocol.getAlarm1() > 0) { BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm1()); vo.setWarnCode(String.valueOf(crnProtocol.getAlarm())); if (crnProtocol.getAlarm() > 0) { BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm()); vo.setAlarm(crnError==null?"未知异常":crnError.getErrName()); } vo.setInEnable(basCrnp.getInEnable()); src/main/java/com/zy/asrs/controller/OpenController.java
@@ -154,43 +154,43 @@ return R.ok().add(taskWrk); } //取放货申请 @PostMapping("/pick/and/place/v1") @AppAuth(memo = "agv取放货申请") public R getAgvPickAndPlaceV1(@RequestHeader String appkey, @RequestBody TaskOverParam param, HttpServletRequest request){ auth(appkey, param, request); if (Cools.isEmpty(param)) { return R.parse(BaseRes.PARAM); } if (Cools.isEmpty(param.getStaNo())){ return R.error("码头[staNo]不能为空"); } if (Cools.isEmpty(param.getType())){ return R.error("类型[type]不能为空"); } return openService.getAgvPickAndPlaceV1(param); } // //取放货申请 // @PostMapping("/pick/and/place/v1") // @AppAuth(memo = "agv取放货申请") // public R getAgvPickAndPlaceV1(@RequestHeader String appkey, // @RequestBody TaskOverParam param, // HttpServletRequest request){ // auth(appkey, param, request); // if (Cools.isEmpty(param)) { // return R.parse(BaseRes.PARAM); // } // if (Cools.isEmpty(param.getStaNo())){ // return R.error("码头[staNo]不能为空"); // } // if (Cools.isEmpty(param.getType())){ // return R.error("类型[type]不能为空"); // } // return openService.getAgvPickAndPlaceV1(param); // } //取放货完成反馈 @PostMapping("/pick/and/place/v2") @AppAuth(memo = "agv取放货完成反馈") public R getAgvPickAndPlaceV2(@RequestHeader String appkey, @RequestBody TaskOverParam param, HttpServletRequest request){ auth(appkey, param, request); if (Cools.isEmpty(param)) { return R.parse(BaseRes.PARAM); } if (Cools.isEmpty(param.getStaNo())){ return R.error("码头[staNo]不能为空"); } if (Cools.isEmpty(param.getType())){ return R.error("类型[type]不能为空"); } return openService.getAgvPickAndPlaceV2(param); } // //取放货完成反馈 // @PostMapping("/pick/and/place/v2") // @AppAuth(memo = "agv取放货完成反馈") // public R getAgvPickAndPlaceV2(@RequestHeader String appkey, // @RequestBody TaskOverParam param, // HttpServletRequest request){ // auth(appkey, param, request); // if (Cools.isEmpty(param)) { // return R.parse(BaseRes.PARAM); // } // if (Cools.isEmpty(param.getStaNo())){ // return R.error("码头[staNo]不能为空"); // } // if (Cools.isEmpty(param.getType())){ // return R.error("类型[type]不能为空"); // } // return openService.getAgvPickAndPlaceV2(param); // } //查询任务指令集合 @GetMapping("/queryTaskCommand") src/main/java/com/zy/asrs/controller/TaskWrkController.java
@@ -306,21 +306,6 @@ return R.ok(); } @PostMapping(value = "/taskWrk/updateCommandStep") @ManagerAuth(memo = "更新步序") public R updateCommandStep(@RequestParam Integer wrkNo, @RequestParam Integer commandStep) { TaskWrk taskWrk = taskWrkService.selectByWrkNo(wrkNo); if (taskWrk == null) { return R.error(); } Date now = new Date(); taskWrk.setCommandStep(commandStep); taskWrk.setModiTime(now);//操作时间 taskWrk.setModiUser(getUserId());//操作员 taskWrkService.updateById(taskWrk); return R.ok(); } public static String getTaskType(Integer paramIoType){ switch (paramIoType){ case 1: src/main/java/com/zy/asrs/entity/BasDevp.java
@@ -214,22 +214,6 @@ @TableField("cart_pos") private Integer cartPos; @ApiModelProperty(value= "") @TableField("agv_start_pick") private Integer agvStartPick; @ApiModelProperty(value= "") @TableField("agv_target_pick") private Integer agvTargetPick; @ApiModelProperty(value= "") @TableField("agv_start_place") private Integer agvStartPlace; @ApiModelProperty(value= "") @TableField("agv_target_place") private Integer agvTargetPlace; @ApiModelProperty(value= "异常码") @TableField("sta_err") private Integer staErr; src/main/java/com/zy/asrs/entity/TaskWrk.java
@@ -61,6 +61,13 @@ private Integer wrkNo; /** * 任务号 */ @ApiModelProperty(value= "重量") @TableField("sc_weight") private Integer scWeight; /** * 任务时间(接收时间) */ @ApiModelProperty(value= "任务时间(接收时间)") @@ -168,13 +175,6 @@ @ApiModelProperty(value= "堆垛机号") @TableField("crn_no") private Integer crnNo; /** * 指令执行步序 */ @ApiModelProperty(value= "指令执行步序") @TableField("command_step") private Integer commandStep = 0; @ApiModelProperty(value = "移库标记") @TableField("transfer_mark") src/main/java/com/zy/asrs/entity/TaskWrkLog.java
@@ -227,7 +227,6 @@ this.cancelTime = taskWrk.getCancelTime(); this.wrkSts = taskWrk.getWrkSts(); this.crnNo = taskWrk.getCrnNo(); this.commandStep = taskWrk.getCommandStep(); } // TaskWrkLog taskWrkLog = new TaskWrkLog( // null, // wms任务号 src/main/java/com/zy/asrs/service/OpenService.java
@@ -16,6 +16,6 @@ void getAgvTaskOver(TaskOverParam param); R getAgvPickAndPlaceV1(TaskOverParam param); R getAgvPickAndPlaceV2(TaskOverParam param); // R getAgvPickAndPlaceV1(TaskOverParam param); // R getAgvPickAndPlaceV2(TaskOverParam param); } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -56,8 +56,6 @@ @Transactional public class MainServiceImpl { public static final long COMMAND_TIMEOUT = 5 * 1000; @Autowired private SlaveProperties slaveProperties; @Autowired @@ -77,14 +75,8 @@ @Autowired private TaskWrkService taskWrkService; @Autowired private ConfigService configService; @Autowired private StaDescMapper staDescMapper; @Autowired private CommandInfoService commandInfoService; @Autowired private OpenServiceImpl openServiceImpl; @Autowired private StaDescService staDescService; @@ -103,8 +95,6 @@ private String taskStatusFeedbackPath; @Autowired private CrnController crnController; @Autowired private SiteController siteController; public void generateStoreWrkFile() throws IOException, InterruptedException { @@ -860,54 +850,6 @@ /** * 执行对工作档的完成操作 */ // public void storeFinished() { // for (CrnSlave crn : slaveProperties.getCrn()) { // // 获取堆垛机信息 // CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); // CrnProtocol crnProtocol = crnThread.getCrnProtocol(); // if (crnProtocol == null) { continue; } // // // 状态:等待确认 并且 任务完成位 = 1 // if (crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.HANDLING_COMPLETED && crnProtocol.getTaskNo() != 0) { // //获取入库待确认工作档 // TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crn.getId(),crnProtocol.getTaskNo().intValue()); // if (Cools.isEmpty(taskWrk)) { //// log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo()); // continue; // } // // //获取指令ID // Integer commandId = crnProtocol.getCommandId(); // CommandInfo commandInfo = new CommandInfo(); // if (Cools.isEmpty(commandId)){ // commandInfo = commandInfoService.selectOne(new EntityWrapper<CommandInfo>() // .eq("wrk_no",crnProtocol.getTaskNo()) // .eq("device","Crn")); // }else { // commandInfo = commandInfoService.selectById(commandId); // } // // // if (commandInfo == null) { // //指令不存在 // continue; // } // if (commandInfo.getCommandStatus() == 3){ // continue; // } // commandInfo.setCommandStatus(CommandStatusType.COMPLETE.id);//指令完成 // commandInfo.setCompleteTime(new Date());//指令完成时间 // if (commandInfoService.updateById(commandInfo)) {//修改成功后复位堆垛机 // // 堆垛机复位 // crnThread.setResetFlag(true); // } // } // } // } /** * 执行对工作档的完成操作 */ public void storeFinished() throws InterruptedException { for (CrnSlave crn : slaveProperties.getCrn()) { // 获取堆垛机信息 @@ -916,7 +858,7 @@ if (crnProtocol == null) { continue; } // 状态:等待确认 并且 任务完成位 = 1 if (crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.HANDLING_COMPLETED && crnProtocol.getTaskNo() != 0) { if (!Cools.isEmpty(crnProtocol.getTaskFinish()) && crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { //获取入库待确认工作档 TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crn.getId(),crnProtocol.getTaskNo().intValue()); if (Cools.isEmpty(taskWrk)&&crnProtocol.getTaskNo() !=999) { @@ -1054,7 +996,7 @@ wrkMast.getSourceStaNo(), // 源站 wrkMast.getSourceLocNo(), // 源库位 wrkMast.getBarcode(), // 条码 (int) crnProtocol.getAlarm1(), // 异常码 (int) crnProtocol.getAlarm(), // 异常码 errName, // 异常 1, // 异常情况 now, // 添加时间 @@ -1069,7 +1011,7 @@ } } else { // 异常修复 if (crnProtocol.getAlarm1() == null || crnProtocol.getAlarm1() == 0) { if (crnProtocol.getAlarm() == null || crnProtocol.getAlarm() == 0) { latest.setEndTime(now); latest.setUpdateTime(now); latest.setStatus(2); @@ -1082,7 +1024,7 @@ } else { BasErrLog latest = basErrLogService.findLatest(crn.getId()); // 有异常 if (crnProtocol.getAlarm1() != null && crnProtocol.getAlarm() > 0) { if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) { // 记录新异常 if (latest == null || (latest.getErrCode() != crnProtocol.getAlarm().intValue())) { BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm()); @@ -1101,7 +1043,7 @@ null, // 源站 null, // 源库位 null, // 条码 (int)crnProtocol.getAlarm1(), // 异常码 (int)crnProtocol.getAlarm(), // 异常码 errName, // 异常 1, // 异常情况 now, // 添加时间 @@ -1130,199 +1072,6 @@ } } } //自动派发任务 public void autoDistribute() { Config config = configService.selectByCode("autoDistribute"); if (config == null) { return; } if (config.getValue().equals("false")) {//判断是否开启自动派发任务 return; } for (TaskWrk taskWrk : taskWrkService.selectReceive()) { try { taskWrkService.distribute(taskWrk.getTaskNo(), 9527L); } catch (CoolException e) { log.info(e.getMessage()); } } } //agv取放货任务完成 public synchronized void autoCompleteAGV() { List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>()); try{ Thread.sleep(500); }catch (Exception e){ } for (BasDevp basDevp:basDevps){ DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1); StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } if (basDevp.getWrkNo()!=0){ if (basDevp.getAgvTargetPick()!=0){//取货 staProtocol.setAgvTypeSign((short)0); staProtocol.setStaNo(basDevp.getDevNo().shortValue()); MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol)); } boolean sign = true; if (basDevp.getAgvTargetPlace()!=0){ sign = false; basDevp.setAgvTargetPlace(0); basDevpService.updateById(basDevp); staProtocol.setAgvTypeSign((short)3);//1 staProtocol.setStaNo(basDevp.getDevNo().shortValue()); MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol)); } }else { if (basDevp.getAgvTargetPlace()!=0){ if (basDevp.getLoading().equals("Y")){ staProtocol.setAgvTypeSign((short)1); staProtocol.setStaNo(basDevp.getDevNo().shortValue()); MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol)); }else { log.error("AGV放货完成但输送线无物,复位信号 ===>> [staNo:{}] [basDevp:{}]", basDevp.getDevNo(), basDevp); basDevp.setAgvTargetPlace(0); basDevpService.updateById(basDevp); staProtocol.setAgvTypeSign((short)3);//1 staProtocol.setStaNo(basDevp.getDevNo().shortValue()); MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol)); } } if (basDevp.getAgvTargetPick()!=0){ basDevp.setAgvTargetPick(0); basDevpService.updateById(basDevp); staProtocol.setAgvTypeSign((short)2);//0 staProtocol.setStaNo(basDevp.getDevNo().shortValue()); MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol)); } } } } public synchronized void autoCompleteTask() { List<TaskWrk> taskWrks = taskWrkMapper.selectWorkingTask(); for (TaskWrk taskWrk : taskWrks) { //获取命令集合 List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskWrk.getTaskNo()); if (taskWrk.getCommandStep() < commandInfos.size()) { continue;//当前步序没有到达最后一条命令 } //判断末端命令是否执行完成 CommandInfo commandInfo = commandInfos.get(commandInfos.size() - 1); if (commandInfo.getCommandStatus() != CommandStatusType.COMPLETE.id) { continue;//指令未完成 } Date now = new Date(); //指令已完成,更新任务 if (taskWrk.getIoType() == 1) { //入库任务 taskWrk.setWrkSts(4);//3.吊车入库中 => 4.入库完成 //taskWrk.setStatus(TaskStatusType.COMPLETE.id); taskWrk.setModiTime(now); taskWrkService.updateById(taskWrk); //更新库位状态 LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint()); locMast.setLocSts("F");//F.在库 locMast.setBarcode(taskWrk.getBarcode());//托盘码 locMast.setModiTime(now); locMast.setModiUser(9999L); locMastService.updateById(locMast); } else if (taskWrk.getIoType() == 2) { //出库任务 taskWrk.setWrkSts(14);//12.吊车出库中 => 14.出库完成 // taskWrk.setStatus(TaskStatusType.COMPLETE.id); taskWrk.setModiTime(now); taskWrkService.updateById(taskWrk); //更新库位状态 LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint()); locMast.setLocSts("O");//O.空库位 locMast.setBarcode("");//托盘码 locMast.setModiTime(now); locMast.setModiUser(9999L); locMastService.updateById(locMast); } } } public synchronized String CrnStartRunning(TaskWrk taskWrk){ String tasktype = null; switch (taskWrk.getIoType()){ case 1: tasktype= "RK"; break; case 2: tasktype= "CK"; break; case 3: tasktype= "YK"; break; default: tasktype= "未知"; } Map<String, Object> map = new HashMap<>(); map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2"); TaskOverToWms taskOverToWms = new TaskOverToWms(); taskOverToWms.setFeedbackFrom("WCS"); //来源 taskOverToWms.setWarehouseId("1688469798893297665"); //仓库标识 taskOverToWms.setTaskNo(taskWrk.getTaskNo()); //任务号 taskOverToWms.setTaskType(tasktype); // 任务类型 taskOverToWms.setContainerCode(taskWrk.getBarcode()); // 容器编码 if (taskWrk.getIoType() ==1 || taskWrk.getIoType() == 3){ taskOverToWms.setEquipmentCode(String.valueOf(taskWrk.getCrnNo())); //设备编码 taskOverToWms.setTargetLocationCode(taskWrk.getOriginTargetPoint()); //目标库位 }else if (taskWrk.getIoType() ==2){ Map<Integer,String> map1 = new HashMap<>(); map1.put(102,"J-1101"); map1.put(106,"J-1103"); map1.put(110,"J-1105"); map1.put(114,"J-1107"); map1.put(118,"J-1109"); map1.put(122,"J-1111"); map1.put(305,"H-1101"); map1.put(405,"G-1101"); taskOverToWms.setEquipmentCode(map1.get(taskWrk.getTargetPoint())); //设备编码 taskOverToWms.setSourceLocationCode(taskWrk.getOriginStartPoint()); //源库位 } taskOverToWms.setTaskStatus("executing"); //任务状态 String response = null; try { response = new HttpHandler.Builder() .setHeaders(map) .setUri(wmsUrl) .setPath("wcsManager/wcsInterface/taskStatusFeedback") .setJson(JSON.toJSONString(taskOverToWms)) .build() .doPost(); }catch (Exception e){ log.error("堆垛机任务完成,请求wms任务完成接口失败"); } apiLogService.save("堆垛机开始运行" ,wmsUrl+"wcsManager/wcsInterface/taskStatusFeedback" ,null ,"127.0.0.1" ,JSON.toJSONString(taskOverToWms) ,response ,true ); return response; } private TaskWrk createTask(GetWmsDto dto, String barcode){ src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -265,39 +265,39 @@ } @Override public R getAgvPickAndPlaceV1(TaskOverParam param) { BasDevp basDevp = basDevpService.selectById(param.getStaNo()); if (Cools.isEmpty(basDevp)){ return R.error("站点号有误"+param.getStaNo()); } if (param.getType()==0 && basDevp.getAgvStartPick()==1){ return R.ok(); }else if (param.getType()==1 && basDevp.getAgvStartPlace()==1){ return R.ok(); }else { return R.error("不允许"); } } // @Override // public R getAgvPickAndPlaceV1(TaskOverParam param) { // BasDevp basDevp = basDevpService.selectById(param.getStaNo()); // if (Cools.isEmpty(basDevp)){ // return R.error("站点号有误"+param.getStaNo()); // } // if (param.getType()==0 && basDevp.getAgvStartPick()==1){ // return R.ok(); // }else if (param.getType()==1 && basDevp.getAgvStartPlace()==1){ // return R.ok(); // }else { // return R.error("不允许"); // } // } @Override public R getAgvPickAndPlaceV2(TaskOverParam param) { BasDevp basDevp = basDevpService.selectById(param.getStaNo()); if (Cools.isEmpty(basDevp)){ return R.error("站点号有误"+param.getStaNo()); } if (param.getType()==0){ basDevp.setAgvTargetPick(1); basDevpService.updateById(basDevp); return R.ok(); }else if (param.getType()==1){ basDevp.setAgvTargetPlace(1); basDevpService.updateById(basDevp); return R.ok(); }else { return R.error("请求类型异常"+param.getType()); } } // @Override // public R getAgvPickAndPlaceV2(TaskOverParam param) { // BasDevp basDevp = basDevpService.selectById(param.getStaNo()); // if (Cools.isEmpty(basDevp)){ // return R.error("站点号有误"+param.getStaNo()); // } // if (param.getType()==0){ // basDevp.setAgvTargetPick(1); // basDevpService.updateById(basDevp); // return R.ok(); // }else if (param.getType()==1){ // basDevp.setAgvTargetPlace(1); // basDevpService.updateById(basDevp); // return R.ok(); // }else { // return R.error("请求类型异常"+param.getType()); // } // } public List<Integer> getInEnableRoadway(){ int[] roadway = null; src/main/java/com/zy/core/MainProcess.java
@@ -68,13 +68,6 @@ i = 0; } //自动派发任务 // mainService.autoDistribute(); //自动完成任务 // mainService.autoCompleteTask(); //agv取放货完成 mainService.autoCompleteAGV(); } catch (Exception e) { e.printStackTrace(); } src/main/java/com/zy/core/enums/CrnStatusType.java
@@ -2,37 +2,23 @@ public enum CrnStatusType { // NONE(-1, "离线"), // IDLE(0, "空闲"), // FETCH_MOVING(1, "取货行走"), // FETCH_WAITING(2, "取货等待"), // FETCHING(3, "取货中"), // PUT_MOVING(4, "放货走行"), // PUT_WAITING(5, "放货等待"), // PUTTING(6, "放货中"), // ORIGIN_GO(7, "回原点"), // ORIGIN_BACK(8, "回反原点"), // MOVING(9, "走行中"), // WAITING(10, "任务完成等待WCS确认"), // PAUSE(11, "任务暂停"), // SOS(99, "报警"), // ; IDLE(0, "空闲,无任务"), NONE_MOVING(1, "取货定位"), FETCHING(2, "取货等待"), MOVING(3, "取货中"), PUTTING(4, "放货走行"), HOMING(5, "放货等待"), ANTI_ORIGIN(6, "放货中"), PUT_COMPLETE(7, "回原点"), // MOVE_THE_SHIPPING_LOCATION(8, "移动到放货位置"), // PUTTING(9, "放货中"), HANDLING_COMPLETED(10, "搬运完成等待WCS确认"), EMPTY_AVOIDANCE(11, "空载避让"), NONE(-1, "离线"), IDLE(0, "空闲"), FETCH_MOVING(1, "取货行走"), FETCH_WAITING(2, "取货等待"), FETCHING(3, "取货中"), PUT_MOVING(4, "放货走行"), PUT_WAITING(5, "放货等待"), PUTTING(6, "放货中"), ORIGIN_GO(7, "回原点"), ORIGIN_BACK(8, "回反原点"), MOVING(9, "走行中"), WAITING(10, "任务完成等待WCS确认"), PAUSE(11, "任务暂停"), SOS(99, "报警"), OTHER(100, "其他"), UNKNOW(100, "其他"), ; public Integer id; public String desc; @@ -50,7 +36,7 @@ return type; } } return null; return NONE; } public static CrnStatusType get(CrnStatusType type) { src/main/java/com/zy/core/model/protocol/CrnProtocol.java
@@ -1,7 +1,10 @@ package com.zy.core.model.protocol; import com.zy.asrs.entity.BasCrnp; import com.zy.core.enums.*; import com.zy.core.enums.CrnForkPosType; import com.zy.core.enums.CrnLiftPosType; import com.zy.core.enums.CrnModeType; import com.zy.core.enums.CrnStatusType; import lombok.Data; /** @@ -9,6 +12,8 @@ */ @Data public class CrnProtocol { private Integer crnNo; /** * 1 = 手动模式 @@ -25,14 +30,14 @@ public Short taskFinish; /** * 校验结果 1表示检验成功 */ public Short valid; /** * 1 = 急停 */ public Short eStop; /** * 异常码 */ public Short alarm; /** * 任务号 @@ -54,12 +59,15 @@ */ public Short status; public Short alarm = 0; /** * 状态枚举 */ public CrnStatusType statusType; /** * 故障 */ public Boolean fault; /** * 堆垛机当前列号 @@ -72,175 +80,45 @@ public Short level; /** * 堆垛机当前排 */ public Short row; /** * 堆垛机当前巷道号 */ public Short lane; /** * 堆垛机通讯状态 */ public Boolean connStatus; /** * 申请入库修正 */ public Boolean correction; /** * 托盘号错 */ public Boolean tuError; /** * 取货无箱 */ public Boolean noneError; /** * 双重入库 */ public Boolean stockError; /** * 作业数据无效 */ public Boolean jobInvalid; /** * 空闲状态 */ public Boolean idle; /** * 控制柜使能 */ public Boolean control; /** * 停准 */ public Boolean stopQuasi; /** * 运行 */ public Boolean running; /** * 故障 */ public Boolean fault; /** * 货叉中位 */ public Boolean forkHome; /** * 单伸位货叉左位 */ public Boolean forkSingleLeft; /** * 单伸位货叉右位 */ public Boolean forkSingleRight; /** * 双伸位货叉左位 */ public Boolean forkDoubleLeft; /** * 双伸位货叉右位 */ public Boolean forkDoubleRight; /** * 单伸位高位 */ public Boolean singleHigh; /** * 单伸位低位 */ public Boolean singleLow; /** * 双伸位高位 */ public Boolean doubleHigh; /** * 双伸位低位 */ public Boolean doubleLow; /** * 站台高位 */ public Boolean platformHigh; /** * 站台低位 */ public Boolean platformLow; /** * 当前货叉位置 * 0 = 货叉原位 * 1 = 货叉在左侧 * 2 = 货叉在右侧 */ public Short forkPos = -1; public Short forkPos; public CrnForkPosType forkPosType = CrnForkPosType.NONE; public CrnForkPosType forkPosType; /** * 当前载货台位置 * 0 = 下定位 * 1 = 上定位 */ public Short liftPos = -1; public Short liftPos; public CrnLiftPosType liftPosType = CrnLiftPosType.ERROR; public CrnLiftPosType liftPosType; /** * 走行在定位 * 0 = 在定位 * 1 = 不在定位 */ public Short walkPos = 0; /** * 拨指位置 * 0 = 不在定位 * 1 = 上定位 * 2 = 下定位 */ public Short fingerPos; public CrnFingerPosType fingerPosType; public Short walkPos; /** * 载货台有物 */ public Short loaded; /** * 堆垛机垂直故障代码(数值显示) */ private Integer alarm1 = 0; private Short temp1; /** * 堆垛机水平故障代码(数值显示) */ private Integer alarm2 = 0;; private CrnTemp1 crnTemp1; /** * 堆垛机货叉故障代码(数值显示) */ private Integer alarm3 = 0;; private Short temp2; /** * 堆垛机状态故障代码(数值显示) */ private Integer alarm4 = 0;; private Short temp3; private Short temp4; /** * 异常1 @@ -271,42 +149,53 @@ private CrnError4 crnError4; /** * 异常5 */ private boolean[] error5; private CrnError5 crnError5; /** * 异常6 */ private boolean[] error6; private CrnError6 crnError6; /** * X行走线速度m/min */ private Float xSpeed = 0F; private Float xSpeed; /** * Y行走线速度m/min */ private Float ySpeed = 0F; private Float ySpeed; /** * Z行走线速度m/min */ private Float zSpeed = 0F; private Float zSpeed; /** * 堆垛机累计走行距离km */ public Float xDistance = 0F; public Float xDistance; /** * 堆垛机累计升降距离km */ public Float yDistance = 0F; public Float yDistance; /** * 堆垛机累计走行时长h */ public Float xDuration = 0F; public Float xDuration; /**w /** * 堆垛机累计升降时长h */ public Float yDuration = 0F; //指令ID private Integer commandId; public Float yDuration; public void setMode(Short mode) { this.mode = mode; @@ -348,81 +237,12 @@ this.status = CrnStatusType.get(type).id.shortValue(); } public void setFingerPos(Short type) { this.fingerPos = type; this.fingerPosType = CrnFingerPosType.get(type); public Short getTemp1() { return temp1; } public void setError1(boolean[] error1){ this.error1 = error1; this.crnError1 = new CrnError1(); this.crnError1.remoteStop = error1[0]; this.crnError1.mainStop = error1[1]; this.crnError1.controlStop = error1[2]; this.crnError1.xCoverErr = error1[3]; this.crnError1.yCoverErr = error1[4]; this.crnError1.zCoverErr = error1[5]; this.crnError1.laserErr = error1[6]; this.crnError1.barcodeErr = error1[7]; this.crnError1.xFrontLimitErr = error1[8]; this.crnError1.xBackLimitErr = error1[9]; this.crnError1.yUpLimitErr = error1[10]; this.crnError1.yDownLimitErr = error1[11]; this.crnError1.zLeftLimitErr = error1[12]; this.crnError1.zRightLimitErr = error1[13]; this.crnError1.leftOverWidthErr1 = error1[14]; this.crnError1.leftOverWidthErr2 = error1[15]; } public void setError2(boolean[] error2){ this.error2 = error2; this.crnError2 = new CrnError2(); this.crnError2.leftOverLenErr1 = error2[0]; this.crnError2.leftOverLenErr2 = error2[1]; this.crnError2.leftOverHighErr = error2[2]; this.crnError2.rightOverWidthErr1 = error2[3]; this.crnError2.rightOverWidthErr2 = error2[4]; this.crnError2.rightOverLenErr1 = error2[5]; this.crnError2.rightOverLenErr2 = error2[6]; this.crnError2.rightOverHighErr = error2[7]; this.crnError2.leftLooseRopeErr = error2[8]; this.crnError2.rightLooseRopeErr = error2[9]; this.crnError2.frontDoorErr = error2[10]; this.crnError2.backDoorErr = error2[11]; this.crnError2.startupErr = error2[12]; this.crnError2.xFrontLocaUpErr = error2[13]; this.crnError2.xFrontLocaDownErr = error2[14]; this.crnError2.xBackLocaUpErr = error2[15]; } public void setError3(boolean[] error3) { this.error3 = error3; this.crnError3 = new CrnError3(); this.crnError3.xBackLocaDownErr = error3[0]; this.crnError3.yUpLocaUpErr = error3[1]; this.crnError3.yUpLocaDownErr = error3[2]; this.crnError3.yDownLocaUpErr = error3[3]; this.crnError3.yDownLocaDownErr = error3[4]; this.crnError3.zLeftLocaUpErr = error3[5]; this.crnError3.zLeftLocaDownErr = error3[6]; this.crnError3.zRightLocaUpErr = error3[7]; this.crnError3.zRightLocaDownErr = error3[8]; this.crnError3.leftTakeNoneErr = error3[9]; this.crnError3.rightTakeNoneErr = error3[10]; this.crnError3.leftTakeThenLoadErr = error3[11]; this.crnError3.rightTakeThenLoadErr = error3[12]; this.crnError3.leftPutAndLoadErr = error3[13]; this.crnError3.rightPutAndLoadErr = error3[14]; this.crnError3.leftPutThenNoneErr = error3[15]; } public void setError4(boolean[] error4) { this.error4 = error4; this.crnError4 = new CrnError4(); this.crnError4.rightPutThenNoneErr = error4[0]; this.crnError4.xLooseBrakeTimeout = error4[1]; this.crnError4.yLooseBrakeTimeout = error4[2]; this.crnError4.zLooseBrakeTimeout = error4[3]; public void setTemp1(Short temp1) { this.temp1 = temp1; } /** @@ -434,8 +254,39 @@ public BasCrnp toSqlModel(BasCrnp basCrnp){ basCrnp.setCrnErr(alarm.longValue()); if (alarm!=null) { basCrnp.setCrnErr(alarm.longValue()); } basCrnp.setWrkNo(taskNo.intValue()); return basCrnp; } public void setxSpeed(Short xSpeed) { this.xSpeed = Float.valueOf(xSpeed); } public void setySpeed(Short ySpeed) { this.ySpeed = Float.valueOf(ySpeed); } public void setzSpeed(Short zSpeed) { this.zSpeed = Float.valueOf(zSpeed); } public void setxDistance(Short xDistance) { this.xDistance = Float.valueOf(xDistance); } public void setyDistance(Short yDistance) { this.yDistance = Float.valueOf(yDistance); } public void setxDuration(Short xDuration) { this.xDuration = Float.valueOf(xDuration); } public void setyDuration(Short yDuration) { this.yDuration = Float.valueOf(yDuration); } } src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -197,8 +197,6 @@ basDevp.setLocType3((short) 0); // 轻重类型{0:未知,1:轻库位,2:重库位} basDevp.setLocType1(high != low && low ? (short) 1 : (short) 2); basDevp.setInQty(inQty !=null ?(int)inQty : 0); basDevp.setAgvStartPick(agvStartPick.intValue()); basDevp.setAgvStartPlace(agvStartPlace.intValue()); return basDevp; } src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -21,7 +21,6 @@ import com.zy.core.model.CrnSlave; import com.zy.core.model.Task; import com.zy.core.model.command.CrnCommand; import com.zy.core.model.cpmmandParam.CrnCommandParam; import com.zy.core.model.protocol.CrnProtocol; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -41,7 +40,6 @@ private CrnSlave slave; private CrnProtocol crnProtocol; private boolean resetFlag = false; private boolean resetFlagTwo = false; public Long sign = System.currentTimeMillis(); @@ -51,7 +49,6 @@ * 堆垛机是否在回原点运动中标记 */ private boolean backHpFlag = false; private boolean backHpFlagTwo = false; public SiemensCrnThread(CrnSlave slave) { this.slave = slave; @@ -61,7 +58,6 @@ @SuppressWarnings("InfiniteLoopStatement") public void run() { this.connect(); sign = System.currentTimeMillis(); while (isRunning) { try { int step = 1; @@ -96,32 +92,6 @@ command.setDestinationPosZ((short)0); // 目标库位层 write(command); break; // 写入数据 case 5: write5((CrnCommand) task.getData()); break; // 复位 case 6: CrnCommand command2 = (CrnCommand) task.getData(); if (null == command2) { command2 = new CrnCommand(); } command2.setCrnNo(slave.getId()); // 堆垛机编号 command2.setTaskNo((short) 0); // 工作号 command2.setAckFinish((short) 1); // 任务完成确认位 command2.setTaskMode(CrnTaskModeType.NONE); // 任务模式 command2.setSourcePosX((short)0); // 源库位排 command2.setSourcePosY((short)0); // 源库位列 command2.setSourcePosZ((short)0); // 源库位层 command2.setDestinationPosX((short)0); // 目标库位排 command2.setDestinationPosY((short)0); // 目标库位列 command2.setDestinationPosZ((short)0); // 目标库位层 write5(command2); break; // 双工位同时作业 case 9: write9((CrnCommandParam) task.getData()); break; default: break; } @@ -144,7 +114,6 @@ crnProtocol.setMode((short) -1); // crnProtocol.setTaskNo((short)0); crnProtocol.setStatus((short)-1); crnProtocol.setStatusTwo((short)-1); crnProtocol.setBay((short)0); crnProtocol.setLevel((short)0); crnProtocol.setForkPos((short) -1); @@ -159,16 +128,6 @@ crnProtocol.setyDistance((short) 0); crnProtocol.setxDuration((short) 0); crnProtocol.setyDuration((short) 0); // 根据实时信息更新数据库 BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class); BasCrnp basCrnp = basCrnpService.selectById(slave.getId()); basCrnp.setCrnSts((int)crnProtocol.getMode()); basCrnp.setCrnStatusOne(-1); basCrnp.setCrnStatusTwo(-1); if (!basCrnpService.updateById(basCrnp)){ log.error("堆垛机plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } } @Override @@ -196,74 +155,40 @@ */ private void readStatus(){ try { OperateResultExOne<byte[]> result = new OperateResultExOne<byte[]>(); if (slave.getId()>2 && slave.getId()<6){ result = siemensNet.Read("DB101.0", (short) 66); } else { result = siemensNet.Read("DB101.0", (short) 56); } OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 56); if (result.IsSuccess) { if (null == crnProtocol) { crnProtocol = new CrnProtocol(); crnProtocol.setCrnNo(slave.getId()); } crnProtocol.setCrnNo(slave.getId()); crnProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0)); crnProtocol.setTaskNo(siemensNet.getByteTransform().TransInt16(result.Content, 2)); crnProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 4)); crnProtocol.setBay(siemensNet.getByteTransform().TransInt16(result.Content, 6)); crnProtocol.setLevel(siemensNet.getByteTransform().TransInt16(result.Content, 8)); crnProtocol.setForkPos(siemensNet.getByteTransform().TransInt16(result.Content, 10)); if (slave.getId()<3 || slave.getId()>5){ crnProtocol.setLiftPos(siemensNet.getByteTransform().TransInt16(result.Content, 12)); crnProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 14)); crnProtocol.setLoaded(siemensNet.getByteTransform().TransInt16(result.Content, 16)); crnProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 18)); crnProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 20)); crnProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 22)); crnProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 24)); crnProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 26)); crnProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 28)); crnProtocol.setySpeed(siemensNet.getByteTransform().TransInt16(result.Content, 32)); crnProtocol.setzSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 36)); crnProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 40)); crnProtocol.setyDistance(siemensNet.getByteTransform().TransInt16(result.Content, 44)); crnProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 48)); crnProtocol.setyDuration(siemensNet.getByteTransform().TransInt16(result.Content, 52)); } else { crnProtocol.setLoaded(siemensNet.getByteTransform().TransInt16(result.Content, 12)); crnProtocol.setTaskNoTwo(siemensNet.getByteTransform().TransInt16(result.Content, 14)); crnProtocol.setStatusTwo(siemensNet.getByteTransform().TransInt16(result.Content, 16)); crnProtocol.setBayTwo(siemensNet.getByteTransform().TransInt16(result.Content, 18)); crnProtocol.setLevelTwo(siemensNet.getByteTransform().TransInt16(result.Content, 20)); crnProtocol.setForkPosTwo(siemensNet.getByteTransform().TransInt16(result.Content, 22)); crnProtocol.setLoadedTwo(siemensNet.getByteTransform().TransInt16(result.Content, 24)); crnProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 26)); crnProtocol.setWalkPosTwo(siemensNet.getByteTransform().TransInt16(result.Content, 28)); crnProtocol.setLiftPos(siemensNet.getByteTransform().TransInt16(result.Content, 30)); crnProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 32)); crnProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 34)); crnProtocol.setySpeed(siemensNet.getByteTransform().TransInt16(result.Content, 38)); crnProtocol.setzSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 42)); // crnProtocol.setzSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 42)); crnProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 50)); crnProtocol.setyDistance(siemensNet.getByteTransform().TransInt16(result.Content, 54)); crnProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 58)); crnProtocol.setyDuration(siemensNet.getByteTransform().TransInt16(result.Content, 62)); } crnProtocol.setLiftPos(siemensNet.getByteTransform().TransInt16(result.Content, 12)); crnProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 14)); crnProtocol.setLoaded(siemensNet.getByteTransform().TransInt16(result.Content, 16)); crnProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 18)); crnProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 20)); crnProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 22)); crnProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 24)); crnProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 26)); crnProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 28)); crnProtocol.setySpeed(siemensNet.getByteTransform().TransInt16(result.Content, 32)); crnProtocol.setzSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 36)); crnProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 40)); crnProtocol.setyDistance(siemensNet.getByteTransform().TransInt16(result.Content, 44)); crnProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 48)); crnProtocol.setyDuration(siemensNet.getByteTransform().TransInt16(result.Content, 52)); OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); // 复位信号 if (!Cools.isEmpty(crnProtocol.getStatusType()) && (crnProtocol.getStatusType().equals(CrnStatusType.WAITING) || crnProtocol.getStatusType().equals(CrnStatusType.SEPARATE_WAITING))) { log.error("-------------------------工位1-------------------------第一步、[堆垛机号:{}, 工作号:{}, 载货台:{}]==>> 状态为{},等待确认!!", slave.getId(),crnProtocol.getTaskNo(), crnProtocol.getLoaded()==1 ? "有物" : "无物",crnProtocol.getStatusType()); if (!Cools.isEmpty(crnProtocol.getStatusType()) && crnProtocol.getStatusType().equals(CrnStatusType.WAITING)) { log.error("-------------------------------------------第一步、[堆垛机号:{}, 工作号:{}, 载货台:{}]==>> 状态为10,等待确认!!", slave.getId(),crnProtocol.getTaskNo(), crnProtocol.getLoaded()==1 ? "有物" : "无物"); if (resetFlag) { if(crnProtocol.getTaskNo()==9999){ backHpFlag = false; @@ -272,22 +197,6 @@ crnCommand.setAckFinish((short)1); if (write(crnCommand)) { resetFlag = false; } } } // 复位信号 if (!Cools.isEmpty(crnProtocol.getStatusTypeTwo()) && (crnProtocol.getStatusTypeTwo().equals(CrnStatusType.WAITING) || crnProtocol.getStatusTypeTwo().equals(CrnStatusType.SEPARATE_WAITING))) { log.error("-------------------------工位2-------------------------第一步、[堆垛机号:{}, 工作号:{}, 载货台:{}]==>> 状态为{},等待确认!!", slave.getId(),crnProtocol.getTaskNoTwo(), crnProtocol.getLoadedTwo()==1 ? "有物" : "无物",crnProtocol.getStatusTypeTwo()); if (resetFlagTwo) { if(crnProtocol.getTaskNoTwo()==9999){ backHpFlagTwo = false; } CrnCommand crnCommand = new CrnCommand(); crnCommand.setAckFinish((short)1); if (write5(crnCommand)) { resetFlagTwo = false; } } } @@ -348,398 +257,12 @@ // array[9] = command.getSourceStaNo(); // array[10] = command.getDestinationStaNo(); array[9] = command.getCommand(); OperateResult result18 = siemensNet.Write("DB100.18", (short)0); OperateResult result = siemensNet.Write("DB100.0", array); log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), array); //堆垛机任务写入后,回读一次,看是否成功 Thread.sleep(200); int writeCount = 1; do { try{ if(!result.IsSuccess){ log.error("写入堆垛机plc数据失败,重新下发任务 写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSONString(command),writeCount); result = siemensNet.Write("DB100.0", array); Thread.sleep(100); writeCount++; continue; } OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24); if (resultRead.IsSuccess) { CrnCommand one = new CrnCommand(); one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2)); one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4)); one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6)); one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8)); one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10)); one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12)); one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14)); one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16)); if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode()) || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY()) || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX()) || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ()) ){ try{ log.error("堆垛机命令地址写入后回读失败==>不一致[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSONString(command),JSON.toJSONString(one)); }catch (Exception e){ try{ log.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSONString(command),JSON.toJSONString(resultRead)); }catch (Exception e1){ log.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSONString(command)); } } try{ Thread.sleep(100); }catch (Exception e){ } log.error("写入堆垛机plc数据失败,重新下发任务 回读不一致 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSONString(command),writeCount); result = siemensNet.Write("DB100.0", array); writeCount++; continue; } else { log.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSONString(command),JSON.toJSONString(one)); break; } } }catch (Exception e){ log.error("堆垛机命令地址写入后回读出错,异常:"+e); } writeCount++; } while (writeCount<6); if (command.getAckFinish() == 0) { short commandFinish = 1; Thread.sleep(100L); result = siemensNet.Write("DB100.18", commandFinish); int signFinish = 1; while (signFinish<5){ OperateResultExOne<byte[]> result10018 = siemensNet.Read("DB100.18", (short) 2); short transInt16 = siemensNet.getByteTransform().TransInt16(result10018.Content, 0); if (transInt16 != commandFinish){ log.info("下发DB100.18 回读失败" + "commandFinish:"+commandFinish); log.info("下发DB100.18 回读失败" + "array:"+ JSON.toJSONString(array)); result = siemensNet.Write("DB100.18", commandFinish); signFinish++; }else { log.info("下发DB100.18" + "commandFinish:"+commandFinish); log.info("下发DB100.18" + "array:"+ JSON.toJSONString(array)); break; } } } try { // 日志记录 BasCrnOptService bean = SpringUtils.getBean(BasCrnOptService.class); BasCrnOpt basCrnOpt = new BasCrnOpt( command.getTaskNo().intValue(), // 任务号 command.getCrnNo(), // 堆垛机[非空] new Date(), // 下发时间 command.getTaskModeType().toString(), // 模式 command.getSourcePosX().intValue(), // 源排 command.getSourcePosY().intValue(), // 源列 command.getSourcePosZ().intValue(), // 源层 null, // 源站 command.getDestinationPosX().intValue(), // 目标排 command.getDestinationPosY().intValue(), // 目标列 command.getDestinationPosZ().intValue(), // 目标层 null, // 目标站 null, // 响应结果 null, // 修改时间 null // 修改人员 ); bean.insert(basCrnOpt); } catch (Exception ignore) {} if (result != null && result.IsSuccess) { Thread.sleep(200); this.readStatus(); log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSONString(command)); OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSONString(command))); return true; } else { OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); return false; } } /** * 写入数据 工位2 */ private boolean write5(CrnCommand command) throws InterruptedException { if (null == command) { log.error("堆垛机写入命令为空"); return false; } // convertRow(command); command.setCrnNo(slave.getId()); short[] array = new short[10]; array[0] = command.getAckFinish(); array[1] = command.getTaskNo(); array[2] = command.getTaskMode(); array[3] = command.getSourcePosX(); array[4] = command.getSourcePosY(); array[5] = command.getSourcePosZ(); array[6] = command.getDestinationPosX(); array[7] = command.getDestinationPosY(); array[8] = command.getDestinationPosZ(); // array[9] = command.getSourceStaNo(); // array[10] = command.getDestinationStaNo(); array[9] = command.getCommand(); OperateResult result18 = siemensNet.Write("DB100.38", (short)0); OperateResult result = siemensNet.Write("DB100.20", array); log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), array); //堆垛机任务写入后,回读一次,看是否成功 Thread.sleep(200); int writeCount = 1; do { try{ if(!result.IsSuccess){ log.error("写入堆垛机plc数据失败,重新下发任务 写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSONString(command),writeCount); result = siemensNet.Write("DB100.20", array); Thread.sleep(100); writeCount++; continue; } OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.20", (short) 24); if (resultRead.IsSuccess) { CrnCommand one = new CrnCommand(); one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2)); one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4)); one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6)); one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8)); one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10)); one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12)); one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14)); one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16)); if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode()) || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY()) || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX()) || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ()) ){ try{ log.error("堆垛机命令地址写入后回读失败==>不一致[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSONString(command),JSON.toJSONString(one)); }catch (Exception e){ try{ log.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSONString(command),JSON.toJSONString(resultRead)); }catch (Exception e1){ log.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSONString(command)); } } try{ Thread.sleep(100); }catch (Exception e){ } log.error("写入堆垛机plc数据失败,重新下发任务 回读不一致 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSONString(command),writeCount); result = siemensNet.Write("DB100.20", array); writeCount++; continue; } else { log.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSONString(command),JSON.toJSONString(one)); break; } } }catch (Exception e){ log.error("堆垛机命令地址写入后回读出错,异常:"+e); } writeCount++; } while (writeCount<6); if (command.getAckFinish() == 0) { short commandFinish = 1; Thread.sleep(100L); result = siemensNet.Write("DB100.38", commandFinish); int signFinish = 1; while (signFinish<5){ OperateResultExOne<byte[]> result10018 = siemensNet.Read("DB100.38", (short) 2); short transInt16 = siemensNet.getByteTransform().TransInt16(result10018.Content, 0); if (transInt16 != commandFinish){ log.info("下发DB100.38 回读失败" + "commandFinish:"+commandFinish); log.info("下发DB100.38 回读失败" + "array:"+ JSON.toJSONString(array)); result = siemensNet.Write("DB100.38", commandFinish); signFinish++; }else { log.info("下发DB100.38" + "commandFinish:"+commandFinish); log.info("下发DB100.38" + "array:"+ JSON.toJSONString(array)); break; } } } try { // 日志记录 BasCrnOptService bean = SpringUtils.getBean(BasCrnOptService.class); BasCrnOpt basCrnOpt = new BasCrnOpt( command.getTaskNo().intValue(), // 任务号 command.getCrnNo(), // 堆垛机[非空] new Date(), // 下发时间 command.getTaskModeType().toString(), // 模式 command.getSourcePosX().intValue(), // 源排 command.getSourcePosY().intValue(), // 源列 command.getSourcePosZ().intValue(), // 源层 null, // 源站 command.getDestinationPosX().intValue(), // 目标排 command.getDestinationPosY().intValue(), // 目标列 command.getDestinationPosZ().intValue(), // 目标层 null, // 目标站 null, // 响应结果 null, // 修改时间 null // 修改人员 ); bean.insert(basCrnOpt); } catch (Exception ignore) {} if (result != null && result.IsSuccess) { Thread.sleep(200); this.readStatus(); log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSONString(command)); OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSONString(command))); return true; } else { OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); return false; } } /** * 写入数据 双工位 */ private boolean write9(CrnCommandParam command) throws InterruptedException { if (null == command) { log.error("堆垛机写入命令为空"); return false; } command.setCrnNo(slave.getId()); short[] array = new short[22]; array[0] = command.getAckFinish(); array[1] = command.getTaskNo(); array[2] = command.getTaskMode(); array[3] = command.getSourcePosX(); array[4] = command.getSourcePosY(); array[5] = command.getSourcePosZ(); array[6] = command.getDestinationPosX(); array[7] = command.getDestinationPosY(); array[8] = command.getDestinationPosZ(); array[9] = command.getCommand(); array[10] = command.getAckFinish2(); array[11] = command.getTaskNo2(); array[12] = command.getTaskMode2(); array[13] = command.getSourcePosX2(); array[14] = command.getSourcePosY2(); array[15] = command.getSourcePosZ2(); array[16] = command.getDestinationPosX2(); array[17] = command.getDestinationPosY2(); array[18] = command.getDestinationPosZ2(); array[19] = command.getCommand(); array[20] = (short)1; array[21] = (short)1; OperateResult result18 = siemensNet.Write("DB100.18", (short)0); OperateResult result38 = siemensNet.Write("DB100.38", (short)0); OperateResult result = siemensNet.Write("DB100.0", array); // OperateResult result = siemensNet.Write("DB100.20", array); log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), array); //堆垛机任务写入后,回读一次,看是否成功 Thread.sleep(200); int writeCount = 1; do { try{ if(!result.IsSuccess){ log.error("写入堆垛机plc数据失败,重新下发任务 写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(command),writeCount); result = siemensNet.Write("DB100.0", array); Thread.sleep(100); writeCount++; continue; } OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 40); if (resultRead.IsSuccess) { CrnCommandParam one = new CrnCommandParam(); one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2)); one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4)); one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6)); one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8)); one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10)); one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12)); one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14)); one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16)); one.setTaskNo2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 22)); one.setTaskMode2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 24)); one.setSourcePosX2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 26)); one.setSourcePosY2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 28)); one.setSourcePosZ2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 30)); one.setDestinationPosX2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 32)); one.setDestinationPosY2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 34)); one.setDestinationPosZ2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 36)); if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode()) || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY()) || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX()) || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ()) || !command.getTaskNo2().equals(one.getTaskNo2()) || !command.getTaskMode2().equals(one.getTaskMode2()) || !command.getSourcePosX2().equals(one.getSourcePosX2()) || !command.getSourcePosY2().equals(one.getSourcePosY2()) || !command.getSourcePosZ2().equals(one.getSourcePosZ2()) || !command.getDestinationPosX2().equals(one.getDestinationPosX2()) || !command.getDestinationPosY2().equals(one.getDestinationPosY2()) || !command.getDestinationPosZ2().equals(one.getDestinationPosZ2()) ){ try{ log.error("堆垛机命令地址写入后回读失败==>不一致[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); }catch (Exception e){ try{ log.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead)); }catch (Exception e1){ log.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command)); } } try{ Thread.sleep(100); }catch (Exception e){ } log.error("写入堆垛机plc数据失败,重新下发任务 回读不一致 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(command),writeCount); result = siemensNet.Write("DB100.0", array); writeCount++; continue; } else { log.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); break; } } }catch (Exception e){ log.error("堆垛机命令地址写入后回读出错,异常:"+e); } writeCount++; } while (writeCount<6); if (command.getAckFinish() == 0) { short commandFinish = 1; Thread.sleep(100L); result18 = siemensNet.Write("DB100.18", commandFinish); result38 = siemensNet.Write("DB100.38", commandFinish); int signFinish = 1; while (signFinish<5){ OperateResultExOne<byte[]> result10018 = siemensNet.Read("DB100.18", (short) 2); OperateResultExOne<byte[]> result10038 = siemensNet.Read("DB100.38", (short) 2); short transInt1618 = siemensNet.getByteTransform().TransInt16(result10018.Content, 0); short transInt1638 = siemensNet.getByteTransform().TransInt16(result10038.Content, 0); if (transInt1618 != commandFinish || transInt1638 != commandFinish){ log.info("下发DB100.18/DB100.38 回读失败" + "commandFinish:"+commandFinish); log.info("下发DB100.18/DB100.38 回读失败" + "array:"+ JSON.toJSONString(array)); result18 = siemensNet.Write("DB100.18", commandFinish); result38 = siemensNet.Write("DB100.38", commandFinish); signFinish++; }else { log.info("下发DB100.18/DB100.38" + "commandFinish:"+commandFinish); log.info("下发DB100.18/DB100.38" + "array:"+ JSON.toJSONString(array)); break; } } } try { src/main/resources/mapper/BasDevpMapper.xml
@@ -41,10 +41,6 @@ <result column="max_wt" property="maxWt" /> <result column="gross_wt" property="grossWt" /> <result column="cart_pos" property="cartPos" /> <result column="agv_start_pick" property="agvStartPick" /> <result column="agv_target_pick" property="agvTargetPick" /> <result column="agv_start_place" property="agvStartPlace" /> <result column="agv_target_place" property="agvTargetPlace" /> <result column="sta_err" property="staErr" /> </resultMap> src/main/resources/mapper/TaskWrkLogMapper.xml
@@ -23,7 +23,6 @@ <result column="cancel_time" property="cancelTime" /> <result column="wrk_sts" property="wrkSts" /> <result column="crn_no" property="crnNo" /> <result column="command_step" property="commandStep" /> <result column="transfer_mark" property="transferMark" /> </resultMap> src/main/resources/mapper/TaskWrkMapper.xml
@@ -12,6 +12,9 @@ <result column="io_pri" property="ioPri" /> <result column="start_point" property="startPoint" /> <result column="target_point" property="targetPoint" /> <result column="origin_start_point" property="originStartPoint" /> <result column="origin_target_point" property="originTargetPoint" /> <result column="sc_weight" property="scWeight" /> <result column="modi_user" property="modiUser" /> <result column="modi_time" property="modiTime" /> <result column="memo" property="memo" /> @@ -22,7 +25,6 @@ <result column="cancel_time" property="cancelTime" /> <result column="wrk_sts" property="wrkSts" /> <result column="crn_no" property="crnNo" /> <result column="command_step" property="commandStep" /> <result column="transfer_mark" property="transferMark" /> </resultMap>