自动化立体仓库 - WCS系统
8740b1c94ffd20b54b95962df886e43f722911c5..44be6da8fc2740a7e81d5b878a894e318b6a5f8c
19 小时以前 lsh
*
44be6d 对比 | 目录
昨天 lsh
*
98f1c4 对比 | 目录
11个文件已修改
381 ■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/BasDevpPosition.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/StaDesc.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 88 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/RouteUtils.java 132 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/TrackRangeUtils.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/CrnSlave.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/CrnCommand.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/CrnProtocol.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasDevpPosition.java
@@ -42,7 +42,20 @@
        this.plcPosition = plcPosition;
    }
//    BasDevpPosition basDevpPosition = new BasDevpPosition(
    public BasDevpPosition(BasDevpPosition basDevpPosition) {
        this.id = basDevpPosition.getId();
        this.devNo = basDevpPosition.getDevNo();
        this.plcId = basDevpPosition.getPlcId();
        this.plcPosition = basDevpPosition.getPlcPosition();
    }
    public BasDevpPosition(BasDevpPosition basDevpPosition,Long plcPosition) {
        this.id = basDevpPosition.getId();
        this.devNo = basDevpPosition.getDevNo();
        this.plcId = basDevpPosition.getPlcId();
        this.plcPosition = plcPosition;
    }
    //    BasDevpPosition basDevpPosition = new BasDevpPosition(
//            null,    // 
//            null,    // 
//            null    // 
src/main/java/com/zy/asrs/entity/StaDesc.java
@@ -69,6 +69,14 @@
    private Integer crnNo;
    /**
     * 堆垛机号
     */
    @ApiModelProperty(value= "堆垛机号")
    @TableId(value = "LANE_NO", type = IdType.INPUT)
    @TableField("LANE_NO")
    private Integer laneNo;
    /**
     * 堆垛机站点
     */
    @ApiModelProperty(value= "堆垛机站点")
@@ -301,5 +309,11 @@
        return basWrkIotype.getIoDesc();
    }
    public Integer getLaneNo() {
        return laneNo;
    }
    public void setLaneNo(Integer laneNo) {
        this.laneNo = laneNo;
    }
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -384,9 +384,28 @@
     */
    public void crnStnToOutStn() {
        for (CrnSlave crnSlave : slaveProperties.getCrn()) {
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) { continue; }
            BasCrnp basCrnp = basCrnpService.selectById(crnSlave.getId());
            if (basCrnp == null) {
                log.error("{}号堆垛机尚未在数据库进行维护!", crnSlave.getId());
                continue;
            }
            if (!crnSlave.getId().equals(crnProtocol.getLaneNo())){
                for (CrnSlave crnOther : slaveProperties.getCrn()) {
                    if (crnOther.getId().equals(crnProtocol.getLaneNo())){
                        crnSlave.updateCrnInStn(crnOther);
                    }
                }
            }
            // 遍历堆垛机出库站
            for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
                List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", crnSlave.getId()).eq("crn_stn", crnStn.getStaNo()));
                List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnSlave.getId()).eq("LANE_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
//                List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", crnSlave.getId()).eq("").eq("crn_stn", crnStn.getStaNo()));
                for (StaDesc staDesc : staDescs){
                    try{
                        // 获取堆垛机出库站信息
@@ -399,7 +418,7 @@
                        }
                        if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) {
                            // 查询工作档
                            TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnSlave.getId(), staDesc.getStnNo().toString());
                            TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnProtocol.getLaneNo(), staDesc.getStnNo().toString());
                            if (taskWrk == null) {
                                continue;
                            }
@@ -452,6 +471,14 @@
                continue;
            }
            if (!crn.getId().equals(crnProtocol.getLaneNo())){
                for (CrnSlave crnOther : slaveProperties.getCrn()) {
                    if (crnOther.getId().equals(crnProtocol.getLaneNo())){
                        crn.updateCrnInStn(crnOther);
                    }
                }
            }
            // 库位移转
            this.locToLoc(crn, crnProtocol);
@@ -488,7 +515,7 @@
     */
    public void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol) throws IOException {
        for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) {
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", slave.getId()).eq("crn_stn", crnStn.getStaNo()));
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", slave.getId()).eq("LANE_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
            for (StaDesc staDesc : staDescs) {
                boolean flag = false;
                // 获取堆垛机入库站信息
@@ -514,7 +541,7 @@
                }
                // 获取工作状态为2(设备上走)的入库工作档
                TaskWrk taskWrk = taskWrkMapper.selectPakIn(slave.getId(), staProtocol.getWorkNo().intValue(), staDesc.getStnNo().toString());
                TaskWrk taskWrk = taskWrkMapper.selectPakIn(crnProtocol.getLaneNo(), staProtocol.getWorkNo().intValue(), staDesc.getStnNo().toString());
                if(null == taskWrk) {
                    continue;
                }
@@ -525,7 +552,7 @@
                }
                // 已经存在吊车执行任务时,则过滤
                if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) {
                if (taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()) != null) {
                    continue;
                }
@@ -573,7 +600,8 @@
                // 命令下发区 --------------------------------------------------------------------------
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(staDesc.getCrnNo()); // 堆垛机编号
                crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                crnCommand.setCrnNo(staDesc.getLaneNo()); // 堆垛机巷道编号
                crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号
                crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
@@ -634,15 +662,17 @@
     * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库
     */
    public void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol){
        List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOut(slave.getId(), null);
        List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOut(crnProtocol.getLaneNo(), null);
        if (taskWrksInitial.size()==0){
            return;
        }
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", slave.getId()).eq("crn_stn", crnStn.getStaNo()));
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", slave.getId()).eq("LANE_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
//            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", crnProtocol.getLaneNo()).eq("crn_stn", crnStn.getStaNo()));
            for (StaDesc staDesc : staDescs){
                // 获取工作状态为11(生成出库ID)的出库工作档
                List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(slave.getId(),staDesc.getStnNo().toString());
                List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(crnProtocol.getLaneNo(),staDesc.getStnNo().toString());
                for (TaskWrk taskWrk : taskWrks){
                    if (taskWrk == null) {
                        continue;
@@ -679,12 +709,13 @@
                        }
                        // 已经存在吊车执行任务时,则过滤
                        if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) {
                        if (taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()) != null) {
                            break;
                        }
                        CrnCommand command = new CrnCommand();
                        command.setCrnNo(taskWrk.getCrnNo()); // 堆垛机编号
                        command.setCrnNo(slave.getId()); // 堆垛机编号
                        command.setLaneNo(crnProtocol.getLaneNo()); // 堆垛机编号
                        command.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号
                        command.setAckFinish((short) 0);  // 任务完成确认位
                        command.setTaskMode(CrnTaskModeType.PAKIN); // 任务模式
@@ -696,7 +727,7 @@
                        command.setDestinationPosZ(crnStn.getLev().shortValue());     // 目标库位层
                        command.setCommand((short)1);
                        if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, command),false)) {
                            log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(command));
                            log.error("堆垛机命令生成失败,堆垛机号={},巷道={},任务数据={}",slave.getId(), taskWrk.getCrnNo(), JSON.toJSON(command));
                            throw new CoolException("堆垛机命令生成失败");
                        }else{
                            try{
@@ -755,7 +786,7 @@
            // 获取工作状态为11(生成出库ID)的移库工作档
            List<TaskWrk> taskWrks = taskWrkMapper.selectList(
                    new EntityWrapper<TaskWrk>()
                    .eq("CRN_NO",slave.getId())
                    .eq("CRN_NO",crnProtocol.getLaneNo())
                    .eq("WRK_STS",11)
                    .eq("IO_TYPE",3)
                    .orderBy("IO_PRI",false));
@@ -775,7 +806,7 @@
                }
                // 已经存在吊车执行任务时,则过滤
                if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) {
                if (taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()) != null) {
                    continue;
                }
@@ -796,6 +827,7 @@
                // 1.堆垛机开始移动
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                crnCommand.setLaneNo(crnProtocol.getLaneNo()); // 堆垛机编号
                crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号
                crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
@@ -863,12 +895,20 @@
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) { continue; }
            if (!crn.getId().equals(crnProtocol.getLaneNo())){
                for (CrnSlave crnOther : slaveProperties.getCrn()) {
                    if (crnOther.getId().equals(crnProtocol.getLaneNo())){
                        crn.updateCrnInStn(crnOther);
                    }
                }
            }
            //  状态:等待确认 并且  任务完成位 = 1
            if (!Cools.isEmpty(crnProtocol.getTaskFinish()) && crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) {
                //获取入库待确认工作档
                TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crn.getId(),crnProtocol.getTaskNo().intValue());
                TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crnProtocol.getLaneNo(),crnProtocol.getTaskNo().intValue());
                if (Cools.isEmpty(taskWrk)&&crnProtocol.getTaskNo() !=999) {
                    log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo());
                    log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},巷道号={},工作号={}", crn.getId(),crnProtocol.getLaneNo(), crnProtocol.getTaskNo());
                    continue;
                }
                Thread.sleep(300);
@@ -1211,7 +1251,7 @@
                    if (rgvOtherStatusEnable(rgvSlave)){
                        //分成上下两部分任务
                        List<Integer>[] avoidRange = RouteUtils.gradeRange(staList, basDevpPositions);
                        List<Integer>[] avoidRange = RouteUtils.gradeRange(staList, basDevpPositions,itSmall);
                        List<Integer> rangeListSou = avoidRange[itSmall ? 0 : 1];
                        List<Integer> rangeListSouOther = avoidRange[itSmall ? 1 : 0];
                        //就近排序
@@ -1223,15 +1263,17 @@
                        //筛选范围内任务
                        //就近排序
                        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(rgvSlave.getOtherId());
                        //筛选在范围任务
                        List<Integer> belongToRange = RouteUtils.belongToRange(rangeList, rgvProtocolOther.getRgvPosDestination(), basDevpPositions);
                        Long[][] avoidedRange = new TrackRangeUtils().avoidRangeArr(rgvSlave, trackEntireLength, trackBenchmark, avoidDistance);
                        List<Integer> belongToRange = RouteUtils.SortNearby(RouteUtils.belongToRange(rangeList, avoidedRange[0], basDevpPositions), rgvProtocol.RgvPos, basDevpPositions);
                        for (Integer staNoNow : belongToRange){
                            for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
                                if (rgvStn.getStaNo().equals(staNoNow)){
                                    TaskWrk taskWrk = deviceDetection(rgvStn);
                                    if (taskWrk!=null){
                                        if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,taskWrk.getTargetPointConvert(),basDevpPositions)){
                                        BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", taskWrk.getTargetPointConvert()));
                                        if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,basDevpPosition.getPlcPosition(),basDevpPositions,itSmall)){
                                            sign = taskGenerate(rgvSlave,rgvStn,0);
                                        }
                                    }
@@ -1263,7 +1305,8 @@
                                    if (rgvStn.getStaNo().equals(staNoNow)){
                                        TaskWrk taskWrk = deviceDetection(rgvStn);
                                        if (taskWrk!=null){
                                            if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,taskWrk.getTargetPointConvert(),basDevpPositions)){
                                            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", taskWrk.getTargetPointConvert()));
                                            if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,basDevpPosition.getPlcPosition(),basDevpPositions,itSmall)){
                                                sign = taskGenerate(rgvSlave,rgvStn,0);
                                            }
                                        }
@@ -1296,7 +1339,8 @@
                                    if (rgvStn.getStaNo().equals(staNoNow)){
                                        TaskWrk taskWrk = deviceDetection(rgvStn);
                                        if (taskWrk!=null){
                                            if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,taskWrk.getTargetPointConvert(),basDevpPositions)){
                                            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", taskWrk.getTargetPointConvert()));
                                            if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,basDevpPosition.getPlcPosition(),basDevpPositions,itSmall)){
                                                sign = taskGenerate(rgvSlave,rgvStn,0);
                                            }
                                        }
src/main/java/com/zy/asrs/utils/RouteUtils.java
@@ -7,6 +7,7 @@
import com.zy.core.model.RgvSlave;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static java.util.stream.Collectors.toList;
@@ -16,55 +17,154 @@
 */
public class RouteUtils {
    //排序  执行方向(面朝轨道 定位值左小右大)  0:左 小   1:右 大
    public static List<Integer>[] gradeRange(List<Integer> staNoList,List<BasDevpPosition> basDevpPositions) {
    public static List<Integer>[] gradeRange(List<Integer> staNoList, List<BasDevpPosition> basDevpPositionList, boolean itSmall) {
        List<Integer>[] avoidRangeArray = new ArrayList[2];
        Integer[] rangeList = new Integer[staNoList.size()];
        List<Integer> rangeList1 = new ArrayList<>();
        List<Integer> rangeList2 = new ArrayList<>();
        int i = 0;
        for (BasDevpPosition basDevpPosition : basDevpPositionList) {
            for (Integer staNo : staNoList) {
                if (basDevpPosition.getDevNo().equals(staNo)) {
                    rangeList[i] = staNo;
                    i = i + 1;
                    break;
                }
            }
        }
        boolean sign = true;
        for (int j = 0; j < rangeList.length; j++) {
            if (itSmall) {
                if (sign) {
                    rangeList1.add(rangeList[j]);
                } else {
                    rangeList2.add(rangeList[j]);
                }
                if (sign && j >= rangeList.length / 2) {
                    sign = false;
                }
            } else {
                if (sign && j >= rangeList.length / 2) {
                    sign = false;
                }
                if (sign) {
                    rangeList1.add(rangeList[j]);
                } else {
                    rangeList2.add(rangeList[j]);
                }
            }
        }
        avoidRangeArray[0] = rangeList1;
        avoidRangeArray[1] = rangeList2;
        return avoidRangeArray;
    }
    //获取在范围的站点
    public static List<Integer> belongToRange(List<Integer> staNoList,Long position,List<BasDevpPosition> basDevpPositions){
    public static List<Integer> belongToRange(List<Integer> staNoList, Long[] avoid, List<BasDevpPosition> basDevpPositions) {
        List<Integer> siteList = new ArrayList<>();
        for (BasDevpPosition basDevpPosition : basDevpPositions) {
            if (new TrackRangeUtils().avoidRange(basDevpPosition.getPlcPosition(), avoid)) {
                for (Integer staNo : staNoList) {
                    if (basDevpPosition.getDevNo().equals(staNo)) {
                        siteList.add(staNo);
                        break;
                    }
                }
            }
        }
        return siteList;
    }
    //提取站点集合
    public static List<Integer> BasDevpPositionExtractSites(List<BasDevpPosition> basDevpPositions){
    public static List<Integer> BasDevpPositionExtractSites(List<BasDevpPosition> basDevpPositions) {
        List<Integer> siteList = new ArrayList<>();
        for (BasDevpPosition basDevpPosition : basDevpPositions){
            if (!siteList.contains(basDevpPosition.getDevNo())){
        for (BasDevpPosition basDevpPosition : basDevpPositions) {
            if (!siteList.contains(basDevpPosition.getDevNo())) {
                siteList.add(basDevpPosition.getDevNo());
            }
        }
        return siteList;
    }
    //提取站点集合
    public static List<Integer> SortNearby(List<Integer> staNoList,Long rgvNowPos,List<BasDevpPosition> basDevpPositions){
    //提取站点集合//就近排序
    public static List<Integer> SortNearby(List<Integer> staNoList, Long rgvNowPos, List<BasDevpPosition> basDevpPositionList) {
        List<Integer> siteList = new ArrayList<>();
        List<BasDevpPosition> basDevpPositions = devpNoSort(basDevpPositionList, rgvNowPos);
        for (BasDevpPosition basDevpPosition : basDevpPositions) {
            for (Integer staNo : staNoList) {
                if (basDevpPosition.getDevNo().equals(staNo)) {
                    siteList.add(staNo);
                    break;
                }
            }
        }
        return siteList;
    }
    //站点过滤
    public static List<BasDevpPosition> devpNoSort(List<BasDevpPosition> devpPositionList, Long rgvNowPos) {
        List<BasDevpPosition> basDevpPositions = new ArrayList<>();
        List<BasDevpPosition> basDevpPositionSort = new ArrayList<>();
        ArrayList<Long> arrayList = new ArrayList<>();
        for (BasDevpPosition basDevpPosition : devpPositionList) {
            long position = Math.abs(basDevpPosition.getPlcPosition() - rgvNowPos);
            BasDevpPosition devpPosition = new BasDevpPosition(basDevpPosition, position);
            basDevpPositions.add(devpPosition);
            arrayList.add(position);
        }
        Collections.sort(arrayList); // 升序排序
        for (Long position : arrayList) {
            for (BasDevpPosition basDevpPosition : basDevpPositions) {
                if (basDevpPosition.getPlcPosition().equals(position)) {
                    basDevpPositionSort.add(basDevpPosition);
                    break;
                }
            }
        }
        return basDevpPositionSort;
    }
    //检测是否在范围
    public static boolean CheckIfItIsWithinTheRange(List<Integer> staNoList,Integer staNo,List<BasDevpPosition> basDevpPositions){
    public static boolean CheckIfItIsWithinTheRange(List<Integer> staNoList, Long staNoNowPos, List<BasDevpPosition> basDevpPositionList, boolean itSmall) {
        List<Integer> siteList = new ArrayList<>();
        if (staNoList.isEmpty()){
            return true;
        Integer[] rangeList = new Integer[staNoList.size()];
        int i = 0;
        for (BasDevpPosition basDevpPosition : basDevpPositionList) {
            for (Integer staNo : staNoList) {
                if (basDevpPosition.getDevNo().equals(staNo)) {
                    rangeList[i] = staNo;
                    i = i + 1;
                    break;
                }
            }
        }
        return false;
        if (itSmall) {
            return staNoNowPos <= rangeList[rangeList.length - 1];
        }
        return staNoNowPos >= rangeList[0];
    }
    public static long absoluteDifference(Long a, Long b) {
        if (a == null || b == null) {
            a = 0L;
            b = 0L;
//            throw new IllegalArgumentException("");
            System.out.println("a or b is null");
        }
        return Math.abs(a - b);
    }
}
src/main/java/com/zy/asrs/utils/TrackRangeUtils.java
@@ -23,7 +23,7 @@
        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
        RgvProtocol rgvProtocolE, rgvProtocolB;
        if (rgvProtocol.getRgvPos() < rgvProtocolOther.getRgvPos()) {
        if (IsItSmall(slave)) {
            rgvProtocolE = rgvProtocolOther;
            rgvProtocolB = rgvProtocol;
        } else {
@@ -42,6 +42,38 @@
    }
    public Long[][] avoidRangeArr(RgvSlave slave, Long trackEntireLength, Long trackBenchmark, Long avoidDistance) {
        RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
        RgvProtocol rgvProtocolE, rgvProtocolB;
        if (IsItSmall(slave)) {
            rgvProtocolE = rgvProtocolOther;
            rgvProtocolB = rgvProtocol;
            long entireLength = rgvProtocolE.getRgvPosDestination() - rgvProtocolE.getCarBodyJiaoMing() - avoidDistance - rgvProtocolB.getCarBodyKunPeng();
            long benchmark = trackBenchmark + rgvProtocolB.getCarBodyJiaoMing();
            long entireLengthOther = trackEntireLength - rgvProtocolE.getCarBodyKunPeng();
            long benchmarkOther = rgvProtocolB.getRgvPosDestination() + rgvProtocolB.getCarBodyKunPeng() + avoidDistance + rgvProtocolE.getCarBodyJiaoMing();
            return new Long[][]{new Long[]{entireLength, benchmark}, new Long[]{entireLengthOther, benchmarkOther}};
        } else {
            rgvProtocolE = rgvProtocol;
            rgvProtocolB = rgvProtocolOther;
            long entireLength = trackEntireLength - rgvProtocolE.getCarBodyKunPeng();
            long benchmark = rgvProtocolB.getRgvPosDestination() + rgvProtocolB.getCarBodyKunPeng() + avoidDistance + rgvProtocolE.getCarBodyJiaoMing();
            long entireLengthOther = rgvProtocolE.getRgvPosDestination() - rgvProtocolE.getCarBodyJiaoMing() - avoidDistance - rgvProtocolB.getCarBodyKunPeng();
            long benchmarkOther = trackBenchmark + rgvProtocolB.getCarBodyJiaoMing();
            return new Long[][]{new Long[]{entireLength, benchmark}, new Long[]{entireLengthOther, benchmarkOther}};
        }
    }
    public boolean avoidRange(Long avoid, Long[] range) {
        return avoid < range[0] && avoid > range[1];
    }
src/main/java/com/zy/core/model/CrnSlave.java
@@ -51,4 +51,9 @@
    }
    public void updateCrnInStn(CrnSlave crnSlave){
        crnInStn = crnSlave.getCrnInStn();
        crnOutStn = crnSlave.getCrnOutStn();
    }
}
src/main/java/com/zy/core/model/command/CrnCommand.java
@@ -16,6 +16,7 @@
    // 堆垛机号
    private Integer crnNo = 0;
    private Integer laneNo = 0;
    // 任务完成确认位
    private Short ackFinish = 0;
src/main/java/com/zy/core/model/protocol/CrnProtocol.java
@@ -14,6 +14,7 @@
public class CrnProtocol {
    private Integer crnNo;
    private Integer laneNo;
    /**
     * 1 = 手动模式
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -159,8 +159,11 @@
            if (result.IsSuccess) {
                if (null == crnProtocol) {
                    crnProtocol = new CrnProtocol();
                    crnProtocol.setCrnNo(slave.getId());
                }
                crnProtocol.setCrnNo(slave.getId());
                crnProtocol.setLaneNo(siemensNet.getByteTransform().TransInt32(result.Content, 0));//巷道号
                crnProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0));
                crnProtocol.setTaskNo(siemensNet.getByteTransform().TransInt16(result.Content, 2));
                crnProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 4));
src/main/resources/application-prod.yml
@@ -1,7 +1,7 @@
wcs-slave:
  doubleDeep: true #双深
  doubleDeep: false #双深
  doubleLocs: 3,6,7,10,13 #双深库位排号 3,6,7,10,13
  groupCount: 4 #一个堆垛机负责的货架排数
  groupCount: 2 #一个堆垛机负责的货架排数
  crn[0]: #堆垛机1
    ip: 192.168.4.250
    id: 1
@@ -22,6 +22,86 @@
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
  crn[1]: #堆垛机1
    ip: 192.168.4.250
    id: 2
    slot: 0
    demo: false
    rack: 0
    offset: 2    #偏移量,当堆垛机站点列号=1时,偏移量=2
    port: 102
    crnOutStn[0]:    #堆垛机出库站点
      staNo: 101
      row: 2
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
    crnInStn[0]:    #堆垛机入库站点1
      staNo: 100
      row: 1
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
  crn[2]: #堆垛机1
    ip: 192.168.4.250
    id: 3
    slot: 0
    demo: false
    rack: 0
    offset: 2    #偏移量,当堆垛机站点列号=1时,偏移量=2
    port: 102
    crnOutStn[0]:    #堆垛机出库站点
      staNo: 101
      row: 2
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
    crnInStn[0]:    #堆垛机入库站点1
      staNo: 100
      row: 1
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
  crn[3]: #堆垛机1
    ip: 192.168.4.250
    id: 4
    slot: 0
    demo: false
    rack: 0
    offset: 2    #偏移量,当堆垛机站点列号=1时,偏移量=2
    port: 102
    crnOutStn[0]:    #堆垛机出库站点
      staNo: 101
      row: 2
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
    crnInStn[0]:    #堆垛机入库站点1
      staNo: 100
      row: 1
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
  crn[4]: #堆垛机1
    ip: 192.168.4.250
    id: 5
    slot: 0
    demo: false
    rack: 0
    offset: 2    #偏移量,当堆垛机站点列号=1时,偏移量=2
    port: 102
    crnOutStn[0]:    #堆垛机出库站点
      staNo: 101
      row: 2
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
    crnInStn[0]:    #堆垛机入库站点1
      staNo: 100
      row: 1
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
  barcode[0]: #条码扫描仪1
    port: 51236
    ip: 10.10.10.52
src/main/resources/application.yml
@@ -1,5 +1,5 @@
server:
  port: 8080
  port: 8083
  servlet:
    context-path: /@pom.build.finalName@