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 |  461 +++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 317 insertions(+), 144 deletions(-)

diff --git a/src/main/java/com/zy/core/thread/RgvThread.java b/src/main/java/com/zy/core/thread/RgvThread.java
index 15214fe..d0e09bd 100644
--- a/src/main/java/com/zy/core/thread/RgvThread.java
+++ b/src/main/java/com/zy/core/thread/RgvThread.java
@@ -13,6 +13,7 @@
 import com.zy.asrs.service.BasRgvOptService;
 import com.zy.asrs.service.BasRgvService;
 import com.zy.asrs.utils.RouteUtils;
+import com.zy.asrs.utils.TrackRangeUtils;
 import com.zy.core.ThreadHandler;
 import com.zy.core.cache.*;
 import com.zy.core.enums.RgvModeType;
@@ -44,14 +45,14 @@
 
     private SiemensS7Net siemensNet;
     private RgvSlave slave;
-//    private RgvProtocol rgvProtocol;
+    //    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澶嶄綅淇″彿
@@ -62,6 +63,8 @@
      */
     private boolean resetFlag2 = false;
 
+    private boolean connectRgv = false;
+
     public RgvThread(RgvSlave slave) {
         this.slave = slave;
     }
@@ -69,21 +72,52 @@
     @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::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();
+            }
         }
     }
 
-    private void readStatusRgv(){
+    private void readStatusRgv() {
         while (true) {
             try {
                 Thread.sleep(100);
@@ -91,13 +125,93 @@
                 readStatus();
 
             } catch (Exception e) {
-                log.error("RGV鏁版嵁璇诲彇绾跨▼寮傚父锛侊紒锛�"+e.getMessage());
+                log.error("RGV鏁版嵁璇诲彇绾跨▼寮傚父锛侊紒锛�" + e.getMessage());
                 initRgv();
 //                e.printStackTrace();
             }
 
         }
 
+    }
+
+    /**
+     * 瀹屾垚
+     */
+    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();
+            }
+        }
     }
 
     /**
@@ -109,7 +223,7 @@
                 // 浼戠湢 1 绉�
                 Thread.sleep(100);
 
-                if (!deviceDetection()){
+                if (!deviceDetection()) {
                     continue;
                 }
                 RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
@@ -123,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);
 
@@ -130,7 +246,7 @@
                 RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
 
             } catch (Exception e) {
-                log.error("RGV琛岃蛋浠诲姟涓嬪彂绾跨▼寮傚父锛侊紒锛�"+e.getMessage());
+                log.error("RGV琛岃蛋浠诲姟涓嬪彂绾跨▼寮傚父锛侊紒锛�" + e.getMessage());
 //                e.printStackTrace();
             }
         }
@@ -144,7 +260,7 @@
             try {
                 // 浼戠湢 1 绉�
                 Thread.sleep(100);
-                if (!deviceDetection()){
+                if (!deviceDetection()) {
                     continue;
                 }
                 RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
@@ -157,38 +273,51 @@
                 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());
+                for (TaskProtocol taskProtocol : allTakeTaskProtocol) {
+                    if (taskProtocol.getIsRunning() == 1) {//鍑嗗涓嬪彂
+//                        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
                         //鍙岃溅
-                        if (rgvOtherStatusEnable()){
+                        if (rgvOtherStatusEnable()) {
                             //鍙︿竴鍙拌溅鏄惁鍏佽姝ゅ彴杞︽墽琛�
-                            if (!otherRgvAvoid(taskProtocol.getTargetPosition())){
+                            if (!otherRgvAvoid(taskProtocol.getTargetPosition())) {
                                 continue;
                             }
                         }
-                        Thread.sleep(200);
-                        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) {
-                log.error("RGV鍙栬揣浠诲姟涓嬪彂绾跨▼寮傚父锛侊紒锛�"+e.getMessage());
+                log.error("RGV鍙栬揣浠诲姟涓嬪彂绾跨▼寮傚父锛侊紒锛�" + e.getMessage());
 //                e.printStackTrace();
             }
         }
     }
 
-    public boolean deviceDetection(){
+    public boolean deviceDetection() {
         RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
         RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
 
-        if (rgvProtocol == null || rgvTaskProtocol ==null) {
+        if (rgvProtocol == null || rgvTaskProtocol == null) {
             return false;
         }
         if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) || rgvProtocol.getRgvPos().equals(0L) || rgvTaskProtocol.getAvoid() == -1 || rgvProtocol.getRgvPosDestination() == 0L
@@ -201,20 +330,20 @@
         if (rgvProtocolOther == null) {
             return false;
         }
-        if (rgvProtocolOther.statusEnable){
-            if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L) || rgvTaskProtocolOther.getAvoid() == -1  || rgvProtocolOther.getRgvPosDestination() == 0L) {
+        if (rgvProtocolOther.statusEnable) {
+            if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L) || rgvTaskProtocolOther.getAvoid() == -1 || rgvProtocolOther.getRgvPosDestination() == 0L) {
                 return false;
             }
         }
         return true;
     }
 
-    public boolean rgvOtherStatusEnable(){
+    public boolean rgvOtherStatusEnable() {
         RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
         if (rgvProtocolOther == null) {
             return true;
         }
-        if (rgvProtocolOther.statusEnable){
+        if (rgvProtocolOther.statusEnable) {
 //            if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L)) {
             return true;
 //            }
@@ -222,136 +351,156 @@
         return false;
     }
 
-    public boolean otherRgvAvoid(Long targetPosition){
+    public boolean otherRgvAvoid(Long targetPosition) {
         RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
         RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
 
         RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
+        RgvTaskProtocol rgvTaskProtocolOther = RgvTaskCache.getRgvStatus(slave.getOtherId());
+        Long[][] avoidRange = new TrackRangeUtils().avoidRange(slave, trackEntireLength, trackBenchmark, avoidDistance);
 
-        if (rgvProtocol.getRgvPos()<rgvProtocolOther.getRgvPos()){
-            if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE)){
-                if ((rgvProtocolOther.getRgvPos()-rgvProtocolOther.getCarBodyJiaoMing())
-                        - (targetPosition+rgvProtocol.getCarBodyKunPeng())
-                        > avoidDistance){//鏃犻渶閬胯
+        if (new TrackRangeUtils().IsItSmall(slave)) {
+
+            if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE)) {
+                if ((rgvProtocolOther.getRgvPos() - rgvProtocolOther.getCarBodyJiaoMing())
+                        - (targetPosition + rgvProtocol.getCarBodyKunPeng())
+                        > avoidDistance) {//鏃犻渶閬胯
                     return true;
                 } else {
                     long avoid = targetPosition + rgvProtocol.getCarBodyKunPeng() + avoidDistance + rgvProtocolOther.getCarBodyJiaoMing();
-                    if (avoid > trackEntireLength-rgvProtocolOther.getCarBodyKunPeng()){
-                        log.error("閬胯瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
+                    if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[0])) {
+                        log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
                         return false;
                     }
-                    rgvTaskProtocol.setAvoid(1);
-                    rgvTaskProtocol.setAvoidingTheDestination(avoid);
-                    RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
+                    long avoidAbs = Math.abs(avoid - rgvProtocolOther.getRgvPos());
+                    if (avoidAbs<51){
+                        return true;
+                    }
+                    rgvTaskProtocolOther.setAvoid(1);
+                    rgvTaskProtocolOther.setAvoidingTheDestination(avoid);
+                    RgvTaskCache.updateRgvStatus(rgvTaskProtocolOther);
                     return true;
                 }
-            } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.ROAM)){
-                if ((rgvProtocolOther.getRgvPosDestination()-rgvProtocolOther.getCarBodyJiaoMing())
-                        - (targetPosition+rgvProtocol.getCarBodyKunPeng())
-                        > avoidDistance){//鏃犻渶閬胯
+            } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.ROAM)) {
+                if ((rgvProtocolOther.getRgvPosDestination() - rgvProtocolOther.getCarBodyJiaoMing())
+                        - (targetPosition + rgvProtocol.getCarBodyKunPeng())
+                        > avoidDistance) {//鏃犻渶閬胯
                     return true;
                 } else {
                     long avoid = targetPosition + rgvProtocol.getCarBodyKunPeng() + avoidDistance + rgvProtocolOther.getCarBodyJiaoMing();
-                    if (avoid > trackEntireLength-rgvProtocolOther.getCarBodyKunPeng()){
-                        log.error("閬胯瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
+                    if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[0])) {
+                        log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
                         return false;
                     }
-                    rgvTaskProtocol.setAvoid(1);
-                    rgvTaskProtocol.setAvoidingTheDestination(avoid);
-                    RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
+                    long avoidAbs = Math.abs(avoid - rgvProtocolOther.getRgvPos());
+                    if (avoidAbs<51){
+                        return true;
+                    }
+                    rgvTaskProtocolOther.setAvoid(1);
+                    rgvTaskProtocolOther.setAvoidingTheDestination(avoid);
+                    RgvTaskCache.updateRgvStatus(rgvTaskProtocolOther);
                     return true;
                 }
-            } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.WORKING)){
-                if ((rgvProtocolOther.getRgvPosDestination()-rgvProtocolOther.getCarBodyJiaoMing())
-                        - (targetPosition+rgvProtocol.getCarBodyKunPeng())
-                        > avoidDistance){//鏃犻渶閬胯
+            } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.WORKING)) {
+                if ((rgvProtocolOther.getRgvPosDestination() - rgvProtocolOther.getCarBodyJiaoMing())
+                        - (targetPosition + rgvProtocol.getCarBodyKunPeng())
+                        > avoidDistance) {//鏃犻渶閬胯
                     return true;
                 } else {
-                    RgvThread rgvThreadOther = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvProtocolOther.getRgvNo());
-                    TaskProtocolCache taskProtocolCacheOther = rgvThreadOther.getTaskProtocolCache();
-                    List<TaskProtocol> allPutTaskProtocol = taskProtocolCacheOther.getAllPutTaskProtocol();
-                    if (allPutTaskProtocol.size() > 1){
-                        return false;
-                    }
-                    for (TaskProtocol taskProtocol : allPutTaskProtocol){
-                        if (taskProtocol.getTargetPosition()>=rgvProtocolOther.getRgvPos()){
-                            long avoid = rgvProtocolOther.getRgvPos()-rgvProtocolOther.getCarBodyJiaoMing()-avoidDistance-rgvProtocol.getCarBodyKunPeng();
-                            if (avoid > trackEntireLength-rgvProtocolOther.getCarBodyKunPeng()){
-                                log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
-                                return false;
-                            }
-                            rgvTaskProtocol.setAvoid(1);
-                            rgvTaskProtocol.setAvoidingTheDestination(avoid);
-                            RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
-                            return false;
-                        } else {
+                    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);
+                        rgvTaskProtocol.setAvoidingTheDestination(avoid);
+                        RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
+                        return false;
                     }
                     return false;
+                }
+            } else {
+                if ((rgvProtocolOther.getRgvPosDestinationOrPos(true) - rgvProtocolOther.getCarBodyJiaoMing())
+                        - (targetPosition + rgvProtocol.getCarBodyKunPeng())
+                        > avoidDistance) {//鏃犻渶閬胯
+                    return true;
                 }
             }
         } else {
-            if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE)){
-                if ((targetPosition-rgvProtocol.getCarBodyJiaoMing())
-                        - (rgvProtocolOther.getRgvPos()+rgvProtocolOther.getCarBodyKunPeng())
-                        > avoidDistance){//鏃犻渶閬胯
+            if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE)) {
+                if ((targetPosition - rgvProtocol.getCarBodyJiaoMing())
+                        - (rgvProtocolOther.getRgvPos() + rgvProtocolOther.getCarBodyKunPeng())
+                        > avoidDistance) {//鏃犻渶閬胯
                     return true;
                 } else {
-                    long avoid = targetPosition -rgvProtocol.getCarBodyJiaoMing() - avoidDistance - rgvProtocolOther.getCarBodyKunPeng();
-                    if (avoid < trackBenchmark + rgvProtocolOther.getCarBodyJiaoMing()){
-                        log.error("閬胯瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
+                    long avoid = targetPosition - rgvProtocol.getCarBodyJiaoMing() - avoidDistance - rgvProtocolOther.getCarBodyKunPeng();
+                    if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[1])) {
+                        log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
                         return false;
                     }
-                    rgvTaskProtocol.setAvoid(1);
-                    rgvTaskProtocol.setAvoidingTheDestination(avoid);
-                    RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
+                    long avoidAbs = Math.abs(avoid - rgvProtocolOther.getRgvPos());
+                    if (avoidAbs<51){
+                        return true;
+                    }
+                    rgvTaskProtocolOther.setAvoid(1);
+                    rgvTaskProtocolOther.setAvoidingTheDestination(avoid);
+                    RgvTaskCache.updateRgvStatus(rgvTaskProtocolOther);
                     return true;
                 }
-            } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.ROAM)){
-                if ((targetPosition-rgvProtocol.getCarBodyJiaoMing())
-                        - (rgvProtocolOther.getRgvPosDestination()+rgvProtocolOther.getCarBodyKunPeng())
-                        > avoidDistance){//鏃犻渶閬胯
+            } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.ROAM)) {
+                if ((targetPosition - rgvProtocol.getCarBodyJiaoMing())
+                        - (rgvProtocolOther.getRgvPosDestination() + rgvProtocolOther.getCarBodyKunPeng())
+                        > avoidDistance) {//鏃犻渶閬胯
                     return true;
                 } else {
-                    long avoid = targetPosition -rgvProtocol.getCarBodyJiaoMing() - avoidDistance - rgvProtocolOther.getCarBodyKunPeng();
-                    if (avoid < trackBenchmark + rgvProtocolOther.getCarBodyJiaoMing()){
-                        log.error("閬胯瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
+                    long avoid = targetPosition - rgvProtocol.getCarBodyJiaoMing() - avoidDistance - rgvProtocolOther.getCarBodyKunPeng();
+                    if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[1])) {
+                        log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
                         return false;
                     }
-                    rgvTaskProtocol.setAvoid(1);
-                    rgvTaskProtocol.setAvoidingTheDestination(avoid);
-                    RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
+                    long avoidAbs = Math.abs(avoid - rgvProtocolOther.getRgvPos());
+                    if (avoidAbs<51){
+                        return true;
+                    }
+                    rgvTaskProtocolOther.setAvoid(1);
+                    rgvTaskProtocolOther.setAvoidingTheDestination(avoid);
+                    RgvTaskCache.updateRgvStatus(rgvTaskProtocolOther);
                     return true;
                 }
-            } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.WORKING)){
-                if ((targetPosition-rgvProtocol.getCarBodyJiaoMing())
-                        - (rgvProtocolOther.getRgvPosDestination()+rgvProtocolOther.getCarBodyKunPeng())
-                        > avoidDistance){//鏃犻渶閬胯
+
+            } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.WORKING)) {
+                if ((targetPosition - rgvProtocol.getCarBodyJiaoMing())
+                        - (rgvProtocolOther.getRgvPosDestination() + rgvProtocolOther.getCarBodyKunPeng())
+                        > avoidDistance) {//鏃犻渶閬胯
                     return true;
                 } else {
-                    RgvThread rgvThreadOther = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvProtocolOther.getRgvNo());
-                    TaskProtocolCache taskProtocolCacheOther = rgvThreadOther.getTaskProtocolCache();
-                    List<TaskProtocol> allPutTaskProtocol = taskProtocolCacheOther.getAllPutTaskProtocol();
-                    if (allPutTaskProtocol.size() > 1){
-                        return false;
-                    }
-                    for (TaskProtocol taskProtocol : allPutTaskProtocol){
-                        if (taskProtocol.getTargetPosition()<=rgvProtocolOther.getRgvPos()){
-                            long avoid = rgvProtocolOther.getRgvPos()+rgvProtocolOther.getCarBodyKunPeng()+avoidDistance+rgvProtocol.getCarBodyJiaoMing();
-                            if (avoid < trackBenchmark + rgvProtocolOther.getCarBodyJiaoMing()){
-                                log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
-                                return false;
-                            }
-                            rgvTaskProtocol.setAvoid(1);
-                            rgvTaskProtocol.setAvoidingTheDestination(avoid);
-                            RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
-                            return false;
-                        } else {
+                    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);
+                        rgvTaskProtocol.setAvoidingTheDestination(avoid);
+                        RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
+                        return false;
                     }
                     return false;
+                }
+            } else {
+                if ((rgvProtocolOther.getRgvPosDestinationOrPos(false) - rgvProtocolOther.getCarBodyJiaoMing())
+                        - (targetPosition + rgvProtocol.getCarBodyKunPeng())
+                        > avoidDistance) {//鏃犻渶閬胯
+                    return true;
                 }
             }
         }
@@ -368,25 +517,25 @@
             rgvProtocol.setRgvNo(slave.getId());
         }
         rgvProtocol.setMode((short) -1);
-        rgvProtocol.setStatus((short)-1);
-        rgvProtocol.setWalkPos((short)0);
+        rgvProtocol.setStatus((short) -1);
+        rgvProtocol.setWalkPos((short) 0);
         rgvProtocol.setRgvPos(0L);
-        rgvProtocol.setAlarm((short)0);
+        rgvProtocol.setAlarm((short) 0);
         rgvProtocol.setxSpeed((short) 0);
         rgvProtocol.setxDistance((short) 0);
         rgvProtocol.setxDuration((short) 0);
         rgvProtocol.setCarBodyJiaoMing(0L);
         rgvProtocol.setCarBodyKunPeng(0L);
-        try{
+        try {
             BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class);
             BasRgv rgv = basRgvService.selectById(slave.getId());
-            if (!Cools.isEmpty(rgv)){
+            if (!Cools.isEmpty(rgv)) {
                 rgvProtocol.setStatusEnable(rgv.getStatus() == 1);
             } else {
                 rgvProtocol.setStatusEnable(false);
             }
-        } catch (Exception e){
-            log.error("RGV寮傚父锛侊紒锛�"+e.getMessage());
+        } catch (Exception e) {
+            log.error("RGV寮傚父锛侊紒锛�" + e.getMessage());
             rgvProtocol.setStatusEnable(true);
         }
 
@@ -395,7 +544,7 @@
             rgvTaskProtocol = new RgvTaskProtocol();
             rgvTaskProtocol.setRgvNo(slave.getId());
         }
-        rgvTaskProtocol.setAvoid(-1);
+        rgvTaskProtocol.setAvoid(0);
         rgvTaskProtocol.setAvoidingTheDestination(0L);
 
         RgvStatusCache.updateRgvStatus(rgvProtocol);
@@ -411,7 +560,7 @@
         siemensNet.setRack(slave.getRack().byteValue());
         siemensNet.setSlot(slave.getSlot().byteValue());
         OperateResult connect = siemensNet.ConnectServer();
-        if(connect.IsSuccess){
+        if (connect.IsSuccess) {
             result = true;
 //            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.info("RGV plc杩炴帴鎴愬姛 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
@@ -428,25 +577,39 @@
     /**
      * 璇诲彇鐘舵��
      */
-    private void readStatus(){
+    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));
 
-                OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
+//                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澶嶄綅淇″彿
 //                if (rgvProtocol.getStatusType().equals(RgvStatusType.WAITING)
 //                        || rgvProtocol.getStatusType().equals(RgvStatusType.FETCHWAITING)) {
@@ -463,18 +626,18 @@
                     // 鏍规嵁瀹炴椂淇℃伅鏇存柊鏁版嵁搴�
                     BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class);
                     BasRgv basRgv = basRgvService.selectById(slave.getId());
-                    if (!Cools.isEmpty(basRgv)){
+                    if (!Cools.isEmpty(basRgv)) {
                         rgvProtocol.setStatusEnable(basRgv.getStatus() == 1);
                     } else {
                         rgvProtocol.setStatusEnable(false);
                     }
 //                    BasRgv basRgv = new BasRgv();
                     basRgv.setRgvNo(slave.getId());
-                    basRgv.setRgvSts((int)rgvProtocol.getMode());
-                    if (!basRgvService.updateById(rgvProtocol.toSqlModel(basRgv))){
+                    basRgv.setRgvSts((int) rgvProtocol.getMode());
+                    if (!basRgvService.updateById(rgvProtocol.toSqlModel(basRgv))) {
                         log.error("RGV plc鏁版嵁搴撴洿鏂板け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
                     }
-                } catch (Exception ignore){
+                } catch (Exception ignore) {
 
                 }
 
@@ -484,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());
             }
@@ -506,13 +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[1] = taskProtocol.getTaskNo();
 //        array[2] = taskProtocol.getTaskMode();
 //        array[4] = command.getDestinationStaNo();
 //        array[10] = taskProtocol.getCommand();
-        OperateResult result = siemensNet.Write("DB100.0", taskProtocol.getTaskNo());
+        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);
@@ -531,13 +703,14 @@
                     null,
                     null,
                     null,
-                    result.IsSuccess? 1 : 0,
+                    result.IsSuccess ? 1 : 0,
                     null,
                     new Date(),
                     null
             );
             bean.insert(basRgvOpt);
-        } catch (Exception ignore) {}
+        } catch (Exception ignore) {
+        }
 
         if (result != null && result.IsSuccess) {
             Thread.sleep(200);

--
Gitblit v1.9.1