From 68c075a4ce4297a179222b5156a33f146d330bdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=B1=9F=E7=8E=AE?= Date: Tue, 26 Sep 2023 17:46:31 +0800 Subject: [PATCH] =?UTF-8?q?add=20AGV=E8=AE=BE=E5=A4=87=E7=9B=91=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/nl/acs/agv/server/NDCAgvService.java | 2 + .../org/nl/acs/agv/server/dto/AgvDto.java | 32 ++- .../agv/server/impl/NDCAgvServiceImpl.java | 48 ++-- .../wms/service/impl/WmsToAcsServiceImpl.java | 4 + .../auto/run/NDCSocketConnectionAutoRun.java | 225 +++++++++--------- .../dashboard/service/DashboardService.java | 81 +++++++ 6 files changed, 242 insertions(+), 150 deletions(-) diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/NDCAgvService.java b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/NDCAgvService.java index 84cb853..6d9bbdc 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/NDCAgvService.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/NDCAgvService.java @@ -74,4 +74,6 @@ public interface NDCAgvService { * @return */ public boolean createChargingTaskToNDC(String carno); + + AgvDto findByCarNumber(String carNumber); } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/dto/AgvDto.java b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/dto/AgvDto.java index ed1333a..fccbef2 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/dto/AgvDto.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/dto/AgvDto.java @@ -3,6 +3,8 @@ package org.nl.acs.agv.server.dto; import lombok.Data; import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; @Data public class AgvDto implements Serializable { @@ -10,7 +12,7 @@ public class AgvDto implements Serializable { /** * 名称 */ - private String name; + private String name = ""; /** * 机器人当前的自身状态 @@ -22,17 +24,17 @@ public class AgvDto implements Serializable { * EXECUTING:正在执行运单 * CHARGING:正在充电 */ - private String state; + private String state = ""; /** * 机器人的剩余电量值(单位:整数百分比) */ - private String energyLevel; + private String energyLevel = ""; /** * */ - private String energyLevelGood; + private String energyLevelGood = ""; /** * 机器人在 SRD 系统中的在线状态 @@ -42,7 +44,7 @@ public class AgvDto implements Serializable { * TO_BE_RESPECTED:机器人处于在线状态,但不能接受新的运单。 * TO_BE_UTILIZED:机器人处于在线状态,可以接受并执行新的运单。 */ - private String integrationLevel; + private String integrationLevel = ""; /** * 机器人当前的运单执行状态 @@ -52,26 +54,36 @@ public class AgvDto implements Serializable { * AWAITING_ORDER:机器人在等待运单中新的子任务 * PROCESSING_ORDER:机器人正在执行运单 */ - private String procState; + private String procState = ""; /** * 角度 */ - private String positionAngle; + private String positionAngle = ""; /** * X坐标 */ - private String positionX; + private String positionX = ""; /** * Y坐标 */ - private String positionY; + private String positionY = ""; /** * 当前任务号 */ - private String transportOrder; + private String transportOrder = ""; + + /** + * 故障信息 + */ + private List faultInfo = new ArrayList<>(); + + /** + * 类型 + */ + private String type = "AGV"; } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java index a3a4fef..f4b9489 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java @@ -18,7 +18,6 @@ import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.opc.Device; import org.nl.acs.opc.DeviceAppService; -import org.nl.acs.opc.DeviceAppServiceImpl; import org.nl.acs.opc.DeviceType; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.system.service.ParamService; @@ -28,9 +27,9 @@ import org.nl.start.auto.run.NDCSocketConnectionAutoRun; import org.slf4j.MDC; import org.springframework.stereotype.Service; -import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; @Slf4j @Service @@ -43,13 +42,13 @@ public class NDCAgvServiceImpl implements NDCAgvService { private final DeviceExecuteLogService logServer; - Map AGVDeviceStatus = new HashMap(); + Map agv = new ConcurrentHashMap<>(); private String log_file_type = "log_file_type"; private String log_type = "agv接口日志"; @Override - public void deleteAgvInstToNDC(Instruction inst) throws Exception { + public void deleteAgvInstToNDC(Instruction inst) { try { MDC.put(log_file_type, log_type); if (StrUtil.equals(acsConfigService.findByCode(AcsConfig.FORKAGV).getValue(), "1")) { @@ -131,7 +130,6 @@ public class NDCAgvServiceImpl implements NDCAgvService { String instcode = inst.getInstruction_code(); int type = Integer.parseInt(inst.getInstruction_type()); int priority = Integer.parseInt(inst.getPriority()) + 128; - DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); DeviceService deviceService = SpringContextHolder.getBean(DeviceServiceImpl.class); int startAddress = deviceService.queryAddressBydeviceCode(inst.getStart_point_code()); int nextAddress = deviceService.queryAddressBydeviceCode(inst.getNext_point_code()); @@ -188,7 +186,7 @@ public class NDCAgvServiceImpl implements NDCAgvService { } @Override - public void sendAgvInstToNDC(String instcode) throws Exception { + public void sendAgvInstToNDC(String instcode) { InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class); Instruction inst = instructionService.findByCodeFromCache(instcode); sendAgvInstToNDC(inst); @@ -201,26 +199,24 @@ public class NDCAgvServiceImpl implements NDCAgvService { public static int IntToHexHigh(int b) { - int big = (b & 0xFF00) >> 8; - return big; + return (b & 0xFF00) >> 8; } public static int IntToHexLow(int b) { - int little = b & 0xFF; - return little; + return b & 0xFF; } public static String Bytes2HexString(byte[] b) { - String ret = ""; + StringBuilder ret = new StringBuilder(); for (int i = 0; i < b.length; i++) { String hex = Integer.toHexString(b[i] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } - ret += hex.toUpperCase(); + ret.append(hex.toUpperCase()); } - return ret; + return ret.toString(); } @Override @@ -306,7 +302,7 @@ public class NDCAgvServiceImpl implements NDCAgvService { }; break; } - log.info("反馈agv动作数据--index:" + hexToString(indexhigh & 0xFF) + hexToString(indexlow & 0xFF) + ",phase:" + hexToString(phasehigh & 0xFF) + hexToString(phaselow & 0xFF)); + log.info("反馈agv动作数据:index--" + hexToString(indexhigh & 0xFF) + hexToString(indexlow & 0xFF) + " phase--" + hexToString(phasehigh & 0xFF) + hexToString(phaselow & 0xFF)); return b; } finally { @@ -349,7 +345,7 @@ public class NDCAgvServiceImpl implements NDCAgvService { JSONObject jo = JSONObject.parseObject(mes); ja.add(jo); } - log.info("AGV查询自动门状态,反馈:{}", ja.toString()); + log.info("AGV查询自动门状态,反馈:{}", ja); return ja.toString(); } else { @@ -376,15 +372,13 @@ public class NDCAgvServiceImpl implements NDCAgvService { @Override public Map findAllAgvFromCache() { - return AGVDeviceStatus; + return agv; } @Override public void updateAgvFromCache(AgvDto dto) { - if (AGVDeviceStatus.containsKey(dto.getName())) { - AGVDeviceStatus.remove(dto.getName()); - } - AGVDeviceStatus.put(dto.getName(), dto); + agv.remove(dto.getName()); + agv.put(dto.getName(), dto); } @Override @@ -428,7 +422,7 @@ public class NDCAgvServiceImpl implements NDCAgvService { NDCSocketConnectionAutoRun.write(b); log.info("下发agv指令数据:" + Bytes2HexString(b)); } catch (Exception e) { - e.printStackTrace(); + log.error("error !", e); return false; } return true; @@ -436,4 +430,16 @@ public class NDCAgvServiceImpl implements NDCAgvService { MDC.remove(log_file_type); } } + + @Override + public AgvDto findByCarNumber(String carNumber) { + if (agv.containsKey(String.valueOf(carNumber)) && agv.get(carNumber) != null) { + return agv.get(String.valueOf(carNumber)); + } else { + AgvDto dto = new AgvDto(); + dto.setName(carNumber); + agv.put(carNumber, dto); + return dto; + } + } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java index b914f93..489c9e5 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java @@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.acs.agv.server.NDCAgvService; import org.nl.acs.config.AcsConfig; import org.nl.acs.device.service.DeviceService; import org.nl.acs.device_driver.DeviceDriver; @@ -55,6 +56,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { private final DeviceService DeviceService; private final DeviceAppService DeviceAppService; private final RouteLineService RouteLineService; + private final NDCAgvService ndcAgvService; private final String log_file_type = "log_file_type"; private final String log_type = "WMS下发ACS"; @@ -569,6 +571,8 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { status.put("container_qty", driver.getContainer_qty()); } } + + param.addAll(ndcAgvService.findAllAgvFromCache().values()); } JSONObject result = new JSONObject(); diff --git a/acs/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java b/acs/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java index 51d2d53..58ca9f3 100644 --- a/acs/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java +++ b/acs/nladmin-system/src/main/java/org/nl/start/auto/run/NDCSocketConnectionAutoRun.java @@ -3,6 +3,7 @@ package org.nl.start.auto.run; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; @@ -38,8 +39,8 @@ import java.io.DataOutputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; -import java.util.Date; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; @Slf4j @Component @@ -52,10 +53,23 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { static DataInputStream dis; private int recordTimeOut = 10000; private Date recordTime; - String[] ERROR = new String[]{ - "货叉尖部传感器触发", "S300传感器触发", "载货状态改变", "急停按钮触发", "触边开关出发", "需要复位", - "停在充电位", "取货失败", "放货失败", "轮子打滑", "没有动作码不能进入站点", "取货时有货", "丢失定位", - "抬叉停止"}; + + public static final String[] ERROR = new String[]{ + "货叉尖部传感器触发", + "S300传感器触发", + "载货状态改变", + "急停按钮触发", + "触边开关触发", + "需要复位", + "停在充电位", + "取货失败", + "放货失败", + "轮子打滑", + "没有动作码不能进入站点", + "取货时有货", + "丢失定位", + "抬叉停止" + }; boolean bConnected = true; boolean isReConnect = false; @@ -84,7 +98,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { ParamService acsConfigService = SpringContextHolder.getBean(ParamServiceImpl.class); InstructionService instructionService = SpringContextHolder.getBean(InstructionServiceImpl.class); AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsServiceImpl.class); - NDCAgvService AgvService = SpringContextHolder.getBean(NDCAgvService.class); + NDCAgvService ndcAGVService = SpringContextHolder.getBean(NDCAgvService.class); DeviceAppService deviceAppService = SpringContextHolder.getBean(DeviceAppService.class); DeviceService deviceService = SpringContextHolder.getBean(DeviceService.class); DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogServiceImpl.class); @@ -159,13 +173,13 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { LnshPalletizingManipulatorSiteDeviceDriver lnshPalletizingManipulatorSiteDeviceDriver; try { if (phase == 0x01) { - data = AgvService.sendAgvOneModeInst(phase, index); + data = ndcAGVService.sendAgvOneModeInst(phase, index); if (!ObjectUtil.isEmpty(inst)) { inst.setInstruction_status("1"); inst.setAgv_jobno(String.valueOf(index)); inst.setSend_status("1"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); } flag = true; } @@ -196,7 +210,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { && standardInspectSiteDeviceDriver.getMove() != 0) { inst.setExecute_status("1"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); standardInspectSiteDeviceDriver.setMessage(""); flag = true; } else { @@ -224,7 +238,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { && (lnshStationDeviceDriver.getAction() == 3 || lnshStationDeviceDriver.getAction() == 1)) { inst.setExecute_status("1"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); lnshStationDeviceDriver.setMessage(""); flag = true; } else { @@ -250,7 +264,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { && (lnshStationDeviceDriver.getAction() == 3 || lnshStationDeviceDriver.getAction() == 1)) { inst.setExecute_status("1"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); lnshStationDeviceDriver.setMessage(""); flag = true; } else { @@ -284,7 +298,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { && (lnshPalletizingManipulatorSiteDeviceDriver.getAction() == 3 || lnshPalletizingManipulatorSiteDeviceDriver.getAction() == 1)) { inst.setExecute_status("1"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); lnshPalletizingManipulatorSiteDeviceDriver.setMessage(""); flag = true; } else { @@ -312,13 +326,13 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { if (StrUtil.equals(acsConfigService.findByCode(AcsConfig.IGNOREHASGOODS).getValue(), "1")) { inst.setExecute_status("1"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); flag = true; } else { if (device.getHas_goods() != 0) { inst.setExecute_status("1"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); flag = true; } else { logServer.deviceExecuteLog(device_code, "", "", "AGV请求取货设备{}无货,无法反馈"); @@ -334,7 +348,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { && deviceDriver.getContainer_qty() > 0) { inst.setExecute_status("1"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); deviceDriver.setMessage(""); flag = true; } else { @@ -375,7 +389,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { inst.setExecute_status("5"); instructionService.update(inst); standardInspectSiteDeviceDriver.writing(2); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); standardInspectSiteDeviceDriver.setMessage(""); flag = true; } else { @@ -402,7 +416,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { inst.setExecute_status("5"); instructionService.update(inst); lnshStationDeviceDriver.writing(2); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); lnshStationDeviceDriver.setMessage(""); flag = true; } else { @@ -425,7 +439,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { inst.setExecute_status("5"); instructionService.update(inst); lnshStationDeviceDriver.writing(2); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); lnshStationDeviceDriver.setMessage(""); flag = true; } else { @@ -455,7 +469,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { inst.setExecute_status("5"); instructionService.update(inst); lnshPalletizingManipulatorSiteDeviceDriver.writing(2); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); lnshPalletizingManipulatorSiteDeviceDriver.setMessage(""); flag = true; } else { @@ -483,7 +497,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { inst.setExecute_status("5"); instructionService.update(inst); deviceDriver.writing(2); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); deviceDriver.setMessage(""); flag = true; } else { @@ -500,13 +514,13 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { if (StrUtil.equals(acsConfigService.findByCode(AcsConfig.IGNOREHASGOODS).getValue(), "1")) { inst.setExecute_status("5"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); flag = true; } else { if (device.getHas_goods() != 0) { inst.setExecute_status("5"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); flag = true; } } @@ -553,7 +567,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { && standardInspectSiteDeviceDriver.getMove() == 0) { inst.setExecute_status("3"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); standardInspectSiteDeviceDriver.setMessage(""); flag = true; } else { @@ -582,7 +596,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { inst.setExecute_status("3"); instructionService.update(inst); lnshStationDeviceDriver.writing(3, Integer.parseInt(inst.getInstruction_code())); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); lnshStationDeviceDriver.setMessage(""); flag = true; } else { @@ -609,7 +623,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { inst.setExecute_status("3"); instructionService.update(inst); lnshStationDeviceDriver.writing(3, Integer.parseInt(inst.getInstruction_code())); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); lnshStationDeviceDriver.setMessage(""); flag = true; } else { @@ -643,7 +657,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { && (lnshPalletizingManipulatorSiteDeviceDriver.getAction() == 2 || lnshPalletizingManipulatorSiteDeviceDriver.getAction() == 3)) { inst.setExecute_status("3"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); lnshPalletizingManipulatorSiteDeviceDriver.setMessage(""); flag = true; } else { @@ -673,7 +687,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { && deviceDriver.getContainer_qty() < Integer.parseInt(deviceDriver.getExtraValue().get("max_emptypalletnum").toString())) { inst.setExecute_status("3"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); deviceDriver.setMessage(""); flag = true; } else { @@ -695,13 +709,13 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { if (StrUtil.equals(acsConfigService.findByCode(AcsConfig.IGNOREHASGOODS).getValue(), "1")) { inst.setExecute_status("3"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); flag = true; } else { if (device.getHas_goods() != 0) { inst.setExecute_status("3"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); flag = true; } } @@ -727,11 +741,11 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { standardInspectSiteDeviceDriver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); if (standardInspectSiteDeviceDriver.getMode() != 0 - && standardInspectSiteDeviceDriver.getMove() != 0) { + && standardInspectSiteDeviceDriver.getMove() != 0) { inst.setExecute_status("6"); instructionService.update(inst); standardInspectSiteDeviceDriver.writing(3); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); flag = true; } else { String message = ""; @@ -762,7 +776,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { while (lnshStationDeviceDriver.getTo_command() != 3) { lnshStationDeviceDriver.writing(3); } - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); lnshStationDeviceDriver.setMessage(""); flag = true; } else { @@ -785,7 +799,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { inst.setExecute_status("6"); instructionService.update(inst); lnshStationDeviceDriver.writing(3); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); lnshStationDeviceDriver.setMessage(""); flag = true; } else { @@ -816,7 +830,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { inst.setExecute_status("6"); instructionService.update(inst); lnshPalletizingManipulatorSiteDeviceDriver.writing(3); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); lnshPalletizingManipulatorSiteDeviceDriver.setMessage(""); flag = true; } else { @@ -842,7 +856,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { inst.setExecute_status("6"); instructionService.update(inst); deviceDriver.writing(3); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); deviceDriver.setMessage(""); flag = true; } else { @@ -860,13 +874,13 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { if (StrUtil.equals(acsConfigService.findByCode(AcsConfig.IGNOREHASGOODS).getValue(), "1")) { inst.setExecute_status("6"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); flag = true; } else { if (device.getHas_goods() != 0) { inst.setExecute_status("6"); instructionService.update(inst); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); flag = true; } } @@ -884,12 +898,12 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { inst.setInstruction_status("2"); instructionService.finish(inst); } - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); } //请求删除任务 else if (phase == 0x30) { flag = true; - data = AgvService.sendAgvOneModeInst(0x8F, index, 0); + data = ndcAGVService.sendAgvOneModeInst(0x8F, index, 0); } //任务删除确认 //(需要WCS反馈) @@ -898,7 +912,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { if (!ObjectUtil.isEmpty(inst)) { instructionService.cancelNOSendAgv(inst.getInstruction_id()); } - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); } //进入区域 else if (phase == 0x50) { @@ -908,7 +922,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { standardAutodoorDeviceDriver.OpenOrClose("1"); if (standardAutodoorDeviceDriver.getAction() == 1) { standardAutodoorDeviceDriver.OpenOrClose("1"); - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); } } } @@ -919,99 +933,49 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver(); standardAutodoorDeviceDriver.OpenOrClose("2"); if (standardAutodoorDeviceDriver.getAction() == 2) { - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); } } else { - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); } } else if (phase == 0x64) { - data = AgvService.sendAgvOneModeInst(phase, index, 0); + data = ndcAGVService.sendAgvOneModeInst(phase, index, 0); } //上报异常 else if (phase == 0x67) { - AgvDto dto = null; - Map map = AgvService.findAllAgvFromCache(); - if (map.containsKey(String.valueOf(carno))) { - dto = map.get(String.valueOf(carno)); - } else { - dto = new AgvDto(); - } - dto.setName(String.valueOf(carno)); -// if (arr[18] * 256 + arr[19] == 0) { -// dto.setState("IDLE"); -// acsToWmsService.feedbackAgvStatus(String.valueOf(carno), "0", ""); -// } else { -// StringBuffer errbs = new StringBuffer(); -// for (int i = 0; i < ERROR.length; i++) { -// if (((arr[18] * 256 + arr[19]) & (1 << i)) > 0) -// errbs.append("," + ERROR[i]); -// //反馈故障 -// } -// dto.setState("ERROR"); -// acsToWmsService.feedbackAgvStatus(String.valueOf(carno), "1", "error"); -// } + AgvDto agv = ndcAGVService.findByCarNumber(String.valueOf(arr[18] * 256 + arr[19])); + agv.setFaultInfo(getNDCFaultInfo(ikey)); } //X坐标 else if (phase == 0x70) { - AgvDto dto = null; - Map map = AgvService.findAllAgvFromCache(); - carno = arr[18] * 256 + arr[19]; - if (map.containsKey(String.valueOf(carno))) { - dto = map.get(String.valueOf(carno)); - } else { - dto = new AgvDto(); - } - dto.setName(String.valueOf(carno)); - dto.setPositionX(String.valueOf(ikey)); - AgvService.updateAgvFromCache(dto); + AgvDto agv = ndcAGVService.findByCarNumber(String.valueOf(arr[18] * 256 + arr[19])); + agv.setPositionX(String.valueOf(ikey)); } //Y坐标 else if (phase == 0x71) { - AgvDto dto = null; - Map map = AgvService.findAllAgvFromCache(); - carno = arr[18] * 256 + arr[19]; - if (map.containsKey(String.valueOf(carno))) { - dto = map.get(String.valueOf(carno)); - } else { - dto = new AgvDto(); - } - dto.setName(String.valueOf(carno)); - dto.setPositionY(String.valueOf(ikey)); - AgvService.updateAgvFromCache(dto); + AgvDto agv = ndcAGVService.findByCarNumber(String.valueOf(arr[18] * 256 + arr[19])); + agv.setPositionY(String.valueOf(ikey)); } //角度 else if (phase == 0x72) { - AgvDto dto = null; - Map map = AgvService.findAllAgvFromCache(); - carno = arr[18] * 256 + arr[19]; - if (map.containsKey(String.valueOf(carno))) { - dto = map.get(String.valueOf(carno)); - } else { - dto = new AgvDto(); - } - dto.setName(String.valueOf(carno)); - dto.setPositionAngle(String.valueOf(ikey)); - AgvService.updateAgvFromCache(dto); + AgvDto agv = ndcAGVService.findByCarNumber(String.valueOf(arr[18] * 256 + arr[19])); + agv.setPositionAngle(String.valueOf(ikey)); } //电量 else if (phase == 0x73) { - AgvDto dto = null; - Map map = AgvService.findAllAgvFromCache(); - carno = arr[18] * 256 + arr[19]; - if (map.containsKey(String.valueOf(carno))) { - dto = map.get(String.valueOf(carno)); - } else { - dto = new AgvDto(); - } - dto.setName(String.valueOf(carno)); - dto.setEnergyLevel(String.valueOf(ikey)); - AgvService.updateAgvFromCache(dto); + AgvDto agv = ndcAGVService.findByCarNumber(String.valueOf(arr[18] * 256 + arr[19])); + agv.setEnergyLevel(String.valueOf(ikey)); + } else if (phase == 0x74) { + // 状态 + AgvDto agv = ndcAGVService.findByCarNumber(String.valueOf(arr[18] * 256 + arr[19])); + agv.setState(String.valueOf(ikey)); } + if (!ObjectUtil.isEmpty(data)) { write(data); } } catch (Exception e) { - log.error("AGV交互出错", e); + log.error("AGV交互出错!", e); } } else { log.info("AGV上报不是 [0073] 类型动作,不处理。"); @@ -1031,33 +995,56 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { try { s.close(); } catch (Exception e) { - e.printStackTrace(); + log.error("close NDC socket error !", e); } } public static void write(byte[] b) { try { - log.info("下发AGV数据:" + Bytes2HexString(b)); + log.info("下发AGV数据:" + Bytes2HexString(b)); dos.write(b); dos.flush(); } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - log.error("下发AGV数据失败", e); + log.error("下发AGV数据失败!", e); } } public static String Bytes2HexString(byte[] b) { - String ret = ""; + StringBuilder ret = new StringBuilder(); for (int i = 0; i < b.length; i++) { String hex = Integer.toHexString(b[i] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } - ret += hex.toUpperCase(); + ret.append(hex.toUpperCase()); + } + return ret.toString(); + } + + public static List getNDCFaultInfo(int errorCode) { + if (errorCode == 0) { + return Arrays.asList("正常"); + } else { + if (errorCode > Math.pow(2, ERROR.length - 1)) { + return Arrays.asList("NDC上报故障代码有误"); + } else { + int index = 0; + ArrayList faultInfo = new ArrayList<>(); + for (int i = errorCode; i != 0; i = i >> 1) { + if (index == ERROR.length) { + faultInfo.clear(); + faultInfo.add("NDC上报故障代码有误"); + break; + } + if (i % 2 == 1) { + faultInfo.add(ERROR[index]); + } + index++; + } + return faultInfo; + } } - return ret; } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/dashboard/service/DashboardService.java b/lms/nladmin-system/src/main/java/org/nl/wms/dashboard/service/DashboardService.java index 95d4113..a098d34 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/dashboard/service/DashboardService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/dashboard/service/DashboardService.java @@ -1231,6 +1231,51 @@ public class DashboardService { JSONArray trayDestacker = new JSONArray(); vehicleConveyorLine.put("trayDestacker", trayDestacker); + // AGV---------------------------------------------------------------------------------------------------------- + JSONObject agv = new JSONObject(); + result.put("agv", agv); + + JSONArray agvArr = new JSONArray(); + agv.put("agv", agvArr); + List agvData = deviceData.stream().map(o -> (JSONObject) o).filter(o -> "AGV".equals(o.getString("type"))).sorted(Comparator.comparingInt(o -> o.getIntValue("name"))).collect(Collectors.toList()); + for (JSONObject datum : agvData) { + JSONObject row = new JSONObject(); + row.put("equipment", datum.getString("name")); + row.put("status", this.agvStatusToDictStatus(datum.getIntValue("state"))); + row.put("equipmentName", datum.getString("device_name")); + row.put("statusChinese", this.agvStatusToChinese(datum.getIntValue("state"))); + + JSONArray rowData = new JSONArray(); + row.put("data", rowData); + + JSONObject rowDatum = new JSONObject(); + rowDatum.put("key", "电量"); + rowDatum.put("value", datum.getIntValue("energyLevel")); + rowData.add(rowDatum); + + rowDatum = new JSONObject(); + rowDatum.put("key", "角度"); + rowDatum.put("value", datum.getIntValue("positionAngle")); + rowData.add(rowDatum); + + rowDatum = new JSONObject(); + rowDatum.put("key", "X坐标"); + rowDatum.put("value", datum.getIntValue("positionX")); + rowData.add(rowDatum); + + rowDatum = new JSONObject(); + rowDatum.put("key", "Y坐标"); + rowDatum.put("value", datum.getIntValue("positionY")); + rowData.add(rowDatum); + + rowDatum = new JSONObject(); + rowDatum.put("key", "故障信息"); + rowDatum.put("value", datum.getJSONArray("faultInfo")); + rowData.add(rowDatum); + + agvArr.add(row); + } + return result; } @@ -1743,4 +1788,40 @@ public class DashboardService { return "运行"; } } + + private int agvStatusToDictStatus(int status) { + switch (status) { + case 2: + case 3: + return 1; + case 4: + case 5: + case 7: + return 2; + case 1: + return 3; + case 6: + return 4; + default: + return status; + } + } + private String agvStatusToChinese(int status) { + switch (status) { + case 2: + case 3: + return "运行"; + case 4: + case 5: + case 7: + return "暂停"; + case 1: + return "停机"; + case 6: + return "故障"; + default: + return "未知"; + } + } + }