#ZH
野心家
2025-05-27 1b9f41e12e3ee8ac8bbc388eab7585300bdab75a
src/main/java/com/zy/core/thread/RgvThread.java
@@ -12,7 +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;
@@ -22,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;
@@ -44,14 +45,15 @@
    private SiemensS7Net siemensNet;
    private RgvSlave slave;
//    private RgvProtocol rgvProtocol;
    //    private RgvProtocol rgvProtocol;
    private TaskProtocolCache taskProtocolCache = new TaskProtocolCache();
    // # 轨道总长
    private Long trackEntireLength = 100L;
    private Long trackEntireLength = 224000L;
    //# 轨道基准点
    private Long trackBenchmark = 100L;
    private Long trackBenchmark = 1L;
    //  # 避让距离
    private Long avoidDistance = 100L;
    private Long avoidDistance = 5000L;
    private String errorRgv = "-";
    /**
     * 工位1复位信号
@@ -62,6 +64,9 @@
     */
    private boolean resetFlag2 = false;
    private boolean connectRgv = false;
    private boolean delRgvTask = false;
    public RgvThread(RgvSlave slave) {
        this.slave = slave;
    }
@@ -69,29 +74,74 @@
    @Override
    @SuppressWarnings("InfiniteLoopStatement")
    public void run() {
        boolean connect = this.connect();
        if (connect){
        connectRgv = this.connect();
        while(!connectRgv){
            try {
                connectRgv = this.connect();
                Thread.sleep(100);
            } catch (Exception e){
            // 启动读数据线程
            new Thread(this::readStatusRgv).start();
            }
        }
            // 启动任务下发线程
            new Thread(this::taskIssued).start();
        // 启动线程自动重连
        new Thread(this::rgvConnect).start();
            // 启动漫游线程
            new Thread(this::taskWalkIssued).start();
        // 启动读数据线程
        new Thread(this::readStatusRgv).start();
        // 启动任务下发线程
        new Thread(this::taskIssued).start();
        // 启动漫游线程
//        new Thread(this::taskWalkIssued).start();
//        new Thread(this::taskWalkIssued2).start();
        // 启动任务完成线程
        new Thread(this::taskComplete).start();
    }
    private void rgvConnect() {
        while (true) {
            try {
                if(!connectRgv){
                    try {
                        connectRgv = this.connect();
                        Thread.sleep(100);
                    } catch (Exception e){
                    }
                }
            } catch (Exception e) {
                log.error("rgv连接失败!!! ===>> [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(){
    private void readStatusRgv() {
        while (true) {
            try {
                Thread.sleep(100);
                Thread.sleep(20);
//                System.out.println("读线程"+ slave.getId());
                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();
            }
@@ -101,52 +151,168 @@
    }
    /**
     * 漫游
     * 完成
     */
    private void taskWalkIssued() {
    private void taskComplete() {
        while (true) {
            try {
                // 休眠 1 秒
                Thread.sleep(100);
                if (!deviceDetection()){
                if (delRgvTask){
                    writeDelRgvTask();
                    delRgvTask = false;
                    continue;
                }
                RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
                if (rgvTaskProtocol == null) {
                    initRgv();
                    rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
                Thread.sleep(40);
                OperateResultExOne<byte[]> result = siemensNet.Read("DB100.12", (short) 1);
                boolean[] status = siemensNet.getByteTransform().TransBool(result.Content, 0, 1);
                if (status[0]){
                    OperateResult result4 = siemensNet.Write("DB100.12.0", false);
                }
                if (rgvTaskProtocol.getAvoid() != 1) {
                    continue;
                }
                TaskProtocol issued = new TaskProtocol();
                issued.setTaskNo(32222L);
                issued.setTargetPosition(rgvTaskProtocol.getAvoidingTheDestination());
                write(issued);
                rgvTaskProtocol.setAvoid(0);
                Thread.sleep(200);
                RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
            } 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();
            }
        }
    }
    /**
     * 任务下发
     */
//    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();
//            }
//        }
//    }
    /**
     * 漫游
     */
//    private void taskWalkIssued() {
//        while (true) {
//            try {
//                // 休眠 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) {
            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 > 500) {
                    rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50;
                } else {
                    continue;
                }
                if (!deviceDetection()) {
                    rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50;
                    rgvRun.setRgvNo(slave.getOtherId());
                    RgvRunCache.updateRgvStatus(rgvRun);
                    RgvErrCache.updateRgvErr(slave.getId(),errorRgv);
                    continue;
                }
                RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
                RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
                if (rgvProtocol == null || rgvTaskProtocol == null) {
@@ -154,45 +320,145 @@
                    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) {
                    if (rgvTaskProtocol.getAvoid() == 1) {
                        TaskProtocol issued = new TaskProtocol();
                        issued.setTaskNo(32222L);
                        issued.setTargetPosition(rgvTaskProtocol.getAvoidingTheDestination());
                        issued.setTaskStatus(1);
                        issued.setDirection(true);
                        write(issued);
                        RgvErrCache.updateRgvErr(slave.getId());
                        rgvTaskProtocol.setAvoid(0);
//                        try{Thread.sleep(50L);} catch (Exception e){}
                        RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
                    }
                    rgvRun.currentTimeMilliOld = System.currentTimeMillis()+50;
                    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(200);
                        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()+50;
                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()+50;
                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());
@@ -201,20 +467,65 @@
        if (rgvProtocolOther == null) {
            return false;
        }
        if (rgvProtocolOther.statusEnable){
            if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L) || rgvTaskProtocolOther.getAvoid() == -1  || rgvProtocolOther.getRgvPosDestination() == 0L) {
        if (rgvProtocolOther.statusEnable) {
            if (rgvTaskProtocolOther == null) {
                return false;
            }
        }
        return true;
    }
    public boolean rgvOtherStatusEnable(){
    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 = slave.getId()+"号小车非空闲";
            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.statusEnable) {
//            if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L)) {
            return true;
//            }
@@ -222,139 +533,309 @@
        return false;
    }
    public boolean otherRgvAvoid(Long targetPosition){
    public boolean otherRgvAvoid(Long targetPosition) {
        RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
        RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
        RgvTaskProtocol rgvTaskProtocolOther = RgvTaskCache.getRgvStatus(slave.getOtherId());
        Long[][] avoidRange = new TrackRangeUtils().avoidRange(slave, trackEntireLength, trackBenchmark, avoidDistance);
        if (rgvProtocol.getRgvPos()<rgvProtocolOther.getRgvPos()){
            if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE)){
                if ((rgvProtocolOther.getRgvPos()-rgvProtocolOther.getCarBodyJiaoMing())
                        - (targetPosition+rgvProtocol.getCarBodyKunPeng())
                        > avoidDistance){//无需避让
        if (new TrackRangeUtils().IsItSmall(slave)) {
            if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE) && (Math.abs(rgvProtocolOther.getRgvPos() - rgvProtocolOther.getRgvPosDestination())<50)) {
                if ((rgvProtocolOther.getRgvPos() - rgvProtocolOther.getCarBodyJiaoMing())
                        - (targetPosition + rgvProtocol.getCarBodyKunPeng())
                        > avoidDistance - 50) {//无需避让
                    return true;
                } else {
                    long avoid = targetPosition + rgvProtocol.getCarBodyKunPeng() + avoidDistance + rgvProtocolOther.getCarBodyJiaoMing();
                    if (avoid > trackEntireLength-rgvProtocolOther.getCarBodyKunPeng()){
                        log.error("避让超出范围!!!任务异常  联系管理员!!!");
                        return false;
                    }
                    rgvTaskProtocol.setAvoid(1);
                    rgvTaskProtocol.setAvoidingTheDestination(avoid);
                    RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
                    return true;
                }
            } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.ROAM)){
                if ((rgvProtocolOther.getRgvPosDestination()-rgvProtocolOther.getCarBodyJiaoMing())
                        - (targetPosition+rgvProtocol.getCarBodyKunPeng())
                        > avoidDistance){//无需避让
                    return true;
                } else {
                    long avoid = targetPosition + rgvProtocol.getCarBodyKunPeng() + avoidDistance + rgvProtocolOther.getCarBodyJiaoMing();
                    if (avoid > trackEntireLength-rgvProtocolOther.getCarBodyKunPeng()){
                        log.error("避让超出范围!!!任务异常  联系管理员!!!");
                        return false;
                    }
                    rgvTaskProtocol.setAvoid(1);
                    rgvTaskProtocol.setAvoidingTheDestination(avoid);
                    RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
                    return true;
                }
            } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.WORKING)){
                if ((rgvProtocolOther.getRgvPosDestination()-rgvProtocolOther.getCarBodyJiaoMing())
                        - (targetPosition+rgvProtocol.getCarBodyKunPeng())
                        > avoidDistance){//无需避让
                    return true;
                } else {
                    RgvThread rgvThreadOther = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvProtocolOther.getRgvNo());
                    RgvThread rgvThreadOther = (RgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getOtherId());
                    TaskProtocolCache taskProtocolCacheOther = rgvThreadOther.getTaskProtocolCache();
                    List<TaskProtocol> allPutTaskProtocol = taskProtocolCacheOther.getAllPutTaskProtocol();
                    if (allPutTaskProtocol.size() > 1){
                        return false;
                    }
                    for (TaskProtocol taskProtocol : allPutTaskProtocol){
                        if (taskProtocol.getTargetPosition()>=rgvProtocolOther.getRgvPos()){
                            long avoid = rgvProtocolOther.getRgvPos()-rgvProtocolOther.getCarBodyJiaoMing()-avoidDistance-rgvProtocol.getCarBodyKunPeng();
                            if (avoid > trackEntireLength-rgvProtocolOther.getCarBodyKunPeng()){
                                log.error("行走超出范围!!!任务异常  联系管理员!!!");
                                return false;
                    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;
                            }
                            rgvTaskProtocol.setAvoid(1);
                            rgvTaskProtocol.setAvoidingTheDestination(avoid);
                            RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
                            return false;
                        } else {
                            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()+"号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("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 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("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 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("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;
                    }
                    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)){
                if ((targetPosition-rgvProtocol.getCarBodyJiaoMing())
                        - (rgvProtocolOther.getRgvPos()+rgvProtocolOther.getCarBodyKunPeng())
                        > avoidDistance){//无需避让
            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 {
                    long avoid = targetPosition -rgvProtocol.getCarBodyJiaoMing() - avoidDistance - rgvProtocolOther.getCarBodyKunPeng();
                    if (avoid < trackBenchmark + rgvProtocolOther.getCarBodyJiaoMing()){
                        log.error("避让超出范围!!!任务异常  联系管理员!!!");
                        return false;
                    }
                    rgvTaskProtocol.setAvoid(1);
                    rgvTaskProtocol.setAvoidingTheDestination(avoid);
                    RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
                    return true;
                }
            } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.ROAM)){
                if ((targetPosition-rgvProtocol.getCarBodyJiaoMing())
                        - (rgvProtocolOther.getRgvPosDestination()+rgvProtocolOther.getCarBodyKunPeng())
                        > avoidDistance){//无需避让
                    return true;
                } else {
                    long avoid = targetPosition -rgvProtocol.getCarBodyJiaoMing() - avoidDistance - rgvProtocolOther.getCarBodyKunPeng();
                    if (avoid < trackBenchmark + rgvProtocolOther.getCarBodyJiaoMing()){
                        log.error("避让超出范围!!!任务异常  联系管理员!!!");
                        return false;
                    }
                    rgvTaskProtocol.setAvoid(1);
                    rgvTaskProtocol.setAvoidingTheDestination(avoid);
                    RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
                    return true;
                }
            } else if (rgvProtocolOther.getStatusType().equals(RgvStatusType.WORKING)){
                if ((targetPosition-rgvProtocol.getCarBodyJiaoMing())
                        - (rgvProtocolOther.getRgvPosDestination()+rgvProtocolOther.getCarBodyKunPeng())
                        > avoidDistance){//无需避让
                    return true;
                } else {
                    RgvThread rgvThreadOther = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvProtocolOther.getRgvNo());
                    RgvThread rgvThreadOther = (RgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getOtherId());
                    TaskProtocolCache taskProtocolCacheOther = rgvThreadOther.getTaskProtocolCache();
                    List<TaskProtocol> allPutTaskProtocol = taskProtocolCacheOther.getAllPutTaskProtocol();
                    if (allPutTaskProtocol.size() > 1){
                        return false;
                    }
                    for (TaskProtocol taskProtocol : allPutTaskProtocol){
                        if (taskProtocol.getTargetPosition()<=rgvProtocolOther.getRgvPos()){
                            long avoid = rgvProtocolOther.getRgvPos()+rgvProtocolOther.getCarBodyKunPeng()+avoidDistance+rgvProtocol.getCarBodyJiaoMing();
                            if (avoid < trackBenchmark + rgvProtocolOther.getCarBodyJiaoMing()){
                                log.error("行走超出范围!!!任务异常  联系管理员!!!");
                                return false;
                    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;
                            }
                            rgvTaskProtocol.setAvoid(1);
                            rgvTaskProtocol.setAvoidingTheDestination(avoid);
                            RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
                            return false;
                        } else {
                            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()+"号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("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 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("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 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("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;
                    }
                    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;
    }
@@ -368,25 +849,31 @@
            rgvProtocol.setRgvNo(slave.getId());
        }
        rgvProtocol.setMode((short) -1);
        rgvProtocol.setStatus((short)-1);
        rgvProtocol.setWalkPos((short)0);
        rgvProtocol.setStatus((short) -1);
        rgvProtocol.setWalkPos((short) 0);
        rgvProtocol.setRgvPos(0L);
        rgvProtocol.setAlarm((short)0);
        rgvProtocol.setAlarm((short) 0);
        rgvProtocol.setxSpeed((short) 0);
        rgvProtocol.setxDistance((short) 0);
        rgvProtocol.setxDuration((short) 0);
        rgvProtocol.setCarBodyJiaoMing(0L);
        rgvProtocol.setCarBodyKunPeng(0L);
        try{
        try {
            BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class);
            BasRgv rgv = basRgvService.selectById(slave.getId());
            if (!Cools.isEmpty(rgv)){
            if (!Cools.isEmpty(rgv)) {
                rgvProtocol.setStatusEnable(rgv.getStatus() == 1);
            } else {
                rgvProtocol.setStatusEnable(false);
            }
        } catch (Exception e){
            log.error("RGV异常!!!"+e.getMessage());
        } catch (Exception e) {
            log.error("RGV异常!!! ===>> [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);
        }
@@ -395,7 +882,7 @@
            rgvTaskProtocol = new RgvTaskProtocol();
            rgvTaskProtocol.setRgvNo(slave.getId());
        }
        rgvTaskProtocol.setAvoid(-1);
        rgvTaskProtocol.setAvoid(0);
        rgvTaskProtocol.setAvoidingTheDestination(0L);
        RgvStatusCache.updateRgvStatus(rgvProtocol);
@@ -411,7 +898,7 @@
        siemensNet.setRack(slave.getRack().byteValue());
        siemensNet.setSlot(slave.getSlot().byteValue());
        OperateResult connect = siemensNet.ConnectServer();
        if(connect.IsSuccess){
        if (connect.IsSuccess) {
            result = true;
//            OutputQueue.RGV.offer(MessageFormat.format( "【{0}】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());
@@ -419,6 +906,12 @@
//            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("rgv", slave.getId(), "RGVplc连接失败");
            } catch (Exception e2){
                log.error("e2:"+e2.getMessage());
            }
        }
        initRgv();
//        siemensNet.ConnectClose();
@@ -428,25 +921,47 @@
    /**
     * 读取状态
     */
    private void readStatus(){
    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.setTaskNo((long)siemensNet.getByteTransform().TransInt32(result.Content, 10));
                rgvProtocol.setRgvNo((int)siemensNet.getByteTransform().TransInt16(result.Content, 14));
                rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 16));
//                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 20));
//                rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 28));
//                rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 40));
//                rgvProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 48));
                OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
//                OperateResultExOne<byte[]> result11 = siemensNet.Read("DB100.12", (short) 1);
                boolean[] status = siemensNet.getByteTransform().TransBool(result.Content, 18, 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]);
//                System.out.println("读线程"+ slave.getId()+"---"+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)) {
@@ -458,23 +973,33 @@
//                        }
//                    }
//                }
                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)){
                    if (!Cools.isEmpty(basRgv)) {
                        rgvProtocol.setStatusEnable(basRgv.getStatus() == 1);
                    } else {
                        rgvProtocol.setStatusEnable(false);
                    }
//                    BasRgv basRgv = new BasRgv();
                    basRgv.setRgvNo(slave.getId());
                    basRgv.setRgvSts((int)rgvProtocol.getMode());
                    if (!basRgvService.updateById(rgvProtocol.toSqlModel(basRgv))){
                    basRgv.setRgvSts((int) rgvProtocol.getMode());
                    if (!basRgvService.updateById(rgvProtocol.toSqlModel(basRgv))) {
                        log.error("RGV plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
                        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){
                } catch (Exception ignore) {
                }
@@ -484,13 +1009,28 @@
            } 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("rgv", 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("rgv", slave.getId(), "读取RGV plc状态信息失败");
            } catch (Exception e2){
                log.error("e2:"+e2.getMessage());
            }
            initRgv();
        }
    }
@@ -500,19 +1040,34 @@
     */
    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];
        OperateResult result41 = siemensNet.Write("DB100.12.0", false);
//        array[0] = taskProtocol.getAckFinish1();
        array[1] = taskProtocol.getTaskNo();
//        array[1] = taskProtocol.getTaskNo();
//        array[2] = taskProtocol.getTaskMode();
//        array[4] = command.getDestinationStaNo();
//        array[10] = taskProtocol.getCommand();
        OperateResult result = siemensNet.Write("DB100.0", taskProtocol.getTaskNo());
        int taskStatus = taskProtocol.getTaskStatus();
        OperateResult result = siemensNet.Write("DB100.0", taskProtocol.getTargetPosition().intValue());
        OperateResult result1 = siemensNet.Write("DB100.4", (short) taskStatus);
        OperateResult result2 = siemensNet.Write("DB100.6", taskProtocol.getTaskNo().intValue());
        OperateResult result3 = siemensNet.Write("DB100.10", taskProtocol.isDirection()? (short) 1 :  (short) 2); // 执行方向(面朝轨道 定位值左小右大)    true:左   false:右
        OperateResult result4 = siemensNet.Write("DB100.12.0", true);
//        if (taskProtocol.getAckFinish1() == 0) {
//            short commandFinish = 3;  //工位1、2任务同时写入
//            Thread.sleep(100L);
@@ -531,18 +1086,27 @@
                    null,
                    null,
                    null,
                    result.IsSuccess? 1 : 0,
                    result.IsSuccess ? 1 : 0,
                    null,
                    new Date(),
                    null
            );
            bean.insert(basRgvOpt);
        } catch (Exception ignore) {}
        } catch (Exception ignore) {
        }
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
            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 {
@@ -552,6 +1116,53 @@
        }
    }
    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:右
        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;
        }
    }
    public void setDelRgvTask() {
        delRgvTask = true;
    }
    @Override
    public void close() {
        siemensNet.ConnectClose();