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; private boolean delRgvTask = false; public RgvThread(RgvSlave slave) { this.slave = slave; } @Override @SuppressWarnings("InfiniteLoopStatement") public void run() { 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 { if(!connectRgv){ try { connectRgv = this.connect(); Thread.sleep(100); } catch (Exception e){ } } } catch (Exception e) { log.error("rgv连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); try{ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "rgv连接失败"+e.getMessage()); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); } initRgv(); // e.printStackTrace(); } } } private void readStatusRgv() { while (true) { try { Thread.sleep(20); // System.out.println("读线程"+ slave.getId()); 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("rgv", slave.getId(), "RGV数据读取线程异常"+e.getMessage()); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); } initRgv(); // e.printStackTrace(); } } } /** * 完成 */ private void taskComplete() { while (true) { try { if (delRgvTask){ writeDelRgvTask(); delRgvTask = false; continue; } Thread.sleep(40); OperateResultExOne result = siemensNet.Read("DB100.12", (short) 1); boolean[] status = siemensNet.getByteTransform().TransBool(result.Content, 0, 1); if (status[0]){ OperateResult result4 = siemensNet.Write("DB100.12.0", false); } } catch (Exception e) { log.error("RGV数据任务下发复位线程异常!!! ===>> [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 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 秒 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) { 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) { 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 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("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 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 = 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.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L)) { return true; // } } return false; } 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 (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("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) && (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("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; } /** * 初始化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("rgv", 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()); try{ DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); deviceErrorService.addDeviceError("rgv", slave.getId(), "RGVplc连接失败"); } catch (Exception e2){ log.error("e2:"+e2.getMessage()); } } initRgv(); // siemensNet.ConnectClose(); return result; } /** * 读取状态 */ private void readStatus() { try { OperateResultExOne 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.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 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)) { // 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("rgv", 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("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(); } } /** * 写入数据 */ 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("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[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:右 OperateResult result4 = siemensNet.Write("DB100.12.0", true); // 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) { } 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("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 { 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:右 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(); } }