| package com.zy.core.thread; | 
|   | 
| import HslCommunication.Core.Types.OperateResult; | 
| import HslCommunication.Core.Types.OperateResultExOne; | 
| import HslCommunication.Profinet.Siemens.SiemensPLCS; | 
| import HslCommunication.Profinet.Siemens.SiemensS7Net; | 
| import com.alibaba.fastjson.JSON; | 
| import com.core.common.Cools; | 
| import com.core.common.DateUtils; | 
| import com.core.common.SpringUtils; | 
| import com.zy.asrs.entity.BasRgv; | 
| 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; | 
| import com.zy.core.enums.RgvStatusType; | 
| import com.zy.core.enums.RgvTaskModeType; | 
| import com.zy.core.enums.SlaveType; | 
| 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.*; | 
| import lombok.Data; | 
| import lombok.extern.slf4j.Slf4j; | 
| import org.springframework.beans.factory.annotation.Value; | 
|   | 
| import java.text.MessageFormat; | 
| import java.util.Date; | 
| import java.util.List; | 
| import java.util.concurrent.ConcurrentHashMap; | 
|   | 
| /** | 
|  * RGV线程 | 
|  * Created by vincent on 2022/11/29 | 
|  */ | 
| @Data | 
| @Slf4j | 
| public class RgvThread implements Runnable, ThreadHandler { | 
|   | 
|     private SiemensS7Net siemensNet; | 
|     private RgvSlave slave; | 
|     //    private RgvProtocol rgvProtocol; | 
|     private TaskProtocolCache taskProtocolCache = new TaskProtocolCache(); | 
|     // # 轨道总长 | 
|     private Long trackEntireLength = 224000L; | 
|     //# 轨道基准点 | 
|     private Long trackBenchmark = 1L; | 
|     //  # 避让距离 | 
|     private Long avoidDistance = 5000L; | 
|     private String errorRgv = "-"; | 
|   | 
|     /** | 
|      * 工位1复位信号 | 
|      */ | 
|     private boolean resetFlag1 = false; | 
|     /** | 
|      * 工位2复位信号 | 
|      */ | 
|     private boolean resetFlag2 = false; | 
|   | 
|     private boolean connectRgv = false; | 
|     public Long currentTimeMilliConnectRgv= 0L; | 
|   | 
|     private boolean delRgvTask = false; | 
|     private short wrkSign = 0; | 
|   | 
|     public RgvThread(RgvSlave slave) { | 
|         this.slave = slave; | 
|     } | 
|   | 
|     @Override | 
|     @SuppressWarnings("InfiniteLoopStatement") | 
|     public void run() { | 
|         initRgv(); | 
|         try{ | 
|             Thread.sleep(2000); | 
|         } catch (Exception e){ | 
|   | 
|         } | 
|         connectRgv = this.connect(); | 
|         while(!connectRgv){ | 
|             try { | 
|                 connectRgv = this.connect(); | 
|                 Thread.sleep(100); | 
|             } catch (Exception e){ | 
|   | 
|             } | 
|         } | 
|   | 
|         // 启动线程自动重连 | 
|         new Thread(this::rgvConnect).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 { | 
|                 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("rgvErr", slave.getId(), "rgv连接失败"+e.getMessage()); | 
|                 } catch (Exception e2){ | 
| //                    log.error("e2:"+e2.getMessage()); | 
|                 } | 
|                 initRgv(); | 
| //                e.printStackTrace(); | 
|             } | 
|         } | 
|     } | 
|   | 
|     private void readStatusRgv() { | 
|         while (true) { | 
|             try { | 
|                 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数据读取线程异常!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); | 
|                 try{ | 
|                     DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); | 
|                     deviceErrorService.addDeviceError("rgvErr", slave.getId(), "RGV数据读取线程异常"+e.getMessage()); | 
|                 } catch (Exception e2){ | 
| //                    log.error("e2:"+e2.getMessage()); | 
|                 } | 
|                 initRgv(); | 
| //                e.printStackTrace(); | 
|             } | 
|   | 
|         } | 
|   | 
|     } | 
|   | 
|     /** | 
|      * 完成 | 
|      */ | 
|     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("rgvErr", 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("rgvErr", slave.getId(), "RGV任务下发线程异常"+e.getMessage()); | 
| //                } catch (Exception e2){ | 
| //                    log.error("e2:"+e2.getMessage()); | 
| //                } | 
| ////                e.printStackTrace(); | 
| //            } | 
| //        } | 
| //    } | 
|   | 
|     /** | 
|      * 漫游 | 
|      */ | 
|     private void taskWalkIssued() { | 
|         while (true) { | 
|             try { | 
|                 if(!connectRgv){ | 
|                     try { | 
|                         Thread.sleep(1000L); | 
|                     } catch (Exception e){ | 
|   | 
|                     } | 
|                     continue; | 
|                 } | 
|                 // 休眠 1 秒 | 
|                 Thread.sleep(100); | 
|   | 
|                 if (!deviceDetection()) { | 
|                     continue; | 
|                 } | 
|                 RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); | 
|                 if (rgvTaskProtocol == null) { | 
|                     initRgv(); | 
|                     rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); | 
|                 } | 
|                 if (rgvTaskProtocol.getAvoid() != 1) { | 
|                     continue; | 
|                 } | 
|                 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); | 
|                 RgvTaskCache.updateRgvStatus(rgvTaskProtocol); | 
|   | 
|             } catch (Exception e) { | 
|                 log.error("RGV行走任务下发线程异常!!!" + e.getMessage()); | 
| //                e.printStackTrace(); | 
|             } | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 任务下发 | 
|      */ | 
|     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(100); | 
|                 rgvRun = RgvRunCache.getRgvRun(); | 
| //                System.out.println(JSON.toJSON(rgvRun)); | 
|   | 
|                 // 休眠 1 秒 | 
|                 if (System.currentTimeMillis() - rgvRun.currentTimeMilliOld > 500L) { | 
|                     rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50; | 
|                 } else { | 
|                     continue; | 
|                 } | 
|                 if (!deviceDetection()) { | 
|                     rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50; | 
|                     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) { | 
|                     initRgv(); | 
|                     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()+50; | 
|                     rgvRun.setRgvNo(slave.getOtherId()); | 
|                     RgvRunCache.updateRgvStatus(rgvRun); | 
|                     continue; | 
|                 } | 
|                 if (rgvProtocol.getLoaded() == -1){ | 
|                     rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50; | 
|                     rgvRun.setRgvNo(slave.getOtherId()); | 
|                     RgvRunCache.updateRgvStatus(rgvRun); | 
|                     RgvErrCache.updateRgvErr(slave.getId(),"小车探物物状态异常"); | 
|                     continue; | 
|                 } | 
|                 if (rgvTaskProtocol.getAvoid() != 0) { | 
|                     rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50; | 
|                     rgvRun.setRgvNo(slave.getOtherId()); | 
|                     RgvRunCache.updateRgvStatus(rgvRun); | 
|                     continue; | 
|                 } | 
|   | 
|                 List<TaskProtocol> allTakeTaskProtocol = taskProtocolCache.getTakeOrPutTaskProtocol(rgvProtocol.getLoaded()); | 
|                 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; | 
|                             } | 
|                         } | 
|                     } | 
|                     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()+50; | 
|                 rgvRun.setRgvNo(slave.getOtherId()); | 
|                 RgvRunCache.updateRgvStatus(rgvRun); | 
|             } catch (Exception e) { | 
|                 log.error("RGV任务下发线程异常!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); | 
|                 try{ | 
|                     DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); | 
|                     deviceErrorService.addDeviceError("rgvErr", slave.getId(), "RGV任务下发线程异常"+e.getMessage()); | 
|                 } catch (Exception e2){ | 
| //                    log.error("e2:"+e2.getMessage()); | 
|                 } | 
|                 rgvRun = RgvRunCache.getRgvRun(); | 
|                 rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50; | 
|                 rgvRun.setRgvNo(slave.getOtherId()); | 
|                 RgvRunCache.updateRgvStatus(rgvRun); | 
|                 continue; | 
| //                e.printStackTrace(); | 
|             } | 
|         } | 
|     } | 
|     public boolean isSignRgvTaskProtocol() { | 
|         RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); | 
|         if (rgvTaskProtocol == null) { | 
|             return false; | 
|         } | 
|         RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); | 
|         RgvTaskProtocol rgvTaskProtocolOther = RgvTaskCache.getRgvStatus(slave.getOtherId()); | 
|   | 
|         if (rgvProtocolOther == null) { | 
|             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; | 
|             } | 
|         } | 
|         return true; | 
|     } | 
|   | 
|     public boolean rgvOtherStatusEnable() { | 
|         RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); | 
|         if (rgvProtocolOther == null) { | 
|             return true; | 
|         } | 
|         if (rgvProtocolOther.statusEnable) { | 
| //            if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L)) { | 
|             return true; | 
| //            } | 
|         } | 
|         return false; | 
|     } | 
|   | 
|     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()); | 
|         RgvTaskProtocol rgvTaskProtocolOther = RgvTaskCache.getRgvStatus(slave.getOtherId()); | 
|         Long[][] avoidRange = new TrackRangeUtils().avoidRange(slave, trackEntireLength, trackBenchmark, avoidDistance); | 
|   | 
|         if (new TrackRangeUtils().IsItSmall(slave)) { | 
|             if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE) && (Math.abs(rgvProtocolOther.getRgvPos() - rgvProtocolOther.getRgvPosDestination())<50)) { | 
|                 if ((rgvProtocolOther.getRgvPos() - rgvProtocolOther.getCarBodyJiaoMing()) | 
|                         - (targetPosition + rgvProtocol.getCarBodyKunPeng()) | 
|                         > 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("rgvErr", 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()+"号RGV等待作业..."; | 
|                             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()+"号RGV等待作业..."; | 
|                                                 return false; | 
|                                             } | 
|                                         } | 
|                                         signNowPosRun =false; | 
|                                     } | 
|                                 } | 
|                             } else { | 
|                                 long twoPos = Math.abs(nowPosRunTask2.getTargetPosition() - rgvProtocolOther.getRgvPos()); | 
|                                 if (twoPos<100){ | 
|                                     errorRgv = slave.getOtherId()+"号RGV等待作业..."; | 
|                                     return false; | 
|                                 } | 
|                                 if (Math.abs(onePos - twoPos)>100){ | 
|                                     if (onePos-50>twoPos+50){ | 
|                                         signNowPosRun =false; | 
|                                     } | 
|                                 } | 
|                             } | 
|                         } | 
|   | 
|                         if (signNowPosRun){ | 
|                             errorRgv = slave.getOtherId()+"号RGV等待作业..."; | 
|                             return false; | 
|                         } | 
|                     } | 
|                     long avoid = targetPosition + rgvProtocol.getCarBodyKunPeng() + avoidDistance + rgvProtocolOther.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("rgvErr", 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 false; | 
|                 } | 
|             } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.ROAM)) { | 
|                 if ((rgvProtocolOther.getRgvPosDestination() - rgvProtocolOther.getCarBodyJiaoMing()) | 
|                         - (targetPosition + rgvProtocol.getCarBodyKunPeng()) | 
|                         > avoidDistance - 50) {//无需避让 | 
|                     return true; | 
|                 } else { | 
|                     long avoid = targetPosition + rgvProtocol.getCarBodyKunPeng() + avoidDistance + rgvProtocolOther.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("rgvErr", 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 false; | 
|                 } | 
|             } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.WORKING)) { | 
|                 if ((rgvProtocolOther.getRgvPosDestination() - rgvProtocolOther.getCarBodyJiaoMing()) | 
|                         - (targetPosition + rgvProtocol.getCarBodyKunPeng()) | 
|                         > avoidDistance - 50) {//无需避让 | 
|                     return true; | 
|                 } 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("RGV行走超出范围!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); | 
|                             errorRgv = "RGV行走目标超出范围"; | 
|   | 
|                             try{ | 
|                                 DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); | 
|                                 deviceErrorService.addDeviceError("rgvErr", 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; | 
|                     } | 
|                     errorRgv = slave.getOtherId()+"号RGV影响,等待中..."; | 
|   | 
|                     return false; | 
|                 } | 
|             } else { | 
|                 if ((rgvProtocolOther.getRgvPosDestinationOrPos(true) - rgvProtocolOther.getCarBodyJiaoMing()) | 
|                         - (targetPosition + rgvProtocol.getCarBodyKunPeng()) | 
|                         > avoidDistance - 50) {//无需避让 | 
|                     return true; | 
|                 } | 
|             } | 
|         } else { | 
|             if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE)  && (Math.abs(rgvProtocolOther.getRgvPos() - rgvProtocolOther.getRgvPosDestination())<50)) { | 
|                 if ((targetPosition - rgvProtocol.getCarBodyJiaoMing()) | 
|                         - (rgvProtocolOther.getRgvPos() + rgvProtocolOther.getCarBodyKunPeng()) | 
|                         > 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("rgvErr", 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()+"号RGV等待作业..."; | 
|                             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()+"号RGV等待作业..."; | 
|                                                 return false; | 
|                                             } | 
|                                         } | 
|                                         signNowPosRun =false; | 
|                                     } | 
|                                 } | 
|                             } else { | 
|                                 long twoPos = Math.abs(nowPosRunTask2.getTargetPosition() - rgvProtocolOther.getRgvPos()); | 
|                                 if (twoPos<100){ | 
|                                     errorRgv = slave.getOtherId()+"号RGV等待作业..."; | 
|                                     return false; | 
|                                 } | 
|                                 if (Math.abs(onePos - twoPos)>100){ | 
|                                     if (onePos-50>twoPos+50){ | 
|                                         signNowPosRun =false; | 
|                                     } | 
|                                 } | 
|                             } | 
|                         } | 
|   | 
|                         if (signNowPosRun){ | 
|                             errorRgv = slave.getOtherId()+"号RGV等待作业..."; | 
|                             return false; | 
|                         } | 
|                     } | 
|                     long avoid = targetPosition - rgvProtocol.getCarBodyJiaoMing() - avoidDistance - rgvProtocolOther.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("rgvErr", 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 false; | 
|                 } | 
|             } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.ROAM)) { | 
|                 if ((targetPosition - rgvProtocol.getCarBodyJiaoMing()) | 
|                         - (rgvProtocolOther.getRgvPosDestination() + rgvProtocolOther.getCarBodyKunPeng()) | 
|                         > avoidDistance - 50) {//无需避让 | 
|                     return true; | 
|                 } else { | 
|                     long avoid = targetPosition - rgvProtocol.getCarBodyJiaoMing() - avoidDistance - rgvProtocolOther.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("rgvErr", 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 false; | 
|                 } | 
|   | 
|             } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.WORKING)) { | 
|                 if ((targetPosition - rgvProtocol.getCarBodyJiaoMing()) | 
|                         - (rgvProtocolOther.getRgvPosDestination() + rgvProtocolOther.getCarBodyKunPeng()) | 
|                         > avoidDistance-50) {//无需避让 | 
|                     return true; | 
|                 } 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("RGV行走超出范围!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); | 
|                             errorRgv = "RGV行走目标超出范围"; | 
|   | 
|                             try{ | 
|                                 DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); | 
|                                 deviceErrorService.addDeviceError("rgvErr", 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; | 
|                     } | 
|                     errorRgv = slave.getOtherId()+"号RGV等待中..."; | 
|                     return false; | 
|                 } | 
|             } else { | 
|                 if ((rgvProtocolOther.getRgvPosDestinationOrPos(false) - rgvProtocolOther.getCarBodyJiaoMing()) | 
|                         - (targetPosition + rgvProtocol.getCarBodyKunPeng()) | 
|                         > avoidDistance - 50) {//无需避让 | 
|                     return true; | 
|                 } | 
|             } | 
|         } | 
|   | 
|         errorRgv = slave.getOtherId()+"号RGV影响,等待中..."; | 
|         return false; | 
|     } | 
|   | 
|     /** | 
|      * 初始化RGV状态 | 
|      */ | 
|     private void initRgv() { | 
|         RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId()); | 
|         if (rgvProtocol == null) { | 
|             rgvProtocol = new RgvProtocol(); | 
|             rgvProtocol.setRgvNo(slave.getId()); | 
|         } | 
|         rgvProtocol.setMode((short) -1); | 
|         rgvProtocol.setStatus((short) -1); | 
|         rgvProtocol.setWalkPos((short) 0); | 
|         rgvProtocol.setRgvPos(0L); | 
|         rgvProtocol.setAlarm((short) 0); | 
|         rgvProtocol.setxSpeed((short) 0); | 
|         rgvProtocol.setxDistance((short) 0); | 
|         rgvProtocol.setxDuration((short) 0); | 
|         rgvProtocol.setCarBodyJiaoMing(0L); | 
|         rgvProtocol.setCarBodyKunPeng(0L); | 
|         try { | 
|             BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class); | 
|             BasRgv rgv = basRgvService.selectById(slave.getId()); | 
|             if (!Cools.isEmpty(rgv)) { | 
|                 rgvProtocol.setStatusEnable(rgv.getStatus() == 1); | 
|             } else { | 
|                 rgvProtocol.setStatusEnable(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("rgvErr", slave.getId(), "RGV异常"+e.getMessage()); | 
|             } catch (Exception e2){ | 
| //                log.error("e2:"+e2.getMessage()); | 
|             } | 
|             rgvProtocol.setStatusEnable(true); | 
|         } | 
|   | 
|         RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); | 
|         if (rgvTaskProtocol == null) { | 
|             rgvTaskProtocol = new RgvTaskProtocol(); | 
|             rgvTaskProtocol.setRgvNo(slave.getId()); | 
|         } | 
|         rgvTaskProtocol.setAvoid(0); | 
|         rgvTaskProtocol.setAvoidingTheDestination(0L); | 
|   | 
|         RgvStatusCache.updateRgvStatus(rgvProtocol); | 
|   | 
|         RgvTaskCache.updateRgvStatus(rgvTaskProtocol); | 
|   | 
|     } | 
|   | 
|     @Override | 
|     public boolean connect() { | 
|         boolean result = false; | 
|         siemensNet = new SiemensS7Net(SiemensPLCS.S1200, slave.getIp()); | 
|         siemensNet.setRack(slave.getRack().byteValue()); | 
|         siemensNet.setSlot(slave.getSlot().byteValue()); | 
|         OperateResult connect = siemensNet.ConnectServer(); | 
|         if (connect.IsSuccess) { | 
|             result = true; | 
| //            OutputQueue.RGV.offer(MessageFormat.format( "【{0}】RGV 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()); | 
|         } else { | 
| //            OutputQueue.RGV.offer(MessageFormat.format("【{0}】RGV 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()); | 
|   | 
|             if (System.currentTimeMillis()-currentTimeMilliConnectRgv>1000*60*10){ | 
|                 try{ | 
|                     DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); | 
|                     deviceErrorService.addDeviceError("rgvErr", slave.getId(), "RGVplc连接失败"); | 
|                 } catch (Exception e2){ | 
| //                log.error("e2:"+e2.getMessage()); | 
|                 } | 
|                 if (currentTimeMilliConnectRgv == 0){ | 
|                     currentTimeMilliConnectRgv = System.currentTimeMillis()-1000*60*10-1; | 
|                 } else { | 
|                     currentTimeMilliConnectRgv = System.currentTimeMillis(); | 
|                 } | 
|             } | 
|         } | 
|         initRgv(); | 
| //        siemensNet.ConnectClose(); | 
|         return result; | 
|     } | 
|   | 
|     /** | 
|      * 读取状态 | 
|      */ | 
|     private void readStatus() { | 
|         try { | 
|             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.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); | 
|   | 
|                 //作业启动中  解决任务下发后小车状态未更新,小车状态不及时 | 
|                 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[14]); | 
|                 rgvProtocol.setErr8(status[15]); | 
| //                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) | 
| //                        || rgvProtocol.getStatusType().equals(RgvStatusType.FETCHWAITING)) { | 
| //                    if (resetFlag1) { | 
| //                        RgvCommand rgvCommand = new RgvCommand(); | 
| //                        rgvCommand.setAckFinish1((short)1); | 
| //                        if (write(rgvCommand)) { | 
| //                            resetFlag1 = false; | 
| //                        } | 
| //                    } | 
| //                } | 
|                 if (rgvProtocol.getAlarm$()!=0){ | 
|                     RgvErrCache.updateRgvErr(slave.getId(),rgvProtocol.getAlarmM()); | 
|                 } | 
|   | 
|                 try { | 
|                     // 根据实时信息更新数据库 | 
|                     BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class); | 
|                     BasRgv basRgv = basRgvService.selectById(slave.getId()); | 
|                     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))) { | 
|                         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("rgvErr", slave.getId(), "RGV plc数据库更新失败"); | 
|                         } catch (Exception e2){ | 
| //                            log.error("e2:"+e2.getMessage()); | 
|                         } | 
|                     } | 
|                 } catch (Exception ignore) { | 
|   | 
|                 } | 
|   | 
|   | 
|                 // 更新缓存 | 
|                 RgvStatusCache.updateRgvStatus(rgvProtocol); | 
|   | 
|             } else { | 
|                 initRgv(); | 
|                 connectRgv = false; | 
| //                OutputQueue.RGV.offer(MessageFormat.format("【{0}】读取RGV 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("rgvErr", slave.getId(), "读取RGV plc状态信息失败"); | 
|                 } catch (Exception e2){ | 
| //                    log.error("e2:"+e2.getMessage()); | 
|                 } | 
|             } | 
|         } catch (Exception e) { | 
| //            e.printStackTrace(); | 
| //            OutputQueue.RGV.offer(MessageFormat.format("【{0}】读取RGV 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("rgvErr", slave.getId(), "读取RGV plc状态信息失败"); | 
|             } catch (Exception e2){ | 
| //                log.error("e2:"+e2.getMessage()); | 
|             } | 
|             initRgv(); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 写入数据 | 
|      */ | 
|     private boolean write(TaskProtocol taskProtocol) throws InterruptedException { | 
|         if (null == taskProtocol) { | 
|             log.error("RGV写入命令为空 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); | 
|   | 
|             try{ | 
|                 DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); | 
|                 deviceErrorService.addDeviceError("rgvErr", slave.getId(), "RGV写入命令为空"); | 
|             } catch (Exception e2){ | 
| //                log.error("e2:"+e2.getMessage()); | 
|             } | 
|             return false; | 
|         } | 
| //        convertRow(command); | 
| //        taskProtocol.setRgvNo(slave.getId()); | 
| //        Long[] array = new Long[11]; | 
|         OperateResult result41 = siemensNet.Write("DB100.12.0", false); | 
| //        array[0] = taskProtocol.getAckFinish1(); | 
| //        array[1] = taskProtocol.getTaskNo(); | 
| //        array[2] = taskProtocol.getTaskMode(); | 
| //        array[4] = command.getDestinationStaNo(); | 
| //        array[10] = taskProtocol.getCommand(); | 
|         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任务同时写入 | 
| //            Thread.sleep(100L); | 
| //            result = siemensNet.Write("DB100.20", commandFinish); | 
| //        } | 
|   | 
|         try { | 
|             // 日志记录 | 
|             BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class); | 
|             BasRgvOpt basRgvOpt = new BasRgvOpt( | 
|                     taskProtocol.getTaskNo().intValue(), | 
|                     taskProtocol.getTaskNo().intValue(), | 
|                     slave.getId(), | 
|                     new Date(), | 
|                     String.valueOf(taskProtocol.getTaskStatus()), | 
|                     null, | 
|                     null, | 
|                     null, | 
|                     result.IsSuccess ? 1 : 0, | 
|                     null, | 
|                     new Date(), | 
|                     null | 
|             ); | 
|             bean.insert(basRgvOpt); | 
|         } catch (Exception ignore) { | 
|         } | 
|   | 
|         readStatus(); | 
|         if (result != null && result.IsSuccess) { | 
| //            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("rgvWrite", 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 { | 
|             OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV 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; | 
|         } | 
|     } | 
|   | 
|     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}】写入RGV 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; | 
|         } | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 清除作业启动中 | 
|      */ | 
|     @Override | 
|     public void setWrkSign() { | 
|         this.wrkSign = 0; | 
|     } | 
|   | 
|     public void setDelRgvTask() { | 
|         delRgvTask = true; | 
|     } | 
|   | 
|     @Override | 
|     public void close() { | 
|         siemensNet.ConnectClose(); | 
|     } | 
|   | 
| } |