6be77dcf31e3c9d7233b36d8e9d22c4d1d802f3e..5c730a13070f0eb569aa787005bb2433c6dbc44d
2025-06-13 lsh
*
5c730a 对比 | 目录
2025-06-13 lsh
*
1be3b9 对比 | 目录
2025-06-13 lsh
*
14ecfb 对比 | 目录
2025-06-13 lsh
*
473da4 对比 | 目录
2025-06-13 lsh
*
90f81c 对比 | 目录
2025-06-13 lsh
*
18e637 对比 | 目录
2025-06-13 lsh
*
b825c8 对比 | 目录
2025-06-13 lsh
*
41aa9d 对比 | 目录
2025-06-13 lsh
*
488b3d 对比 | 目录
2025-06-13 lsh
*
d9e90f 对比 | 目录
2025-06-13 lsh
*
e0768e 对比 | 目录
7个文件已修改
266 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/BasRgvOpt.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvStatusType.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvTaskModeType.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/RgvThread.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgvOpt.java
@@ -31,7 +31,7 @@
     * ID
     */
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.INPUT)
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
@@ -159,6 +159,7 @@
        this.rgvNo = rgvProtocol.getRgvNo();
        this.sendTime = now;
        this.mode = command.getTaskModeType1().name();
        this.sourceRow = rgvProtocol.getRgvPosI();//小车当前位置
        this.sourceSta = command.getSourceStaNo1().intValue();
        this.posSta = command.getDestinationStaNo1().intValue();
        this.updateTime = now;
@@ -170,7 +171,8 @@
        this.wrkNo1 = rgvProtocol.getTaskNo1().intValue();
        this.rgvNo = rgvProtocol.getRgvNo();
        this.sendTime = now;
        this.mode = "取放货";
        this.mode = "漫游";
        this.sourceRow = rgvProtocol.getRgvPosI();//小车当前位置
        this.sourceSta = rgvProtocol.getRgvPosI();
        this.posSta = command.intValue();
        this.updateTime = now;
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -206,24 +206,23 @@
    /**
     * 站点任务检测  下发小车取放任务
     */
    public synchronized List<List<List<WrkMast>>> DevpTaskNoRun() {
        List<List<List<WrkMast>>> wrkMastListAll = new ArrayList<>();
    public synchronized void DevpTaskNoRun() {
        try {
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", 1L).orderBy("modi_time", true));
            if (wrkMasts.isEmpty()) {
                return wrkMastListAll;
                return;
            }
            long differenceInSeconds = TimeCalculatorUtils.differenceInMilliseconds(wrkMasts.get(0).getModiTime(), new Date());
            if (differenceInSeconds <= 1000) {
                return wrkMastListAll;
                return;
            }
            BasCircularShuttle basCircularShuttle = basCircularShuttleService.selectOne(new EntityWrapper<BasCircularShuttle>().eq("rgv_id", 1));
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basCircularShuttle.getRgvNo());
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) {
                return wrkMastListAll;
                return;
            }
            List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<BasDevpPosition>().orderBy("plc_position", true));
            List<BasDevpPosition> basDevpPositionDevRegion = basDevpPositionService.selectList(new EntityWrapper<BasDevpPosition>().orderBy("dev_region", true));
@@ -232,15 +231,13 @@
            BasDevpPosition[] basDevpPositionsListUN = SortTheExecutionOfTheCarUtil.devpNoSortUN(basDevpPositionsList);
            List<List<Integer>> siteListAll = SortTheExecutionOfTheCarUtil.siteListAll(basDevpPositionDevRegion);
//            List<List<WrkMast>> wrkMastLists = getWrkMastLists(basDevpPositionsListUN);
            return getWrkMastListAll(siteListAll,basDevpPositionsListUN);
            List<List<List<WrkMast>>> wrkMastListAll = getWrkMastListAll(siteListAll, basDevpPositionsListUN);
            //下发任务
//            taskDown(wrkMastLists);
            taskDown(wrkMastListAll);
        } catch (Exception e) {
            log.error("自动下发小车取放任务失败,异常:" + e);
            log.error("自动下发小车任务失败,异常:" + e);
        }
        return wrkMastListAll;
    }
@@ -330,140 +327,7 @@
        }
    }
//    public synchronized void taskDown(List<List<WrkMast>> wrkMastLists) {
//        long rgvId = 0;
//        runRgv:
//        for (List<WrkMast> wrkMastList : wrkMastLists) {
//            for (WrkMast wrkMast : wrkMastList) {
//                while (rgvId <= rgvCount) {
//                    rgvId++;
////                    log.info("存在任务,RGV号={},任务数据={}", rgvId, JSON.toJSON(wrkMast));
//                    if (rgvId > rgvCount) {
//                        break runRgv;
//                    }
//                    BasCircularShuttle basCircularShuttle = basCircularShuttleService.selectOne(new EntityWrapper<BasCircularShuttle>().eq("rgv_id", rgvId));
//                    if (basCircularShuttle.getStatus() != 0){
//                        continue ;
//                    }
//                    RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basCircularShuttle.getRgvNo());
//                    RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
//                    if (rgvProtocol == null) {
//                        continue;
//                    }
//
//                    List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("rgv_no", rgvProtocol.getRgvNo()).eq("wrk_sts", 2L));
//                    if (!wrkMasts.isEmpty()) {
//                        continue;
//                    }
//                    if (rgvProtocol != null
//                            && rgvProtocol.modeType == RgvModeType.AUTO
//                            && (rgvProtocol.getStatusType() == RgvStatusType.IDLE || rgvProtocol.getStatusType() == RgvStatusType.ROAM)
//                            && rgvProtocol.getTaskNo1() == 0
//                            && rgvProtocol.getAlarm() == 0) {
//                        if (rgvProtocol.getStatusType() == RgvStatusType.ROAM) {
//                            double finalVelocity = 0.0;     // 最终速度 (m/s)
//                            double distance = (Math.pow(finalVelocity, 2) - Math.pow(rgvProtocol.instantaneousSpeed / 60, 2)) / (2 * acceleration);
//                            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("dev_no", wrkMast.getSourceStaNo()));
//                            if ((distance * proportion + (rgvProtocol.instantaneousSpeed / 60) * proportion * rgvDate) > (SortTheExecutionOfTheCarUtil.LatelyAndLessThan(basDevpPosition.getPlcPosition(), rgvProtocol.getRgvPos(), perimeter) )) {
////                                List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<BasDevpPosition>().orderBy("plc_position", true));
////                                if (basDevpPositions.isEmpty()) {
////                                    log.error("获取所有站点信息异常,RGV任务下发失败,请联系管理员!!!");
////                                    break runRgv;
////                                }
////                                List<Integer> devpList = SortTheExecutionOfTheCarUtil.BasDevpPositionExtractSites(basDevpPositions);
////
////                                if (!SortTheExecutionOfTheCarUtil.calculateShortestDistanceDirection(devpList,rgvProtocol.getEndStaM(),wrkMast.getSourceStaNo())){
//                                    continue;
////                                }
//                            }
//                        }
//                        RgvCommand rgvCommand = new RgvCommand();
//                        rgvCommand.setRgvNo(rgvProtocol.getRgvNo());
//                        rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
//                        rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());
//                        rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式:  取放货
//                        rgvCommand.setSourceStaNo1(wrkMast.getSourceStaNo().shortValue());   //工位1起点
//                        rgvCommand.setDestinationStaNo1(wrkMast.getStaNo().shortValue());   //工位1目标站点
//                        rgvCommand.setCommand((short) 1);   //工位1任务确认
//                        rgvCommand.setRgvSome(basCircularShuttle.getRgvSome()==1 ? (short) 1 : (short) 0);
//                        if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(2, rgvCommand))) {
//                            //
//                            log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
//                            break runRgv;
//                        }
//                        log.info("RGV命令下发成功,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
//
//                        wrkMast.setWrkSts(2L);
//                        wrkMast.setRgvNo(rgvProtocol.getRgvNo());
//                        Date now = new Date();
//                        wrkMast.setAppeTime(now);
//                        wrkMast.setCrnStrTime(now);
//                        try {
//                            wrkMastService.updateById(wrkMast);
//                            break;
//                        } catch (Exception e) {
//                            log.error("更新小车任务失败,任务号:" + wrkMast.getWrkNo());
//                        }
//                        break runRgv;
//                    } else if (rgvProtocol != null
//                            && rgvProtocol.modeType == RgvModeType.AUTO
//                            && rgvProtocol.getStatusType() == RgvStatusType.WALK
//                            && rgvProtocol.getTaskNo1() == 0
//                            && rgvProtocol.getAlarm() == 0) {
//                        if (rgvProtocol.getStatusType() == RgvStatusType.WALK) {
//                            double finalVelocity = 0.0;     // 最终速度 (m/s)
//                            double distance = (Math.pow(finalVelocity, 2) - Math.pow(rgvProtocol.instantaneousSpeed / 60, 2)) / (2 * acceleration);
//                            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("dev_no", wrkMast.getSourceStaNo()));
//                            if ((distance * proportion + (rgvProtocol.instantaneousSpeed / 60) * proportion * rgvDate) > (SortTheExecutionOfTheCarUtil.LatelyAndLessThan(basDevpPosition.getPlcPosition(), rgvProtocol.getRgvPos(), perimeter) )) {
////                                List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<BasDevpPosition>().orderBy("plc_position", true));
////                                if (basDevpPositions.isEmpty()) {
////                                    log.error("获取所有站点信息异常,RGV任务下发失败,请联系管理员!!!");
////                                    break runRgv;
////                                }
////                                List<Integer> devpList = SortTheExecutionOfTheCarUtil.BasDevpPositionExtractSites(basDevpPositions);
////
////                                if (!SortTheExecutionOfTheCarUtil.calculateShortestDistanceDirection(devpList,rgvProtocol.getEndStaM(),wrkMast.getSourceStaNo())){
//                                continue;
////                                }
//                            }
//                        }
//                        RgvCommand rgvCommand = new RgvCommand();
//                        rgvCommand.setRgvNo(rgvProtocol.getRgvNo());
//                        rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
//                        rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());
//                        rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式:  取放货
//                        rgvCommand.setSourceStaNo1(wrkMast.getSourceStaNo().shortValue());   //工位1起点
//                        rgvCommand.setDestinationStaNo1(wrkMast.getStaNo().shortValue());   //工位1目标站点
//                        rgvCommand.setCommand((short) 1);   //工位1任务确认
//                        rgvCommand.setRgvSome(basCircularShuttle.getRgvSome()==1 ? (short) 1 : (short) 0);
//                        if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(3, rgvCommand))) {
//                            //
//                            log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
//                            break runRgv;
//                        }
//                        log.info("RGV命令下发成功,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
//
//                        wrkMast.setWrkSts(2L);
//                        wrkMast.setRgvNo(rgvProtocol.getRgvNo());
//                        Date now = new Date();
//                        wrkMast.setAppeTime(now);
//                        wrkMast.setCrnStrTime(now);
//                        try {
//                            wrkMastService.updateById(wrkMast);
//                            break;
//                        } catch (Exception e) {
//                            log.error("更新小车任务失败,任务号:" + wrkMast.getWrkNo());
//                        }
//                        break runRgv;
//                    } else {
//                        break runRgv;
//                    }
//                }
//            }
//        }
//    }
    public synchronized void taskDown(List<List<List<WrkMast>>> wrkMastListAll) {
//0小车车号  1小车编号
        List<Integer> rgvNoM = new ArrayList<>();
        List<Integer> rgvNoR = new ArrayList<>();
        int wrkMastRunCount = 0;
@@ -602,7 +466,7 @@
            }
        } catch (Exception e){
            log.error("RGV漫游启动命令下发失败,任务数据===> "+JSON.toJSON(wrkMastListAll));
            log.error("RGV取放货启动命令下发失败,任务数据===> "+JSON.toJSON(wrkMastListAll));
            return;
        }
        try{
@@ -639,8 +503,8 @@
    //任务完成
    public synchronized void rgvCompleteWrkMastSta(int[] autoZ) {
        try {
            for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
        for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
            try {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
@@ -713,9 +577,67 @@
                    } catch (Exception e){}
                    wrkMastService.updateById(wrkMast);
                }
            } catch (Exception e) {
                log.error("小车复位线程报错!" + e);
            }
        } catch (Exception e) {
            log.error("小车复位线程报错!" + e);
        }
    }
    public synchronized void rgvCancelWrkMastSta() {
        for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
            try {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    continue;
                }
                if (rgvProtocol.getStatusType() == RgvStatusType.CANCEL) {
                    log.info("{}号小车等待wcs取消,状态{},参数{}", rgvProtocol.getRgvNo(), rgvProtocol.getStatusType(), rgvProtocol);
                }
                // 只有当RGV等待WCS确认、自动
                if (rgvProtocol.getStatusType() == RgvStatusType.CANCEL
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getTaskNo1() != 0
                ) {
                    WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", rgvProtocol.getTaskNo1().longValue()));
                    if (Cools.isEmpty(wrkMast) || !wrkMast.getWrkSts().equals(2L)) {
                        log.error("未查到小车执行任务或者执行任务状态不符合!" + wrkMast);
                        continue;
                    }
                    RgvCommand rgvCommand = new RgvCommand();
                    rgvCommand.setRgvNo(rgvProtocol.getRgvNo());
                    rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
                    rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());
                    rgvCommand.setTaskMode1(RgvTaskModeType.CANCEL); // 工位1任务模式:  取消
                    rgvCommand.setSourceStaNo1((short)-1);   //工位1起点
                    rgvCommand.setDestinationStaNo1((short)-1);   //工位1目标站点
                    rgvCommand.setCommand((short) 1);   //工位1任务确认
                    rgvCommand.setRgvSome((short) 1);
                    if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(2, rgvCommand))) {
                        //
                        log.error("RGV取消命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                        wrkMast.setLogErrTime(new Date());
                        wrkMast.setLogErrMemo("RGV取消命令下发失败,RGV号={"+rgvProtocol.getRgvNo()+"}===>跳过");
                        wrkMastService.updateById(wrkMast);
                        continue;
                    }
                    log.info("RGV取消命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                    Date now = new Date();
                    wrkMast.setWrkSts(1L);
                    wrkMast.setAppeTime(now);
                    wrkMast.setLogErrTime(now);
                    wrkMast.setRgvNo(null);
                    wrkMast.setLogErrMemo("RGV申请取消任务,RGV号={"+rgvProtocol.getRgvNo()+"},取消时间:"+now);
                    wrkMastService.updateById(wrkMast);
                }
            } catch (Exception e) {
                log.error("小车取消线程报错!" + e);
            }
        }
    }
src/main/java/com/zy/core/MainProcess.java
@@ -1,18 +1,13 @@
package com.zy.core;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.impl.MainServiceImpl;
import com.zy.core.properties.SystemProperties;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PreDestroy;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * WCS主流程
@@ -28,10 +23,6 @@
    // 所属线程
    private Thread thread;
    // 频率
    private int i = 0;
    private int j = 0;
    private int k = 0;
    private int l = 0;
    private int[] autoZ = new int[]{0,0,0,0,0,0,0};
    /**
@@ -54,40 +45,20 @@
                try {
                    // 间隔
                    Thread.sleep(200);
//                    System.out.println("开始:"+new Date().getTime());
                    // 系统运行状态判断
                    if (!SystemProperties.WCS_RUNNING_STATUS.get()) {
                        continue;
                    }
                    //更新位置信息
                    mainService.updateStePosition();
                    // 任务排序
                    List<List<List<WrkMast>>> wrkMastListAll = mainService.DevpTaskNoRun();
                    // 任务下发
                    mainService.taskDown(wrkMastListAll);;
                    mainService.DevpTaskNoRun();
                    // 任务完成
                    mainService.rgvCompleteWrkMastSta(autoZ);
                    // 任务完成
                    mainService.rgvCompleteWrkMastSta(autoZ);
//
//                    //更新位置信息
//                    mainService.updateStePositionNearby(null);
//                    //更新位置信息
//                    mainService.updateStePosition();
//                    // 任务下发
//                    mainService.DevpTaskNoRun();
//                    // 任务完成
//                    mainService.rgvCompleteWrkMastSta(autoZ);
//                    //更新位置信息
//                    mainService.updateStePosition();
//                    System.out.println("结束:"+new Date().getTime());
                    // 任务取消
                    mainService.rgvCancelWrkMastSta();
                } catch (Exception e) {
                    e.printStackTrace();
src/main/java/com/zy/core/enums/RgvStatusType.java
@@ -13,6 +13,7 @@
    Outbound_operation_in_progress(7, "出站运行中","#21618C"),
    Outbound_completed(8, "出站完成","#85C1E9"),
    ROAM(11, "漫游","#95A5A6"),
    CANCEL(12, "等待取消","#95A5A6"),
    WALK(20, "走行","#F1C40F"),
    WAITING(100, "任务执行完成等待确认","#AED6F1"),
    SOS110(110, "报警","#E74C3C"),
src/main/java/com/zy/core/enums/RgvTaskModeType.java
@@ -12,6 +12,7 @@
//    GO_ORIGIN(7),    // 回原点
//    BACK_ORIGIN(8),      // 回反原点
//    CLEAR(9),       // 清错
    CANCEL(10),       // 清错
    ;
    public Integer id;
src/main/java/com/zy/core/thread/RgvThread.java
@@ -13,12 +13,9 @@
import com.zy.asrs.service.BasRgvErrLogService;
import com.zy.asrs.service.BasRgvOptService;
import com.zy.asrs.service.BasRgvService;
import com.zy.asrs.utils.NumUtils;
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.enums.RgvStatusType;
import com.zy.core.enums.RgvTaskModeType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.RgvSlave;
src/main/resources/application.yml
@@ -57,7 +57,7 @@
  # 小车数
  rgvCount: 10
  # 延迟时间
  rgvDate: 0.5
  rgvDate: 1
# 下位机配置
wcs-slave: