自动化立体仓库 - WCS系统
*
lsh
5 天以前 ccd6309576bfa66ddf40b8a48202ced37c05333a
src/main/java/com/zy/core/thread/RgvThread.java
@@ -14,10 +14,7 @@
import com.zy.asrs.service.BasRgvService;
import com.zy.asrs.utils.RouteUtils;
import com.zy.core.ThreadHandler;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.cache.RgvStatusCache;
import com.zy.core.cache.TaskProtocolCache;
import com.zy.core.cache.*;
import com.zy.core.enums.RgvModeType;
import com.zy.core.enums.RgvStatusType;
import com.zy.core.enums.RgvTaskModeType;
@@ -26,9 +23,11 @@
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 lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import java.text.MessageFormat;
import java.util.Date;
@@ -47,6 +46,12 @@
    private RgvSlave slave;
//    private RgvProtocol rgvProtocol;
    private TaskProtocolCache taskProtocolCache = new TaskProtocolCache();
    // # 轨道总长
    private Long trackEntireLength = 100L;
    //# 轨道基准点
    private Long trackBenchmark = 100L;
    //  # 避让距离
    private Long avoidDistance = 100L;
    /**
     * 工位1复位信号
@@ -71,10 +76,9 @@
            new Thread(this::readStatusRgv).start();
            // 启动任务下发线程
            new Thread(this::taskTakeIssued).start();
            new Thread(this::taskIssued).start();
            new Thread(this::taskPutIssued).start();
            // 启动漫游线程
            new Thread(this::taskWalkIssued).start();
        }
    }
@@ -97,9 +101,45 @@
    }
    /**
     * 漫游
     */
    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());
                write(issued);
                rgvTaskProtocol.setAvoid(0);
                Thread.sleep(200);
                RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
            } catch (Exception e) {
                log.error("RGV行走任务下发线程异常!!!"+e.getMessage());
//                e.printStackTrace();
            }
        }
    }
    /**
     * 任务下发
     */
    private void taskTakeIssued() {
    private void taskIssued() {
        while (true) {
            try {
                // 休眠 1 秒
@@ -108,24 +148,28 @@
                    continue;
                }
                RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
                if (rgvProtocol == null) {
                RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
                if (rgvProtocol == null || rgvTaskProtocol == null) {
                    initRgv();
                    rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
                    rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
                }
                if (rgvProtocol.getAvoid() == 0 || !rgvProtocol.getLoaded().equals((short) 0)) {
                if (rgvTaskProtocol.getAvoid() != 0) {
                    continue;
                }
                List<TaskProtocol> allTakeTaskProtocol = taskProtocolCache.getAllTakeTaskProtocol();
                List<TaskProtocol> allTakeTaskProtocol = taskProtocolCache.getTakeOrPutTaskProtocol(rgvProtocol.getLoaded());
                for(TaskProtocol taskProtocol: allTakeTaskProtocol){
                    if (taskProtocol.getTaskStatus() == 1){//准备下发
                    if (taskProtocol.getIsRunning() == 1){//准备下发
                        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
                        //双车
                        if (rgvOtherStatusEnable()){
                            //另一台车是否允许此台车执行
                            if (!otherRgvAvoid(taskProtocol.getTargetPosition())){
                                continue;
                            }
                        }
                        Thread.sleep(200);
                        TaskProtocol issued = new TaskProtocol(taskProtocol);
                        write(issued);
                        taskProtocol.setIsRunning(taskProtocol.getIsRunning() +1);
@@ -133,8 +177,6 @@
                        break;
                    }
                }
            } catch (Exception e) {
                log.error("RGV取货任务下发线程异常!!!"+e.getMessage());
//                e.printStackTrace();
@@ -144,56 +186,176 @@
    public boolean deviceDetection(){
        RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
        if (rgvProtocol == null) {
        RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
        if (rgvProtocol == null || rgvTaskProtocol ==null) {
            return false;
        }
        if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) || rgvProtocol.getRgvPos().equals(0L)
                || !rgvProtocol.getStatusType().equals(RgvStatusType.IDLE)) {
        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))) {
            return false;
        }
        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
        RgvTaskProtocol rgvTaskProtocolOther = RgvTaskCache.getRgvStatus(slave.getOtherId());
        if (rgvProtocolOther == null) {
            return false;
        }
        if (rgvProtocolOther.statusEnable){
            if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L)) {
            if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L) || rgvTaskProtocolOther.getAvoid() == -1  || rgvProtocolOther.getRgvPosDestination() == 0L) {
                return false;
            }
        }
        return true;
    }
    /**
     * 任务下发
     */
    private void taskPutIssued() {
        while (true) {
            try {
                // 休眠 1 秒
                Thread.sleep(100);
            } catch (Exception e) {
                log.error("RGV放货任务下发线程异常!!!"+e.getMessage());
//                e.printStackTrace();
            }
    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;
    }
    /**
     * 任务下发
     */
    private void taskWalkIssued() {
        while (true) {
            try {
                // 休眠 1 秒
                Thread.sleep(100);
    public boolean otherRgvAvoid(Long targetPosition){
        RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
        RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
            } catch (Exception e) {
                log.error("RGV行走任务下发线程异常!!!"+e.getMessage());
//                e.printStackTrace();
        if (rgvProtocol.getRgvPos()<rgvProtocolOther.getRgvPos()){
            if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE)){
                if ((rgvProtocolOther.getRgvPos()-rgvProtocolOther.getCarBodyJiaoMing())
                        - (targetPosition+rgvProtocol.getCarBodyKunPeng())
                        > avoidDistance){//无需避让
                    return true;
                } else {
                    long avoid = targetPosition + rgvProtocol.getCarBodyKunPeng() + avoidDistance + rgvProtocolOther.getCarBodyJiaoMing();
                    if (avoid > trackEntireLength-rgvProtocolOther.getCarBodyKunPeng()){
                        log.error("避让超出范围!!!任务异常  联系管理员!!!");
                        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());
                    TaskProtocolCache taskProtocolCacheOther = rgvThreadOther.getTaskProtocolCache();
                    List<TaskProtocol> allPutTaskProtocol = taskProtocolCacheOther.getAllPutTaskProtocol();
                    if (allPutTaskProtocol.size() > 1){
                        return false;
                    }
                    for (TaskProtocol taskProtocol : allPutTaskProtocol){
                        if (taskProtocol.getTargetPosition()>=rgvProtocolOther.getRgvPos()){
                            long avoid = rgvProtocolOther.getRgvPos()-rgvProtocolOther.getCarBodyJiaoMing()-avoidDistance-rgvProtocol.getCarBodyKunPeng();
                            if (avoid > trackEntireLength-rgvProtocolOther.getCarBodyKunPeng()){
                                log.error("行走超出范围!!!任务异常  联系管理员!!!");
                                return false;
                            }
                            rgvTaskProtocol.setAvoid(1);
                            rgvTaskProtocol.setAvoidingTheDestination(avoid);
                            RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
                            return false;
                        } else {
                            return false;
                        }
                    }
                    return false;
                }
            }
        } else {
            if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE)){
                if ((targetPosition-rgvProtocol.getCarBodyJiaoMing())
                        - (rgvProtocolOther.getRgvPos()+rgvProtocolOther.getCarBodyKunPeng())
                        > avoidDistance){//无需避让
                    return true;
                } else {
                    long avoid = targetPosition -rgvProtocol.getCarBodyJiaoMing() - avoidDistance - rgvProtocolOther.getCarBodyKunPeng();
                    if (avoid < trackBenchmark + rgvProtocolOther.getCarBodyJiaoMing()){
                        log.error("避让超出范围!!!任务异常  联系管理员!!!");
                        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());
                    TaskProtocolCache taskProtocolCacheOther = rgvThreadOther.getTaskProtocolCache();
                    List<TaskProtocol> allPutTaskProtocol = taskProtocolCacheOther.getAllPutTaskProtocol();
                    if (allPutTaskProtocol.size() > 1){
                        return false;
                    }
                    for (TaskProtocol taskProtocol : allPutTaskProtocol){
                        if (taskProtocol.getTargetPosition()<=rgvProtocolOther.getRgvPos()){
                            long avoid = rgvProtocolOther.getRgvPos()+rgvProtocolOther.getCarBodyKunPeng()+avoidDistance+rgvProtocol.getCarBodyJiaoMing();
                            if (avoid < trackBenchmark + rgvProtocolOther.getCarBodyJiaoMing()){
                                log.error("行走超出范围!!!任务异常  联系管理员!!!");
                                return false;
                            }
                            rgvTaskProtocol.setAvoid(1);
                            rgvTaskProtocol.setAvoidingTheDestination(avoid);
                            RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
                            return false;
                        } else {
                            return false;
                        }
                    }
                    return false;
                }
            }
        }
        return false;
    }
    /**
@@ -213,14 +375,32 @@
        rgvProtocol.setxSpeed((short) 0);
        rgvProtocol.setxDistance((short) 0);
        rgvProtocol.setxDuration((short) 0);
        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);
        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异常!!!"+e.getMessage());
            rgvProtocol.setStatusEnable(true);
        }
        RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
        if (rgvTaskProtocol == null) {
            rgvTaskProtocol = new RgvTaskProtocol();
            rgvTaskProtocol.setRgvNo(slave.getId());
        }
        rgvTaskProtocol.setAvoid(-1);
        rgvTaskProtocol.setAvoidingTheDestination(0L);
        RgvStatusCache.updateRgvStatus(rgvProtocol);
        RgvTaskCache.updateRgvStatus(rgvTaskProtocol);
    }
@@ -233,13 +413,14 @@
        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()));
//            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()));
//            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());
            initRgv();
        }
        initRgv();
//        siemensNet.ConnectClose();
        return result;
    }