pjb
2025-06-23 6c5963052282dfe4ae2f20d2e18012d1cff93c85
rgv调度优化
9个文件已修改
228 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/RgvController.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/RgvWrkMastParam.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMast.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvStatusType.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/index.html 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/RgvController.java
@@ -430,7 +430,8 @@
//    @ManagerAuth(memo = "作业信息")
    public R ringThroughTaskWrkMast(){
        List<RgvWrkMastParam> result = new ArrayList<>();
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts",9,10));
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts",9,10).orderBy("wrk_sts",false)
                .orderBy("rgv_no",true));
        for (WrkMast wrkMast : wrkMasts){
            RgvWrkMastParam rgvWrkMastParam = new RgvWrkMastParam(wrkMast);
            if (Cools.isEmpty(rgvWrkMastParam.getRgvNo())){
@@ -466,6 +467,7 @@
                    RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                    if (rgvProtocol != null) {
                        rgvCircularShuttleParam.setPosition(rgvProtocol.getRgvPos());
                        rgvCircularShuttleParam.setTaskNo(rgvProtocol.taskNo1);
                        if (rgvCircularShuttleParam.getStatus()==0){
                            rgvCircularShuttleParam.setStatus$(rgvProtocol.statusType.desc);
                        }
src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java
@@ -1,11 +1,6 @@
package com.zy.asrs.domain.param;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.zy.asrs.entity.BasCircularShuttle;
import com.zy.asrs.entity.WrkMast;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
@@ -21,6 +16,8 @@
    private Integer rgvNo;
    private short taskNo;
    /**
     * 0:正常,1:禁用
     */
src/main/java/com/zy/asrs/domain/param/RgvWrkMastParam.java
@@ -1,11 +1,7 @@
package com.zy.asrs.domain.param;
import com.core.common.Cools;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.utils.TimeCalculatorUtils;
import lombok.Data;
import java.util.Date;
/**
 * Created by vincent on 2020-06-02
@@ -21,6 +17,8 @@
    private Long wrkSts;
    private String wrkSts$;
    // 工位1目标站
    private Integer rgvDstaNo;
    // 最终目标站
    private Integer staNo;
    // 工位1源站
    private Integer sourceStaNo;
@@ -36,7 +34,8 @@
    public RgvWrkMastParam(WrkMast wrkMast){
        this.wrkNo = wrkMast.getWrkNo();
        this.rgvNo = wrkMast.getRgvNo();
        this.sourceStaNo = wrkMast.getSourceStaNo();
        this.sourceStaNo = wrkMast.getRgvSstaNo();
        this.rgvDstaNo = wrkMast.getRgvDstaNo();
        this.staNo = wrkMast.getStaNo();
        this.wrkSts = wrkMast.getWrkSts();
        this.wrkSts$ = wrkMast.getWrkSts$();
src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -134,6 +134,14 @@
    @TableField("rgv_dsta_no")
    private Integer rgvDstaNo;
    @ApiModelProperty(value= "rgv命令下发时间")
    @TableField("rgv_create_time")
    private Date rgvCreateTime;
    @ApiModelProperty(value= "rgv任务完成时间")
    @TableField("rgv_finish_time")
    private Date rgvFinishTime;
    @ApiModelProperty(value= "")
    @TableField("loc_sts")
    private String locSts;
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -32,9 +32,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.*;
/**
 * 立体仓库WCS系统主流程业务
@@ -358,6 +356,117 @@
        }
    }
    public synchronized void rgvTheHandlingTaskIsIssued() {
        try {
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("rgv_no", 0).eq("wrk_sts", 9)
                    .orderBy("io_pri", false)
                    .orderBy("modi_time", true));
            if (wrkMasts.isEmpty()) {
                return;
            }
            LinkedList<RgvProtocol> rgvProtocolList = new LinkedList<>();
            for (int i = 1; i <= 5; i++) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, i);
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    continue;
                }
                rgvProtocolList.add(rgvProtocol);
            }
            runRgv:
            for (WrkMast wrkMast : wrkMasts) {
                BasDevpPosition basDevpPositions = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("dev_no", wrkMast.getRgvSstaNo())); // 站点
                long position = basDevpPositions.getPlcPosition(); // 起始站位置
                TreeMap<Long, RgvProtocol> map = new TreeMap<>();
                for (RgvProtocol rgvProtocol : rgvProtocolList) {
                    long distance;
                    if (rgvProtocol.getRgvPos() <= position) {
                        distance = position - rgvProtocol.getRgvPos();
                    } else {
                        distance = position + (perimeter - rgvProtocol.getRgvPos());
                    }
                    map.put(distance, rgvProtocol);
                }
                log.info("取货站点:{},后面小车排序", basDevpPositions.getDevNo());
                StringBuilder sb = new StringBuilder();
                for (Map.Entry<Long, RgvProtocol> rgvProtocolMap : map.entrySet()) {
                    RgvProtocol rgvProtocol = rgvProtocolMap.getValue();
                    sb.append("[").append(rgvProtocol.getRgvNo()).append(",").append(rgvProtocol.getStatusType().desc).append("]");
                }
                log.info(sb.toString());
                for (Map.Entry<Long, RgvProtocol> rgvProtocolMap : map.entrySet()) {
                    RgvProtocol rgvProtocol = rgvProtocolMap.getValue(); // 最近距离小车
//                    log.info("取货站点:{},后面最近小车:{},状态:{}", basDevpPositions.getDevNo(), rgvProtocol.getRgvNo(), rgvProtocol.getStatusType().desc);
                    int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("rgv_no", rgvProtocol.getRgvNo()).eq("wrk_sts", 10));
                    if(wrkMast.getIoType() == 10 || wrkMast.getIoType() == 110 || wrkMast.getSourceStaNo() == 1034) {
                        if (count != 0) {
                            continue;
                        }
                        if (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.setTaskNo1(wrkMast.getWrkNo().shortValue());
                            rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式:  取放货
                            rgvCommand.setSourceStaNo1(wrkMast.getRgvSstaNo().shortValue());   //工位1起点
                            rgvCommand.setDestinationStaNo1(wrkMast.getRgvDstaNo().shortValue());   //工位1目标站点
                            rgvCommand.setCommand((short) 1);   //工位1任务确认
                            if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(2, rgvCommand))) {
                                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                                break runRgv;
                            }
                            log.info("RGV命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                            Date now = new Date();
                            wrkMast.setRgvNo(rgvProtocol.getRgvNo());
                            wrkMast.setWrkSts(10L);
                            wrkMast.setRgvCreateTime(now);
                            wrkMastService.updateById(wrkMast);
                            break runRgv;
                        }
                    } else {
                        if (count != 0) {
                            break;
                        }
                        if (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.setTaskNo1(wrkMast.getWrkNo().shortValue());
                            rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式:  取放货
                            rgvCommand.setSourceStaNo1(wrkMast.getRgvSstaNo().shortValue());   //工位1起点
                            rgvCommand.setDestinationStaNo1(wrkMast.getRgvDstaNo().shortValue());   //工位1目标站点
                            rgvCommand.setCommand((short) 1);   //工位1任务确认
                            if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(2, rgvCommand))) {
                                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                                break runRgv;
                            }
                            log.info("RGV命令下发成功,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                            Date now = new Date();
                            wrkMast.setRgvNo(rgvProtocol.getRgvNo());
                            wrkMast.setWrkSts(10L);
                            wrkMast.setRgvCreateTime(now);
                            wrkMastService.updateById(wrkMast);
                            break runRgv;
                        } else {
                            break ; // 只看最近的第一个小车
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("自动下发小车取放任务失败,异常:" + e);
        }
    }
    //任务完成
    public synchronized void rgvCompleteWrkMastSta(int[] autoZ) {
        try {
@@ -394,7 +503,47 @@
                    }
                    wrkMast.setWrkSts(2L);
                    Date now = new Date();
                    wrkMast.setModiTime(now);
                    wrkMast.setRgvFinishTime(now);
                    wrkMastService.updateById(wrkMast);
                }
            }
        } catch (Exception e) {
            log.error("小车复位线程报错!" + e);
        }
    }
    // 小车取货越位,任务取消
    public synchronized void rgvTaskCancel() {
        try {
            for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    continue;
                }
                // 只有当RGV等待WCS确认、自动
                if (rgvProtocol.getStatusType() == RgvStatusType.PICK_UP_OFFSIDE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getTaskNo1() != 0
                ) {
                    log.info("{}号小车小车取货越位,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol);
                    WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", rgvProtocol.getTaskNo1().longValue()));
                    if (Cools.isEmpty(wrkMast)) {
                        log.error("未查到小车执行任务!" + rgvProtocol.getTaskNo1());
                        continue;
                    } else if(wrkMast.getWrkSts() != 10) {
                        log.error("执行任务状态不符合!" + rgvProtocol.getTaskNo1());
                        continue;
                    }
                    boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
                    if (!rgvComplete) {
                        log.error("小车取货越位,任务取消,复位失败,小车号{}!", rgvProtocol.getRgvNo());
                        break;
                    }
                    wrkMast.setWrkSts(9L);
                    wrkMast.setRgvNo(0);
                    wrkMast.setRgvCreateTime(new Date());
                    wrkMastService.updateById(wrkMast);
                }
            }
src/main/java/com/zy/core/MainProcess.java
@@ -48,7 +48,7 @@
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    // 间隔
                    Thread.sleep(200);
                    Thread.sleep(500);
                    // 系统运行状态判断
//                    if (!SystemProperties.WCS_RUNNING_STATUS.get()) {
@@ -56,15 +56,22 @@
//                    }
                    //更新小车排序
                    mainService.updateStePositionNearby();
                    //更新位置信息
                    mainService.updateStePosition();
//                    mainService.updateStePositionNearby();
//                    //更新位置信息
//                    mainService.updateStePosition();
//                    // 任务下发
//                    mainService.DevpTaskNoRun();
                    // 小车取货越位,任务取消
                    mainService.rgvTaskCancel();
                    // 任务下发
                    mainService.DevpTaskNoRun();
                    mainService.rgvTheHandlingTaskIsIssued();
                    // 任务完成
                    mainService.rgvCompleteWrkMastSta(autoZ);
                    //更新位置信息
                    mainService.updateStePosition();
//                    mainService.updateStePosition();
                } catch (Exception e) {
                    e.printStackTrace();
src/main/java/com/zy/core/enums/RgvStatusType.java
@@ -12,6 +12,7 @@
    Outbound_request(6, "出站请求","#2196F3"),
    Outbound_operation_in_progress(7, "出站运行中","#2196F3"),
    Outbound_completed(8, "出站完成","#2196F3"),
    PICK_UP_OFFSIDE(9, "小车取货越位","#2196F3"),
    ROAM(11, "漫游","#2196F3"),
    WAITING(100, "任务执行完成等待确认","#2196F3"),
    SOS110(110, "报警","#2196F3"),
src/main/resources/mapper/WrkMastMapper.xml
@@ -63,7 +63,8 @@
        <result column="ctn_no" property="ctnNo" />
        <result column="full_plt" property="fullPlt" />
        <result column="work_no_other" property="workNoOther" />
        <result column="rgv_create_time" property="rgvCreateTime" />
        <result column="rgv_finish_time" property="rgvFinishTime" />
    </resultMap>
    <select id="selectByLocNo"  resultMap="BaseResultMap">
src/main/webapp/views/index.html
@@ -273,7 +273,11 @@
                    </el-table-column>
                    <el-table-column
                            prop="sourceStaNo"
                            label="源站">
                            label="RGV源站">
                    </el-table-column>
                    <el-table-column
                            prop="rgvDstaNo"
                            label="RGV目标站">
                    </el-table-column>
                    <el-table-column
                            prop="staNo"
@@ -325,16 +329,20 @@
                        :data="tableDataRight"
                        style="width: 100%"
                        :row-class-name="tableRowClassName">
                    <el-table-column
                            prop="rgvId"
                            label="编号"
                            width="80">
                    </el-table-column>
<!--                    <el-table-column-->
<!--                            prop="rgvId"-->
<!--                            label="编号"-->
<!--                            width="80">-->
<!--                    </el-table-column>-->
                    <el-table-column
                            prop="rgvNo"
                            label="小车号">
                    </el-table-column>
                    <el-table-column
                            prop="taskNo"
                            label="任务号">
                    </el-table-column>
                    <el-table-column
                            prop="position"
                            label="位置">
                    </el-table-column>