| | |
| | | |
| | | import com.zy.asrs.utils.Utils; |
| | | import com.zy.common.model.NavigateNode; |
| | | import com.zy.common.model.NyShuttleOperaResult; |
| | | import com.zy.common.service.CommonService; |
| | | import com.zy.common.utils.*; |
| | | import com.zy.core.News; |
| | | import com.zy.core.ThreadHandler; |
| | |
| | | import lombok.Data; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import javax.swing.*; |
| | | import java.io.IOException; |
| | | import java.net.Socket; |
| | | import java.text.MessageFormat; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | private ShuttleSlave slave; |
| | | private NyShuttleProtocol shuttleProtocol; |
| | | private RedisUtil redisUtil; |
| | | private Socket socket; |
| | | |
| | | public NyShuttleThread(ShuttleSlave slave,RedisUtil redisUtil) { |
| | | this.slave = slave; |
| | |
| | | case 1: |
| | | read(); |
| | | break; |
| | | // 写入数据 |
| | | case 2: |
| | | write((NyShuttleHttpCommand) task.getData()); |
| | | break; |
| | | // // 写入数据 |
| | | // case 2: |
| | | // write((NyShuttleHttpCommand) task.getData()); |
| | | // break; |
| | | //下发任务 |
| | | case 3: |
| | | assignWork((ShuttleAssignCommand) task.getData()); |
| | |
| | | |
| | | private void read() { |
| | | try { |
| | | if (this.socket == null || this.socket.isClosed()) { |
| | | //链接断开重新链接 |
| | | this.connect(); |
| | | } |
| | | readStatus(); |
| | | //四向穿梭车空闲、有任务、标记为true、存在任务指令,需要执行任务的下一条指令 |
| | | if (shuttleProtocol.getFree() == ShuttleStatusType.IDLE.id |
| | | && shuttleProtocol.getTaskNo() != 0 |
| | | && shuttleProtocol.getPakMk()) { |
| | | && !shuttleProtocol.getPakMk()) { |
| | | //执行下一步指令 |
| | | executeWork(shuttleProtocol.getTaskNo().shortValue()); |
| | | } |
| | | |
| | | //小车空闲且有跑库程序 |
| | | if (shuttleProtocol.isIdle() && shuttleProtocol.getMoveLoc()) { |
| | | moveLoc(); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | |
| | | |
| | | //----------读取四向穿梭车状态----------- |
| | | NyShuttleHttpCommand readStatusCommand = NyHttpUtils.getReadStatusCommand(slave.getId()); |
| | | JSONObject jsonObject = NyHttpUtils.requestCommand(readStatusCommand); |
| | | JSONObject jsonObject = NyHttpUtils.requestCommand(socket, readStatusCommand); |
| | | if (jsonObject == null) { |
| | | OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向穿梭车plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); |
| | | shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.OFFLINE); |
| | | OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向穿梭车Socket状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); |
| | | }else { |
| | | //手动状态/自动状态 |
| | | shuttleProtocol.setWorkingMode(jsonObject.getInteger("workingMode")); |
| | |
| | | errCode.add(Integer.parseInt(o.toString())); |
| | | } |
| | | //故障码 |
| | | shuttleProtocol.setErrCode(errCode); |
| | | shuttleProtocol.setErrCode(errCode.get(0)); |
| | | //总里程数 |
| | | shuttleProtocol.setStatusSum(jsonObject.getObject("statusSum", NyShuttleProtocol.StatusSumClass.class)); |
| | | //非自动状态时间计时 |
| | | shuttleProtocol.setErrTime(jsonObject.getInteger("errTime")); |
| | | |
| | | //小车处于运行中,将标记置为true |
| | | //小车处于运行中,将标记置为false |
| | | if (shuttleProtocol.getFree() == 0) { |
| | | shuttleProtocol.setPakMk(true); |
| | | shuttleProtocol.setPakMk(false); |
| | | } |
| | | |
| | | //将四向穿梭车状态保存至数据库 |
| | |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向穿梭车plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); |
| | | OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向穿梭车Socket状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); |
| | | try { |
| | | this.socket.close(); |
| | | this.socket = null; |
| | | Thread.sleep(1000); |
| | | this.connect(); |
| | | } catch (IOException | InterruptedException exception) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public boolean connect() { |
| | | try { |
| | | Socket socket = new Socket(slave.getIp(),slave.getPort()); |
| | | socket.setSoTimeout(60000); |
| | | socket.setKeepAlive(true); |
| | | this.socket = socket; |
| | | log.info(MessageFormat.format("【{0}】四向穿梭车Socket链接成功 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); |
| | | } catch (IOException e) { |
| | | OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向穿梭车Socket链接失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | private boolean write(NyShuttleHttpCommand command){ |
| | | private boolean write(NyShuttleHttpCommand command, ShuttleAssignCommand assignCommand) { |
| | | if (null == command) { |
| | | News.error("四向穿梭车写入命令为空"); |
| | | return false; |
| | |
| | | } |
| | | |
| | | //发出请求 |
| | | JSONObject result = NyHttpUtils.requestCommand(command); |
| | | JSONObject result = null; |
| | | try { |
| | | result = NyHttpUtils.requestCommand(socket, command); |
| | | } catch (IOException e) { |
| | | try { |
| | | this.socket.close(); |
| | | this.socket = null; |
| | | Thread.sleep(1000); |
| | | this.connect(); |
| | | } catch (IOException exception) { |
| | | exception.printStackTrace(); |
| | | } catch (InterruptedException ex) { |
| | | throw new RuntimeException(ex); |
| | | } |
| | | } |
| | | |
| | | //保存数据到数据库做流水 |
| | | BasShuttleOptService shuttleOptService = SpringUtils.getBean(BasShuttleOptService.class); |
| | | BasShuttleOpt opt = null; |
| | | if (shuttleOptService != null) { |
| | | opt = new BasShuttleOpt( |
| | | assignCommand.getTaskNo().intValue(), |
| | | assignCommand.getShuttleNo().intValue(), |
| | | new Date(), |
| | | ShuttleTaskModeType.get(assignCommand.getTaskMode()).desc, |
| | | assignCommand.getSourceLocNo(), |
| | | assignCommand.getLocNo(), |
| | | null, |
| | | null, |
| | | null, |
| | | JSON.toJSONString(command), |
| | | null, |
| | | JSON.toJSONString(shuttleProtocol) |
| | | ); |
| | | opt.setSend(1);//已下发 |
| | | opt.setResponse(JSON.toJSONString(result));//请求响应 |
| | | opt.setDeviceWrk(command.getWrkNo().toString());//设备工作号 |
| | | shuttleOptService.insert(opt); |
| | | } |
| | | |
| | | if (result == null) { |
| | | return false;//请求失败 |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | |
| | | return false; |
| | | } |
| | | |
| | | WrkMastService wrkMastService = SpringUtils.getBean(WrkMastService.class); |
| | | NavigateMapUtils navigateMapUtils = SpringUtils.getBean(NavigateMapUtils.class); |
| | | WrkMastMapper wrkMastMapper = SpringUtils.getBean(WrkMastMapper.class); |
| | | WrkMast wrkMast = wrkMastMapper.selectByWorkNo(wrkNo.intValue()); |
| | | |
| | | Object o = redisUtil.get("shuttle_wrk_no_" + wrkNo); |
| | | if (o == null) { |
| | | return false; |
| | | } |
| | | |
| | | ShuttleRedisCommand redisCommand = JSON.parseObject(o.toString(), ShuttleRedisCommand.class); |
| | | List<NyShuttleHttpCommand> commands = redisCommand.getAssignCommand().getCommands(); |
| | | ShuttleAssignCommand assignCommand = redisCommand.getAssignCommand(); |
| | | List<NyShuttleHttpCommand> commands = redisCommand.getAssignCommand().getCommands(); |
| | | //当前步序 |
| | | int commandStep = redisCommand.getCommandStep(); |
| | | if (commands.size() == 0) { |
| | | return false; |
| | | } |
| | | |
| | | NavigateMapData navigateMapData = new NavigateMapData(Utils.getLev(shuttleProtocol.getCurrentLocNo())); |
| | | checkIOSta(commands, commandStep);//检测小车是否进出提升机输送站 |
| | | |
| | | boolean isLock = false;//是否解锁路径 |
| | | //取出命令 |
| | | NyShuttleHttpCommand command = commands.get(commandStep);//当前命令 |
| | | NyShuttleHttpCommand command = null; |
| | | if (commandStep < commands.size()) { |
| | | command = commands.get(commandStep);//当前命令 |
| | | } |
| | | if (commandStep != 0) { |
| | | //判断上一条指令是否完成 |
| | | NyShuttleHttpCommand lastCommand = commands.get(commandStep - 1); |
| | |
| | | if (shuttleProtocol.getPoint().equals(target)) { |
| | | //上一条指令的目标位置和当前小车位置相同,则认定上一条任务完成 |
| | | lastCommand.setComplete(true); |
| | | //解锁锁定路径,上一条路径和当前路径 |
| | | //解锁锁定路径,上一条路径 |
| | | List<NavigateNode> nodes = lastCommand.getNodes(); |
| | | nodes.addAll(command.getNodes()); |
| | | navigateMapData.writeNavigateNodeToRedisMap(nodes, false);//解锁路径 |
| | | // //解锁当前路径 |
| | | // if (command != null && command.getNodes() != null) { |
| | | // nodes.addAll(command.getNodes()); |
| | | // } |
| | | if (nodes != null) { |
| | | NavigateNode targetNode = assignCommand.getNodes().get(assignCommand.getNodes().size() - 1);//最终节点 |
| | | NavigateNode node = nodes.get(nodes.size() - 1); |
| | | if (!(targetNode.getX() == node.getX() && targetNode.getY() == node.getY())) { |
| | | nodes.remove(nodes.size() - 1);//剔除尾节点 |
| | | } |
| | | boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(shuttleProtocol.getCurrentLocNo()), nodes, false);//解锁路径 |
| | | if (!result) { |
| | | return false;//解锁失败 |
| | | } |
| | | isLock = true;//解锁过路径 |
| | | } |
| | | } |
| | | }else { |
| | | lastCommand.setComplete(true);//其他命令默认认为完成 |
| | |
| | | //上一条任务未完成,禁止下发命令 |
| | | return false; |
| | | } |
| | | |
| | | //判断是否为最后一条命令且命令执行完成,抛出等待确认状态 |
| | | NyShuttleHttpCommand endCommand = commands.get(commands.size() - 1); |
| | | if (endCommand.getComplete()) { |
| | | //删除redis |
| | | redisUtil.del("shuttle_wrk_no_" + redisCommand.getWrkNo()); |
| | | |
| | | if (!assignCommand.getCharge()) { |
| | | //对主线程抛出等待确认状态waiting |
| | | shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WAITING); |
| | | }else { |
| | | shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING); |
| | | } |
| | | News.info("四向穿梭车任务执行下发完成等待执行结束,穿梭车号={},任务数据={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(commands)); |
| | | |
| | | return false;//禁止再下发命令 |
| | | } |
| | | } |
| | | |
| | | List<NavigateNode> nextNodes = null;//下一步命令行走路径 |
| | |
| | | } |
| | | |
| | | if (shuttleProtocol.getFree() == ShuttleStatusType.BUSY.id) { |
| | | return false;//小车状态忙,禁止执行命令 |
| | | String requestType = command.getRequest().getBody().get("requestType").toString(); |
| | | //停止充电 管制命令 |
| | | if(!(requestType.equals("stopCharge") && shuttleProtocol.getChargState() == 1) && !requestType.equals("resume")){ |
| | | return false;//小车状态忙,禁止执行命令 |
| | | } |
| | | } |
| | | |
| | | //检测小车是否要进提升机,如需要进提升机则调度提升机 |
| | | if (!checkLiftStation(wrkNo)) { |
| | | return false; |
| | | } |
| | | // //检测小车是否要进提升机,如需要进提升机则调度提升机 |
| | | // if (!checkLiftStation(wrkNo)) { |
| | | // return false; |
| | | // } |
| | | |
| | | //检测穿梭车是否在提升机内 |
| | | if (!checkShuttleInTheLift(wrkNo)) { |
| | | return false; |
| | | } |
| | | |
| | | //检查路径是否可行走(检查路径锁定状态,检测路径是否有其他小车) |
| | | //检测当前行走路径,和下一步路径 |
| | | boolean checkPathIsAvailable = NavigateUtils.checkPathIsAvailable(command.getNodes(), shuttleProtocol.getShuttleNo().intValue(), Utils.getLev(shuttleProtocol.getCurrentLocNo())); |
| | | boolean checkPathIsAvailable2 = NavigateUtils.checkPathIsAvailable(nextNodes, shuttleProtocol.getShuttleNo().intValue(), Utils.getLev(shuttleProtocol.getCurrentLocNo())); |
| | | if (!checkPathIsAvailable && !checkPathIsAvailable2) { |
| | | return false; |
| | | } |
| | | //锁定路径,锁定当前路径和下一步路径 |
| | | List<NavigateNode> nodes = command.getNodes(); |
| | | nodes.addAll(nextNodes); |
| | | navigateMapData.writeNavigateNodeToRedisMap(nodes, true);//所使用的路径进行锁定禁用 |
| | | // if (command.getRequest().getBody().get("requestType").equals("move")) { |
| | | // ArrayList<int[]> whiteList = new ArrayList<>();//设置节点的白名单 |
| | | // if (wrkMast != null && ((wrkMast.getIoType() > 100 && wrkMast.getIoType() < 200) || wrkMast.getIoType() == 11)) { |
| | | // //出库任务,不检测首节点 |
| | | // int[] startArr = NavigatePositionConvert.positionToXY(wrkMast.getSourceLocNo());//开始节点 |
| | | // whiteList.add(startArr); |
| | | // } |
| | | // |
| | | // //解锁过路径,只检测下一段路径是否可走(当前路径已经被锁定无需再检测) |
| | | // if (isLock) { |
| | | // //只检测下一段路径是否可走(当前路径已经被锁定无需再检测) |
| | | // //检测路径是否可行走 |
| | | // if (!checkPath(nextNodes == null ? command.getNodes() : nextNodes, null, whiteList)) { |
| | | // return false; |
| | | // } |
| | | // }else { |
| | | // //检测当前路径和下一段路径 |
| | | // //检测路径是否可行走 |
| | | // if (!checkPath(command.getNodes(), nextNodes, whiteList)) { |
| | | // return false; |
| | | // } |
| | | // } |
| | | // |
| | | // //锁定路径,锁定当前路径和下一步路径 |
| | | // List<NavigateNode> nodes = command.getNodes(); |
| | | // if (nextNodes != null) { |
| | | // nodes.addAll(nextNodes); |
| | | // } |
| | | // if (nodes != null) { |
| | | // boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(shuttleProtocol.getCurrentLocNo()), nodes, true);//所使用的路径进行锁定禁用 |
| | | // if (!result) { |
| | | // return false;//路径锁定失败 |
| | | // } |
| | | // } |
| | | // } |
| | | |
| | | //可执行命令 |
| | | if (!write(command)) { |
| | | if (!write(command, assignCommand)) { |
| | | News.error("四向穿梭车命令下发失败,穿梭车号={},任务数据={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command)); |
| | | return false; |
| | | } |
| | | |
| | | News.info("四向穿梭车命令下发成功,穿梭车号={},任务数据={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command)); |
| | | //将标记置为false(防止重发) |
| | | shuttleProtocol.setPakMk(false); |
| | | shuttleProtocol.setPakMk(true); |
| | | |
| | | //保存数据到数据库做流水 |
| | | BasShuttleOptService shuttleOptService = SpringUtils.getBean(BasShuttleOptService.class); |
| | | if (shuttleOptService != null) { |
| | | BasShuttleOpt opt = new BasShuttleOpt( |
| | | assignCommand.getTaskNo().intValue(), |
| | | assignCommand.getShuttleNo().intValue(), |
| | | new Date(), |
| | | ShuttleTaskModeType.get(assignCommand.getTaskMode()).desc, |
| | | assignCommand.getSourceLocNo(), |
| | | assignCommand.getLocNo(), |
| | | null, |
| | | null, |
| | | null, |
| | | JSON.toJSONString(command), |
| | | null |
| | | ); |
| | | shuttleOptService.insert(opt); |
| | | String requestType = command.getRequest().getBody().get("requestType").toString(); |
| | | if (requestType.equals("updateFloor")) { |
| | | //更新楼层命令 |
| | | shuttleProtocol.setPakMk(false);//恢复标记 |
| | | } |
| | | |
| | | //判断数据是否执行完成 |
| | | if (commandStep < commands.size() - 1) { |
| | | //更新redis数据 |
| | | //步序增加 |
| | | commandStep++; |
| | | redisCommand.setCommandStep(commandStep); |
| | | //任务数据保存到redis |
| | | redisUtil.set("shuttle_wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand)); |
| | | }else { |
| | | //已执行完成 |
| | | |
| | | //删除redis |
| | | redisUtil.del("shuttle_wrk_no_" + redisCommand.getWrkNo()); |
| | | |
| | | if (!assignCommand.getCharge()) { |
| | | //对主线程抛出等待确认状态waiting |
| | | shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WAITING); |
| | | }else { |
| | | shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING); |
| | | } |
| | | News.info("四向穿梭车任务执行下发完成等待执行结束,穿梭车号={},任务数据={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command)); |
| | | } |
| | | commandStep++; |
| | | //更新redis数据 |
| | | redisCommand.setCommandStep(commandStep); |
| | | //任务数据保存到redis |
| | | redisUtil.set("shuttle_wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand)); |
| | | |
| | | return true; |
| | | } |
| | |
| | | if (o == null) { |
| | | return false; |
| | | } |
| | | |
| | | WrkMastMapper wrkMastMapper = SpringUtils.getBean(WrkMastMapper.class); |
| | | |
| | | ShuttleRedisCommand redisCommand = JSON.parseObject(o.toString(), ShuttleRedisCommand.class); |
| | | //当前步序 |
| | |
| | | return true;//提升机达到小车楼层,放行 |
| | | } |
| | | |
| | | //搜索是否有其他任务占用了提升机,如果占用提升机的任务和当前任务相同,则运行执行 |
| | | WrkMast wrkMast1 = wrkMastMapper.selectLiftWrkMast(liftProtocol.getLiftNo().intValue()); |
| | | if (wrkMast1 != null && wrkMast1.getWrkNo() != wrkNo.intValue()) { |
| | | return false; |
| | | } |
| | | |
| | | //提升机未到达小车楼层,呼叫提升机 |
| | | //获取提升机命令 |
| | | NyLiftCommand liftCommand = NyLiftUtils.getLiftCommand(liftProtocol.getLiftNo().intValue(), NyLiftTaskModelType.MOVE_CAR.id, null, basDevp.getDevNo(), wrkNo.intValue()); |
| | |
| | | if (basLift == null) { |
| | | continue; |
| | | } |
| | | if (basLift.getPoint().equals(shuttleProtocol.getPoint())) { |
| | | Integer liftX = basLift.getPoint$().getX(); |
| | | Integer liftY = basLift.getPoint$().getY(); |
| | | if (liftX.equals(shuttleProtocol.getPoint().getX()) && liftY.equals(shuttleProtocol.getPoint().getY())) { |
| | | //小车在提升机内 |
| | | //判断提升机是否空闲 |
| | | LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSlave.getId()); |
| | |
| | | //提升机处于空闲,放行 |
| | | return true; |
| | | } |
| | | }else { |
| | | return true;//不在提升机内,放行 |
| | | } |
| | | } |
| | | return false;//默认不放行 |
| | | } |
| | | |
| | | /** |
| | | * 检测路径是否可行走 |
| | | * 如果路径为目标库位,但不可行走,系统将尝试重新计算路径 |
| | | */ |
| | | private boolean checkPath(List<NavigateNode> currentNodes, List<NavigateNode> nextNodes, List<int[]> whitePoints) { |
| | | //检测路径是否可行走(检查路径锁定状态,检测路径是否有其他小车) |
| | | //检测当前行走路径,和下一步路径 |
| | | boolean checkPathIsAvailable = NavigateUtils.checkPathIsAvailable(currentNodes, shuttleProtocol.getShuttleNo().intValue(), Utils.getLev(shuttleProtocol.getCurrentLocNo()), whitePoints); |
| | | if (nextNodes == null) { |
| | | if (checkPathIsAvailable) { |
| | | return true;//可行走 |
| | | } |
| | | return false; |
| | | }else { |
| | | boolean checkPathIsAvailable2 = NavigateUtils.checkPathIsAvailable(nextNodes, shuttleProtocol.getShuttleNo().intValue(), Utils.getLev(shuttleProtocol.getCurrentLocNo()), whitePoints); |
| | | if (checkPathIsAvailable && checkPathIsAvailable2) { |
| | | return true;//可行走 |
| | | } |
| | | } |
| | | |
| | | // ShuttleAssignCommand assignCommand = redisCommand.getAssignCommand(); |
| | | // NavigateNode currentTarget = currentNodes.get(currentNodes.size() - 1); |
| | | // String currentLocNo = NavigatePositionConvert.nodeToLocNo(currentTarget); |
| | | // NavigateNode nextTarget = nextNodes.get(nextNodes.size() - 1); |
| | | // String nextLocNo = NavigatePositionConvert.nodeToLocNo(nextTarget); |
| | | // if (assignCommand.getLocNo().equals(currentLocNo) || assignCommand.getLocNo().equals(nextLocNo)) { |
| | | // //当前路径最后一个节点是目标库位,进行路径检测,如果不可行走,重新计算路径 |
| | | // //不可行走,重新计算路径 |
| | | // NyShuttleOperaResult result = NyShuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getShuttleNo().intValue(), shuttleProtocol.getTaskNo(), shuttleProtocol.getCurrentLocNo(), assignCommand.getLocNo()); |
| | | // if (result == null) { |
| | | // return false;//路径计算失败,不可行走 |
| | | // } |
| | | // |
| | | // List<NyShuttleHttpCommand> newCommands = result.getCommands();//新路径 |
| | | // |
| | | // //当前步序 |
| | | // int commandStep = redisCommand.getCommandStep(); |
| | | // List<NyShuttleHttpCommand> commands = assignCommand.getCommands(); |
| | | // |
| | | // commands.remove(commandStep);//移除当前步序指令 |
| | | // if (assignCommand.getLocNo().equals(currentLocNo)) { |
| | | // //当前路径,需要再多移除下一步指令 |
| | | // commands.remove(commandStep + 1); |
| | | // } |
| | | // |
| | | // //将新路径添加进指令集合 |
| | | // commands.addAll(commandStep, newCommands); |
| | | // assignCommand.setCommands(commands); |
| | | // redisCommand.setAssignCommand(assignCommand); |
| | | // //任务数据保存到redis |
| | | // redisUtil.set("shuttle_wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand)); |
| | | // return false;//当前不可行走,等待下一次执行走新路径 |
| | | // } |
| | | |
| | | return false;//不可行走 |
| | | } |
| | | |
| | | /** |
| | | * 跑库程序 |
| | | */ |
| | | private void moveLoc() { |
| | | LocMastService locMastService = SpringUtils.getBean(LocMastService.class); |
| | | ShuttleDispatchUtils shuttleDispatchUtils = SpringUtils.getBean(ShuttleDispatchUtils.class); |
| | | CommonService commonService = SpringUtils.getBean(CommonService.class); |
| | | WrkMastMapper wrkMastMapper = SpringUtils.getBean(WrkMastMapper.class); |
| | | int lev = Utils.getLev(shuttleProtocol.getCurrentLocNo());//小车当前楼层 |
| | | if (!shuttleProtocol.isIdle()) { |
| | | return; |
| | | } |
| | | |
| | | WrkMast wrkMast = wrkMastMapper.selectShuttleHasMoveWorking(shuttleProtocol.getShuttleNo().intValue()); |
| | | if (wrkMast != null) { |
| | | return; |
| | | } |
| | | |
| | | if (shuttleProtocol.getYCurrent() > shuttleProtocol.getYTarget()) { |
| | | //跑库结束 |
| | | shuttleProtocol.setMoveLoc(false); |
| | | shuttleProtocol.setMoveType(0); |
| | | shuttleProtocol.setXStart(0); |
| | | shuttleProtocol.setXTarget(0); |
| | | shuttleProtocol.setXCurrent(0); |
| | | shuttleProtocol.setYStart(0); |
| | | shuttleProtocol.setYTarget(0); |
| | | shuttleProtocol.setYCurrent(0); |
| | | return; |
| | | } |
| | | |
| | | if (shuttleProtocol.getMoveType() == 0) {//跑轨道 |
| | | ArrayList<String> locs = new ArrayList<>(); |
| | | for (int i = shuttleProtocol.getXCurrent(); i <= shuttleProtocol.getXTarget(); i++) { |
| | | String locNo = Utils.getLocNo(i, shuttleProtocol.getYCurrent(), lev); |
| | | locs.add(locNo); |
| | | } |
| | | List<LocMast> locMasts = locMastService.selectEmptyLocNos(locs); |
| | | if (locMasts.isEmpty()) { |
| | | //空库位 |
| | | shuttleProtocol.setYCurrent(shuttleProtocol.getYCurrent() + 1); |
| | | return; |
| | | } |
| | | |
| | | LocMast start = locMasts.get(0); |
| | | LocMast target = locMasts.get(locMasts.size() - 1); |
| | | //判断小车是否在起点位置 |
| | | if (!shuttleProtocol.getCurrentLocNo().equals(start.getLocNo())) {//不在起点位置,调度去起点位置 |
| | | shuttleDispatchUtils.dispatchShuttle(commonService.getWorkNo(3), start.getLocNo()); |
| | | }else { |
| | | //在起点位置,调度去目标位置 |
| | | if (shuttleProtocol.getCurrentLocNo().equals(target.getLocNo())) { |
| | | shuttleProtocol.setYCurrent(shuttleProtocol.getYCurrent() + 1);//小车和目标位置一致,跳过 |
| | | }else { |
| | | boolean result = shuttleDispatchUtils.dispatchShuttle(commonService.getWorkNo(3), target.getLocNo()); |
| | | if (result) {//调度成功 |
| | | shuttleProtocol.setYCurrent(shuttleProtocol.getYCurrent() + 1); |
| | | } |
| | | } |
| | | } |
| | | }else {//跑库位 |
| | | Integer xCurrent = shuttleProtocol.getXCurrent(); |
| | | if (xCurrent > shuttleProtocol.getXTarget()) {//当X值大于X目标值,进行归零且Y方向+1 |
| | | shuttleProtocol.setXCurrent(shuttleProtocol.getXStart()); |
| | | shuttleProtocol.setYCurrent(shuttleProtocol.getYCurrent() + 1); |
| | | return; |
| | | } |
| | | |
| | | Integer yCurrent = shuttleProtocol.getYCurrent(); |
| | | String locNo = Utils.getLocNo(xCurrent, yCurrent, lev); |
| | | LocMast target = locMastService.selectById(locNo); |
| | | if (target == null) { |
| | | shuttleProtocol.setXCurrent(shuttleProtocol.getXCurrent() + 1); |
| | | return; |
| | | } |
| | | |
| | | if (!target.getLocSts().equals("O")) { |
| | | shuttleProtocol.setXCurrent(shuttleProtocol.getXCurrent() + 1); |
| | | return; |
| | | } |
| | | |
| | | //调度去目标位置 |
| | | if (shuttleProtocol.getCurrentLocNo().equals(target.getLocNo())) { |
| | | shuttleProtocol.setXCurrent(shuttleProtocol.getXCurrent() + 1);//小车和目标位置一致,跳过 |
| | | }else { |
| | | boolean result = shuttleDispatchUtils.dispatchShuttle(commonService.getWorkNo(3), target.getLocNo()); |
| | | if (result) {//调度成功 |
| | | shuttleProtocol.setXCurrent(shuttleProtocol.getXCurrent() + 1); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | //检测小车是否进出提升机输送站 |
| | | public void checkIOSta(List<NyShuttleHttpCommand> commands, int commandStep) { |
| | | if (commandStep != 0) { |
| | | NyShuttleHttpCommand lastCommand = commands.get(commandStep - 1);//上一步命令 |
| | | if (lastCommand.getRequest().getBody().get("requestType").equals("move")) { |
| | | //检测起点是否为提升机输送站点 |
| | | NyShuttleProtocol.NyShuttlePointClass start = JSON.parseObject(lastCommand.getRequest().getBody().get("start").toString(), NyShuttleProtocol.NyShuttlePointClass.class); |
| | | int[] startPoint = NavigatePositionConvert.NyXyzToWCSXyz(start.getX(), start.getY(), start.getZ()); |
| | | if (startPoint[0] == 13 && (startPoint[1] == 22 || startPoint[1] == 38 || startPoint[1] == 57)) { |
| | | //输送站点位置 |
| | | |
| | | int liftNo; |
| | | if (startPoint[1] == 22) { |
| | | liftNo = 1; |
| | | } else if (startPoint[1] == 38) { |
| | | liftNo = 2; |
| | | } else { |
| | | liftNo = 3; |
| | | } |
| | | |
| | | HashMap<String, Object> data = new HashMap<>(); |
| | | data.put("lev", startPoint[2]); |
| | | data.put("status", false);//出输送站 |
| | | |
| | | //下发任务 |
| | | MessageQueue.offer(SlaveType.Lift, liftNo, new Task(4, data)); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (commands.size() == commandStep) { |
| | | return; |
| | | } |
| | | NyShuttleHttpCommand command = commands.get(commandStep);//当前命令 |
| | | if (command.getRequest().getBody().get("requestType").equals("move")) { |
| | | NyShuttleProtocol.NyShuttlePointClass target = JSON.parseObject(command.getRequest().getBody().get("target").toString(), NyShuttleProtocol.NyShuttlePointClass.class); |
| | | int[] targetPoint = NavigatePositionConvert.NyXyzToWCSXyz(target.getX(), target.getY(), target.getZ()); |
| | | //检测目标位置是否为提升机输送站点 |
| | | if (targetPoint[0] == 13 && (targetPoint[1] == 22 || targetPoint[1] == 38 || targetPoint[1] == 57)) { |
| | | //输送站点位置 |
| | | |
| | | int liftNo; |
| | | if (targetPoint[1] == 22) { |
| | | liftNo = 1; |
| | | } else if (targetPoint[1] == 38) { |
| | | liftNo = 2; |
| | | } else { |
| | | liftNo = 3; |
| | | } |
| | | |
| | | HashMap<String, Object> data = new HashMap<>(); |
| | | data.put("lev", targetPoint[2]); |
| | | data.put("status", true);//进输送站 |
| | | |
| | | //下发任务 |
| | | MessageQueue.offer(SlaveType.Lift, liftNo, new Task(4, data)); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |