| | |
| | | if (obj == null) { |
| | | return false; |
| | | } |
| | | ShuttleRedisCommand redisCommand = JSON.parseObject(obj.toString(), ShuttleRedisCommand.class); |
| | | |
| | | JSONObject jsonObject = JSON.parseObject(String.valueOf(obj)); |
| | | System.out.println(JSON.parseObject(String.valueOf(obj))); |
| | | ShuttleRedisCommand redisCommand = JSON.parseObject(String.valueOf(obj), ShuttleRedisCommand.class); |
| | | System.out.println(JSON.toJSONString(redisCommand)); |
| | | if (redisCommand == null) { |
| | | return false; |
| | | } |
| | |
| | | |
| | | // 系统任务 |
| | | 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)); |
| | | |
| | | // 手动任务 |
| | |
| | | return false; |
| | | } |
| | | |
| | | commandStep++; |
| | | //更新redis数据 |
| | | redisCommand.setCommandStep(commandStep); |
| | | //任务数据保存到redis |
| | | redisUtil.set(DeviceRedisConstant.SHUTTLE_WORK_FLAG + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand)); |
| | | return true; |
| | | } |
| | | |
| | |
| | | return result; |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | String s = "{\"commandStep\":0,\"liftSecurityMk\":false,\"shuttleNo\":6,\"wrkNo\":30095,\"assignCommand\":{\"sourceLocNo\":\"3-1-1\",\"auto\":true,\"shuttleNo\":6,\"taskMode\":19,\"charge\":false,\"nodes\":[{\"isInflectionPoint\":false,\"f\":0,\"g\":0,\"h\":0,\"x\":3,\"y\":1,\"nodeZ\":1,\"z\":1,\"direction\":\"top\"},{\"isInflectionPoint\":false,\"f\":1,\"g\":0,\"h\":1,\"x\":2,\"y\":1,\"nodeZ\":1,\"z\":1},{\"isInflectionPoint\":false,\"f\":1,\"g\":1,\"h\":0,\"x\":1,\"y\":1,\"nodeZ\":1,\"z\":1}],\"locNo\":\"1-1-1\",\"taskNo\":30095,\"deviceId\":6,\"commands\":[{\"mode\":1,\"targetLocNo\":\"1-1-1\",\"shuttleNo\":78,\"nodes\":[{\"isInflectionPoint\":false,\"moveDistance\":1000,\"f\":0,\"g\":0,\"h\":0,\"x\":3,\"y\":1,\"nodeZ\":1,\"z\":1,\"direction\":\"top\"},{\"isInflectionPoint\":false,\"moveDistance\":1000,\"f\":1,\"g\":0,\"h\":1,\"x\":2,\"y\":1,\"nodeZ\":1,\"z\":1,\"direction\":\"top\"},{\"isInflectionPoint\":false,\"moveDistance\":1000,\"f\":1,\"g\":1,\"h\":0,\"x\":1,\"y\":1,\"nodeZ\":1,\"z\":1,\"direction\":\"top\"}],\"taskNo\":0,\"body\":\"{\\\"messageName\\\":\\\"runOrder\\\",\\\"nodeX\\\":1,\\\"nodeY\\\":1,\\\"msgTime\\\":\\\"2024-04-12 17:39:16\\\",\\\"nodeZ\\\":1,\\\"deviceNo\\\":78,\\\"taskId\\\":5}\",\"complete\":false}]}}"; |
| | | ShuttleRedisCommand shuttleRedisCommand = JSON.parseObject(s, ShuttleRedisCommand.class); |
| | | System.out.println(shuttleRedisCommand); |
| | | } |
| | | |
| | | } |
| | |
| | | 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; |
| | |
| | | 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 |
| | |
| | | // 如果已经在当前条码则过滤 |
| | | 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); |
| | |
| | | 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<>(); |
| | | //获取分段路径 |
| | |
| | | |
| | | 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 |
| | | private int z;//坐标z(高度) |
| | | private int nodeZ; |
| | | private int F;//综合花费的步数 |
| | | private int G;//已经花费的步数 |
| | | private int H;//将要花费的步数 |
| | |
| | | return Integer.compare(this.F, o.F); |
| | | } |
| | | |
| | | public void setZ(int z) { |
| | | this.z = z; |
| | | this.nodeZ = z; |
| | | } |
| | | |
| | | @Override |
| | | public NavigateNode clone() { |
| | | try { |
| | | return (NavigateNode) super.clone(); |
| | | } catch (CloneNotSupportedException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return null; |
| | | } |
| | | } |
| | |
| | | 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; |
| | | |
| | | /** |
| | | * 四向穿梭车号 |
| | |
| | | @Data |
| | | public class ShuttleRedisCommand implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | //四向穿梭车号 |
| | | private Integer shuttleNo; |
| | | |
| | |
| | | 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) { |
| | |
| | | ///读取四向穿梭车状态-end |
| | | |
| | | //小车处于忙碌状态,将标记置为true |
| | | if (!shuttleProtocol.getIdle()) { |
| | | if (deviceStatus == 1 || deviceStatus == 2 || deviceStatus == 5) { |
| | | shuttleProtocol.setPakMk(true); |
| | | } |
| | | |
| | |
| | | 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("nodeX", node.getX()); |
| | | map.put("nodeY", node.getY()); |
| | |
| | | return false; |
| | | } |
| | | } |
| | | if (this.shuttleProtocol.getIdle() == null |
| | | if (this.shuttleProtocol.getDeviceStatus() == null |
| | | || this.shuttleProtocol.getPakMk() == null |
| | | || this.shuttleProtocol.getErrorCode() == null |
| | | || this.shuttleProtocol.getProtocolStatus() == null |
| | |
| | | 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 |
| | |
| | | |
| | | @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 |
| | |
| | | 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 |
| | |
| | | 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();//穿梭车预计路径 |