From a032e83b86f182f2939454949129adfece45ebed Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期四, 26 九月 2024 16:35:52 +0800
Subject: [PATCH] #
---
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/KernelService.java | 36 +++++++
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigatePositionConvert.java | 6
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/MotionTimer.java | 8 +
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java | 18 +++
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/MapCommandService.java | 124 ++++++++++++++++++++++++
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/DeviceCtgType.java | 1
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/MotionCtgType.java | 4
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java | 43 +++++++
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java | 60 +++++++++++
9 files changed, 291 insertions(+), 9 deletions(-)
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java
index d017869..75586e0 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java
@@ -680,6 +680,15 @@
MotionCtgType.SHUTTLE_MOVE
));
+ // 閿佸畾鐩爣妤煎眰绌挎杞﹀緟鏈轰綅璺緞
+ motionList.addAll(kernelService.mapLockPath(
+ null,
+ MotionDto.build((dto -> {
+ dto.setShuttleNo(shuttleDevice.getId().intValue());
+ dto.setLocNo(standbyLocNoFrom);
+ }))
+ ));
+
// 鎻愬崌鏈虹┖杞界Щ鍔ㄥ埌绌挎杞﹀眰
motionList.addAll(kernelService.liftMove(
null
@@ -1291,6 +1300,15 @@
MotionCtgType.SHUTTLE_MOVE
));
+ // 閿佸畾鐩爣妤煎眰绌挎杞﹀緟鏈轰綅璺緞
+ motionList.addAll(kernelService.mapLockPath(
+ null,
+ MotionDto.build((dto -> {
+ dto.setShuttleNo(shuttleDevice.getId().intValue());
+ dto.setLocNo(standbyLocNoFrom);
+ }))
+ ));
+
// 鎻愬崌鏈虹┖杞界Щ鍔ㄥ埌绌挎杞﹀眰
motionList.addAll(kernelService.liftMove(
null
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/KernelService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/KernelService.java
index db4c697..d827bd6 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/KernelService.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/KernelService.java
@@ -431,4 +431,40 @@
return motionList;
}
+ // Map -----------------------------------------------------------------------------
+
+ /**
+ * 鍦板浘璺緞閿佸畾
+ */
+ public List<Motion> mapLockPath(MotionDto origin, MotionDto target) {
+ List<Motion> motionList = new ArrayList<>();
+
+ motionList.add(Motion.build(motion -> {
+ motion.setDeviceCtg(DeviceCtgType.MAP.val());
+ motion.setDevice(String.valueOf(target.getShuttleNo()));
+ motion.setMotionCtg(MotionCtgType.MAP_LOCK_PATH.val());
+
+ motion.setTarget(target.getLocNo());
+ }));
+
+ return motionList;
+ }
+
+ /**
+ * 鍦板浘璺緞瑙i攣
+ */
+ public List<Motion> mapUnlockPath(MotionDto origin, MotionDto target) {
+ List<Motion> motionList = new ArrayList<>();
+
+ motionList.add(Motion.build(motion -> {
+ motion.setDeviceCtg(DeviceCtgType.MAP.val());
+ motion.setDevice(String.valueOf(target.getShuttleNo()));
+ motion.setMotionCtg(MotionCtgType.MAP_UNLOCK_PATH.val());
+
+ motion.setTarget(target.getLocNo());
+ }));
+
+ return motionList;
+ }
+
}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/MapCommandService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/MapCommandService.java
new file mode 100644
index 0000000..7d65d0a
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/MapCommandService.java
@@ -0,0 +1,124 @@
+package com.zy.asrs.wcs.core.kernel.command;
+
+import com.zy.asrs.wcs.core.entity.Motion;
+import com.zy.asrs.wcs.core.model.MapNode;
+import com.zy.asrs.wcs.core.model.NavigateNode;
+import com.zy.asrs.wcs.core.model.enums.MotionCtgType;
+import com.zy.asrs.wcs.core.model.enums.NavigationMapType;
+import com.zy.asrs.wcs.core.utils.*;
+import com.zy.asrs.wcs.rcs.cache.SlaveConnection;
+import com.zy.asrs.wcs.rcs.constant.DeviceRedisConstant;
+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 lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+@Slf4j
+@Service
+public class MapCommandService {
+
+ @Autowired
+ private RedisUtil redisUtil;
+ @Autowired
+ private NavigateMapUtils navigateMapUtils;
+ @Autowired
+ private NavigateMapData navigateMapData;
+
+ public Boolean accept(Motion motion) {
+ switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))) {
+ case MAP_LOCK_PATH:
+ return lockPath(motion, true);
+ case MAP_UNLOCK_PATH:
+ return lockPath(motion, false);
+ default:
+ break;
+ }
+
+ return Boolean.TRUE;
+ }
+
+ public Boolean finish(Motion motion) {
+ switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))) {
+ case MAP_LOCK_PATH:
+ return checkLockPath(motion, true);
+ case MAP_UNLOCK_PATH:
+ return checkLockPath(motion, false);
+ default:
+ break;
+ }
+
+ return Boolean.TRUE;
+ }
+
+ private boolean lockPath(Motion motion, boolean lock) {
+ Integer deviceNo = Integer.parseInt(motion.getDevice());
+ ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, deviceNo);
+ if (shuttleThread == null) {
+ return false;
+ }
+ ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+ if (null == shuttleProtocol) {
+ return false;
+ }
+
+ NavigateNode navigateNode = NavigatePositionConvert.locNoToNode(motion.getTarget());
+ List<NavigateNode> nodes = new ArrayList<>();
+ nodes.add(navigateNode);
+
+ //鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹�/瑙i攣
+ boolean lockResult = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(motion.getTarget()), shuttleProtocol.getShuttleNo(), nodes, lock);//鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹�/瑙i攣
+ if (!lockResult) {
+ return false;//閿佸畾/瑙i攣澶辫触
+ }
+ return true;
+ }
+
+ private boolean checkLockPath(Motion motion, boolean lock) {
+ NavigateNode navigateNode = NavigatePositionConvert.locNoToNode(motion.getTarget());
+ List<NavigateNode> nodes = new ArrayList<>();
+ nodes.add(navigateNode);
+
+ int lev = Utils.getLev(motion.getTarget());
+
+ Object o = redisUtil.get(DeviceRedisConstant.MAP + lev);
+ if (o == null) {
+ return false;
+ }
+
+ Integer deviceNo = Integer.parseInt(motion.getDevice());
+ ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, deviceNo);
+ if (shuttleThread == null) {
+ return false;
+ }
+ ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+ if (null == shuttleProtocol) {
+ return false;
+ }
+
+ //鑾峰彇灏忚溅鑺傜偣
+ List<int[]> shuttlePoints = Utils.getShuttlePoints(shuttleProtocol.getShuttleNo(), lev);
+ List<List<MapNode>> map = navigateMapData.getJsonData(NavigationMapType.DFX.id, null, shuttlePoints);
+
+ for (NavigateNode node : nodes) {
+ List<MapNode> listX = map.get(node.getX());
+ MapNode mapNode = listX.get(node.getY());
+ if (lock) {//妫�娴嬫槸鍚﹂攣瀹�
+ if (mapNode.getValue() != -999) {
+ return false;//璺緞鏈攣瀹�
+ }
+ }else {//妫�娴嬫槸鍚︽湭閿佸畾
+ if(mapNode.getValue() == -999) {
+ return false;//璺緞宸查攣瀹�
+ }
+ }
+ }
+ return true;
+ }
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java
index 71b7906..8fafb60 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java
@@ -1,6 +1,5 @@
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;
@@ -162,7 +161,7 @@
// return false;
// }
- shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread);
+ shuttleCommands = this.shuttleInOutLiftCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread);
shuttleTaskModeType = ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO;
break;
case SHUTTLE_MOVE_TO_LIFT://杩涙彁鍗囨満
@@ -450,5 +449,62 @@
return commands;
}
+ public synchronized List<ShuttleCommand> shuttleInOutLiftCommand(String startLocNo, String endLocNo, Integer mapType, ShuttleAssignCommand assignCommand, ShuttleThread shuttleThread) {
+ NavigateNode startNode = NavigatePositionConvert.locNoToNode(startLocNo);
+ NavigateNode endNode = NavigatePositionConvert.locNoToNode(endLocNo);
+ List<NavigateNode> unlockPath = new ArrayList<>();
+ unlockPath.add(startNode);
+ unlockPath.add(endNode);
+
+ ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+
+ //鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹�/瑙i攣
+ boolean lockResult = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(endLocNo), shuttleProtocol.getShuttleNo(), unlockPath, false);//鎵�浣跨敤鐨勮矾寰勮繘琛岃В閿�
+ if (!lockResult) {
+ News.error("{} dash {} can't find unlock path!", startLocNo, endLocNo);
+ return null;//瑙i攣澶辫触
+ }
+
+
+ //鑾峰彇灏忚溅绉诲姩閫熷害
+ Integer runSpeed = Optional.ofNullable(basShuttleService.getOne(new LambdaQueryWrapper<BasShuttle>().eq(BasShuttle::getDeviceId, assignCommand.getDeviceId())).getRunSpeed()).orElse(1000);
+ Long hostId = shuttleThread.getDevice().getHostId();
+ List<NavigateNode> nodeList = NavigateUtils.calc(startLocNo, endLocNo, mapType, Utils.getShuttlePoints(Integer.parseInt(shuttleThread.getDevice().getDeviceNo()), Utils.getLev(startLocNo)));
+ if (nodeList == null) {
+ News.error("{} dash {} can't find navigate path!", startLocNo, endLocNo);
+ return null;
+ }
+
+ List<NavigateNode> allNode = new ArrayList<>();
+ for (NavigateNode node : nodeList) {
+ allNode.add(node.clone());
+ }
+
+ List<ShuttleCommand> commands = new ArrayList<>();
+ //鑾峰彇鍒嗘璺緞
+ ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(nodeList);
+ //灏嗘瘡涓�娈佃矾寰勫垎鎴恈ommand鎸囦护
+ for (ArrayList<NavigateNode> nodes : data) {
+ //寮�濮嬭矾寰�
+ NavigateNode startPath = nodes.get(0);
+
+ //鐩爣璺緞
+ NavigateNode endPath = nodes.get(nodes.size() - 1);
+ Integer allDistance = NavigateUtils.getCurrentPathAllDistance(nodes);//璁$畻褰撳墠璺緞琛岃蛋鎬昏窛绂�
+ //閫氳繃xy鍧愭爣灏忚溅浜岀淮鐮�
+ String startCodeNum = NavigatePositionConvert.xyToPosition(startPath.getX(), startPath.getY(), startPath.getZ(), hostId);
+ //閫氳繃xy鍧愭爣灏忚溅浜岀淮鐮�
+ String distCodeNum = NavigatePositionConvert.xyToPosition(endPath.getX(), endPath.getY(), endPath.getZ(), hostId);
+ //鑾峰彇绉诲姩鍛戒护
+ ShuttleCommand command = shuttleThread.getMoveCommand(assignCommand.getDeviceTaskNo(), startCodeNum, distCodeNum, allDistance, ShuttleRunDirection.get(startPath.getDirection()).id.intValue(), runSpeed, nodes);
+ command.setNodes(nodes);//灏嗚璧拌妭鐐规坊鍔犲埌姣忎竴姝ュ懡浠や腑
+ commands.add(command);
+ }
+
+ assignCommand.setNodes(allNode);//褰撳墠浠诲姟鎵�鍗犵敤鐨勮妭鐐筶ist
+
+ return commands;
+ }
+
}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/DeviceCtgType.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/DeviceCtgType.java
index 05252e6..36b772c 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/DeviceCtgType.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/DeviceCtgType.java
@@ -13,6 +13,7 @@
SHUTTLE,
AGV,
LED,
+ MAP,
;
DeviceCtgType() {
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/MotionCtgType.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/MotionCtgType.java
index 19d2949..9129fa2 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/MotionCtgType.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/MotionCtgType.java
@@ -60,6 +60,10 @@
// AGV ----------------------------------------------
AGV_TRANSPORT(AGV),
+ // MAP ----------------------------------------------
+ MAP_LOCK_PATH(MAP),//鍦板浘閿佸畾璺緞
+ MAP_UNLOCK_PATH(MAP),//鍦板浘瑙i攣璺緞
+
;
public DeviceCtgType deviceCtg;
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/MotionTimer.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/MotionTimer.java
index 82408aa..537e3a8 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/MotionTimer.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/MotionTimer.java
@@ -41,6 +41,8 @@
private LiftCommandService liftCommandService;
@Autowired
private ShuttleCommandService shuttleCommandService;
+ @Autowired
+ private MapCommandService mapCommandService;
@Scheduled(cron = "0/1 * * * * ? ")
public synchronized void executeTask() {
@@ -416,6 +418,9 @@
case AGV:
executeRes = agvCommandService.accept(motion);
break;
+ case MAP:
+ executeRes = mapCommandService.accept(motion);
+ break;
default:
break;
}
@@ -451,6 +456,9 @@
case CONVEYOR:
executeRes = conveyorCommandService.finish(motion);
break;
+ case MAP:
+ executeRes = mapCommandService.finish(motion);
+ break;
default:
break;
}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigatePositionConvert.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigatePositionConvert.java
index 9b2bdad..44adfe3 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigatePositionConvert.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigatePositionConvert.java
@@ -38,10 +38,10 @@
//WCS绯荤粺搴撲綅鍙疯浆璺緞绠楁硶鑺傜偣
public static NavigateNode locNoToNode(String locNo) {
- int col = Integer.parseInt(locNo.substring(0, 2));
- int row = Integer.parseInt(locNo.substring(2, 5));
+ int col = Utils.getRow(locNo);
+ int row = Utils.getBay(locNo);
int[] newPosition = coverPosition(col,row);
- NavigateNode node = new NavigateNode(col, row);
+ NavigateNode node = new NavigateNode(newPosition[0], newPosition[1]);
node.setZ(Utils.getLev(locNo));
return node;
}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java
index cd0eb58..ee9f923 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java
@@ -9,10 +9,7 @@
import com.zy.asrs.wcs.core.entity.*;
import com.zy.asrs.wcs.core.kernel.AnalyzeService;
import com.zy.asrs.wcs.core.model.NavigateNode;
-import com.zy.asrs.wcs.core.model.enums.DeviceCtgType;
-import com.zy.asrs.wcs.core.model.enums.NavigationMapType;
-import com.zy.asrs.wcs.core.model.enums.TaskCtgType;
-import com.zy.asrs.wcs.core.model.enums.TaskStsType;
+import com.zy.asrs.wcs.core.model.enums.*;
import com.zy.asrs.wcs.core.service.*;
import com.zy.asrs.wcs.rcs.News;
import com.zy.asrs.wcs.rcs.cache.SlaveConnection;
@@ -406,6 +403,44 @@
}
+ //鎼滅储鏄惁瀛樺湪鍓嶅線鐩爣妤煎眰鐨勫皬杞﹀伐浣滄。
+ for (Task task : taskService.list(new LambdaQueryWrapper<Task>()
+ .in(Task::getTaskSts, TaskStsType.NEW_INBOUND.sts, TaskStsType.ANALYZE_INBOUND.sts, TaskStsType.EXECUTE_INBOUND.sts, TaskStsType.COMPLETE_INBOUND.sts
+ , TaskStsType.NEW_OUTBOUND.sts, TaskStsType.ANALYZE_OUTBOUND.sts, TaskStsType.EXECUTE_OUTBOUND.sts, TaskStsType.COMPLETE_OUTBOUND.sts))) {
+
+ List<Motion> motions = motionService.list(new LambdaQueryWrapper<Motion>()
+ .eq(Motion::getTaskNo, task.getTaskNo())
+ .in(Motion::getMotionCtg, MotionCtgType.SHUTTLE_MOVE
+ , MotionCtgType.SHUTTLE_MOVE_LIFT_PALLET
+ , MotionCtgType.SHUTTLE_MOVE_DOWN_PALLET
+ , MotionCtgType.SHUTTLE_MOVE_FROM_LIFT
+ , MotionCtgType.SHUTTLE_MOVE_TO_LIFT
+ , MotionCtgType.SHUTTLE_MOVE_FROM_CONVEYOR
+ , MotionCtgType.SHUTTLE_MOVE_TO_CONVEYOR
+ , MotionCtgType.SHUTTLE_MOVE_FROM_LIFT_TO_CONVEYOR
+ ));
+
+ boolean isUpdateLev = false;
+ for (Motion motion : motions) {
+ if (motion.getOrigin() == null || motion.getTarget() == null) {
+ continue;
+ }
+
+ int sourceLev = Utils.getLev(motion.getOrigin());//鍔ㄤ綔婧愭ゼ灞�
+ int targetLev = Utils.getLev(motion.getTarget());//鍔ㄤ綔鐩爣妤煎眰
+ if (sourceLev != targetLev) {
+ isUpdateLev = true;
+ break;
+ }
+ }
+
+ if(isUpdateLev) {
+ levCount++;//宸ヤ綔妗e睘浜庤法灞備换鍔★紝灏忚溅褰掑睘浜庣洰鏍囨ゼ灞�
+ continue;
+ }
+
+ }
+
return levCount < Integer.parseInt(dict.getValue());
}
--
Gitblit v1.9.1