From 08d8933d3fe66fb83f1e2e7e4038e62b3c5143e1 Mon Sep 17 00:00:00 2001
From: cpT <1@123>
Date: 星期四, 19 六月 2025 11:10:43 +0800
Subject: [PATCH] #改造

---
 src/main/java/com/zy/core/thread/RgvThread.java |  941 +++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 861 insertions(+), 80 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..602cae6 100644
--- a/src/main/java/com/zy/core/thread/RgvThread.java
+++ b/src/main/java/com/zy/core/thread/RgvThread.java
@@ -12,8 +12,10 @@
 import com.zy.asrs.entity.BasRgvOpt;
 import com.zy.asrs.service.BasRgvOptService;
 import com.zy.asrs.service.BasRgvService;
+import com.zy.asrs.service.DeviceErrorService;
 import com.zy.asrs.utils.RouteUtils;
 import com.zy.asrs.utils.TrackRangeUtils;
+import com.zy.core.DevpThread;
 import com.zy.core.ThreadHandler;
 import com.zy.core.cache.*;
 import com.zy.core.enums.RgvModeType;
@@ -23,9 +25,7 @@
 import com.zy.core.model.RgvSlave;
 import com.zy.core.model.Task;
 import com.zy.core.model.command.RgvCommand;
-import com.zy.core.model.protocol.RgvProtocol;
-import com.zy.core.model.protocol.RgvTaskProtocol;
-import com.zy.core.model.protocol.TaskProtocol;
+import com.zy.core.model.protocol.*;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
@@ -48,11 +48,12 @@
     //    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;
+    private String errorRgv = "-";
 
     /**
      * 宸ヤ綅1澶嶄綅淇″彿
@@ -63,6 +64,10 @@
      */
     private boolean resetFlag2 = false;
 
+    private boolean connectRgv = false;
+    private boolean delRgvTask = false;
+    private short wrkSign = 0;
+
     public RgvThread(RgvSlave slave) {
         this.slave = slave;
     }
@@ -70,32 +75,84 @@
     @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 {
+                Thread.sleep(1000);
+                if(!connectRgv){
+                    try {
+                        connectRgv = this.connect();
+                        Thread.sleep(100);
+                    } catch (Exception e){
+
+                    }
+                }
+            } catch (Exception e) {
+                log.error("rgv杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+                try{
+                    DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                    deviceErrorService.addDeviceError("rgv", slave.getId(), "rgv杩炴帴澶辫触"+e.getMessage());
+                } catch (Exception e2){
+//                    log.error("e2:"+e2.getMessage());
+                }
+                initRgv();
+//                e.printStackTrace();
+            }
         }
     }
 
     private void readStatusRgv() {
         while (true) {
             try {
-                Thread.sleep(100);
+                if(!connectRgv){
+                    try {
+                        Thread.sleep(1000L);
+                    } catch (Exception e){
+
+                    }
+                    initRgv();
+                    continue;
+                }
+                Thread.sleep(20);
+//                System.out.println("璇荤嚎绋�,灏忚溅鍙�"+ slave.getId()+"鏃堕棿鎴筹細"+System.currentTimeMillis());
 
                 readStatus();
 
             } catch (Exception e) {
-                log.error("RGV鏁版嵁璇诲彇绾跨▼寮傚父锛侊紒锛�" + e.getMessage());
+                log.error("RGV鏁版嵁璇诲彇绾跨▼寮傚父锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+                try{
+                    DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                    deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV鏁版嵁璇诲彇绾跨▼寮傚父"+e.getMessage());
+                } catch (Exception e2){
+//                    log.error("e2:"+e2.getMessage());
+                }
                 initRgv();
 //                e.printStackTrace();
             }
@@ -108,8 +165,107 @@
      * 瀹屾垚
      */
     private void taskComplete() {
+        while (true) {
+            try {
+                if(!connectRgv){
+                    try {
+                        Thread.sleep(1000L);
+                    } catch (Exception e){
+
+                    }
+                    continue;
+                }
+                if (delRgvTask){
+                    writeDelRgvTask();
+                    delRgvTask = false;
+                    continue;
+                }
+                Thread.sleep(50L);
+
+                OperateResultExOne<byte[]> result = siemensNet.Read("DB100.12", (short) 1);
+                boolean[] status = siemensNet.getByteTransform().TransBool(result.Content, 0, 1);
+                if (status[0]){
+                    Thread.sleep(500L);
+                    OperateResult result4 = siemensNet.Write("DB100.12.0", false);
+                }
+            } catch (Exception e) {
+                log.error("RGV鏁版嵁浠诲姟涓嬪彂澶嶄綅绾跨▼寮傚父锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+                try{
+                    DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                    deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV鏁版嵁浠诲姟涓嬪彂澶嶄綅绾跨▼寮傚父"+e.getMessage());
+                } catch (Exception e2){
+//                    log.error("e2:"+e2.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 {
+//                            TaskProtocol issued = new TaskProtocol(taskProtocol,true);
+//                            write(issued);
+//                            taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection());
+//                            break;
+//                        }
+//                    }
+//                }
+//            } catch (Exception e) {
+//                log.error("RGV浠诲姟涓嬪彂绾跨▼寮傚父锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+//                try{
+//                    DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+//                    deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV浠诲姟涓嬪彂绾跨▼寮傚父"+e.getMessage());
+//                } catch (Exception e2){
+//                    log.error("e2:"+e2.getMessage());
+//                }
+////                e.printStackTrace();
+//            }
+//        }
+//    }
 
     /**
      * 婕父
@@ -117,6 +273,14 @@
     private void taskWalkIssued() {
         while (true) {
             try {
+                if(!connectRgv){
+                    try {
+                        Thread.sleep(1000L);
+                    } catch (Exception e){
+
+                    }
+                    continue;
+                }
                 // 浼戠湢 1 绉�
                 Thread.sleep(100);
 
@@ -134,10 +298,12 @@
                 TaskProtocol issued = new TaskProtocol();
                 issued.setTaskNo(32222L);
                 issued.setTargetPosition(rgvTaskProtocol.getAvoidingTheDestination());
+                issued.setTaskStatus(1);
+                issued.setDirection(true);
                 write(issued);
                 rgvTaskProtocol.setAvoid(0);
 
-                Thread.sleep(200);
+//                Thread.sleep(200);
                 RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
 
             } catch (Exception e) {
@@ -152,12 +318,39 @@
      */
     private void taskIssued() {
         while (true) {
+            if(!connectRgv){
+                try {
+                    Thread.sleep(1000L);
+                } catch (Exception e){
+
+                }
+                continue;
+            }
+            RgvRunProtocol rgvRun = RgvRunCache.getRgvRun();
+            if (!rgvRun.getRgvNo().equals(slave.getId())){
+                continue;
+            }
             try {
+                Thread.sleep(50);
+                rgvRun = RgvRunCache.getRgvRun();
+//                System.out.println(JSON.toJSON(rgvRun));
+
                 // 浼戠湢 1 绉�
-                Thread.sleep(100);
-                if (!deviceDetection()) {
+                if (System.currentTimeMillis() - rgvRun.currentTimeMilliOld > 100) {
+                    rgvRun.currentTimeMilliOld = System.currentTimeMillis()+10;
+                } else {
                     continue;
                 }
+                if (!deviceDetection()) {
+                    rgvRun.currentTimeMilliOld = System.currentTimeMillis()+10;
+                    rgvRun.setRgvNo(slave.getOtherId());
+                    RgvRunCache.updateRgvStatus(rgvRun);
+                    if (!errorRgv.equals("鏃�")){
+                        RgvErrCache.updateRgvErr(slave.getId(),errorRgv);
+                    }
+                    continue;
+                }
+
                 RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
                 RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
                 if (rgvProtocol == null || rgvTaskProtocol == null) {
@@ -165,45 +358,131 @@
                     rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
                     rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
                 }
+                if (!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE) || (Math.abs(rgvProtocol.getRgvPos() - rgvProtocol.getRgvPosDestination())>100)){
+                    rgvRun.currentTimeMilliOld = System.currentTimeMillis()+10;
+                    rgvRun.setRgvNo(slave.getOtherId());
+                    RgvRunCache.updateRgvStatus(rgvRun);
+                    continue;
+                }
+                if (rgvProtocol.getLoaded() == -1){
+                    rgvRun.currentTimeMilliOld = System.currentTimeMillis()+10;
+                    rgvRun.setRgvNo(slave.getOtherId());
+                    RgvRunCache.updateRgvStatus(rgvRun);
+                    RgvErrCache.updateRgvErr(slave.getId(),"灏忚溅鎺㈢墿鐗╃姸鎬佸紓甯�");
+                    continue;
+                }
                 if (rgvTaskProtocol.getAvoid() != 0) {
+                    rgvRun.currentTimeMilliOld = System.currentTimeMillis()+10;
+                    rgvRun.setRgvNo(slave.getOtherId());
+                    RgvRunCache.updateRgvStatus(rgvRun);
                     continue;
                 }
 
                 List<TaskProtocol> allTakeTaskProtocol = taskProtocolCache.getTakeOrPutTaskProtocol(rgvProtocol.getLoaded());
-                for (TaskProtocol taskProtocol : allTakeTaskProtocol) {
-                    if (taskProtocol.getIsRunning() == 1) {//鍑嗗涓嬪彂
-                        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
-                        //鍙岃溅
-                        if (rgvOtherStatusEnable()) {
-                            //鍙︿竴鍙拌溅鏄惁鍏佽姝ゅ彴杞︽墽琛�
-                            if (!otherRgvAvoid(taskProtocol.getTargetPosition())) {
-                                continue;
+                if (allTakeTaskProtocol.isEmpty()){
+                    allTakeTaskProtocol = taskProtocolCache.getAllWalkTaskProtocol();
+                    for (TaskProtocol taskProtocol : allTakeTaskProtocol) {
+                        if (taskProtocol.getIsRunning() == 1) {//鍑嗗涓嬪彂
+                            // 鍙岃溅
+                            if (rgvOtherStatusEnable()) {
+                                //鍙︿竴鍙拌溅鏄惁鍏佽姝ゅ彴杞︽墽琛�
+                                if (!otherRgvAvoid(taskProtocol.getTargetPosition())) {
+                                    RgvErrCache.updateRgvErr(slave.getId(),errorRgv);
+                                    break;
+                                }
+                            }
+                            if (taskProtocol.getTargetPosition()<=rgvProtocol.getRgvPos()+50
+                                    && taskProtocol.getTargetPosition()>=rgvProtocol.getRgvPos()-50){
+                                taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection());
+                                RgvErrCache.updateRgvErr(slave.getId());
+                                break;
+                            } else {
+                                TaskProtocol issued = new TaskProtocol(taskProtocol,true);
+                                write(issued);
+                                RgvErrCache.updateRgvErr(slave.getId());
+                                taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection());
+                                break;
                             }
                         }
-                        Thread.sleep(100);
-                        TaskProtocol issued = new TaskProtocol(taskProtocol);
-                        write(issued);
-                        taskProtocol.setIsRunning(taskProtocol.getIsRunning() + 1);
-                        taskProtocolCache.updateTaskProtocol(taskProtocol);
-                        break;
+                    }
+                    RgvErrCache.updateRgvErr(slave.getId());
+                } else {
+                    for (TaskProtocol taskProtocol : allTakeTaskProtocol) {
+                        if (taskProtocol.getIsRunning() == 1) {//鍑嗗涓嬪彂
+                            //鍙岃溅
+                            if (rgvOtherStatusEnable()) {
+                                //鍙︿竴鍙拌溅鏄惁鍏佽姝ゅ彴杞︽墽琛�
+                                if (!otherRgvAvoid(taskProtocol.getTargetPosition())) {
+                                    RgvErrCache.updateRgvErr(slave.getId(),errorRgv);
+                                    break;
+                                }
+                            }
+                            if (taskProtocol.getTargetPosition()<=rgvProtocol.getRgvPos()+50
+                                    && taskProtocol.getTargetPosition()>=rgvProtocol.getRgvPos()-50){
+                                if (taskProtocol.getTaskStatus()==3){
+                                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, taskProtocol.getTargetPositionStaNoPlcId());
+                                    StaProtocol staProtocol = devpThread.getStation().get(taskProtocol.getTargetPositionStaNo());
+                                    if (staProtocol == null ) {
+                                        RgvErrCache.updateRgvErr(slave.getId(),"鏈煡鍒板皬杞︿綔涓氱珯"+staProtocol.getStaNo()+"绔欑偣");
+                                        break;
+                                    }
+                                    // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢
+                                    if (!staProtocol.isAutoing() || staProtocol.isLoading()
+                                    ){
+                                        RgvErrCache.updateRgvErr(slave.getId(),"灏忚溅绛夊緟"+staProtocol.getStaNo()+"绔欑偣灏辩华");
+                                        break;
+                                    }
+                                } else if (taskProtocol.getTaskStatus()==2){
+                                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, taskProtocol.getTargetPositionStaNoPlcId());
+                                    StaProtocol staProtocol = devpThread.getStation().get(taskProtocol.getTargetPositionStaNo());
+                                    if (staProtocol == null ) {
+                                        RgvErrCache.updateRgvErr(slave.getId(),"鏈煡鍒板皬杞︿綔涓氱珯"+staProtocol.getStaNo()+"绔欑偣");
+                                        break;
+                                    }
+                                    // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢
+                                    if (!staProtocol.isAutoing() || !staProtocol.isLoading() || staProtocol.getWorkNo()==0
+                                    ){
+                                        RgvErrCache.updateRgvErr(slave.getId(),"灏忚溅绛夊緟"+staProtocol.getStaNo()+"绔欑偣灏辩华");
+                                        break;
+                                    }
+                                }
+                                TaskProtocol issued = new TaskProtocol(taskProtocol);
+                                write(issued);
+                                RgvErrCache.updateRgvErr(slave.getId());
+                                taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection());
+                                break;
+                            } else {
+                                TaskProtocol issued = new TaskProtocol(taskProtocol,true);
+                                write(issued);
+                                RgvErrCache.updateRgvErr(slave.getId());
+                                break;
+                            }
+                        }
                     }
                 }
+                rgvRun.currentTimeMilliOld = System.currentTimeMillis()+10;
+                rgvRun.setRgvNo(slave.getOtherId());
+                RgvRunCache.updateRgvStatus(rgvRun);
             } catch (Exception e) {
-                log.error("RGV鍙栬揣浠诲姟涓嬪彂绾跨▼寮傚父锛侊紒锛�" + e.getMessage());
+                log.error("RGV浠诲姟涓嬪彂绾跨▼寮傚父锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+                try{
+                    DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                    deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV浠诲姟涓嬪彂绾跨▼寮傚父"+e.getMessage());
+                } catch (Exception e2){
+//                    log.error("e2:"+e2.getMessage());
+                }
+                rgvRun = RgvRunCache.getRgvRun();
+                rgvRun.currentTimeMilliOld = System.currentTimeMillis()+10;
+                rgvRun.setRgvNo(slave.getOtherId());
+                RgvRunCache.updateRgvStatus(rgvRun);
+                continue;
 //                e.printStackTrace();
             }
         }
     }
-
-    public boolean deviceDetection() {
-        RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
+    public boolean isSignRgvTaskProtocol() {
         RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
-
-        if (rgvProtocol == null || rgvTaskProtocol == null) {
-            return false;
-        }
-        if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) || rgvProtocol.getRgvPos().equals(0L) || rgvTaskProtocol.getAvoid() == -1 || rgvProtocol.getRgvPosDestination() == 0L
-                || (!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE) && !rgvProtocol.getStatusType().equals(RgvStatusType.ROAM))) {
+        if (rgvTaskProtocol == null) {
             return false;
         }
         RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
@@ -213,7 +492,52 @@
             return false;
         }
         if (rgvProtocolOther.statusEnable) {
+            if (rgvTaskProtocolOther == null) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+
+    public boolean deviceDetection() {
+        RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
+        RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
+
+        if (rgvProtocol == null || rgvTaskProtocol == null) {
+            errorRgv = slave.getId()+"鍙峰皬杞﹁繛鎺ュけ璐�";
+            return false;
+        }
+        if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO)) {
+            errorRgv = slave.getId()+"鍙峰皬杞﹂潪鑷姩";
+            return false;
+        }
+        if (rgvProtocol.getRgvPos().equals(0L)
+                || rgvTaskProtocol.getAvoid() == -1
+                || rgvProtocol.getRgvPosDestination() == 0L) {
+            errorRgv = slave.getId()+"鍙峰皬杞︾姸鎬佸紓甯�";
+            return false;
+        }
+        if (!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE) && !rgvProtocol.getStatusType().equals(RgvStatusType.ROAM)) {
+            errorRgv = "鏃�";
+            return false;
+        }
+        if ( (Math.abs(rgvProtocol.getRgvPos() - rgvProtocol.getRgvPosDestination())>100) && !rgvProtocol.getStatusType().equals(RgvStatusType.ROAM)) {
+            errorRgv = slave.getId()+"鍙峰皬杞﹀瓨鍦ㄨ繍琛岀洰鏍囧�硷紝闇�瑕佸浣嶏紒锛侊紒";
+            return false;
+        }
+        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
+        RgvTaskProtocol rgvTaskProtocolOther = RgvTaskCache.getRgvStatus(slave.getOtherId());
+//        System.out.println("rgvTaskProtocol:"+slave.getId()+"sign:"+rgvTaskProtocol.isSignRun()+"/n"+
+//                "rgvTaskProtocolOther:"+slave.getOtherId()+"sign:"+rgvTaskProtocolOther.isSignRun()+"/n");
+
+        if (rgvProtocolOther == null) {
+            errorRgv = slave.getOtherId()+"鍙峰皬杞﹁繛鎺ュけ璐�";
+            return false;
+        }
+        if (rgvProtocolOther.statusEnable) {
             if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L) || rgvTaskProtocolOther.getAvoid() == -1 || rgvProtocolOther.getRgvPosDestination() == 0L) {
+                errorRgv = slave.getOtherId()+"鍙峰皬杞︾姸鎬佸紓甯�";
                 return false;
             }
         }
@@ -235,6 +559,10 @@
 
     public boolean otherRgvAvoid(Long targetPosition) {
         RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
+        long onePos = Math.abs(targetPosition - rgvProtocol.getRgvPos());
+        if (onePos<50){
+            return true;
+        }
         RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
 
         RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
@@ -242,49 +570,193 @@
         Long[][] avoidRange = new TrackRangeUtils().avoidRange(slave, trackEntireLength, trackBenchmark, avoidDistance);
 
         if (new TrackRangeUtils().IsItSmall(slave)) {
-
-            if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE)) {
+            if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE) && (Math.abs(rgvProtocolOther.getRgvPos() - rgvProtocolOther.getRgvPosDestination())<50)) {
                 if ((rgvProtocolOther.getRgvPos() - rgvProtocolOther.getCarBodyJiaoMing())
                         - (targetPosition + rgvProtocol.getCarBodyKunPeng())
-                        > avoidDistance) {//鏃犻渶閬胯
+                        > avoidDistance - 50) {//鏃犻渶閬胯
                     return true;
                 } else {
+
+                    RgvThread rgvThreadOther = (RgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getOtherId());
+                    TaskProtocolCache taskProtocolCacheOther = rgvThreadOther.getTaskProtocolCache();
+                    TaskProtocol nowPosRunTask = taskProtocolCacheOther.getNowPosRunTask(rgvProtocolOther.getRgvPos());
+                    if (!Cools.isEmpty(nowPosRunTask)){
+                        boolean signNowPosRun = true;
+                        if (nowPosRunTask.getTaskStatus()==3){
+                            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, nowPosRunTask.getTargetPositionStaNoPlcId());
+                            StaProtocol staProtocol = devpThread.getStation().get(nowPosRunTask.getTargetPositionStaNo());
+                            if (staProtocol == null ) {
+                                signNowPosRun =false;
+                            }
+                            if (signNowPosRun){
+                                // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢
+                                if (!staProtocol.isAutoing() || staProtocol.isLoading()
+                                ){
+                                    if (targetPosition.equals(nowPosRunTask.getTargetPosition())){
+                                        if (rgvProtocolOther.getRgvPosDestination() >= rgvProtocolOther.getRgvPos()-50) {
+                                            long avoid = rgvProtocolOther.getRgvPos() - rgvProtocolOther.getCarBodyJiaoMing() - avoidDistance - rgvProtocol.getCarBodyKunPeng();
+                                            if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[1])) {
+                                                log.error("RGV琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+                                                errorRgv = "RGV琛岃蛋鐩爣瓒呭嚭鑼冨洿";
+                                                try{
+                                                    DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                                                    deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV琛岃蛋瓒呭嚭鑼冨洿");
+                                                } catch (Exception e2){
+//                                                    log.error("e2:"+e2.getMessage());
+                                                }
+                                                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;
+                                    }
+                                    signNowPosRun =false;
+                                }
+                            }
+                        }
+                        if (signNowPosRun){
+                            errorRgv = slave.getOtherId()+"鍙稲GV绛夊緟浣滀笟...";
+                            return false;
+                        }
+                    }
+                    TaskProtocol nowPosRunTask2 = taskProtocolCacheOther.getNowPosRunTask2();
+                    if (!Cools.isEmpty(nowPosRunTask2)){
+                        boolean signNowPosRun = true;
+                        boolean signNowPosA = true;
+                        if (targetPosition - rgvProtocol.getRgvPos()>0){
+                            if (nowPosRunTask2.getTargetPosition() - rgvProtocolOther.getRgvPos()>0){
+                                if (rgvProtocol.getRgvPos()>rgvProtocolOther.getRgvPos()){
+                                    signNowPosA = false;
+                                    signNowPosRun = false;
+                                }
+                            }
+                        } else if (targetPosition - rgvProtocol.getRgvPos()<0){
+                            if (nowPosRunTask2.getTargetPosition() - rgvProtocolOther.getRgvPos()<0){
+                                if (rgvProtocol.getRgvPos()<rgvProtocolOther.getRgvPos()){
+                                    signNowPosA = false;
+                                    signNowPosRun = false;
+                                }
+                            }
+                        }
+
+                        if (signNowPosA){
+                            if (nowPosRunTask2.getTaskStatus()==3){
+                                long twoPos = Math.abs(nowPosRunTask2.getTargetPosition() - rgvProtocolOther.getRgvPos());
+                                if (Math.abs(onePos - twoPos)>100){
+                                    if (onePos-50>twoPos+50){
+                                        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, nowPosRunTask2.getTargetPositionStaNoPlcId());
+                                        StaProtocol staProtocol = devpThread.getStation().get(nowPosRunTask2.getTargetPositionStaNo());
+                                        if (staProtocol == null ) {
+                                            signNowPosRun =false;
+                                        }
+                                        if (signNowPosRun){
+                                            // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢
+                                            if (staProtocol.isAutoing() && !staProtocol.isLoading()
+                                            ){
+                                                errorRgv = slave.getOtherId()+"鍙稲GV绛夊緟浣滀笟...";
+                                                return false;
+                                            }
+                                        }
+                                        signNowPosRun =false;
+                                    }
+                                }
+                            } else {
+                                long twoPos = Math.abs(nowPosRunTask2.getTargetPosition() - rgvProtocolOther.getRgvPos());
+                                if (twoPos<100){
+                                    errorRgv = slave.getOtherId()+"鍙稲GV绛夊緟浣滀笟...";
+                                    return false;
+                                }
+                                if (Math.abs(onePos - twoPos)>100){
+                                    if (onePos-50>twoPos+50){
+                                        signNowPosRun =false;
+                                    }
+                                }
+                            }
+                        }
+
+                        if (signNowPosRun){
+                            errorRgv = slave.getOtherId()+"鍙稲GV绛夊緟浣滀笟...";
+                            return false;
+                        }
+                    }
                     long avoid = targetPosition + rgvProtocol.getCarBodyKunPeng() + avoidDistance + rgvProtocolOther.getCarBodyJiaoMing();
                     if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[0])) {
-                        log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
+                        log.error("RGV琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+                        errorRgv = "RGV琛岃蛋鐩爣瓒呭嚭鑼冨洿";
+
+                        try{
+                            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                            deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV琛岃蛋瓒呭嚭鑼冨洿");
+                        } catch (Exception e2){
+//                            log.error("e2:"+e2.getMessage());
+                        }
                         return false;
+                    }
+                    long avoidAbs = Math.abs(avoid - rgvProtocolOther.getRgvPos());
+                    if (avoidAbs<51){
+                        return true;
                     }
                     rgvTaskProtocolOther.setAvoid(1);
                     rgvTaskProtocolOther.setAvoidingTheDestination(avoid);
                     RgvTaskCache.updateRgvStatus(rgvTaskProtocolOther);
-                    return true;
+                    return false;
                 }
             } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.ROAM)) {
                 if ((rgvProtocolOther.getRgvPosDestination() - rgvProtocolOther.getCarBodyJiaoMing())
                         - (targetPosition + rgvProtocol.getCarBodyKunPeng())
-                        > avoidDistance) {//鏃犻渶閬胯
+                        > avoidDistance - 50) {//鏃犻渶閬胯
                     return true;
                 } else {
                     long avoid = targetPosition + rgvProtocol.getCarBodyKunPeng() + avoidDistance + rgvProtocolOther.getCarBodyJiaoMing();
                     if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[0])) {
-                        log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
+                        log.error("RGV琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+                        errorRgv = "RGV琛岃蛋鐩爣瓒呭嚭鑼冨洿";
+
+                        try{
+                            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                            deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV琛岃蛋瓒呭嚭鑼冨洿");
+                        } catch (Exception e2){
+//                            log.error("e2:"+e2.getMessage());
+                        }
                         return false;
+                    }
+                    long avoidAbs = Math.abs(avoid - rgvProtocolOther.getRgvPos());
+                    if (avoidAbs<51){
+                        return true;
                     }
                     rgvTaskProtocolOther.setAvoid(1);
                     rgvTaskProtocolOther.setAvoidingTheDestination(avoid);
                     RgvTaskCache.updateRgvStatus(rgvTaskProtocolOther);
-                    return true;
+                    return false;
                 }
             } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.WORKING)) {
                 if ((rgvProtocolOther.getRgvPosDestination() - rgvProtocolOther.getCarBodyJiaoMing())
                         - (targetPosition + rgvProtocol.getCarBodyKunPeng())
-                        > avoidDistance) {//鏃犻渶閬胯
+                        > avoidDistance - 50) {//鏃犻渶閬胯
                     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("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
+                            log.error("RGV琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+                            errorRgv = "RGV琛岃蛋鐩爣瓒呭嚭鑼冨洿";
+
+                            try{
+                                DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                                deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV琛岃蛋瓒呭嚭鑼冨洿");
+                            } catch (Exception e2){
+//                                log.error("e2:"+e2.getMessage());
+                            }
+                            return false;
+                        }
+                        long avoidAbs = Math.abs(avoid - rgvProtocol.getRgvPos());
+                        if (avoidAbs<51){
                             return false;
                         }
                         rgvTaskProtocol.setAvoid(1);
@@ -292,53 +764,207 @@
                         RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
                         return false;
                     }
+                    errorRgv = slave.getOtherId()+"鍙稲GV褰卞搷锛岀瓑寰呬腑...";
+
                     return false;
+                }
+            } else {
+                if ((rgvProtocolOther.getRgvPosDestinationOrPos(true) - rgvProtocolOther.getCarBodyJiaoMing())
+                        - (targetPosition + rgvProtocol.getCarBodyKunPeng())
+                        > avoidDistance - 50) {//鏃犻渶閬胯
+                    return true;
                 }
             }
         } else {
-            if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE)) {
+            if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE)  && (Math.abs(rgvProtocolOther.getRgvPos() - rgvProtocolOther.getRgvPosDestination())<50)) {
                 if ((targetPosition - rgvProtocol.getCarBodyJiaoMing())
                         - (rgvProtocolOther.getRgvPos() + rgvProtocolOther.getCarBodyKunPeng())
-                        > avoidDistance) {//鏃犻渶閬胯
+                        > avoidDistance - 50) {//鏃犻渶閬胯
                     return true;
                 } else {
+                    RgvThread rgvThreadOther = (RgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getOtherId());
+                    TaskProtocolCache taskProtocolCacheOther = rgvThreadOther.getTaskProtocolCache();
+                    TaskProtocol nowPosRunTask = taskProtocolCacheOther.getNowPosRunTask(rgvProtocolOther.getRgvPos());
+                    if (!Cools.isEmpty(nowPosRunTask)){
+                        boolean signNowPosRun = true;
+                        if (nowPosRunTask.getTaskStatus()==3){
+                            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, nowPosRunTask.getTargetPositionStaNoPlcId());
+                            StaProtocol staProtocol = devpThread.getStation().get(nowPosRunTask.getTargetPositionStaNo());
+                            if (staProtocol == null ) {
+                                signNowPosRun =false;
+                            }
+                            if (signNowPosRun){
+                                // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢
+                                if (!staProtocol.isAutoing() || staProtocol.isLoading()
+                                ){
+                                    if (targetPosition.equals(nowPosRunTask.getTargetPosition())){
+                                        if (rgvProtocolOther.getRgvPosDestination() <= rgvProtocolOther.getRgvPos() + 50) {
+                                            long avoid = rgvProtocolOther.getRgvPos() + rgvProtocolOther.getCarBodyKunPeng() + avoidDistance + rgvProtocol.getCarBodyJiaoMing();
+                                            if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[0])) {
+                                                log.error("RGV琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+                                                errorRgv = "RGV琛岃蛋鐩爣瓒呭嚭鑼冨洿";
+
+                                                try{
+                                                    DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                                                    deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV琛岃蛋瓒呭嚭鑼冨洿");
+                                                } catch (Exception e2){
+//                                                    log.error("e2:"+e2.getMessage());
+                                                }
+                                                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;
+                                    }
+                                    signNowPosRun =false;
+                                }
+                            }
+                        }
+                        if (signNowPosRun){
+                            errorRgv = slave.getOtherId()+"鍙稲GV绛夊緟浣滀笟...";
+                            return false;
+                        }
+                    }
+
+                    TaskProtocol nowPosRunTask2 = taskProtocolCacheOther.getNowPosRunTask2();
+                    if (!Cools.isEmpty(nowPosRunTask2)){
+                        boolean signNowPosRun = true;
+                        boolean signNowPosA = true;
+                        if (targetPosition - rgvProtocol.getRgvPos()>0){
+                            if (nowPosRunTask2.getTargetPosition() - rgvProtocolOther.getRgvPos()>0){
+                                if (rgvProtocol.getRgvPos()>rgvProtocolOther.getRgvPos()){
+                                    signNowPosA = false;
+                                    signNowPosRun = false;
+                                }
+                            }
+                        } else if (targetPosition - rgvProtocol.getRgvPos()<0){
+                            if (nowPosRunTask2.getTargetPosition() - rgvProtocolOther.getRgvPos()<0){
+                                if (rgvProtocol.getRgvPos()<rgvProtocolOther.getRgvPos()){
+                                    signNowPosA = false;
+                                    signNowPosRun = false;
+                                }
+                            }
+                        }
+
+                        if (signNowPosA){
+                            if (nowPosRunTask2.getTaskStatus()==3){
+                                long twoPos = Math.abs(nowPosRunTask2.getTargetPosition() - rgvProtocolOther.getRgvPos());
+                                if (Math.abs(onePos - twoPos)>100){
+                                    if (onePos-50>twoPos+50){
+                                        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, nowPosRunTask2.getTargetPositionStaNoPlcId());
+                                        StaProtocol staProtocol = devpThread.getStation().get(nowPosRunTask2.getTargetPositionStaNo());
+                                        if (staProtocol == null ) {
+                                            signNowPosRun =false;
+                                        }
+                                        if (signNowPosRun){
+                                            // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢
+                                            if (staProtocol.isAutoing() && !staProtocol.isLoading()
+                                            ){
+                                                errorRgv = slave.getOtherId()+"鍙稲GV绛夊緟浣滀笟...";
+                                                return false;
+                                            }
+                                        }
+                                        signNowPosRun =false;
+                                    }
+                                }
+                            } else {
+                                long twoPos = Math.abs(nowPosRunTask2.getTargetPosition() - rgvProtocolOther.getRgvPos());
+                                if (twoPos<100){
+                                    errorRgv = slave.getOtherId()+"鍙稲GV绛夊緟浣滀笟...";
+                                    return false;
+                                }
+                                if (Math.abs(onePos - twoPos)>100){
+                                    if (onePos-50>twoPos+50){
+                                        signNowPosRun =false;
+                                    }
+                                }
+                            }
+                        }
+
+                        if (signNowPosRun){
+                            errorRgv = slave.getOtherId()+"鍙稲GV绛夊緟浣滀笟...";
+                            return false;
+                        }
+                    }
                     long avoid = targetPosition - rgvProtocol.getCarBodyJiaoMing() - avoidDistance - rgvProtocolOther.getCarBodyKunPeng();
                     if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[1])) {
-                        log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
+                        log.error("RGV琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+                        errorRgv = "RGV琛岃蛋鐩爣瓒呭嚭鑼冨洿";
+
+                        try{
+                            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                            deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV琛岃蛋瓒呭嚭鑼冨洿");
+                        } catch (Exception e2){
+//                            log.error("e2:"+e2.getMessage());
+                        }
                         return false;
+                    }
+                    long avoidAbs = Math.abs(avoid - rgvProtocolOther.getRgvPos());
+                    if (avoidAbs<51){
+                        return true;
                     }
                     rgvTaskProtocolOther.setAvoid(1);
                     rgvTaskProtocolOther.setAvoidingTheDestination(avoid);
                     RgvTaskCache.updateRgvStatus(rgvTaskProtocolOther);
-                    return true;
+                    return false;
                 }
             } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.ROAM)) {
                 if ((targetPosition - rgvProtocol.getCarBodyJiaoMing())
                         - (rgvProtocolOther.getRgvPosDestination() + rgvProtocolOther.getCarBodyKunPeng())
-                        > avoidDistance) {//鏃犻渶閬胯
+                        > avoidDistance - 50) {//鏃犻渶閬胯
                     return true;
                 } else {
                     long avoid = targetPosition - rgvProtocol.getCarBodyJiaoMing() - avoidDistance - rgvProtocolOther.getCarBodyKunPeng();
                     if (!new TrackRangeUtils().avoidRange(avoid, avoidRange[1])) {
-                        log.error("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
+                        log.error("RGV琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+                        errorRgv = "RGV琛岃蛋鐩爣瓒呭嚭鑼冨洿";
+
+                        try{
+                            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                            deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV琛岃蛋瓒呭嚭鑼冨洿");
+                        } catch (Exception e2){
+//                            log.error("e2:"+e2.getMessage());
+                        }
                         return false;
+                    }
+                    long avoidAbs = Math.abs(avoid - rgvProtocolOther.getRgvPos());
+                    if (avoidAbs<51){
+                        return true;
                     }
                     rgvTaskProtocolOther.setAvoid(1);
                     rgvTaskProtocolOther.setAvoidingTheDestination(avoid);
                     RgvTaskCache.updateRgvStatus(rgvTaskProtocolOther);
-                    return true;
+                    return false;
                 }
 
             } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.WORKING)) {
                 if ((targetPosition - rgvProtocol.getCarBodyJiaoMing())
                         - (rgvProtocolOther.getRgvPosDestination() + rgvProtocolOther.getCarBodyKunPeng())
-                        > avoidDistance) {//鏃犻渶閬胯
+                        > avoidDistance-50) {//鏃犻渶閬胯
                     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("琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛佷换鍔″紓甯�  鑱旂郴绠$悊鍛橈紒锛侊紒");
+                            log.error("RGV琛岃蛋瓒呭嚭鑼冨洿锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+                            errorRgv = "RGV琛岃蛋鐩爣瓒呭嚭鑼冨洿";
+
+                            try{
+                                DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                                deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV琛岃蛋瓒呭嚭鑼冨洿");
+                            } catch (Exception e2){
+//                                log.error("e2:"+e2.getMessage());
+                            }
+                            return false;
+                        }
+                        long avoidAbs = Math.abs(avoid - rgvProtocol.getRgvPos());
+                        if (avoidAbs<51){
                             return false;
                         }
                         rgvTaskProtocol.setAvoid(1);
@@ -346,10 +972,19 @@
                         RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
                         return false;
                     }
+                    errorRgv = slave.getOtherId()+"鍙稲GV绛夊緟涓�...";
                     return false;
+                }
+            } else {
+                if ((rgvProtocolOther.getRgvPosDestinationOrPos(false) - rgvProtocolOther.getCarBodyJiaoMing())
+                        - (targetPosition + rgvProtocol.getCarBodyKunPeng())
+                        > avoidDistance - 50) {//鏃犻渶閬胯
+                    return true;
                 }
             }
         }
+
+        errorRgv = slave.getOtherId()+"鍙稲GV褰卞搷锛岀瓑寰呬腑...";
         return false;
     }
 
@@ -381,7 +1016,13 @@
                 rgvProtocol.setStatusEnable(false);
             }
         } catch (Exception e) {
-            log.error("RGV寮傚父锛侊紒锛�" + e.getMessage());
+            log.error("RGV寮傚父锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+            try{
+                DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV寮傚父"+e.getMessage());
+            } catch (Exception e2){
+//                log.error("e2:"+e2.getMessage());
+            }
             rgvProtocol.setStatusEnable(true);
         }
 
@@ -390,7 +1031,7 @@
             rgvTaskProtocol = new RgvTaskProtocol();
             rgvTaskProtocol.setRgvNo(slave.getId());
         }
-        rgvTaskProtocol.setAvoid(-1);
+        rgvTaskProtocol.setAvoid(0);
         rgvTaskProtocol.setAvoidingTheDestination(0L);
 
         RgvStatusCache.updateRgvStatus(rgvProtocol);
@@ -414,6 +1055,12 @@
 //            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());
 
+            try{
+                DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                deviceErrorService.addDeviceError("rgv", slave.getId(), "RGVplc杩炴帴澶辫触");
+            } catch (Exception e2){
+//                log.error("e2:"+e2.getMessage());
+            }
         }
         initRgv();
 //        siemensNet.ConnectClose();
@@ -425,22 +1072,56 @@
      */
     private void readStatus() {
         try {
-            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 34);
+            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 20);
             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.setStatus((short)1);
+
+                //浣滀笟鍚姩涓�  瑙e喅浠诲姟涓嬪彂鍚庡皬杞︾姸鎬佹湭鏇存柊锛屽皬杞︾姸鎬佷笉鍙婃椂
+                if (this.wrkSign == 1 && rgvProtocol.getStatus()!=(short)1){
+                    this.wrkSign = 0;
+                }
+                if (this.wrkSign == 1){
+                    rgvProtocol.setStatus((short)110);
+                }
+
+                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, 2);
+                rgvProtocol.setLoaded(status[0]? (short)1:(short)0);
+                rgvProtocol.setErr1(status[8]);
+                rgvProtocol.setErr2(status[9]);
+                rgvProtocol.setErr3(status[10]);
+                rgvProtocol.setErr4(status[11]);
+                rgvProtocol.setErr5(status[12]);
+                rgvProtocol.setErr6(status[13]);
+                rgvProtocol.setErr7(status[13]);
+                rgvProtocol.setErr8(status[13]);
+//                System.out.println("璇荤嚎绋�"+ slave.getId()+"---"+JSON.toJSONString(rgvProtocol));
+//                System.out.println("璇荤嚎绋�,灏忚溅鍙�"+ slave.getId()+"鏃堕棿鎴筹細"+System.currentTimeMillis()+"灏忚溅鏁版嵁锛�"+JSON.toJSONString(rgvProtocol));
                 OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛", DateUtils.convert(new Date()), slave.getId()));
 //                // 宸ヤ綅1澶嶄綅淇″彿
 //                if (rgvProtocol.getStatusType().equals(RgvStatusType.WAITING)
@@ -453,6 +1134,9 @@
 //                        }
 //                    }
 //                }
+                if (rgvProtocol.getAlarm$()!=0){
+                    RgvErrCache.updateRgvErr(slave.getId(),rgvProtocol.getAlarmM());
+                }
 
                 try {
                     // 鏍规嵁瀹炴椂淇℃伅鏇存柊鏁版嵁搴�
@@ -468,6 +1152,13 @@
                     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());
+
+                        try{
+                            DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                            deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV plc鏁版嵁搴撴洿鏂板け璐�");
+                        } catch (Exception e2){
+//                            log.error("e2:"+e2.getMessage());
+                        }
                     }
                 } catch (Exception ignore) {
 
@@ -479,13 +1170,28 @@
 
             } 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());
+
+                try{
+                    DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                    deviceErrorService.addDeviceError("rgv", slave.getId(), "璇诲彇RGV plc鐘舵�佷俊鎭け璐�");
+                } catch (Exception e2){
+//                    log.error("e2:"+e2.getMessage());
+                }
             }
         } catch (Exception e) {
 //            e.printStackTrace();
 //            OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆戣鍙朢GV plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
             log.error("璇诲彇RGV plc鐘舵�佷俊鎭け璐� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+
+            try{
+                DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                deviceErrorService.addDeviceError("rgv", slave.getId(), "璇诲彇RGV plc鐘舵�佷俊鎭け璐�");
+            } catch (Exception e2){
+//                log.error("e2:"+e2.getMessage());
+            }
             initRgv();
         }
     }
@@ -495,19 +1201,37 @@
      */
     private boolean write(TaskProtocol taskProtocol) throws InterruptedException {
         if (null == taskProtocol) {
-            log.error("RGV鍐欏叆鍛戒护涓虹┖");
+            log.error("RGV鍐欏叆鍛戒护涓虹┖ ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+
+            try{
+                DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV鍐欏叆鍛戒护涓虹┖");
+            } catch (Exception e2){
+//                log.error("e2:"+e2.getMessage());
+            }
             return false;
         }
 //        convertRow(command);
 //        taskProtocol.setRgvNo(slave.getId());
-        Long[] array = new Long[11];
+//        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:鍙�
+        Thread.sleep(20L);
+
+        OperateResult result4 = siemensNet.Write("DB100.12.0", true);
+        this.wrkSign = 1;
+
+//        log.info("浠诲姟涓嬪彂绾跨▼,灏忚溅鍙�"+ slave.getId()+"鏃堕棿鎴筹細"+System.currentTimeMillis());
 
 //        if (taskProtocol.getAckFinish1() == 0) {
 //            short commandFinish = 3;  //宸ヤ綅1銆�2浠诲姟鍚屾椂鍐欏叆
@@ -536,10 +1260,19 @@
         } catch (Exception ignore) {
         }
 
+        readStatus();
         if (result != null && result.IsSuccess) {
-            Thread.sleep(200);
-            this.readStatus();
+//            Thread.sleep(50);
+//            this.readStatus();
             log.info("RGV 鍛戒护涓嬪彂[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(taskProtocol));
+            log.error("RGV 鍛戒护涓嬪彂 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+
+            try{
+                DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
+                deviceErrorService.addDeviceError("rgv", slave.getId(), "RGV 鍛戒护涓嬪彂"+JSON.toJSON(taskProtocol));
+            } catch (Exception e2){
+//                log.error("e2:"+e2.getMessage());
+            }
             OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆慬id:{1}] >>>>> 鍛戒护涓嬪彂锛� {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(taskProtocol)));
             return true;
         } else {
@@ -549,6 +1282,54 @@
         }
     }
 
+    private boolean writeDelRgvTask() throws InterruptedException {
+//
+        OperateResult result = siemensNet.Write("DB100.12.0", false);
+        OperateResult result0 = siemensNet.Write("DB100.0", (int) 0);
+        OperateResult result1 = siemensNet.Write("DB100.4", (short) 0);
+        OperateResult result2 = siemensNet.Write("DB100.6", (int) 0);
+        OperateResult result3 = siemensNet.Write("DB100.10", (short) 0); // 鎵ц鏂瑰悜锛堥潰鏈濊建閬� 瀹氫綅鍊煎乏灏忓彸澶э級    true:宸�   false:鍙�
+        log.info("浠诲姟瀹屾垚涓嬪彂绾跨▼,灏忚溅鍙�"+ slave.getId()+"鏃堕棿鎴筹細"+System.currentTimeMillis());
+
+        try {
+            // 鏃ュ織璁板綍
+            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
+            BasRgvOpt basRgvOpt = new BasRgvOpt(
+                    0,
+                    0,
+                    slave.getId(),
+                    new Date(),
+                    String.valueOf(0),
+                    null,
+                    null,
+                    null,
+                    result.IsSuccess ? 1 : 0,
+                    null,
+                    new Date(),
+                    null
+            );
+            bean.insert(basRgvOpt);
+        } catch (Exception ignore) {
+        }
+
+        if (result != null && result.IsSuccess) {
+//            Thread.sleep(200);
+//            this.readStatus();
+            log.info("RGV 鍛戒护涓嬪彂[id:{}] >>>>> {}", slave.getId(), JSON.toJSON("null"));
+            OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆慬id:{1}] >>>>> 鍛戒护涓嬪彂锛� {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON("null")));
+            return true;
+        } else {
+            OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆戝啓鍏GV plc鏁版嵁澶辫触 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            log.error("鍐欏叆RGV plc鏁版嵁澶辫触 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+            return false;
+        }
+    }
+
+
+    public void setDelRgvTask() {
+        delRgvTask = true;
+    }
+
     @Override
     public void close() {
         siemensNet.ConnectClose();

--
Gitblit v1.9.1