From 97aa2cd09e92f73cd4dff3d99eaef64e748c80b3 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 28 六月 2023 19:04:32 +0800
Subject: [PATCH] 优化出库小车避让
---
src/main/java/com/zy/core/thread/ShuttleThread.java | 186 ++++++++++++++++++++++++---------------------
1 files changed, 99 insertions(+), 87 deletions(-)
diff --git a/src/main/java/com/zy/core/thread/ShuttleThread.java b/src/main/java/com/zy/core/thread/ShuttleThread.java
index 7d23d51..88b5ab8 100644
--- a/src/main/java/com/zy/core/thread/ShuttleThread.java
+++ b/src/main/java/com/zy/core/thread/ShuttleThread.java
@@ -423,9 +423,9 @@
//灏忚溅绉诲姩鍒版彁鍗囨満鍙o紝璁$畻璺緞
//璁$畻灏忚溅璧风偣鍒颁腑鐐规墍闇�鍛戒护
LocMast currentLocMast = locMastService.queryByQrCode(shuttleProtocol.getCurrentCode().toString());
- List<NavigateNode> firstMastResult = NavigateUtils.calc(currentLocMast.getLocNo(), assignCommand.getSourceLocNo(), NavigationMapType.NORMAL.id);//灏忚溅鍒颁腑鐐癸紝澶勪簬鏃犺揣鐘舵�侊紝浣跨敤姝e父閫氶亾鍦板浘
-
- if (firstMastResult != null) {
+ List<NavigateNode> firstMastResult = NavigateUtils.calc(currentLocMast.getLocNo(), assignCommand.getSourceLocNo(), NavigationMapType.NORMAL.id, Utils.getShuttlePoints(assignCommand.getShuttleNo().intValue(), Utils.getLev(currentLocMast.getLocNo())));//灏忚溅鍒颁腑鐐癸紝澶勪簬鏃犺揣鐘舵�侊紝浣跨敤姝e父閫氶亾鍦板浘
+ boolean checkResult = Utils.checkShuttlePath(firstMastResult, shuttleProtocol.getShuttleNo().intValue());
+ if (firstMastResult != null && checkResult) {
allNode.addAll(firstMastResult);//灏嗚妭鐐硅繘琛屼繚瀛�
//鑾峰彇鍒嗘璺緞
ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(firstMastResult);
@@ -459,9 +459,9 @@
}
//璁$畻涓偣鍒扮粓鐐硅矾寰�
- List<NavigateNode> secMastResult = NavigateUtils.calc(assignCommand.getSourceLocNo(), assignCommand.getLocNo(), NavigationMapType.DFX.id);//灏忚溅浠庝腑鐐瑰埌缁堢偣锛屽浜庢湁璐х姸鎬侊紝浣跨敤DFX鍦板浘
-
- if (secMastResult != null) {
+ List<NavigateNode> secMastResult = NavigateUtils.calc(assignCommand.getSourceLocNo(), assignCommand.getLocNo(), NavigationMapType.DFX.id, Utils.getShuttlePoints(assignCommand.getShuttleNo().intValue(), Utils.getLev(assignCommand.getSourceLocNo())));//灏忚溅浠庝腑鐐瑰埌缁堢偣锛屽浜庢湁璐х姸鎬侊紝浣跨敤DFX鍦板浘
+ boolean checkResult2 = Utils.checkShuttlePath(secMastResult, shuttleProtocol.getShuttleNo().intValue());
+ if (secMastResult != null && checkResult2) {
allNode.addAll(secMastResult);//灏嗚妭鐐硅繘琛屼繚瀛�
//鑾峰彇鍒嗘璺緞
ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(secMastResult);
@@ -544,9 +544,9 @@
}
LocMast locMast = locMastService.queryByQrCode(startQr);
- List<NavigateNode> result = NavigateUtils.calc(locMast.getLocNo(), assignCommand.getLocNo(), NavigationMapType.NONE.id);//鎵嬪姩鍛戒护-绉诲姩鍛戒护锛屼娇鐢ㄦ棤杩囨护鍦板浘
-
- if (result != null) {
+ List<NavigateNode> result = NavigateUtils.calc(locMast.getLocNo(), assignCommand.getLocNo(), NavigationMapType.NONE.id, Utils.getShuttlePoints(assignCommand.getShuttleNo().intValue(), Utils.getLev(locMast.getLocNo())));//鎵嬪姩鍛戒护-绉诲姩鍛戒护锛屼娇鐢ㄦ棤杩囨护鍦板浘
+ boolean checkResult3 = Utils.checkShuttlePath(result, shuttleProtocol.getShuttleNo().intValue());
+ if (result != null && checkResult3) {
//鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢�
navigateMapData = new NavigateMapData(Utils.getLev(locMast.getLocNo()));
navigateMapData.writeNavigateNodeToRedisMap(result, true);////鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢�
@@ -580,10 +580,10 @@
int lev = Utils.getLev(locMast1.getLocNo());//绌挎杞﹀綋鍓嶉珮搴�
String liftSiteLocNo = Utils.levToOutInStaLocNo(lev);//褰撳墠妤煎眰绔欑偣搴撲綅鍙�
LocMast liftSitelocMast = locMastService.selectById(liftSiteLocNo);
- List<NavigateNode> result1 = NavigateUtils.calc(locMast1.getLocNo(), liftSiteLocNo, NavigationMapType.NONE.id);//绉诲姩鍒版彁鍗囨満锛屼娇鐢ㄦ棤杩囨护鍦板浘
-
+ List<NavigateNode> result1 = NavigateUtils.calc(locMast1.getLocNo(), liftSiteLocNo, NavigationMapType.NONE.id, Utils.getShuttlePoints(assignCommand.getShuttleNo().intValue(), Utils.getLev(locMast1.getLocNo())));//绉诲姩鍒版彁鍗囨満锛屼娇鐢ㄦ棤杩囨护鍦板浘
+ boolean checkResult4 = Utils.checkShuttlePath(result1, shuttleProtocol.getShuttleNo().intValue());
Short endStartCode = null;
- if (result1 != null) {
+ if (result1 != null && checkResult4) {
//鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢�
navigateMapData = new NavigateMapData(Utils.getLev(locMast1.getLocNo()));
navigateMapData.writeNavigateNodeToRedisMap(result1, true);////鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢�
@@ -656,78 +656,81 @@
return false;
}
- List<ShuttleCommand> errorCommands = redisCommand.getErrorCommands();
- if (errorCommands.size() > 0) {
- //浼樺厛鎵ц璇ユ寚浠�
- ShuttleCommand errorCommand = errorCommands.get(0);//鍙栧嚭鎸囦护
+// List<ShuttleCommand> errorCommands = redisCommand.getErrorCommands();
+// if (errorCommands.size() > 0) {
+// //浼樺厛鎵ц璇ユ寚浠�
+// ShuttleCommand errorCommand = errorCommands.get(0);//鍙栧嚭鎸囦护
+//
+// if(errorCommand.getCommandWord() == 1){//姝e父琛岃蛋鍛戒护锛岄渶瑕佸厛鎵ц瀹屾壘搴撲綅鍛戒护鍚庯紝鍐嶆墽琛�
+// LocMastService locMastService = SpringUtils.getBean(LocMastService.class);
+// LocMast locMast = locMastService.queryByQrCode(shuttleProtocol.getCurrentCode().toString());
+// LocMast distLocMast = locMastService.queryByQrCode(errorCommand.getStartCodeNum().toString());
+// if (shuttleProtocol.getCurrentCode().equals(errorCommand.getStartCodeNum())) {
+// //璧风偣鍜岀粓鐐瑰睘浜庡悓涓�搴撲綅锛屾棤闇�鍐嶆墽琛岀Щ鍔ㄦ搷浣�
+// errorCommands.remove(0);//绉婚櫎璇ュ懡浠�
+// redisCommand.setErrorCommands(new ArrayList<ShuttleCommand>());
+// shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WORKING);
+// //褰撳墠姝ュ簭
+// int commandStep = redisCommand.getCommandStep();
+// //姝ュ簭鍥為��
+// commandStep--;
+// redisCommand.setCommandStep(commandStep);
+// //浠诲姟鏁版嵁淇濆瓨鍒皉edis
+// redisUtil.set("shuttle_wrk_no_" + wrkNo, JSON.toJSONString(redisCommand));
+// shuttleProtocol.setPakMk(true);
+// return true;
+// }else {
+// List<NavigateNode> result = NavigateUtils.calc(locMast.getLocNo(), distLocMast.getLocNo(), NavigationMapType.DFX.id, Utils.getShuttlePoints(errorCommand.getShuttleNo().intValue()));//閿欒鎭㈠锛屼娇鐢―FX鍦板浘
+// if (result != null) {
+// //鑾峰彇鍒嗘璺緞
+// ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(result);
+// //灏嗘瘡涓�娈佃矾寰勫垎鎴恈ommand鎸囦护
+// for (ArrayList<NavigateNode> nodes : data) {
+// //寮�濮嬭矾寰�
+// NavigateNode startPath = nodes.get(0);
+// //鐩爣璺緞
+// NavigateNode endPath = nodes.get(nodes.size() - 1);
+// Integer allDistance = NavigateUtils.getCurrentPathAllDistance(nodes);//璁$畻褰撳墠璺緞琛岃蛋鎬昏窛绂�
+//
+// String qrCodeValue = distLocMast.getQrCodeValue();
+// errorCommand.setCommandWord((short) 1);
+// errorCommand.setStartCodeNum(shuttleProtocol.getCurrentCode());
+// errorCommand.setMiddleCodeNum((short) 1);
+// errorCommand.setDistCodeNum((short) Integer.parseInt(qrCodeValue));
+// errorCommand.setStartToDistDistance(allDistance);
+// errorCommand.setRunSpeed((short) 1000);
+// errorCommand.setRunDirection(ShuttleRunDirection.get(startPath.getDirection()).id);
+// errorCommand.setForceMoveDistance(0);
+// errorCommand.setIOControl((short) 0);
+// errorCommand.setCommandEnd((short) 1);
+// break;
+// }
+// }
+// }
+//
+// shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WORKING);
+// //褰撳墠姝ュ簭
+// int commandStep = redisCommand.getCommandStep();
+// //姝ュ簭鍥為��
+// commandStep--;
+// redisCommand.setCommandStep(commandStep);
+// }
+//
+// if (!write(errorCommand)) {
+// News.error("鍥涘悜绌挎杞﹀懡浠や笅鍙戝け璐ワ紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(errorCommand));
+// return false;
+// } else {
+// News.info("鍥涘悜绌挎杞﹀懡浠や笅鍙戞垚鍔燂紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(errorCommand));
+// errorCommands.remove(0);
+// redisCommand.setErrorCommands(errorCommands);
+// //浠诲姟鏁版嵁淇濆瓨鍒皉edis
+// redisUtil.set("shuttle_wrk_no_" + wrkNo, JSON.toJSONString(redisCommand));
+// return true;
+// }
+// }
- if(errorCommand.getCommandWord() == 1){//姝e父琛岃蛋鍛戒护锛岄渶瑕佸厛鎵ц瀹屾壘搴撲綅鍛戒护鍚庯紝鍐嶆墽琛�
- LocMastService locMastService = SpringUtils.getBean(LocMastService.class);
- LocMast locMast = locMastService.queryByQrCode(shuttleProtocol.getCurrentCode().toString());
- LocMast distLocMast = locMastService.queryByQrCode(errorCommand.getStartCodeNum().toString());
- if (shuttleProtocol.getCurrentCode().equals(errorCommand.getStartCodeNum())) {
- //璧风偣鍜岀粓鐐瑰睘浜庡悓涓�搴撲綅锛屾棤闇�鍐嶆墽琛岀Щ鍔ㄦ搷浣�
- errorCommands.remove(0);//绉婚櫎璇ュ懡浠�
- redisCommand.setErrorCommands(new ArrayList<ShuttleCommand>());
- shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WORKING);
- //褰撳墠姝ュ簭
- int commandStep = redisCommand.getCommandStep();
- //姝ュ簭鍥為��
- commandStep--;
- redisCommand.setCommandStep(commandStep);
- //浠诲姟鏁版嵁淇濆瓨鍒皉edis
- redisUtil.set("shuttle_wrk_no_" + wrkNo, JSON.toJSONString(redisCommand));
- shuttleProtocol.setPakMk(true);
- return true;
- }else {
- List<NavigateNode> result = NavigateUtils.calc(locMast.getLocNo(), distLocMast.getLocNo(), NavigationMapType.DFX.id);//閿欒鎭㈠锛屼娇鐢―FX鍦板浘
- if (result != null) {
- //鑾峰彇鍒嗘璺緞
- ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(result);
- //灏嗘瘡涓�娈佃矾寰勫垎鎴恈ommand鎸囦护
- for (ArrayList<NavigateNode> nodes : data) {
- //寮�濮嬭矾寰�
- NavigateNode startPath = nodes.get(0);
- //鐩爣璺緞
- NavigateNode endPath = nodes.get(nodes.size() - 1);
- Integer allDistance = NavigateUtils.getCurrentPathAllDistance(nodes);//璁$畻褰撳墠璺緞琛岃蛋鎬昏窛绂�
-
- String qrCodeValue = distLocMast.getQrCodeValue();
- errorCommand.setCommandWord((short) 1);
- errorCommand.setStartCodeNum(shuttleProtocol.getCurrentCode());
- errorCommand.setMiddleCodeNum((short) 1);
- errorCommand.setDistCodeNum((short) Integer.parseInt(qrCodeValue));
- errorCommand.setStartToDistDistance(allDistance);
- errorCommand.setRunSpeed((short) 1000);
- errorCommand.setRunDirection(ShuttleRunDirection.get(startPath.getDirection()).id);
- errorCommand.setForceMoveDistance(0);
- errorCommand.setIOControl((short) 0);
- errorCommand.setCommandEnd((short) 1);
- break;
- }
- }
- }
-
- shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WORKING);
- //褰撳墠姝ュ簭
- int commandStep = redisCommand.getCommandStep();
- //姝ュ簭鍥為��
- commandStep--;
- redisCommand.setCommandStep(commandStep);
- }
-
- if (!write(errorCommand)) {
- News.error("鍥涘悜绌挎杞﹀懡浠や笅鍙戝け璐ワ紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(errorCommand));
- return false;
- } else {
- News.info("鍥涘悜绌挎杞﹀懡浠や笅鍙戞垚鍔燂紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(errorCommand));
- errorCommands.remove(0);
- redisCommand.setErrorCommands(errorCommands);
- //浠诲姟鏁版嵁淇濆瓨鍒皉edis
- redisUtil.set("shuttle_wrk_no_" + wrkNo, JSON.toJSONString(redisCommand));
- return true;
- }
- }
+ LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, 1);
+ LiftProtocol liftProtocol = liftThread.getLiftProtocol();
List<ShuttleCommand> commands = redisCommand.getAssignCommand().getCommands();
//褰撳墠姝ュ簭
@@ -744,6 +747,14 @@
if (command.getDistCodeNum().intValue() == shuttleProtocol.getCurrentCode().intValue()) {
//涓婁竴鏉℃寚浠ょ殑鐩爣浣嶇疆鍜屽綋鍓嶅皬杞︿綅缃浉鍚岋紝鍒欒瀹氫笂涓�鏉′换鍔″畬鎴�
command.setComplete(true);
+
+ //涓婁竴鏉℃寚浠よ捣鐐规槸鎻愬崌鏈轰簩缁寸爜锛屽垯娓呴浂鎻愬崌鏈轰换鍔″彿
+ if (command.getStartCodeNum().intValue() == liftProtocol.getBarcode().intValue()) {
+ //鍒ゆ柇鎻愬崌鏈烘槸鍚﹀浜庣┖闂�
+ if (liftProtocol.isIdleNoTask()) {
+ liftProtocol.setTaskNo((short) 0);//娓呯┖浠诲姟鍙�
+ }
+ }
}
} else if (command.getCommandWord().intValue() == 2) {
//鎵樼洏椤跺崌鍛戒护
@@ -805,9 +816,6 @@
}
}
- LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, 1);
- LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-
//鍒ゆ柇灏忚溅褰撳墠浜岀淮鐮佹槸鍚︿负鎻愬崌鏈轰簩缁寸爜
if (shuttleProtocol.getCurrentCode().intValue() == liftProtocol.getBarcode().intValue()) {
@@ -817,7 +825,7 @@
if (!liftProtocol.isIdleNoTask()) {
return false;//鎻愬崌鏈哄繖锛岀姝笅鍙戝懡浠�
}
- if (liftProtocol.getTaskNo().intValue() != wrkNo) {
+ if (liftProtocol.getTaskNo().intValue() != 0 && liftProtocol.getTaskNo().intValue() != wrkNo) {
//鎻愬崌鏈哄伐浣滃彿鍜屽綋鍓嶅伐浣滀笉鐩稿悓锛岀姝笅鍙戝懡浠�
return false;
}
@@ -844,6 +852,9 @@
if (!staProtocol.isLiftArrival()) {
return false;//绔欑偣鎻愬崌鏈哄埌浣嶄俊鍙穎alse锛岀姝笅鍙戝懡浠�
}
+
+ //鏉′欢婊¤冻锛屽崰鐢ㄦ彁鍗囨満
+ liftProtocol.setTaskNo(wrkNo);
}
}
@@ -1046,6 +1057,7 @@
return true;
}else {
if (liftProtocol.getPositionArrivalFeedback$() == shuttleLocNoLev) {
+ liftProtocol.setTaskNo(wrkNo);//缁欐彁鍗囨満鍐欏伐浣滃彿锛岄槻姝㈣鍗犵敤
return true;//鎻愬崌鏈哄埌浣�
}
executeLift(liftThread, liftProtocol, redisCommand, shuttleLocNoLev);//璋冨害鎻愬崌鏈�
--
Gitblit v1.9.1