From 00d9f3f5cf3b046cb42098c9bc13f2313a435f53 Mon Sep 17 00:00:00 2001 From: Junjie <fallin.jie@qq.com> Date: 星期二, 27 六月 2023 10:32:50 +0800 Subject: [PATCH] 提升机搬运前判断目标站是否可入 --- src/main/java/com/zy/core/thread/ShuttleThread.java | 176 +++++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 125 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/zy/core/thread/ShuttleThread.java b/src/main/java/com/zy/core/thread/ShuttleThread.java index d6e8c04..30dac2d 100644 --- a/src/main/java/com/zy/core/thread/ShuttleThread.java +++ b/src/main/java/com/zy/core/thread/ShuttleThread.java @@ -12,6 +12,7 @@ import com.zy.asrs.service.*; import com.zy.asrs.utils.Utils; import com.zy.common.model.NavigateNode; +import com.zy.common.model.enums.NavigationMapType; import com.zy.common.utils.*; import com.zy.core.News; import com.zy.core.ThreadHandler; @@ -129,7 +130,7 @@ //鐢垫睜鐢甸噺鐧惧垎姣� shuttleProtocol.setBatteryPower(modbusTcpNet.getByteTransform().TransInt16(content,4)); //鐢垫睜娓╁害 - shuttleProtocol.setBatteryTemp(modbusTcpNet.getByteTransform().TransInt16(content,6)); + shuttleProtocol.setBatteryTemp(modbusTcpNet.getByteTransform().TransUInt16(content, 6)); //閿欒缂栧彿 shuttleProtocol.setErrorCode(modbusTcpNet.getByteTransform().TransInt16(content,8)); //Plc杈撳嚭鐘舵�両O @@ -150,7 +151,7 @@ //璇诲埌鐨勪簩缁寸爜Y鏂瑰悜鍋忕Щ閲� shuttleProtocol.setCodeOffsetY(modbusTcpNet.getByteTransform().TransInt16(content,20)); //褰撳墠鐨勭數鍘嬪�� - shuttleProtocol.setCurrentVoltage(modbusTcpNet.getByteTransform().TransInt16(content,22)); + shuttleProtocol.setCurrentVoltage(modbusTcpNet.getByteTransform().TransUInt16(content, 22)); //褰撳墠鐨勬ā鎷熼噺鍊� shuttleProtocol.setCurrentAnalogValue(modbusTcpNet.getByteTransform().TransInt16(content,24)); //褰撳墠鐨勫崌闄嶄己鏈嶉�熷害 @@ -365,6 +366,11 @@ OperateResult result = modbusTcpNet.Write("0", array);; if (result != null && result.IsSuccess) { + try { + Thread.sleep(3000);//鍛戒护涓嬪彂鍚庝紤鐪�1s + } catch (InterruptedException e) { + throw new RuntimeException(e); + } News.info("鍥涘悜绌挎杞﹀懡浠や笅鍙慬id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] >>>>> 鍛戒护涓嬪彂锛� {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); return true; @@ -414,7 +420,7 @@ //灏忚溅绉诲姩鍒版彁鍗囨満鍙o紝璁$畻璺緞 //璁$畻灏忚溅璧风偣鍒颁腑鐐规墍闇�鍛戒护 LocMast currentLocMast = locMastService.queryByQrCode(shuttleProtocol.getCurrentCode().toString()); - List<NavigateNode> firstMastResult = NavigateUtils.calc(currentLocMast.getLocNo(), assignCommand.getSourceLocNo(), ShuttleTaskModeType.PAK_IN.id); + List<NavigateNode> firstMastResult = NavigateUtils.calc(currentLocMast.getLocNo(), assignCommand.getSourceLocNo(), NavigationMapType.NORMAL.id);//灏忚溅鍒颁腑鐐癸紝澶勪簬鏃犺揣鐘舵�侊紝浣跨敤姝e父閫氶亾鍦板浘 if (firstMastResult != null) { allNode.addAll(firstMastResult);//灏嗚妭鐐硅繘琛屼繚瀛� @@ -450,7 +456,7 @@ } //璁$畻涓偣鍒扮粓鐐硅矾寰� - List<NavigateNode> secMastResult = NavigateUtils.calc(assignCommand.getSourceLocNo(), assignCommand.getLocNo(), ShuttleTaskModeType.PAK_IN.id); + List<NavigateNode> secMastResult = NavigateUtils.calc(assignCommand.getSourceLocNo(), assignCommand.getLocNo(), NavigationMapType.DFX.id);//灏忚溅浠庝腑鐐瑰埌缁堢偣锛屽浜庢湁璐х姸鎬侊紝浣跨敤DFX鍦板浘 if (secMastResult != null) { allNode.addAll(secMastResult);//灏嗚妭鐐硅繘琛屼繚瀛� @@ -478,15 +484,14 @@ commands.add(getPalletCommand((short) 2)); } - navigateMapData = new NavigateMapData(Utils.getLev(currentLocMast.getLocNo())); - if (firstMastResult != null) { - //鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢� - navigateMapData.writeNavigateNodeToRedisMap(firstMastResult, true);////鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢� + if (firstMastResult == null || secMastResult == null) { + throw new CoolException(MessageFormat.format( "鍥涘悜绌挎杞﹀嚭鍏ュ簱璺緞鎼滅储澶辫触 ===>> [id:{0}] [ip:{1}] [port:{2}]", slave.getId(), slave.getIp(), slave.getPort())); } - if (secMastResult != null) { - navigateMapData.writeNavigateNodeToRedisMap(secMastResult, true);////鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢� - } + navigateMapData = new NavigateMapData(Utils.getLev(currentLocMast.getLocNo())); + //鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢� + navigateMapData.writeNavigateNodeToRedisMap(firstMastResult, true);////鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢� + navigateMapData.writeNavigateNodeToRedisMap(secMastResult, true);////鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢� break; case 3://鎵樼洏椤跺崌 case 4://鎵樼洏涓嬮檷 @@ -525,8 +530,8 @@ //濡傛灉绌挎杞﹀湪鎻愬崌鏈哄唴锛岀Щ鍔ㄦ椂闇�瑕佸厛涓嬪彂鍑烘彁鍗囨満鍛戒护 if (liftProtocol.getBarcode().intValue() == shuttleProtocol.getCurrentCode().intValue()) { //绌挎杞﹀嚭鎻愬崌鏈� - Short liftLev = liftProtocol.getPositionArrivalFeedback();//鎻愬崌鏈轰綅缃� - String liftSiteLocNo = Utils.levToOutInStaLocNo(liftLev.intValue()); + Short liftArrival = liftProtocol.getPositionArrivalFeedback();//鎻愬崌鏈轰綅缃弽棣� + String liftSiteLocNo = Utils.liftArrivalToOutInStaLocNo(liftArrival); LocMast locMast1 = locMastService.selectById(liftSiteLocNo); ShuttleCommand moveCommand = getMoveCommand(liftProtocol.getBarcode(), Short.parseShort(locMast1.getQrCodeValue()), 1400, ShuttleRunDirection.BOTTOM.id, liftProtocol.getBarcode(), 1400, runSpeed); commands.add(moveCommand); @@ -536,7 +541,7 @@ } LocMast locMast = locMastService.queryByQrCode(startQr); - List<NavigateNode> result = NavigateUtils.calc(locMast.getLocNo(), assignCommand.getLocNo(), ShuttleTaskModeType.PAK_IN.id); + List<NavigateNode> result = NavigateUtils.calc(locMast.getLocNo(), assignCommand.getLocNo(), NavigationMapType.NONE.id);//鎵嬪姩鍛戒护-绉诲姩鍛戒护锛屼娇鐢ㄦ棤杩囨护鍦板浘 if (result != null) { //鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢� @@ -572,7 +577,7 @@ int lev = Utils.getLev(locMast1.getLocNo());//绌挎杞﹀綋鍓嶉珮搴� String liftSiteLocNo = Utils.levToOutInStaLocNo(lev);//褰撳墠妤煎眰绔欑偣搴撲綅鍙� LocMast liftSitelocMast = locMastService.selectById(liftSiteLocNo); - List<NavigateNode> result1 = NavigateUtils.calc(locMast1.getLocNo(), liftSiteLocNo, ShuttleTaskModeType.PAK_IN.id); + List<NavigateNode> result1 = NavigateUtils.calc(locMast1.getLocNo(), liftSiteLocNo, NavigationMapType.NONE.id);//绉诲姩鍒版彁鍗囨満锛屼娇鐢ㄦ棤杩囨护鍦板浘 Short endStartCode = null; if (result1 != null) { @@ -648,9 +653,6 @@ return false; } - //灏嗘爣璁扮疆涓篺alse(闃叉閲嶅彂) - shuttleProtocol.setPakMk(false); - List<ShuttleCommand> errorCommands = redisCommand.getErrorCommands(); if (errorCommands.size() > 0) { //浼樺厛鎵ц璇ユ寚浠� @@ -675,7 +677,7 @@ shuttleProtocol.setPakMk(true); return true; }else { - List<NavigateNode> result = NavigateUtils.calc(locMast.getLocNo(), distLocMast.getLocNo(), ShuttleTaskModeType.PAK_IN.id); + List<NavigateNode> result = NavigateUtils.calc(locMast.getLocNo(), distLocMast.getLocNo(), NavigationMapType.DFX.id);//閿欒鎭㈠锛屼娇鐢―FX鍦板浘 if (result != null) { //鑾峰彇鍒嗘璺緞 ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(result); @@ -745,6 +747,45 @@ LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, 1); LiftProtocol liftProtocol = liftThread.getLiftProtocol(); + + + //鍒ゆ柇灏忚溅褰撳墠浜岀淮鐮佹槸鍚︿负鎻愬崌鏈轰簩缁寸爜 + if (shuttleProtocol.getCurrentCode().intValue() == liftProtocol.getBarcode().intValue()) { + //灏忚溅褰撳墠鍛戒护璧峰浣嶇疆灏辨槸鎻愬崌鏈轰簩缁寸爜锛岃鏄庡皬杞﹂渶瑕佸悜鎻愬崌鏈哄绉诲姩锛屽垯闇�瑕佸垽鏂姸鎬佹槸鍚︽弧瓒� + if (command.getStartCodeNum().intValue() == liftProtocol.getBarcode().intValue()){ + //鎻愬崌鏈烘槸鍚︾┖闂诧紝鎻愬崌鏈烘槸鍚﹀埌杈剧洰鏍囨ゼ灞傦紝鐩爣妤煎眰鏄惁缁欏嚭鎻愬崌鏈哄埌浣嶄俊鍙蜂綅 + if (!liftProtocol.isIdleNoTask()) { + return false;//鎻愬崌鏈哄繖锛岀姝笅鍙戝懡浠� + } + if (liftProtocol.getTaskNo().intValue() != wrkNo) { + //鎻愬崌鏈哄伐浣滃彿鍜屽綋鍓嶅伐浣滀笉鐩稿悓锛岀姝笅鍙戝懡浠� + return false; + } + + Short distCodeNum = command.getDistCodeNum();//鐩爣浜岀淮鐮� + BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class); + BasDevp basDevp = basDevpService.queryByQrCode(distCodeNum.intValue());//鐩爣绔欑偣 + if (basDevp == null) { + return false;//鎵句笉鍒扮洰鏍囩珯锛岀姝笅鍙戝懡浠� + } + + int lev = Utils.getLev(basDevp.getLocNo());//鐩爣浜岀淮鐮佹墍鍦ㄦゼ灞� + int liftLev = liftProtocol.getLev().intValue();//鎻愬崌鏈烘墍鍦ㄦゼ灞� + if (liftLev != lev) { + return false;//鎻愬崌鏈轰笉鍦ㄧ洰鏍囨ゼ灞傦紝绂佹涓嬪彂鍛戒护 + } + + //鑾峰彇鐩爣绔欎俊鎭� + SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); + StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo()); + if (staProtocol == null) { + return false;//绔欑偣淇℃伅涓嶅瓨鍦紝绂佹涓嬪彂鍛戒护 + } + if (!staProtocol.isLiftArrival()) { + return false;//绔欑偣鎻愬崌鏈哄埌浣嶄俊鍙穎alse锛岀姝笅鍙戝懡浠� + } + } + } //涓嬪彂鍛戒护 if (!write(command)) { @@ -752,6 +793,27 @@ return false; } else { News.info("鍥涘悜绌挎杞﹀懡浠や笅鍙戞垚鍔燂紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command)); + + //灏嗘爣璁扮疆涓篺alse(闃叉閲嶅彂) + shuttleProtocol.setPakMk(false); + + //淇濆瓨鏁版嵁鍒版暟鎹簱鍋氭祦姘� + 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) + ); + shuttleOptService.insert(opt); + } //鍒ゆ柇鏁版嵁鏄惁鎵ц瀹屾垚 if (commandStep < size - 1) { @@ -763,23 +825,6 @@ redisUtil.set("shuttle_wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand)); }else { //宸叉墽琛屽畬鎴� - //淇濆瓨鏁版嵁鍒版暟鎹簱鍋氭祦姘� - 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(assignCommand) - ); - shuttleOptService.insert(opt); - } if (redisCommand.getLiftSecurityMk()) { //鏇鹃攣瀹氳繃鎻愬崌鏈猴紝闇�瑕佽繘琛岃В閿� @@ -814,7 +859,7 @@ }else { shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING); } - News.info("鍥涘悜绌挎杞︿换鍔℃墽琛屽畬鎴愮瓑寰呯‘璁や腑锛岀┛姊溅鍙�={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command)); + News.info("鍥涘悜绌挎杞︿换鍔℃墽琛屼笅鍙戝畬鎴愮瓑寰呮墽琛岀粨鏉燂紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command)); } } @@ -874,14 +919,19 @@ qrCodeValues.add(Short.parseShort(basDevp.getQrCodeValue())); } - //閬嶅巻鎵�鏈夋寚浠わ紝鍒ゆ柇鏄惁鏈夊埌鎻愬崌鏈哄彛鐨勬寚浠わ紝骞惰幏鍙栧埌杈捐鎻愬崌鏈哄彛鎵�闇�姝ュ簭 + //閬嶅巻鎵�鏈夋寚浠わ紝鍒ゆ柇鏄惁鏈夊埌鎻愬崌鏈哄彛鐨勬寚浠ゆ垨浠庢彁鍗囨満鍙e墠寰�鎻愬崌鏈哄唴鐨勬寚浠わ紝骞惰幏鍙栧埌杈捐鎻愬崌鏈哄彛鎵�闇�姝ュ簭 int step = 0; Integer siteNo = null;//绔欑偣鍙� ShuttleCommand command = null; for (int i = 0; i < commands.size(); i++) { command = commands.get(i); for (Short qrCodeValue : qrCodeValues) { - if (qrCodeValue.intValue() == command.getDistCodeNum().intValue()) { + //鐩爣浣嶇疆鏄彁鍗囨満鍙o紝鎴栬捣鐐逛綅缃槸鎻愬崌鏈哄彛涓旂洰鏍囨槸鍘绘彁鍗囨満鍐� + if (command.getDistCodeNum() == null || command.getStartCodeNum() == null) { + continue; + } + + if (qrCodeValue.intValue() == command.getDistCodeNum().intValue() || (qrCodeValue.intValue() == command.getStartCodeNum().intValue() && command.getDistCodeNum().intValue() == liftProtocol.getBarcode().intValue())) { //瀛樺湪 step = i + 1; BasDevp basDevp = basDevpService.queryByQrCode(qrCodeValue.intValue()); @@ -896,17 +946,27 @@ return true; } - //鍒ゆ柇涓嬩竴姝ユ槸鍚︿负鎻愬崌鏈哄彛 - if (commandStep + 1 != step) { - //涓嬩竴姝ヤ笉鏄彁鍗囨満鍙o紝璺宠繃鍚庣画娴佺▼ - return true; + //鍒ゆ柇涓嬩竴姝ユ槸鍚︿负鎻愬崌鏈哄彛鎴栨彁鍗囨満鍐� + if (commandStep < commands.size()) { + ShuttleCommand command1 = commands.get(commandStep); + Short distCodeNum = command1.getDistCodeNum(); + if (distCodeNum != null) { + BasDevp basDevp = basDevpService.queryByQrCode(Integer.valueOf(distCodeNum)); + if (basDevp == null && distCodeNum.intValue() != liftProtocol.getBarcode().intValue()) { + return true;//涓嬩竴姝ヤ笉鏄彁鍗囨満鍙o紝璺宠繃鍚庣画娴佺▼ + } + } } +// if (commandStep + 1 != step) { +// //涓嬩竴姝ヤ笉鏄彁鍗囨満鍙o紝璺宠繃鍚庣画娴佺▼ +// return true; +// } //鑾峰彇鍥涘悜绌挎杞﹀綋鍓嶆ゼ灞� String shuttleLocNo = shuttleProtocol.getCurrentLocNo();//浜岀淮鐮佸搴斿簱浣嶅彿 Integer shuttleLocNoLev = shuttleLocNo == null ? 0 : Utils.getLev(shuttleLocNo);//搴撲綅鍙峰搴斿眰楂� - //鍒ゆ柇鎻愬崌鏈烘槸鍚﹀湪鐩爣妤煎眰 + //鍒ゆ柇绌挎杞﹀拰鎻愬崌鏈烘槸鍚﹀湪鐩爣妤煎眰 if (shuttleLocNoLev >= 2) { shuttleLocNoLev++; } @@ -915,13 +975,28 @@ if (siteNo != null) { SiemensDevpThread siemensDevpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); StaProtocol staProtocol = siemensDevpThread.getStation().get(siteNo); - if (staProtocol.isLiftArrival() - && liftProtocol.getPositionArrivalFeedback().intValue() == shuttleLocNoLev) { - //杈撻�佺嚎鍙嶉鎻愬崌鏈哄埌浣嶄笖鎻愬崌鏈烘ゼ灞傚弽棣堜负鍚屼竴灞傦紝鐩存帴鏀捐 + if (!staProtocol.isLiftArrival()) { + //杈撻�佺嚎鍙嶉鎻愬崌鏈烘病鏈夊埌浣� + executeLift(liftThread, liftProtocol, redisCommand, shuttleLocNoLev);//璋冨害鎻愬崌鏈� + return false; + } + + if (shuttleProtocol.getCurrentCode().intValue() == liftProtocol.getBarcode().intValue()) { + //灏忚溅澶勪簬鎻愬崌鏈哄唴 return true; + }else { + if (liftProtocol.getPositionArrivalFeedback$() == shuttleLocNoLev) { + return true;//鎻愬崌鏈哄埌浣� + } + executeLift(liftThread, liftProtocol, redisCommand, shuttleLocNoLev);//璋冨害鎻愬崌鏈� + return false;//鎻愬崌鏈烘病鏈夊埌浣� } } + return false; + } + + private boolean executeLift(LiftThread liftThread, LiftProtocol liftProtocol, ShuttleRedisCommand redisCommand, Integer shuttleLocNoLev) {//璋冨害鎻愬崌鏈� if (liftProtocol.getRunning()) { //鎻愬崌鏈鸿繍琛屼腑锛岀姝笅鍙� return false; @@ -939,7 +1014,7 @@ liftProtocol.setSecurityMk(true);//鏍囪缃负true锛岄槻姝㈠叾浠栦换鍔″崰鐢ㄥ綋鍓嶆彁鍗囨満 redisCommand.setLiftSecurityMk(true);//鏍囪缃负true锛岄槻姝㈠叾浠栦换鍔″崰鐢ㄥ綋鍓嶆彁鍗囨満 //浠诲姟鏁版嵁淇濆瓨鍒皉edis - redisUtil.set("shuttle_wrk_no_" + wrkNo, JSON.toJSONString(redisCommand)); + redisUtil.set("shuttle_wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand)); //鍛戒护list ArrayList<LiftCommand> liftCommands = new ArrayList<>(); @@ -952,8 +1027,7 @@ liftAssignCommand.setTaskNo(liftProtocol.getTaskNo()); //涓嬪彂浠诲姟 MessageQueue.offer(SlaveType.Lift, liftProtocol.getLiftNo().intValue(), new Task(3, liftAssignCommand)); - - return false; + return true; } /** @@ -1046,7 +1120,7 @@ * 姝e父绉诲姩鍛戒护,榛樿绉诲姩閫熷害1000 */ public ShuttleCommand getMoveCommand(Short startCodeNum, Short distCodeNum, Integer startToDistDistance, Short runDirection, Short middleCodeNum, Integer middleToDistDistance) { - return getMoveCommand(startCodeNum, distCodeNum, startToDistDistance, runDirection, middleCodeNum, middleToDistDistance, 1000); + return getMoveCommand(startCodeNum, distCodeNum, startToDistDistance, runDirection, middleCodeNum, middleToDistDistance, 500); } /** -- Gitblit v1.9.1