zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/action/ShuttleAction.java
@@ -1,10 +1,9 @@ package com.zy.asrs.wcs.core.action; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.wcs.common.ExecuteSupport; import com.zy.asrs.wcs.core.entity.BasShuttle; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.zy.asrs.wcs.core.entity.Loc; import com.zy.asrs.wcs.core.entity.Task; import com.zy.asrs.wcs.core.model.NavigateNode; @@ -27,6 +26,7 @@ import com.zy.asrs.wcs.rcs.model.enums.SlaveType; import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol; import com.zy.asrs.wcs.rcs.thread.ShuttleThread; import org.aspectj.apache.bcel.generic.RET; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -46,6 +46,8 @@ private LocService locService; @Autowired private ShuttleDispatcher shuttleDispatcher; @Autowired private ObjectMapper objectMapper; public synchronized boolean assignWork(Device device, ShuttleAssignCommand assignCommand) { ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue()); @@ -87,7 +89,14 @@ if (obj == null) { return false; } ShuttleRedisCommand redisCommand = JSON.parseObject(obj.toString(), ShuttleRedisCommand.class); ShuttleRedisCommand redisCommand = null; try { redisCommand = objectMapper.readValue(String.valueOf(obj), ShuttleRedisCommand.class); } catch (JsonProcessingException e) { throw new RuntimeException(e); } if (redisCommand == null) { return false; } @@ -177,12 +186,12 @@ // 系统任务 if (assignCommand.getAuto()) { if (!assignCommand.getCharge()) { //对主线程抛出等待确认状态waiting shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WAITING); }else { shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING); } // if (!assignCommand.getCharge()) { // //对主线程抛出等待确认状态waiting // shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WAITING); // }else { // shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING); // } News.info("四向穿梭车任务执行下发完成等待执行结束,穿梭车号={},任务数据={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command)); // 手动任务 @@ -211,6 +220,11 @@ return false; } commandStep++; //更新redis数据 redisCommand.setCommandStep(commandStep); //任务数据保存到redis redisUtil.set(DeviceRedisConstant.SHUTTLE_WORK_FLAG + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand)); return true; } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java
@@ -1,5 +1,6 @@ package com.zy.asrs.wcs.core.kernel.command; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.framework.common.Cools; import com.zy.asrs.framework.exception.CoolException; @@ -29,10 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.*; /** * Created by vincent on 2023/10/23 @@ -99,7 +97,7 @@ // 如果已经在当前条码则过滤 if (String.valueOf(shuttleProtocol.getCurrentCode()).equals(locService.getOne(new LambdaQueryWrapper<Loc>() .eq(Loc::getLocNo, motion.getTarget()) .eq(Loc::getHostId, motion.getHostId())).getCode())) { .eq(Loc::getHostId, motion.getHostId())).getCode())) { return true; } shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread); @@ -341,7 +339,11 @@ News.error("{} dash {} can't find navigate path!", startLocNo, endLocNo); return null; } List<NavigateNode> allNode = new ArrayList<>(nodeList); List<NavigateNode> allNode = new ArrayList<>(); for (NavigateNode node : nodeList) { allNode.add(node.clone()); } List<ShuttleCommand> commands = new ArrayList<>(); //获取分段路径 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/NavigateNode.java
@@ -2,11 +2,15 @@ import lombok.Data; import java.io.Serializable; /** * A*寻路算法Node节点 */ @Data public class NavigateNode implements Comparable<NavigateNode>{ public class NavigateNode implements Comparable<NavigateNode>, Cloneable, Serializable { private static final long serialVersionUID = 1L; private int x;//坐标x private int y;//坐标y @@ -46,4 +50,13 @@ return Integer.compare(this.F, o.F); } @Override public NavigateNode clone() { try { return (NavigateNode) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/command/ShuttleAssignCommand.java
@@ -3,11 +3,14 @@ import com.zy.asrs.wcs.core.model.NavigateNode; import lombok.Data; import java.io.Serializable; import java.util.ArrayList; import java.util.List; @Data public class ShuttleAssignCommand { public class ShuttleAssignCommand implements Serializable { private static final long serialVersionUID = 1L; /** * 四向穿梭车号 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/command/ShuttleRedisCommand.java
@@ -10,6 +10,8 @@ @Data public class ShuttleRedisCommand implements Serializable { private static final long serialVersionUID = 1L; //四向穿梭车号 private Integer shuttleNo; zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/model/protocol/ShuttleProtocol.java
@@ -207,28 +207,6 @@ return ""; } /** * 获取小车空闲状态 */ public Boolean getIdle() { if (this.deviceStatus == null) { return false; } ShuttleDeviceStatusService shuttleDeviceStatusService = SpringUtils.getBean(ShuttleDeviceStatusService.class); ShuttleDeviceStatus status = shuttleDeviceStatusService.getOne(new LambdaQueryWrapper<ShuttleDeviceStatus>() .eq(ShuttleDeviceStatus::getHostId, this.device.getHostId()) .eq(ShuttleDeviceStatus::getDevicePlc, this.device.getDevicePlc()) .eq(ShuttleDeviceStatus::getStatus, 1) .eq(ShuttleDeviceStatus::getDeviceStatus, this.deviceStatus)); if (status != null) { if (status.getFlag() != null && status.getFlag().equals(String.valueOf(ShuttleDeviceStatusType.IDLE))) { return true;//空闲中 } } return false;//默认不空闲 } public Integer getTaskNo() { RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class); if (null != redisUtil) { zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/ShuttleThread.java
@@ -36,6 +36,8 @@ List<NavigateNode> getMoveAdvancePath();//获取穿梭车任务路径 int generateDeviceTaskNo(int taskNo);//生成硬件设备工作号 //***************获取命令***************** ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed);//获取移动命令 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java
@@ -135,7 +135,7 @@ ///读取四向穿梭车状态-end //小车处于忙碌状态,将标记置为true if (!shuttleProtocol.getIdle()) { if (deviceStatus == 1 || deviceStatus == 2 || deviceStatus == 5) { shuttleProtocol.setPakMk(true); } @@ -228,25 +228,37 @@ ArrayList<HashMap<String, Object>> modes = new ArrayList<>(); //获取分段路径 ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(nodes); for (ArrayList<NavigateNode> sectionNodes : data) { for (int idx = 0; idx < data.size(); idx++) { ArrayList<NavigateNode> sectionNodes = data.get(idx); boolean isRemoveFooterNode = false;//是否剔除尾节点 if (idx != data.size() - 1) { isRemoveFooterNode = true;//剔除尾节点 } boolean flag = true; int oper; //开始路径 NavigateNode startPath = nodes.get(0); NavigateNode startPath = sectionNodes.get(0); //结束路径 NavigateNode targetPath = sectionNodes.get(sectionNodes.size() - 1); if (ShuttleRunDirection.get(startPath.getDirection()) == ShuttleRunDirection.LEFT || ShuttleRunDirection.get(startPath.getDirection()) == ShuttleRunDirection.RIGHT) { //母轨方向 oper = 5; }else { } else { //子轨方向 oper = 6; } for (NavigateNode node : sectionNodes) { for (int i = 0; i < sectionNodes.size(); i++) { if (isRemoveFooterNode && i == sectionNodes.size() - 1) { continue; } NavigateNode node = sectionNodes.get(i); HashMap<String, Object> map = new HashMap<>(); map.put("nodexX", node.getX()); map.put("nodexY", node.getY()); map.put("nodexZ", node.getZ()); map.put("nodeX", node.getX()); map.put("nodeY", node.getY()); map.put("nodeZ", node.getZ()); if (flag) { map.put("oper", oper); flag = false; @@ -260,7 +272,7 @@ param.put("messageName", "runRoute"); param.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); param.put("deviceNo", device.getDeviceNo()); param.put("taskId", taskNo); param.put("taskId", generateDeviceTaskNo(taskNo)); param.put("nodeNum", nodes.size()); param.put("modes", modes); String response = new HttpHandler.Builder() @@ -389,7 +401,7 @@ return false; } } if (this.shuttleProtocol.getIdle() == null if (this.shuttleProtocol.getDeviceStatus() == null || this.shuttleProtocol.getPakMk() == null || this.shuttleProtocol.getErrorCode() == null || this.shuttleProtocol.getProtocolStatus() == null @@ -397,7 +409,7 @@ return false; } boolean res = this.shuttleProtocol.getIdle() boolean res = (this.shuttleProtocol.getDeviceStatus() == 3 || this.shuttleProtocol.getDeviceStatus() == 11) && this.shuttleProtocol.getPakMk() && this.shuttleProtocol.getErrorCode().equals("0") && this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id @@ -407,7 +419,7 @@ @Override public boolean isRequireCharge() { if (this.shuttleProtocol.getIdle() == null if (this.shuttleProtocol.getDeviceStatus() == null || this.shuttleProtocol.getPakMk() == null || this.shuttleProtocol.getErrorCode() == null || this.shuttleProtocol.getProtocolStatus() == null @@ -415,7 +427,7 @@ return false; } boolean res = this.shuttleProtocol.getIdle() boolean res = (this.shuttleProtocol.getDeviceStatus() == 3) && this.shuttleProtocol.getPakMk() && this.shuttleProtocol.getErrorCode().equals("0") && this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id @@ -475,7 +487,7 @@ ArrayList<NavigateNode> path = new ArrayList<>(); if (shuttleProtocol.getTaskNo() != 0) { //存在任务,获取指令 Object object = redisUtil.get(DeviceRedisConstant.SHUTTLE_FLAG + shuttleProtocol.getTaskNo()); Object object = redisUtil.get(DeviceRedisConstant.SHUTTLE_WORK_FLAG + shuttleProtocol.getTaskNo()); if (object != null) { ShuttleRedisCommand redisCommand = JSON.parseObject(object.toString(), ShuttleRedisCommand.class); List<NavigateNode> nodes = redisCommand.getAssignCommand().getNodes();//穿梭车预计路径 @@ -488,12 +500,21 @@ } @Override public int generateDeviceTaskNo(int taskNo) { int no = taskNo % 255; if (no <= 1) { no = 2; } return no; } @Override public ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed) { HashMap<String, Object> body = new HashMap<>(); body.put("messageName", "runOrder"); body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); body.put("deviceNo", Integer.parseInt(this.device.getDeviceNo())); body.put("taskId", taskNo); body.put("taskId", generateDeviceTaskNo(taskNo)); LocService locService = SpringUtils.getBean(LocService.class); Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>()