diff --git a/nlsso-server/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java b/nlsso-server/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java index 6b8114b..6f339e9 100644 --- a/nlsso-server/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java +++ b/nlsso-server/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java @@ -28,9 +28,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; -import java.util.Arrays; -import java.util.Date; -import java.util.List; +import java.util.*; import java.util.stream.IntStream; import static org.nl.acs.agv.server.impl.NDCAgvServiceImpl.Bytes2HexString; @@ -120,6 +118,7 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { log.info("接收agv上报任务信息:" + bs); // 从字节流的开头开始读取 int offset = 0; + Map map = new HashMap<>(); // 循环处理字节流,逐个拆包 按照S消息解析 while (offset < packetData.length) { if (offset + 6 > packetData.length) { @@ -159,6 +158,27 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { int carno = arr[20]; //充电桩站点号 int station = arr[25]; + // 处理重复phase + if (map.containsKey(index)){ + if (map.get(index).equals(phase)){ + log.info("agv上报phase已处理,不重复处理"); + // 更新偏移量,继续处理下一个数据包 + offset+=messageHeaderLength; + int indexNum = IntStream.range(offset, packetData.length - 1) + .filter(i -> packetData[i] == 135 && packetData[i + 1] == 205) + .findFirst() + .orElse(-1); + // 如果未找到,返回 -1 + if (indexNum == -1) { + break; + }else { + offset = indexNum; + continue; + } + } + + } + map.put(index,phase); Instruction link_inst = null; Instruction inst = null; List insts = null; diff --git a/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java b/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java index 9f94440..5e5790a 100644 --- a/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java +++ b/nlsso-server/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java @@ -403,13 +403,18 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic //到达输送线取货完成 if (device.getDeviceDriver() instanceof SsxDeviceDriver) { ssxDeviceDriver = (SsxDeviceDriver) device.getDeviceDriver(); - if (ssxDeviceDriver.getMode() != 0) { + //获取最新数据 + inst = instructionService.findByCode(String.valueOf(ikey)); + if (ssxDeviceDriver.getMode() != 0 && inst != null && !"2".equals(inst.getExecute_status())) { log.info("agv进入" + device_code + ",取货完成,开始写入信号3进行安全交互,当前信号值为:Mode:" + ssxDeviceDriver.getMode() + ",Move:" + ssxDeviceDriver.getMove() + ",Action:" + ssxDeviceDriver.getAction()); ssxDeviceDriver.writing(3); if (ssxDeviceDriver.getMode() == 3) { flag = true; log.info("设备" + device_code + "的Mode信号已变更为3,当前信号值为:Mode:" + ssxDeviceDriver.getMode() + ",Move:" + ssxDeviceDriver.getMove() + ",Action:" + ssxDeviceDriver.getAction() + ",开始写入0清除mode信号。"); ssxDeviceDriver.writing(0); + //提前更新 解决ndc上报指令残留问题 + inst.setExecute_status(AgvActionEnum.ACTION_STATUS.code("取货完成")); + instructionService.update(inst); data = actionComplete(index, inst, device_code, ssxDeviceDriver.getTo_command(), Integer.parseInt(AgvActionEnum.ACTION_STATUS.code("取货完成")), "取货完成"); log.info("设备" + device_code + "已完成信号0写入,当前信号值为:" + "Mode:" + ssxDeviceDriver.getMode() + ",Move:" + ssxDeviceDriver.getMove() + ",Action:" + ssxDeviceDriver.getAction() + ",agv开始离开。"); } else { @@ -418,12 +423,6 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic log.info("设备" + device_code + "已完成信号3写入,当前信号值为:" + "Mode:" + ssxDeviceDriver.getMode() + ",Move:" + ssxDeviceDriver.getMove() + ",Action:" + ssxDeviceDriver.getAction()); } ssxDeviceDriver.setMessage(""); - } else { - String message = "agv取货完成写入信号3安全交互失败,设备允许模式mode值为0,设备异常,请检查!"; - agv_message = ssxDeviceDriver.getDevice_code() + message; - ssxDeviceDriver.setMessage(message); - log.info(message); - lucene.deviceExecuteLog(new LuceneLogDto(this.device_code, message)); } } //到达普通站点取货完成 @@ -655,43 +654,50 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic //到达输送线放货完成 if (device.getDeviceDriver() instanceof SsxDeviceDriver) { ssxDeviceDriver = (SsxDeviceDriver) device.getDeviceDriver(); - log.info("agv进入" + device_code + ",放货完成,开始写入信号5进行安全交互,当前信号值为:Mode:" + ssxDeviceDriver.getMode() + ",Move:" + ssxDeviceDriver.getMove() + ",Action:" + ssxDeviceDriver.getAction()); - ssxDeviceDriver.writing(5); - if (ssxDeviceDriver.getMode() == 4) { - log.info("设备" + device_code + "的Mode信号已变更为4,当前信号值为:Mode:" + ssxDeviceDriver.getMode() + ",Move:" + ssxDeviceDriver.getMove() + ",Action:" + ssxDeviceDriver.getAction() + ",开始写入0清除mode信号。"); - if (ObjectUtil.isNotEmpty(task)){ - String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue(); - if (!StrUtil.startWith(task.getTask_code(), "-") && StrUtil.equals(hasWms, "1")) { - FeedBackTaskStatusRequest request = new FeedBackTaskStatusRequest(); - request.setTask_id(task.getExt_task_id()); - request.setTask_code(task.getTask_code()); - request.setTask_status("2"); - request.setRequest_medthod_code(RequestMethodEnum.feedback_task_status.getCode()); - request.setRequest_medthod_name(RequestMethodEnum.feedback_task_status.getName()); - request.setStartLocation(task.getStart_point_code()); - request.setEndLocation(task.getNext_point_code()); - String res = acsToWmsService.feedTaskStatus(request); - JSONObject result = JSONObject.parseObject(res); - if (StringUtil.isNotBlank(result.getString("status")) && "200".equals(result.getString("status"))) { - log.info("任务号" + request.getTask_code() + "放货完成---反馈wcs任务完成状态" + "成功。"); - } else if (StringUtil.isNotBlank(result.getString("status")) && !"200".equals(result.getString("status"))){ - log.info("任务号" + request.getTask_code() + "放货完成---反馈wcs任务完成状态" + "失败,服务器响应的失败原因为:" + result.getString("message")); - }else if (StringUtil.isNotBlank(result.getString("code")) && "500".equals(result.getString("code"))){ - log.info("任务号" + request.getTask_code() + "放货完成---请求不通" + "失败,服务器响应的失败原因为:" + result.getString("message")); - return; + //获取最新数据 + inst = instructionService.findByCode(String.valueOf(ikey)); + if (ssxDeviceDriver.getMode() != 0 && inst != null && !"4".equals(inst.getExecute_status())) { + log.info("agv进入" + device_code + ",放货完成,开始写入信号5进行安全交互,当前信号值为:Mode:" + ssxDeviceDriver.getMode() + ",Move:" + ssxDeviceDriver.getMove() + ",Action:" + ssxDeviceDriver.getAction()); + ssxDeviceDriver.writing(5); + if (ssxDeviceDriver.getMode() == 4) { + log.info("设备" + device_code + "的Mode信号已变更为4,当前信号值为:Mode:" + ssxDeviceDriver.getMode() + ",Move:" + ssxDeviceDriver.getMove() + ",Action:" + ssxDeviceDriver.getAction() + ",开始写入0清除mode信号。"); + if (ObjectUtil.isNotEmpty(task)){ + String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue(); + if (!StrUtil.startWith(task.getTask_code(), "-") && StrUtil.equals(hasWms, "1")) { + FeedBackTaskStatusRequest request = new FeedBackTaskStatusRequest(); + request.setTask_id(task.getExt_task_id()); + request.setTask_code(task.getTask_code()); + request.setTask_status("2"); + request.setRequest_medthod_code(RequestMethodEnum.feedback_task_status.getCode()); + request.setRequest_medthod_name(RequestMethodEnum.feedback_task_status.getName()); + request.setStartLocation(task.getStart_point_code()); + request.setEndLocation(task.getNext_point_code()); + String res = acsToWmsService.feedTaskStatus(request); + JSONObject result = JSONObject.parseObject(res); + if (StringUtil.isNotBlank(result.getString("status")) && "200".equals(result.getString("status"))) { + log.info("任务号" + request.getTask_code() + "放货完成---反馈wcs任务完成状态" + "成功。"); + } else if (StringUtil.isNotBlank(result.getString("status")) && !"200".equals(result.getString("status"))){ + log.info("任务号" + request.getTask_code() + "放货完成---反馈wcs任务完成状态" + "失败,服务器响应的失败原因为:" + result.getString("message")); + }else if (StringUtil.isNotBlank(result.getString("code")) && "500".equals(result.getString("code"))){ + log.info("任务号" + request.getTask_code() + "放货完成---请求不通" + "失败,服务器响应的失败原因为:" + result.getString("message")); + return; + } } } + ssxDeviceDriver.writing(0); + //提前更新 解决ndc上报指令残留问题 + inst.setExecute_status(AgvActionEnum.ACTION_STATUS.code("放货完成")); + instructionService.update(inst); + flag = true; + data = actionComplete(index, inst, device_code, ssxDeviceDriver.getTo_command(), Integer.parseInt(AgvActionEnum.ACTION_STATUS.code("放货完成")), "放货完成"); + log.info("设备" + device_code + "已完成信号0写入,当前信号值为:" + "Mode:" + ssxDeviceDriver.getMode() + ",Move:" + ssxDeviceDriver.getMove() + ",Action:" + ssxDeviceDriver.getAction() + ",agv开始离开。"); + } else { + log.info("设备" + device_code + "的Mode信号未变更为4,当前信号值为:Mode:" + ssxDeviceDriver.getMode() + ",Move:" + ssxDeviceDriver.getMove() + ",Action:" + ssxDeviceDriver.getAction() + ",尝试重新写入信号5进行安全交互"); + ssxDeviceDriver.writing(5); + log.info("设备" + device_code + "已完成信号5写入,当前信号值为:" + "Mode:" + ssxDeviceDriver.getMode() + ",Move:" + ssxDeviceDriver.getMove() + ",Action:" + ssxDeviceDriver.getAction()); } - ssxDeviceDriver.writing(0); - flag = true; - data = actionComplete(index, inst, device_code, ssxDeviceDriver.getTo_command(), Integer.parseInt(AgvActionEnum.ACTION_STATUS.code("放货完成")), "放货完成"); - log.info("设备" + device_code + "已完成信号0写入,当前信号值为:" + "Mode:" + ssxDeviceDriver.getMode() + ",Move:" + ssxDeviceDriver.getMove() + ",Action:" + ssxDeviceDriver.getAction() + ",agv开始离开。"); - } else { - log.info("设备" + device_code + "的Mode信号未变更为4,当前信号值为:Mode:" + ssxDeviceDriver.getMode() + ",Move:" + ssxDeviceDriver.getMove() + ",Action:" + ssxDeviceDriver.getAction() + ",尝试重新写入信号5进行安全交互"); - ssxDeviceDriver.writing(5); - log.info("设备" + device_code + "已完成信号5写入,当前信号值为:" + "Mode:" + ssxDeviceDriver.getMode() + ",Move:" + ssxDeviceDriver.getMove() + ",Action:" + ssxDeviceDriver.getAction()); - } - ssxDeviceDriver.setMessage(""); + ssxDeviceDriver.setMessage(""); + } } //agv普通站点放货完成 if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) {