package com.zy.asrs.service.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.zy.asrs.entity.*; import com.zy.asrs.service.BasCircularShuttleService; import com.zy.asrs.service.BasDevpPositionService; import com.zy.asrs.service.BasDevpService; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.utils.SortTheExecutionOfTheCarUtil; import com.zy.asrs.utils.Utils; import com.zy.core.DevpThread; import com.zy.core.News; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.*; import com.zy.core.model.DevpSlave; import com.zy.core.model.RgvSlave; import com.zy.core.model.SteSlave; import com.zy.core.model.Task; import com.zy.core.model.command.RgvCommand; import com.zy.core.model.command.SteCommand; import com.zy.core.model.protocol.RgvProtocol; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.model.protocol.SteProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.RgvThread; import com.zy.core.thread.SiemensDevpThread; import com.zy.core.thread.SteThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; /** * 立体仓库WCS系统主流程业务 * Created by vincent on 2020/8/6 */ @Slf4j @Service("mainService") @Transactional public class MainServiceImpl { @Autowired private SlaveProperties slaveProperties; @Autowired private BasDevpService basDevpService; @Autowired private BasRgvServiceImpl basRgvService; @Autowired private BasDevpPositionService basDevpPositionService; @Autowired private BasCircularShuttleService basCircularShuttleService; @Autowired private WrkMastService wrkMastService; /** * 站点任务检测 下发小车取放任务 */ public synchronized void updateStePosition() { try{ boolean sign = false; Integer rgvNo = 0; List basCircularShuttleList = basCircularShuttleService.selectList(new EntityWrapper().orderBy("rgv_id", true)); for (BasCircularShuttle basCircularShuttle : basCircularShuttleList){ RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basCircularShuttle.getRgvNo()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { sign = true; } else if (rgvProtocol.modeType != RgvModeType.AUTO || (rgvProtocol.getStatusType() != RgvStatusType.IDLE && rgvProtocol.getStatusType() != RgvStatusType.ROAM) ){ sign = true; } else { rgvNo = basCircularShuttle.getRgvNo(); break; } } if (sign && rgvNo!=0){ int[][] ints = new int[basCircularShuttleList.size()][2]; for (BasCircularShuttle basCircularShuttle : basCircularShuttleList){ ints[basCircularShuttle.getRgvNo()-1] = new int[]{basCircularShuttle.getRgvNo(),basCircularShuttle.getRgvId()}; } String[] oldList = new String[ints.length]; for (int[] rgv : ints){ oldList[rgv[0]-1] = Arrays.toString(rgv); } int[][] rgvList = SortTheExecutionOfTheCarUtil.ReorderSteId(ints, rgvNo); String[] newList = new String[rgvList.length]; for (int[] rgv : rgvList){ newList[rgv[0]-1] = Arrays.toString(rgv); } log.info("更新小车排序信息:原始小车号rgvNo={},小车重新排序信息={},小车原始排序信息={}",rgvNo,Arrays.toString(newList),Arrays.toString(oldList)); for (BasCircularShuttle basCircularShuttle : basCircularShuttleList){ int[] rgv = rgvList[basCircularShuttle.getRgvNo() - 1]; basCircularShuttle.setRgvId(rgv[1]); basCircularShuttleService.updateById(basCircularShuttle); } } } catch (Exception e) { log.error("自动更新小车排序信息失败,异常:"+e); } } /** * 站点任务检测 下发小车取放任务 */ public synchronized void DevpTaskNoRun() { try{ BasCircularShuttle basCircularShuttle = basCircularShuttleService.selectOne(new EntityWrapper().eq("rgv_id", 1)); RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basCircularShuttle.getRgvNo()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { return; } List basDevpPositions = basDevpPositionService.selectList(new EntityWrapper().orderBy("plc_position",false)); Integer devNo = SortTheExecutionOfTheCarUtil.LatelyAndLessThan(basDevpPositions, rgvProtocol.getRgvPos()); BasDevpPosition[] basDevpPositionsList = SortTheExecutionOfTheCarUtil.devpNoSort(basDevpPositions, devNo); BasDevpPosition[] basDevpPositionsListUN = SortTheExecutionOfTheCarUtil.devpNoSortUN(basDevpPositionsList); List> wrkMastLists = getWrkMastLists(basDevpPositionsListUN); //下发任务 taskDown(wrkMastLists); } catch (Exception e){ log.error("自动下发小车取放任务失败,异常:"+e); } } //获取小车取放任务列表失败 public synchronized List> getWrkMastLists(BasDevpPosition[] basDevpPositionsListUN) { List> wrkMastLists = new ArrayList<>(); try{ List wrkMastlistA = new ArrayList<>(); List wrkMastlistB = new ArrayList<>(); for (BasDevpPosition basDevpPosition : basDevpPositionsListUN){ WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper().eq("sta_no", basDevpPosition.getDevNo()).eq("wrk_sts",1L)); if (!Cools.isEmpty(wrkMast)){ if (SortTheExecutionOfTheCarUtil.devpNoSortbj(basDevpPositionsListUN,wrkMast.getSourceStaNo(),wrkMast.getStaNo())){ wrkMastlistA.add(wrkMast); } else { wrkMastlistB.add(wrkMast); } } } wrkMastLists.add(wrkMastlistA); wrkMastLists.add(wrkMastlistB); return wrkMastLists; } catch (Exception e){ log.error("获取小车取放任务列表失败,异常:"+e); return wrkMastLists; } } public synchronized void taskDown(List> wrkMastLists) { long rgvId = 0; runRgv: for (List wrkMastList : wrkMastLists){ for (WrkMast wrkMast: wrkMastList){ rgvId++; BasCircularShuttle basCircularShuttle = basCircularShuttleService.selectOne(new EntityWrapper().eq("rgv_id", 1L)); RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basCircularShuttle.getRgvNo()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol != null && rgvProtocol.modeType == RgvModeType.AUTO && (rgvProtocol.getStatusType() == RgvStatusType.IDLE || rgvProtocol.getStatusType() == RgvStatusType.ROAM) && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getAlarm() == 0){ RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgvProtocol.getRgvNo()); rgvCommand.setAckFinish1((short) 0); // 工位1任务完成确认位 rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式: 取放货 rgvCommand.setSourceStaNo1(wrkMast.getSourceStaNo().shortValue()); //工位1起点 rgvCommand.setDestinationStaNo1(wrkMast.getStaNo().shortValue()); //工位1目标站点 rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(2, rgvCommand))) { // log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand)); break runRgv; } wrkMast.setWrkSts(2L); wrkMast.setRgvNo(rgvProtocol.getRgvNo()); wrkMast.setAppeTime(new Date()); try{ wrkMastService.updateById(wrkMast); continue ; }catch (Exception e){ log.error("更新小车任务失败,任务号:"+wrkMast.getWrkNo()); } break runRgv; } else { break runRgv; } } } } //任务完成 public synchronized void rgvCompleteWrkMastSta() { try{ for (RgvSlave rgvSlave:slaveProperties.getRgv()) { RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; } BasRgv basRgv = basRgvService.selectById(rgvSlave.getId()); if (basRgv == null) { log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId()); continue; } // 只有当RGV等待WCS确认、自动 if (rgvProtocol.getStatusType() == RgvStatusType.WAITING && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getTaskNo1()!=0 ) { log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol); WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper().eq("wrk_no", rgvProtocol.getTaskNo1().longValue())); if (Cools.isEmpty(wrkMast) || !wrkMast.getWrkSts().equals(2L)){ log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMast); continue; } boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo()); if (!rgvComplete){ log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo()); break; } wrkMast.setWrkSts(3L); wrkMast.setAppeTime(new Date()); wrkMastService.updateById(wrkMast); } } } catch (Exception e){ log.error("小车复位线程报错!"+e); } } /* * 小车复位 * */ public synchronized boolean rgvComplete(Integer rgvId){ try{ // 命令下发区 -------------------------------------------------------------------------- if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(3, new RgvCommand()))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={}",rgvId); return false; } else { log.info("RGV命令下发成功,RGV号={}",rgvId); return true; } }catch (Exception e){ log.error("RGV命令下发失败,RGV号={}。异常:"+e,rgvId); return false; } } }