From 0f2eaeeb387850acfede95c5c061b5392dae8688 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 28 六月 2023 16:58:25 +0800
Subject: [PATCH] 寻路算法和避障
---
src/main/java/com/zy/core/thread/ShuttleThread.java | 242 ++++++++++++++++++++++++++++++------------------
1 files changed, 151 insertions(+), 91 deletions(-)
diff --git a/src/main/java/com/zy/core/thread/ShuttleThread.java b/src/main/java/com/zy/core/thread/ShuttleThread.java
index 30dac2d..d6b95ac 100644
--- a/src/main/java/com/zy/core/thread/ShuttleThread.java
+++ b/src/main/java/com/zy/core/thread/ShuttleThread.java
@@ -134,16 +134,19 @@
//閿欒缂栧彿
shuttleProtocol.setErrorCode(modbusTcpNet.getByteTransform().TransInt16(content,8));
//Plc杈撳嚭鐘舵�両O
- boolean[] booleans = modbusTcpNet.getByteTransform().TransBool(content, 10, 2);
- shuttleProtocol.setPlcOutputLift(booleans[1]);
- shuttleProtocol.setPlcOutputTransfer(booleans[2]);
- shuttleProtocol.setPlcOutputBrake(booleans[3]);
- shuttleProtocol.setPlcOutputCharge(booleans[4]);
+ int plcOutIo = modbusTcpNet.getByteTransform().TransUInt16(content, 10);
+ int[] plcOutIos = CommonUtils.byteToBits((byte) plcOutIo);
+ shuttleProtocol.setPlcOutputLift(plcOutIos[1] == 1);
+ shuttleProtocol.setPlcOutputTransfer(plcOutIos[2] == 1);
+ shuttleProtocol.setPlcOutputBrake(plcOutIos[3] == 1);
+ shuttleProtocol.setPlcOutputCharge(plcOutIos[4] == 1);
shuttleProtocol.setPlcOutputStatusIO(modbusTcpNet.getByteTransform().TransInt16(content, 10));
//閿欒淇℃伅鐮�
shuttleProtocol.setStatusErrorCode(modbusTcpNet.getByteTransform().TransInt16(content,12));
+ int plcInIo = modbusTcpNet.getByteTransform().TransUInt16(content, 14);
+ int[] plcInIos = CommonUtils.byteToBits((byte) plcInIo);
//PLC杈撳叆鐘舵��
- shuttleProtocol.setPlcInputStatus(modbusTcpNet.getByteTransform().TransInt16(content,14));
+ shuttleProtocol.setPlcInputStatus((short) plcInIos[6]);
//褰撳墠鎴栬�呬箣鍓嶈鍒扮殑浜岀淮鐮佸��
shuttleProtocol.setCurrentOrBeforeCode(modbusTcpNet.getByteTransform().TransInt16(content,16));
//璇诲埌鐨勪簩缁寸爜X鏂瑰悜鍋忕Щ閲�
@@ -420,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);
@@ -456,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);
@@ -541,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);////鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢�
@@ -577,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);////鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢�
@@ -653,78 +656,78 @@
return false;
}
- 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);//閿欒鎭㈠锛屼娇鐢―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;
- }
- }
+// 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;
+// }
+// }
List<ShuttleCommand> commands = redisCommand.getAssignCommand().getCommands();
//褰撳墠姝ュ簭
@@ -732,6 +735,63 @@
//path璺緞鏁扮洰
int size = commands.size();
ShuttleAssignCommand assignCommand = redisCommand.getAssignCommand();
+
+ if (commandStep != 0) {
+ //鍒ゆ柇涓婁竴鏉℃寚浠ゆ槸鍚﹀畬鎴�
+ ShuttleCommand command = commands.get(commandStep - 1);
+ if (command.getCommandWord().intValue() == 1) {
+ //绉诲姩鍛戒护
+ if (command.getDistCodeNum().intValue() == shuttleProtocol.getCurrentCode().intValue()) {
+ //涓婁竴鏉℃寚浠ょ殑鐩爣浣嶇疆鍜屽綋鍓嶅皬杞︿綅缃浉鍚岋紝鍒欒瀹氫笂涓�鏉′换鍔″畬鎴�
+ command.setComplete(true);
+ }
+ } else if (command.getCommandWord().intValue() == 2) {
+ //鎵樼洏椤跺崌鍛戒护
+ if (command.getPalletLift().intValue() == 1) {
+ //椤跺崌
+ //鍒ゆ柇鏄惁椤跺崌鍒颁綅
+ if (shuttleProtocol.getPlcOutputLift()) {
+ //鑷姩妯″紡
+ if (assignCommand.getAuto() && shuttleProtocol.getPlcInputStatus().intValue() == 1) {
+ //椤跺崌鍒颁綅,涓旀墭鐩橀浄杈炬湁鐗╋紝璁ゅ畾浠诲姟瀹屾垚
+ command.setComplete(true);
+ }else {
+ //鎵嬪姩妯″紡锛屼笉鍒ゆ柇鎵樼洏闆疯揪
+ //椤跺崌鍒颁綅锛岃瀹氫换鍔″畬鎴�
+ command.setComplete(true);
+ }
+ }
+ }else {
+ //涓嬮檷
+ //鍒ゆ柇鏄惁涓嬮檷鍒颁綅锛屽垽鏂墭鐩橀浄杈炬槸鍚︽棤鐗�
+ if (!shuttleProtocol.getPlcOutputLift() && !shuttleProtocol.getPlcOutputTransfer()) {
+ //鑷姩妯″紡
+ if (assignCommand.getAuto() && shuttleProtocol.getPlcInputStatus().intValue() == 0) {
+ //涓嬮檷鍒颁綅锛屼笖鎵樼洏闆疯揪鏃犵墿锛岃瀹氫换鍔″畬鎴�
+ command.setComplete(true);
+ }else {
+ //鎵嬪姩妯″紡锛屼笉鍒ゆ柇鎵樼洏闆疯揪
+ //涓嬮檷鍒颁綅锛屼笖鎵樼洏闆疯揪鏃犵墿锛岃瀹氫换鍔″畬鎴�
+ command.setComplete(true);
+ }
+ }
+ }
+ } else if (command.getCommandWord().intValue() == 5) {
+ //鍏呯數鍛戒护
+ //鍒ゆ柇灏忚溅鍏呯數寮�鍏�
+ if (shuttleProtocol.getPlcOutputCharge()) {
+ //姝e父鍏呯數锛岃瀹氫换鍔″畬鎴�
+ command.setComplete(true);
+ }
+ }
+ //浠诲姟鏁版嵁淇濆瓨鍒皉edis
+ redisUtil.set("shuttle_wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand));
+
+ if (!command.getComplete()) {
+ //涓婁竴鏉′换鍔℃湭瀹屾垚锛岀姝笅鍙戝懡浠�
+ return false;
+ }
+ }
//鍙栧嚭鍛戒护
ShuttleCommand command = commands.get(commandStep);
@@ -757,7 +817,7 @@
if (!liftProtocol.isIdleNoTask()) {
return false;//鎻愬崌鏈哄繖锛岀姝笅鍙戝懡浠�
}
- if (liftProtocol.getTaskNo().intValue() != wrkNo) {
+ if (liftProtocol.getTaskNo().intValue() != 0 && liftProtocol.getTaskNo().intValue() != wrkNo) {
//鎻愬崌鏈哄伐浣滃彿鍜屽綋鍓嶅伐浣滀笉鐩稿悓锛岀姝笅鍙戝懡浠�
return false;
}
--
Gitblit v1.9.1