#
lsh
2024-01-11 63f731641998edc06c1e0409ab1901260d36154b
#
11个文件已修改
510 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/WrkMast.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastSta.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 295 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/RouteUtils.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/DevpSlave.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/RgvThread.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -75,7 +75,7 @@
    private Integer rgvNo;
    /**
     * 徐工汉云拆垛标记  0: 未拆  1: 已拆  2:已处理可下一步(转历史档)
     * 徐工汉云拆垛标记  0: 初始 1、未拆已上报  2: 已拆  3:已处理可下一步(转历史档)
     */
    @ApiModelProperty(value= "")
    @TableField("sheet_no")
src/main/java/com/zy/asrs/entity/WrkMastSta.java
@@ -121,6 +121,18 @@
    public WrkMastSta() {}
    public WrkMastSta(Date now, Integer staStart) {
        this.wrkNo = staStart.longValue()+9999;
        this.wrkStart = staStart;
        this.wrkEnd = staStart;
        this.staStart = staStart;
        this.staEnd = staStart;
        this.createTime = now;
        this.updateTime = now;
        this.wrkSts = 0;
        this.bignTime = now;
    }
    public WrkMastSta(Long wrkNo, Integer wrkStart, Integer wrkEnd, Integer staStart, Integer staEnd, Date createTime, Date updateTime, Integer type, Integer wrkSts, Integer lineNumber, Integer wrkType, Date bignTime) {
        this.wrkNo = wrkNo;
        this.wrkStart = wrkStart;
@@ -136,6 +148,20 @@
        this.bignTime = bignTime;
    }
    public Integer getStaEnd(Integer souSta) {
        switch (souSta) {
            case 100:
            case 103:
            case 106:
            case 109:
            case 112:
            case 115:
                return souSta + 1;
            default:
                return souSta;
        }
    }
//    WrkMastSta wrkMastSta = new WrkMastSta(
//            null,    // 工作号[非空]
//            null,    // 工作档开始位置[非空]
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -42,6 +42,9 @@
//    @Select("select top 1 from dbo.asr_wrk_mast where wrk_no=#{workNo}")
    WrkMast selectPakInStep3(@Param("workNo")Integer workNo);
    WrkMast selectPakInStep4(@Param("staNo")Integer staNo,@Param("sheetNo")String sheetNo);
    WrkMast selectPakInStep5(@Param("staNo")Integer staNo,@Param("sheetNo")String sheetNo);
    // 拣料再入库时,站点有物且需求时查询
//    @Select("select top 1 * from asr_wrk_mast where wrk_no=#{workNo} and wrk_sts=14 and (io_type=103 or io_type=107 or io_type=104)")
    WrkMast selectPickStep(@Param("barcode")String barcode);
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -409,6 +409,118 @@
    }
    /**
     * 拣料、并板、盘点再入库  拆垛位置
     */
    public synchronized void stnToCrnStnPick2() {
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历拣料入库口
            for (DevpSlave.Sta pickSta : devp.getPickSta2()) {
                // 获取拣料入库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isPakMk() && staProtocol.getWorkNo()==0 && !staProtocol.isOutEnable() && staProtocol.isInEnable()) {
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep4(staProtocol.getSiteId(),"3");
                    if (wrkMast == null) {
                        WrkMast wrkMast1 = wrkMastMapper.selectPakInStep5(staProtocol.getSiteId(),"3");
                        if (Cools.isEmpty(wrkMast1) && staProtocol.isEmptyMk()){
                            WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(staProtocol.getSiteId() + 9999L);
                            if (Cools.isEmpty(wrkMastSta)){
                                WrkMastSta wrkMastSta1 = new WrkMastSta(new Date(),staProtocol.getSiteId());
                                wrkMastSta1.setType(2);
                                wrkMastSta1.setWrkType(1);
                                wrkMastStaMapper.insert(wrkMastSta1);
                            }
                            continue;
                        }
//                        log.error("站点号"+staProtocol.getSiteId()+"未查询到工作档案!");
                        // 无拣料数据
                        continue;
                    }
                    if (staProtocol.isEmptyMk()){
                        log.error("站点号"+staProtocol.getSiteId()+"空板信号异常!");
                        continue;
                    }
                    if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107)
                            || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo())) {
                        continue;
                    }
                    // 获取目标站
                    Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                            .eq("type_no", wrkMast.getIoType() - 50)
                            .eq("stn_no", pickSta.getStaNo()) // 作业站点 = 拣料出库的目标站
                            .eq("crn_no", wrkMast.getCrnNo()); // 堆垛机号
                    StaDesc staDesc = staDescService.selectOne(wrapper);
                    if (Cools.isEmpty(staDesc)) {
                        log.error("入库路径不存在!type_no={},stn_no={},crn_no={}", wrkMast.getIoType(), pickSta.getStaNo(), wrkMast.getCrnNo());
                        continue;
                    }
                    try {
                        // 保存工作明细档历史档
                        if (wrkMastMapper.saveWrkDetlLog(wrkMast.getWrkNo()) == 0) {
                            throw new CoolException("保存工作明细档历史档失败");
                        }
                        // 保存工作主档历史档
                        if (wrkMastMapper.saveWrkMastLog(wrkMast.getWrkNo()) == 0) {
                            throw new CoolException("保存工作主档历史档失败");
                        }
                        Date now = new Date();
                        // 堆垛机站点(目标站)
                        Integer staNo = staDesc.getCrnStn();
                        // 更新工作档数据状态
                        wrkMast.setIoTime(now);
                        wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57
                        wrkMast.setWrkSts(2L); // 工作状态: 2.设备上走
                        wrkMast.setSourceStaNo(wrkMast.getStaNo()); // 源站
                        wrkMast.setStaNo(staNo); // 目标站
                        wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 目标库位 = 出库时的源库位
                        wrkMast.setSourceLocNo(""); // 源库位清空
                        wrkMast.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast) == 0) {
                            throw new CoolException("更新工作档数据状态失败");
                        }
                        // 更新明细档io_time (历史档关联使用)
                        wrkDetlService.updateIoTime(wrkMast.getWrkNo(), now);
                        // 修改库位状态 Q.拣料/盘点/并板再入库
                        LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
                        locMast.setLocSts("Q");
                        locMast.setModiTime(new Date());
                        if (!locMastService.updateById(locMast)) {
                            throw new CoolException("修改库位状态失败");
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        continue;
                    }
                    // 更新站点信息 且 下发plc命令
                    staProtocol.setWorkNo(wrkMast.getWrkNo());
                    staProtocol.setStaNo(wrkMast.getStaNo());
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                    if (!result) {
                        log.error("发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId());
                    }
                }
            }
        }
    }
    /**
     * 堆垛机站出库到出库站
     */
    public synchronized void crnStnToOutStn() {
@@ -3706,10 +3818,10 @@
     */
    public synchronized void stackingCompletionDriveTray2() {
        try {
            int[] staNos=new int[]{133,135};//(2个入库站点,1楼2个出库码垛站,根据现场修改)
            int[] staNos=new int[]{131,135};//(2个入库站点,1楼2个出库码垛站,根据现场修改)
            for (int staNo : staNos){
                BasDevp basDevp = basDevpService.selectById(staNo);
                if (basDevp.getWrkNo()<9990){
                if (basDevp.getWrkNo()!=0){
                    continue;
                }
                WrkMast wrkMast = wrkMastMapper.selectWrkMastUnstackingOne202(staNo);
@@ -3738,11 +3850,16 @@
                // 判断是否满足入库条件
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                        && staProtocol.getWorkNo() >= 9990
                        && staProtocol.isInEnable()
                        && staProtocol.getWorkNo() == 0
                ) {//&& staProtocol.isPakMk() && !Cools.isEmpty(barcode)) {
                    //任务完成
                    boolean result1 = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(3, staProtocol));
                    Thread.sleep(100);
                    staProtocol.setWorkNo(wrkMast.getWrkNo());
                    staProtocol.setStaNo(wrkMast.getStaNo());
                    staProtocol.setStaNo(144);
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol));
                    if (!result) {
@@ -3750,6 +3867,10 @@
                    }
                    wrkMast.setWrkSts(52L);
                    wrkMastMapper.updateById(wrkMast);
                    Thread.sleep(100);
                    //任务完成
                    boolean result2 = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(4, staProtocol));
                }
            }
@@ -3757,6 +3878,63 @@
//            e.printStackTrace();
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            log.error("其他  ===>> 码垛完成驱动托盘进入下一步"+e);
        }
    }
    /**
     * 其他  ===>> 码垛完成驱动托盘进入下一步
     */
    public synchronized void stackingCompletionDriveTrayOk2() {
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历拣料入库口
            for (DevpSlave.Sta pickSta : devp.getPickSta2()) {
                // 获取拣料入库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isPakMk()  && staProtocol.getWorkNo()!=0 && staProtocol.isOutEnable()) {//
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep3(staProtocol.getWorkNo());
                    if (wrkMast == null) {
                        log.error("站点号"+staProtocol.getSiteId()+"未查询到工作档案!");
                        // 无拣料数据
                        continue;
                    }
                    if (!wrkMast.getSheetNo().equals("2") || wrkMast.getIoType()<100 || wrkMast.getWrkSts()!=14){
                        continue;
                    }
                    if (wrkMast.getIoType()==101){
                        //任务完成
                        boolean result1 = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(3, staProtocol));
                        wrkMast.setSheetNo("3");
                        wrkMastMapper.updateById(wrkMast);
                    }else {
                        if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107)
                                || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo())) {
                            continue;
                        }
                        //任务完成
                        boolean result1 = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(3, staProtocol));
                        wrkMast.setSheetNo("3");
                        wrkMastMapper.updateById(wrkMast);
                        try{
                            Thread.sleep(100);
                        }catch (Exception e){
                        }
                        boolean result2 = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(4, staProtocol));
                    }
                }
            }
        }
    }
    /**
@@ -3840,11 +4018,12 @@
                // 只有当RGV等待WCS确认、自动
                if (rgvProtocol.getStatusType() == RgvStatusType.WORKING
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && (rgvProtocol.getStatusType1()==RgvStatusType.WAITING || rgvProtocol.getStatusType2()==RgvStatusType.WAITING )
                        && ((rgvProtocol.getStatusType1()==RgvStatusType.WAITING || rgvProtocol.getStatusType2()==RgvStatusType.WAITING ) ||
                        (rgvProtocol.getStatusType1()==RgvStatusType.FETCHWAITING || rgvProtocol.getStatusType2()==RgvStatusType.FETCHWAITING ))
                ) {
                    log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol);
                    if (rgvProtocol.getTaskNo1()!=0&&rgvProtocol.getStatusType1()==RgvStatusType.WAITING){
                        if (rgvProtocol.getTaskNo1()==9999){
                    if (rgvProtocol.getTaskNo1()!=0 && (rgvProtocol.getStatusType1()==RgvStatusType.WAITING || rgvProtocol.getStatusType1()==RgvStatusType.FETCHWAITING)){
                        if (rgvProtocol.getTaskNo1()==29999){
                            boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
                            if (!rgvComplete){
                                log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
@@ -3864,13 +4043,25 @@
                            log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                            break;
                        }
                        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                        StaProtocol staProtocol = devpThread.getStation().get(wrkMastSta.getStaEnd());
                        WrkMast wrkMast = wrkMastMapper.selectPakInStep3(wrkMastSta.getWrkNo().intValue());
                        if (!Cools.isEmpty(wrkMast)){
                            // 下发站点信息
                            staProtocol.setWorkNo(wrkMastSta.getWrkNo().intValue());
                            staProtocol.setStaNo(wrkMast.getStaNo());
                            if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))) {
                                continue;
                            }
                        }
                        wrkMastSta.setWrkSts(3);
                        wrkMastStaMapper.updateById(wrkMastSta);
                        BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                        basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
                        rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
                    }else if (rgvProtocol.getTaskNo2()!=0 && rgvProtocol.getStatusType2()==RgvStatusType.WAITING){
                        if (rgvProtocol.getTaskNo2()==9999){
                    }else if (rgvProtocol.getTaskNo2()!=0 && (rgvProtocol.getStatusType2()==RgvStatusType.WAITING || rgvProtocol.getStatusType2()==RgvStatusType.FETCHWAITING)){
                        if (rgvProtocol.getTaskNo2()==29999){
                            boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
                            if (!rgvComplete){
                                log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
@@ -3889,6 +4080,17 @@
                        if (!rgvComplete){
                            log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                            break;
                        }
                        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                        StaProtocol staProtocol = devpThread.getStation().get(wrkMastSta.getStaEnd());
                        WrkMast wrkMast = wrkMastMapper.selectPakInStep3(wrkMastSta.getWrkNo().intValue());
                        if (!Cools.isEmpty(wrkMast)){
                            // 下发站点信息
                            staProtocol.setWorkNo(wrkMastSta.getWrkNo().intValue());
                            staProtocol.setStaNo(wrkMast.getStaNo());
                            if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))) {
                                continue;
                            }
                        }
                        wrkMastSta.setWrkSts(3);
                        wrkMastStaMapper.updateById(wrkMastSta);
@@ -3925,6 +4127,7 @@
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded1()==0
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (basRgvMap == null) {
@@ -3984,6 +4187,7 @@
                // 只有当RGV空闲、自动,工位二有物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                        && (rgvProtocol.getLoaded2()==3  || rgvProtocol.getLoaded2()==1 )////0 无物;1 一层无物二层有物 (只能拆叠) ;2一层有物二层无物 ;3  1、2层都有物
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
@@ -3999,7 +4203,7 @@
                            continue;
                        }
                        boolean sign = false;
                        if (wrkMastSta.getStaStart()==0 && wrkMastSta.getStaEnd()!=0){//放
                        if ( wrkMastSta.getStaEnd()!=0){//放
                            sign = rgvPutEmpty(rgvProtocol.getRgvNo(),wrkMastSta);//拆盘
                        }else {
                            continue;
@@ -4113,6 +4317,7 @@
                // 只有当RGV空闲、自动,工位二无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                        &&  (rgvProtocol.getLoaded2()==0  || rgvProtocol.getLoaded2()==1 ) //现场修改:叠盘机,////0 无物;1 一层无物二层有物(只能拆叠)   ;2一层有物二层无物 (只能满放);3  1、2层都有物
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
@@ -4128,7 +4333,7 @@
                            continue;
                        }
                        boolean sign = false;
                        if (wrkMastSta.getStaEnd()==0 && wrkMastSta.getStaStart()!=0){//取
                        if ( wrkMastSta.getStaStart()!=0){//取
                            sign = rgvTakeEmpty(rgvProtocol.getRgvNo(),wrkMastSta);//叠盘
                        }else {
                            continue;
@@ -4254,6 +4459,11 @@
                    if (rgvProtocol.getRgvPosI().equals(basRgvMap.getStartRoute())){
                        continue;
                    }
                    if (rgvProtocol.getRgvNo()==1 && (rgvProtocol.getRgvPosI().equals(101) || rgvProtocol.getRgvPosI().equals(102) )){
                        continue;
                    } else if (rgvProtocol.getRgvNo()==2 && (rgvProtocol.getRgvPosI().equals(116) || rgvProtocol.getRgvPosI().equals(117) ) ){
                        continue;
                    }
                    rgvAvoidanceXY(rgvProtocol.getRgvNo());
                    rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
                }
@@ -4303,26 +4513,51 @@
     * 小车XY移动  避让
     * */
    public synchronized boolean rgvAvoidanceXY(Integer rgvId){
        try{
            BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvId);
            //  命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvId); // RGV编号
            rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
            rgvCommand.setTaskNo1((short)9999); // 工位1工作号
            rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式:  回原点
            rgvCommand.setDestinationStaNo1(basRgvMap.getLockStartRoute().shortValue());
            rgvCommand.setCommand((short) 1);   //工位1任务确认
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(9, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务   step=9,回原点 9999任务号
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
        if (rgvId==1){
            try{
                BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvId);
                //  命令下发区 --------------------------------------------------------------------------
                RgvCommand rgvCommand = new RgvCommand();
                rgvCommand.setRgvNo(rgvId); // RGV编号
                rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
                rgvCommand.setTaskNo1((short)29999); // 工位1工作号
                rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式:  回原点
                //basRgvMap.getLockStartRoute().shortValue()
                rgvCommand.setSourceStaNo1( (short)101);
                rgvCommand.setCommand((short) 1);   //工位1任务确认
                if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                    //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务   step=9,回原点 9999任务号
                    log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                    return false;
                } else {
                    return true;
                }
            }catch (Exception e){
                return false;
            } else {
                return true;
            }
        }catch (Exception e){
            return false;
            }
        }else {
            try{
                BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvId);
                //  命令下发区 --------------------------------------------------------------------------
                RgvCommand rgvCommand = new RgvCommand();
                rgvCommand.setRgvNo(rgvId); // RGV编号
                rgvCommand.setAckFinish2((short) 0);  // 工位2任务完成确认位
                rgvCommand.setTaskNo2((short)29999); // 工位2工作号
                rgvCommand.setTaskMode2(RgvTaskModeType.X_MOVE); // 工位2任务模式:  回原点
                rgvCommand.setSourceStaNo2((short)117);
                rgvCommand.setCommand((short) 2);   //工位2任务确认
                if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                    //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务   step=9,回原点 9999任务号
                    log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                    return false;
                } else {
                    return true;
                }
            }catch (Exception e){
                return false;
            }
        }
    }
@@ -4509,7 +4744,7 @@
    public synchronized boolean rgvComplete(Integer rgvId){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(3, new RgvCommand()))) {
            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;
src/main/java/com/zy/asrs/utils/RouteUtils.java
@@ -280,7 +280,51 @@
    }
    public static short RgvPosStaOne(Short posId){
        return 1;
        switch (posId.intValue()){
            case 1:
            case 2:
                return 102;
            case 3:
            case 4:
                return 122;
            case 5:
            case 6:
                return 105;
            case 7:
            case 8:
                return 118;
            case 9:
            case 10:
            case 11:
                return 119;
            case 12:
            case 13:
            case 14:
                return 110;
            case 15:
                return 120;
            case 16:
            case 17:
            case 18:
                return 111;
            case 19:
                return 121;
            case 20:
            case 21:
            case 22:
                return 113;
            case 23:
            case 24:
                return 123;
            case 25:
                return 114;
            case 26:
            case 27:
            case 28:
                return 116;
            default:
                return 0;
        }
    }
    public static short RgvPosStaTwo(Short posId){
@@ -321,6 +365,9 @@
            case 24:
                return 105;
            case 25:
            case 26:
            case 27:
            case 28:
                return 104;
            default:
                return 0;
src/main/java/com/zy/core/MainProcess.java
@@ -56,6 +56,8 @@
//                    mainService.generateStoreWrkFile0(); // WMS入库
                    // 拣料、并板、盘点再入库
                    mainService.stnToCrnStnPick();
                    // 拣料、并板、盘点再入库拆盘区
                    mainService.stnToCrnStnPick2();
                    // 出库  ===>>  堆垛机出库站到出库站
                    mainService.crnStnToOutStn();
                    // 入出库  ===>>  堆垛机入出库作业下发
@@ -86,9 +88,11 @@
                    //执行小车空板搬运任务
                    mainService.rgvRunWrkMastEmptyStaPut();//放
                    mainService.rgvRunWrkMastEmptyStaTake();//取
                    mainService.rgvRunWrkMastEmptyStaAvoidance();//避让
                    i++;
                    if (i > 3) {
                        mainService.rgvRunWrkMastEmptyStaAvoidance();//避让
                        i = 0;
                    }
                    /////////////////////////////////////RGV调度/////////////////////////////////////
                    // 异常信息记录
@@ -124,8 +128,10 @@
                    mainService.stackingCompletionDriveTray();
                    //拆垛完成继续下一步
                    mainService.stackingCompletionDriveTray2();
                    //拆垛完成托盘继续下一步
                    mainService.stackingCompletionDriveTrayOk2();
                    //贴标完成继续下一步
                    mainService.stackingCompletionDriveTray3();
//                    mainService.stackingCompletionDriveTray3();
                } catch (Exception e) {
src/main/java/com/zy/core/model/DevpSlave.java
@@ -26,6 +26,7 @@
    private List<Sta> outSta = new ArrayList<>();
    private List<Sta> pickSta = new ArrayList<>();
    private List<Sta> pickSta2 = new ArrayList<>();
    private List<Sta> outRgvSta = new ArrayList<>();
src/main/java/com/zy/core/thread/RgvThread.java
@@ -111,7 +111,7 @@
                        commandAvoidanceXY.setAckFinish1((short) 1);  // 任务完成确认位
                        commandAvoidanceXY.setTaskMode1(RgvTaskModeType.X_MOVE); // 任务模式
                        commandAvoidanceXY.setSourceStaNo1((short)0);     // 源站
                        commandAvoidanceXY.setDestinationStaNo1(slave.getId()==1? (short) 101:(short)117);     // 目标站
                        commandAvoidanceXY.setDestinationStaNo1(slave.getId()==1? (short) 101:(short)116);     // 目标站
                        commandAvoidanceXY.setTaskNo2((short) 0); // 工作号
                        commandAvoidanceXY.setAckFinish2((short) 1);  // 任务完成确认位
                        commandAvoidanceXY.setTaskMode2(RgvTaskModeType.X_MOVE); // 任务模式
@@ -328,7 +328,7 @@
            return false;
        }
        siemensNet.Write("DB100.20", command.getCommand());
//        siemensNet.Write("DB100.20", command.getCommand());
        command.setRgvNo(slave.getId());
        short[] array = new short[5];
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -20,6 +20,7 @@
import com.zy.core.model.DevpSlave;
import com.zy.core.model.Task;
import com.zy.core.model.protocol.StaProtocol;
import io.swagger.models.auth.In;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -124,6 +125,10 @@
                    // 写数据 ID+目标站 码垛完成  给输送线写任务完成
                    case 3:
                        write3((StaProtocol)task.getData());
                        break;
                    // 写数据 ID+目标站 码垛完成  给输送线写任务完成复位
                    case 4:
                        write4((StaProtocol)task.getData());
                        break;
                    default:
                        break;
@@ -338,14 +343,36 @@
        if (null == staProtocol) {
            return;
        }
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        Integer siteId = staProtocol.getSiteId();
        Integer index =0;
        switch (siteId){
            case 118:
                index=0;
                break;
            case 119:
                index=1;
                break;
            case 120:
                index=2;
                break;
            case 121:
                index=3;
                break;
            case 131:
                index=4;
                break;
            case 135:
                index=5;
                break;
            default:
                return;
        }
        OperateResult write = null;
        //任务下发次数
        int writeCount = 0;
        do {
            write = siemensS7Net.Write("DB100." + index*6, (short)1);    // 工作号
            write = siemensS7Net.Write("DB100.600." + index, true);    // 任务完成
            if(write.IsSuccess){
                writeCount=6;
            }else {
@@ -363,7 +390,62 @@
            log.error("写入输送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
            log.info("输送线命令下发 [id:{}] >>>>> 命令下发: {}",  slave.getId(), JSON.toJSON(staProtocol));
            log.info("输送线命令下发码垛完成  给输送线写任务完成 [id:{}] >>>>> 命令下发: {}",  slave.getId(), JSON.toJSON(staProtocol));
        }
    }
    private void write4(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {
            return;
        }
        Integer siteId = staProtocol.getSiteId();
        Integer index =0;
        switch (siteId){
            case 118:
                index=0;
                break;
            case 119:
                index=1;
                break;
            case 120:
                index=2;
                break;
            case 121:
                index=3;
                break;
            case 131:
                index=4;
                break;
            case 135:
                index=5;
                break;
            default:
                return;
        }
        OperateResult write = null;
        //任务下发次数
        int writeCount = 0;
        do {
            write = siemensS7Net.Write("DB100.600." + index, false);    // 任务完成复位
            if(write.IsSuccess){
                writeCount=6;
            }else {
                writeCount++;
                log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
            }
        }while (writeCount<5);
        if (!write.IsSuccess) {
            staProtocol = station.get(staProtocol.getSiteId());
            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
                staProtocol.setPakMk(true);
            }
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol)));
            log.error("写入输送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
            log.info("输送线命令下发码垛完成  给输送复位 [id:{}] >>>>> 命令下发: {}",  slave.getId(), JSON.toJSON(staProtocol));
        }
    }
    // 更新入出库模式
src/main/resources/application.yml
@@ -350,8 +350,24 @@
    outSta[0]:
      staNo: 11
    # 拣料入库口1
    pickSta2[0]:
      staNo: 118
      barcode: ${wcs-slave.barcode[0].id}
    # 拣料入库口1
    pickSta2[1]:
      staNo: 119
      barcode: ${wcs-slave.barcode[0].id}
    # 拣料入库口1
    pickSta2[2]:
      staNo: 120
      barcode: ${wcs-slave.barcode[0].id}
    # 拣料入库口1
    pickSta2[3]:
      staNo: 121
      barcode: ${wcs-slave.barcode[0].id}
    # 拣料入库口1
    pickSta[0]:
      staNo: 11
      staNo: 122
      barcode: ${wcs-slave.barcode[0].id}
    # Rgv出库口1
    outRgvSta[0]:
src/main/resources/mapper/WrkMastMapper.xml
@@ -106,6 +106,14 @@
        select top 1 * from dbo.asr_wrk_mast where wrk_no=#{workNo}
    </select>
    <select id="selectPakInStep4" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where sta_no=#{staNo} and wrk_sts = 14 and io_type>100 and sheet_no=#{sheetNo}
    </select>
    <select id="selectPakInStep5" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where sta_no=#{staNo} and wrk_sts = 14 and io_type>100 and sheet_no!=#{sheetNo}
    </select>
    <select id="selectPickStep" resultMap="BaseResultMap">
        select top 1 * from asr_wrk_mast where barcode=#{barcode} and wrk_sts=14 and (io_type=103 or io_type=107 or io_type=104)
    </select>