From dcdfc93b50febf61301832d91dfcddcfa1ca5403 Mon Sep 17 00:00:00 2001 From: 1 <1@123> Date: 星期三, 14 五月 2025 14:06:36 +0800 Subject: [PATCH] # --- src/main/java/com/zy/core/thread/RgvThread.java | 238 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 207 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/zy/core/thread/RgvThread.java b/src/main/java/com/zy/core/thread/RgvThread.java index f8cc43d..d0e09bd 100644 --- a/src/main/java/com/zy/core/thread/RgvThread.java +++ b/src/main/java/com/zy/core/thread/RgvThread.java @@ -48,11 +48,11 @@ // private RgvProtocol rgvProtocol; private TaskProtocolCache taskProtocolCache = new TaskProtocolCache(); // # 杞ㄩ亾鎬婚暱 - private Long trackEntireLength = 100L; + private Long trackEntireLength = 224000L; //# 杞ㄩ亾鍩哄噯鐐� - private Long trackBenchmark = 100L; + private Long trackBenchmark = 1L; // # 閬胯璺濈 - private Long avoidDistance = 100L; + private Long avoidDistance = 5000L; /** * 宸ヤ綅1澶嶄綅淇″彿 @@ -63,6 +63,8 @@ */ private boolean resetFlag2 = false; + private boolean connectRgv = false; + public RgvThread(RgvSlave slave) { this.slave = slave; } @@ -70,20 +72,48 @@ @Override @SuppressWarnings("InfiniteLoopStatement") public void run() { - boolean connect = this.connect(); - if (connect) { + connectRgv = this.connect(); + while(!connectRgv){ + try { + connectRgv = this.connect(); + Thread.sleep(100); + } catch (Exception e){ - // 鍚姩璇绘暟鎹嚎绋� - new Thread(this::readStatusRgv).start(); + } + } - // 鍚姩浠诲姟涓嬪彂绾跨▼ - new Thread(this::taskIssued).start(); + // 鍚姩璇绘暟鎹嚎绋� + new Thread(this::rgvConnect).start(); - // 鍚姩婕父绾跨▼ - new Thread(this::taskWalkIssued).start(); + new Thread(this::readStatusRgv).start(); - // 鍚姩浠诲姟瀹屾垚绾跨▼ - new Thread(this::taskComplete).start(); + // 鍚姩浠诲姟涓嬪彂绾跨▼ + new Thread(this::taskIssued).start(); + + // 鍚姩婕父绾跨▼ + new Thread(this::taskWalkIssued).start(); + new Thread(this::taskWalkIssued2).start(); + + // 鍚姩浠诲姟瀹屾垚绾跨▼ + new Thread(this::taskComplete).start(); + } + + private void rgvConnect() { + while (true) { + try { + if(!connectRgv){ + try { + connectRgv = this.connect(); + Thread.sleep(100); + } catch (Exception e){ + + } + } + } catch (Exception e) { + log.error("RGV鏁版嵁璇诲彇绾跨▼寮傚父锛侊紒锛�" + e.getMessage()); + initRgv(); +// e.printStackTrace(); + } } } @@ -108,7 +138,80 @@ * 瀹屾垚 */ private void taskComplete() { + while (true) { + try { + Thread.sleep(100); + OperateResultExOne<byte[]> result = siemensNet.Read("DB100.12", (short) 1); + boolean[] status = siemensNet.getByteTransform().TransBool(result.Content, 0, 1); + if (status[0]){ + OperateResult result4 = siemensNet.Write("DB100.12.0", false); + } + } catch (Exception e) { + log.error("RGV鏁版嵁璇诲彇绾跨▼寮傚父锛侊紒锛�" + e.getMessage()); + initRgv(); +// e.printStackTrace(); + } + } + + } + + /** + * 浠诲姟涓嬪彂 + */ + private void taskWalkIssued2() { + while (true) { + try { + // 浼戠湢 1 绉� + Thread.sleep(100); + if (!deviceDetection()) { + continue; + } + RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId()); + RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); + if (rgvProtocol == null || rgvTaskProtocol == null) { + initRgv(); + rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId()); + rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); + } + if (rgvTaskProtocol.getAvoid() != 0) { + continue; + } + if (!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE)){ + continue; + } + if (rgvProtocol.getLoaded() == -1){ + continue; + } + + List<TaskProtocol> allTakeTaskProtocol = taskProtocolCache.getAllWalkTaskProtocol(); + for (TaskProtocol taskProtocol : allTakeTaskProtocol) { + if (taskProtocol.getIsRunning() == 1) {//鍑嗗涓嬪彂 + // 鍙岃溅 + if (rgvOtherStatusEnable()) { + //鍙︿竴鍙拌溅鏄惁鍏佽姝ゅ彴杞︽墽琛� + if (!otherRgvAvoid(taskProtocol.getTargetPosition())) { + continue; + } + } + if (taskProtocol.getTargetPosition()<=rgvProtocol.getRgvPos()+50 + && taskProtocol.getTargetPosition()>=rgvProtocol.getRgvPos()-50){ + taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection()); + break; + } else { + Thread.sleep(100); + TaskProtocol issued = new TaskProtocol(taskProtocol,true); + write(issued); + taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection()); + break; + } + } + } + } catch (Exception e) { + log.error("RGV鍙栬揣浠诲姟涓嬪彂绾跨▼寮傚父锛侊紒锛�" + e.getMessage()); +// e.printStackTrace(); + } + } } /** @@ -134,6 +237,8 @@ TaskProtocol issued = new TaskProtocol(); issued.setTaskNo(32222L); issued.setTargetPosition(rgvTaskProtocol.getAvoidingTheDestination()); + issued.setTaskStatus(1); + issued.setDirection(true); write(issued); rgvTaskProtocol.setAvoid(0); @@ -168,11 +273,17 @@ if (rgvTaskProtocol.getAvoid() != 0) { continue; } + if (!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE)){ + continue; + } + if (rgvProtocol.getLoaded() == -1){ + continue; + } List<TaskProtocol> allTakeTaskProtocol = taskProtocolCache.getTakeOrPutTaskProtocol(rgvProtocol.getLoaded()); for (TaskProtocol taskProtocol : allTakeTaskProtocol) { if (taskProtocol.getIsRunning() == 1) {//鍑嗗涓嬪彂 - RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); +// RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); //鍙岃溅 if (rgvOtherStatusEnable()) { //鍙︿竴鍙拌溅鏄惁鍏佽姝ゅ彴杞︽墽琛� @@ -180,12 +291,19 @@ continue; } } - Thread.sleep(100); - TaskProtocol issued = new TaskProtocol(taskProtocol); - write(issued); - taskProtocol.setIsRunning(taskProtocol.getIsRunning() + 1); - taskProtocolCache.updateTaskProtocol(taskProtocol); - break; + if (taskProtocol.getTargetPosition()<=rgvProtocol.getRgvPos()+50 + && taskProtocol.getTargetPosition()>=rgvProtocol.getRgvPos()-50){ +// Thread.sleep(100); + TaskProtocol issued = new TaskProtocol(taskProtocol); + write(issued); + taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection()); + break; + } else { + Thread.sleep(100); + TaskProtocol issued = new TaskProtocol(taskProtocol,true); + write(issued); + break; + } } } } catch (Exception e) { @@ -254,6 +372,10 @@ log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯� 鑱旂郴绠$悊鍛橈紒锛侊紒"); return false; } + long avoidAbs = Math.abs(avoid - rgvProtocolOther.getRgvPos()); + if (avoidAbs<51){ + return true; + } rgvTaskProtocolOther.setAvoid(1); rgvTaskProtocolOther.setAvoidingTheDestination(avoid); RgvTaskCache.updateRgvStatus(rgvTaskProtocolOther); @@ -270,6 +392,10 @@ log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯� 鑱旂郴绠$悊鍛橈紒锛侊紒"); return false; } + long avoidAbs = Math.abs(avoid - rgvProtocolOther.getRgvPos()); + if (avoidAbs<51){ + return true; + } rgvTaskProtocolOther.setAvoid(1); rgvTaskProtocolOther.setAvoidingTheDestination(avoid); RgvTaskCache.updateRgvStatus(rgvTaskProtocolOther); @@ -281,10 +407,14 @@ > avoidDistance) {//鏃犻渶閬胯 return true; } else { - if (rgvProtocolOther.getRgvPosDestination() >= rgvProtocolOther.getRgvPos()) { + if (rgvProtocolOther.getRgvPosDestination() >= rgvProtocolOther.getRgvPos()-50) { long avoid = rgvProtocolOther.getRgvPos() - rgvProtocolOther.getCarBodyJiaoMing() - avoidDistance - rgvProtocol.getCarBodyKunPeng(); if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[1])) { log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯� 鑱旂郴绠$悊鍛橈紒锛侊紒"); + return false; + } + long avoidAbs = Math.abs(avoid - rgvProtocol.getRgvPos()); + if (avoidAbs<51){ return false; } rgvTaskProtocol.setAvoid(1); @@ -293,6 +423,12 @@ return false; } return false; + } + } else { + if ((rgvProtocolOther.getRgvPosDestinationOrPos(true) - rgvProtocolOther.getCarBodyJiaoMing()) + - (targetPosition + rgvProtocol.getCarBodyKunPeng()) + > avoidDistance) {//鏃犻渶閬胯 + return true; } } } else { @@ -306,6 +442,10 @@ if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[1])) { log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯� 鑱旂郴绠$悊鍛橈紒锛侊紒"); return false; + } + long avoidAbs = Math.abs(avoid - rgvProtocolOther.getRgvPos()); + if (avoidAbs<51){ + return true; } rgvTaskProtocolOther.setAvoid(1); rgvTaskProtocolOther.setAvoidingTheDestination(avoid); @@ -323,6 +463,10 @@ log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯� 鑱旂郴绠$悊鍛橈紒锛侊紒"); return false; } + long avoidAbs = Math.abs(avoid - rgvProtocolOther.getRgvPos()); + if (avoidAbs<51){ + return true; + } rgvTaskProtocolOther.setAvoid(1); rgvTaskProtocolOther.setAvoidingTheDestination(avoid); RgvTaskCache.updateRgvStatus(rgvTaskProtocolOther); @@ -335,10 +479,14 @@ > avoidDistance) {//鏃犻渶閬胯 return true; } else { - if (rgvProtocolOther.getRgvPosDestination() <= rgvProtocolOther.getRgvPos()) { + if (rgvProtocolOther.getRgvPosDestination() <= rgvProtocolOther.getRgvPos() + 50) { long avoid = rgvProtocolOther.getRgvPos() + rgvProtocolOther.getCarBodyKunPeng() + avoidDistance + rgvProtocol.getCarBodyJiaoMing(); if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[0])) { log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯� 鑱旂郴绠$悊鍛橈紒锛侊紒"); + return false; + } + long avoidAbs = Math.abs(avoid - rgvProtocol.getRgvPos()); + if (avoidAbs<51){ return false; } rgvTaskProtocol.setAvoid(1); @@ -347,6 +495,12 @@ return false; } return false; + } + } else { + if ((rgvProtocolOther.getRgvPosDestinationOrPos(false) - rgvProtocolOther.getCarBodyJiaoMing()) + - (targetPosition + rgvProtocol.getCarBodyKunPeng()) + > avoidDistance) {//鏃犻渶閬胯 + return true; } } } @@ -390,7 +544,7 @@ rgvTaskProtocol = new RgvTaskProtocol(); rgvTaskProtocol.setRgvNo(slave.getId()); } - rgvTaskProtocol.setAvoid(-1); + rgvTaskProtocol.setAvoid(0); rgvTaskProtocol.setAvoidingTheDestination(0L); RgvStatusCache.updateRgvStatus(rgvProtocol); @@ -425,21 +579,35 @@ */ private void readStatus() { try { - OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 34); + OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 19); if (result.IsSuccess) { // 鏋勫缓璁惧鐘舵�佸璞� RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId()); if (rgvProtocol == null) { rgvProtocol = new RgvProtocol(); - rgvProtocol.setRgvNo(slave.getId()); } - rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0)); - rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 2)); - rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransUInt32(result.Content, 10)); - rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 20)); + rgvProtocol.setRgvNo(slave.getId()); + rgvProtocol.setCarBodyJiaoMing(slave.getCarBodyJiaoMing()); + rgvProtocol.setCarBodyKunPeng(slave.getCarBodyKunPeng()); + + rgvProtocol.setRgvPos((long)siemensNet.getByteTransform().TransInt32(result.Content, 0)); + rgvProtocol.setRgvPosDestination((long)siemensNet.getByteTransform().TransInt32(result.Content, 4)); + if (rgvProtocol.getRgvPosDestination()==0L){ + rgvProtocol.setRgvPosDestination(rgvProtocol.getRgvPos()); + } + rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 8)); + rgvProtocol.setTaskNo((long)siemensNet.getByteTransform().TransInt32(result.Content, 10)); + + rgvProtocol.setRgvNo((int)siemensNet.getByteTransform().TransInt16(result.Content, 14)); + rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 16)); +// rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 20)); // rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 28)); // rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 40)); // rgvProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 48)); + +// OperateResultExOne<byte[]> result11 = siemensNet.Read("DB100.12", (short) 1); + boolean[] status = siemensNet.getByteTransform().TransBool(result.Content, 18, 1); + rgvProtocol.setLoaded(status[0]? (short)1:(short)0); OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛", DateUtils.convert(new Date()), slave.getId())); // // 宸ヤ綅1澶嶄綅淇″彿 @@ -479,6 +647,7 @@ } else { initRgv(); + connectRgv = false; // OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆戣鍙朢GV plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot())); log.error("璇诲彇RGV plc鐘舵�佷俊鎭け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); } @@ -501,14 +670,21 @@ // convertRow(command); // taskProtocol.setRgvNo(slave.getId()); Long[] array = new Long[11]; + OperateResult result41 = siemensNet.Write("DB100.12.0", false); + // array[0] = taskProtocol.getAckFinish1(); // array[1] = taskProtocol.getTaskNo(); // array[2] = taskProtocol.getTaskMode(); // array[4] = command.getDestinationStaNo(); // array[10] = taskProtocol.getCommand(); - OperateResult result = siemensNet.Write("DB100.0", taskProtocol.getTaskNo()); - OperateResult result1 = siemensNet.Write("DB100.1", taskProtocol.isDirection()); // 鎵ц鏂瑰悜锛堥潰鏈濊建閬� 瀹氫綅鍊煎乏灏忓彸澶э級 true:宸� false:鍙� + int taskStatus = taskProtocol.getTaskStatus(); + OperateResult result = siemensNet.Write("DB100.0", taskProtocol.getTargetPosition().intValue()); + OperateResult result1 = siemensNet.Write("DB100.4", (short) taskStatus); + OperateResult result2 = siemensNet.Write("DB100.6", taskProtocol.getTaskNo().intValue()); + OperateResult result3 = siemensNet.Write("DB100.10", taskProtocol.isDirection()? (short) 1 : (short) 2); // 鎵ц鏂瑰悜锛堥潰鏈濊建閬� 瀹氫綅鍊煎乏灏忓彸澶э級 true:宸� false:鍙� + + OperateResult result4 = siemensNet.Write("DB100.12.0", true); // if (taskProtocol.getAckFinish1() == 0) { // short commandFinish = 3; //宸ヤ綅1銆�2浠诲姟鍚屾椂鍐欏叆 // Thread.sleep(100L); -- Gitblit v1.9.1