#
LSH
2023-09-26 50a3a5b853b0a6cd86696902f54ca88b4754537d
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -10,6 +10,7 @@
import com.zy.asrs.entity.*;
import com.zy.asrs.mapper.BasCrnErrorMapper;
import com.zy.asrs.mapper.BasRgvErrMapper;
import com.zy.asrs.mapper.WaitPakinMapper;
import com.zy.asrs.mapper.WrkMastMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
@@ -69,6 +70,8 @@
    private WrkMastMapper wrkMastMapper;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private WaitPakinMapper waitPakinMapper;
    @Autowired
    private LocMastService locMastService;
    @Autowired
@@ -577,35 +580,157 @@
        return null;
    }
//    /**
//     * 绑定小车方法
//     */
//    public synchronized void rgvBindSte() {
//        //获取等待绑定RGV的任务
//        List<WrkMast> wrkMasts = wrkMastMapper.selectWaitBindRGV();
//        for (WrkMast wrkMast : wrkMasts) {
//            //目标站
//            Integer staNo = wrkMast.getStaNo();
//            //源站
//            Integer sourceStaNo = wrkMast.getSourceStaNo();
//            //通过目标站搜索rgv号
//            Integer rgvNo=0;
//            if (wrkMast.getCrnNo()==1){
//                rgvNo=1;
//            }else if (wrkMast.getCrnNo()==6){
//                rgvNo=2;
//            }else {
//                rgvNo = this.searchRgvNo(staNo);
//            }
//            if (rgvNo == null || rgvNo==0) {//未找到可用的rgv
//                continue;
//            }
//
//            wrkMast.setRgvNo(rgvNo);//绑定rgv号
//            wrkMast.setRgvDstaNo(wrkMast.getSourceStaNo());//设置RGV前往工作档源站取货
//            if (wrkMastMapper.updateById(wrkMast)==0){
//                log.error("绑定小车更新工作档失败!!! [工作号:{}]", wrkMast.getWrkNo());
//            }
//        }
//    }
    /**
     * 绑定小车方法
     */
    public synchronized void rgvBindSte() {
        //获取等待绑定RGV的任务
        List<WrkMast> wrkMasts = wrkMastMapper.selectWaitBindRGV();
        for (WrkMast wrkMast : wrkMasts) {
            //目标站
            Integer staNo = wrkMast.getStaNo();
            //源站
            Integer sourceStaNo = wrkMast.getSourceStaNo();
            //通过目标站搜索rgv号
            Integer rgvNo = this.searchRgvNo(staNo);
            if (rgvNo == null) {//未找到可用的rgv
                continue;
        try {
            // 根据输送线plc遍历
            for (DevpSlave devp : slaveProperties.getDevp()) {
                if (devp.getId()==2){
                    continue;
                }
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                //入库绑小车
                for (DevpSlave.Sta Sta : devp.getInRgvSta()) {
                    StaProtocol staProtocol = devpThread.getStation().get(Sta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() != 0 && staProtocol.getWorkNo() < 9990){
                        List<WrkMast> wrkMasts = wrkMastMapper.selectList(new EntityWrapper<WrkMast>().eq("wrk_no", staProtocol.getWorkNo()).eq("wrk_sts", 2L));
                        if (Cools.isEmpty(wrkMasts) || wrkMasts.size()!=1){
                            continue;
                        }
                        WrkMast wrkMast = wrkMasts.get(0);
                                    //目标站
                        Integer staNo = wrkMast.getStaNo();
                        //通过目标站搜索rgv号
                        Integer rgvNo=0;
                        if (wrkMast.getCrnNo()==1){
                            rgvNo=1;
                        }else if (wrkMast.getCrnNo()==6){
                            rgvNo=2;
                        }else {
                            rgvNo = this.searchRgvNo(staNo);
                        }
                        if (rgvNo == null || rgvNo==0) {//未找到可用的rgv
                            continue;
                        }
                        wrkMast.setRgvNo(rgvNo);//绑定rgv号
                        if (wrkMastMapper.updateById(wrkMast)==0){
                            log.error("绑定小车更新工作档失败!!! [工作号:{}]", wrkMast.getWrkNo());
                        }
                    }
                }
                //出库绑小车
                for (DevpSlave.Sta Sta : devp.getOutRgvSta()) {
                    StaProtocol staProtocol = devpThread.getStation().get(Sta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() != 0 && staProtocol.getWorkNo() < 9990){
                        List<WrkMast> wrkMasts = wrkMastMapper.selectList(new EntityWrapper<WrkMast>().eq("wrk_no", staProtocol.getWorkNo()).eq("wrk_sts", 14L));
                        if (Cools.isEmpty(wrkMasts) || wrkMasts.size()!=1){
                            continue;
                        }
                        WrkMast wrkMast = wrkMasts.get(0);
                        //目标站
                        Integer staNo = wrkMast.getStaNo();
                        //通过目标站搜索rgv号
                        Integer rgvNo=0;
                        if (wrkMast.getCrnNo()==1){
                            rgvNo=1;
                        }else if (wrkMast.getCrnNo()==6){
                            rgvNo=2;
                        }else {
                            rgvNo = this.searchRgvNo(staNo);
                        }
                        if (rgvNo == null || rgvNo==0) {//未找到可用的rgv
                            continue;
                        }
                        wrkMast.setRgvNo(rgvNo);//绑定rgv号
                        if (wrkMastMapper.updateById(wrkMast)==0){
                            log.error("绑定小车更新工作档失败!!! [工作号:{}]", wrkMast.getWrkNo());
                        }
                    }
                }
            }
        }catch (Exception e){
            log.error("绑定小车异常:{}", e.getMessage());
        }
    }
            wrkMast.setRgvNo(rgvNo);//绑定rgv号
            wrkMast.setRgvDstaNo(wrkMast.getSourceStaNo());//设置RGV前往工作档源站取货
            if (wrkMastMapper.updateById(wrkMast)==0){
                log.error("绑定小车更新工作档失败!!! [工作号:{}]", wrkMast.getWrkNo());
    /**
     * 绑定小车方法
     */
    public synchronized void rgvBindSte2() {
        try{
            for (RgvSlave rgv : slaveProperties.getRgv()) {
                List<WrkMast> wrkMasts = wrkMastMapper.selectWaitBindRGVRgvNo(rgv.getId());
                if (!Cools.isEmpty(wrkMasts) && wrkMasts.size()!=0){
                    continue;
                }
                List<WrkMast> wrkMasts2 = wrkMastMapper.selectWaitBindRgvNo2(rgv.getId());
                for (WrkMast wrkMast : wrkMasts2) {
                    if (wrkMastMapper.selectWaitBindRgvNoOneWrkNo(wrkMast.getWrkNo())!=null){
                        continue;
                    }
                    //目标站
                    BasDevp basDevp = basDevpService.selectById(wrkMast.getRgvDstaNo());
                    if (Cools.isEmpty(basDevp) || !basDevp.getAutoing().equals("Y") || !basDevp.getLoading().equals("N") || basDevp.getWrkNo()!=0){
                        continue;
                    }
                    wrkMastMapper.insertRgvMast(wrkMast.getWrkNo());
                    wrkMastMapper.updateRgvMast(wrkMast.getWrkNo());
                    break;
                }
            }
        }catch (Exception e){
            log.error("小车搬运任务异常:{}", e.getMessage());
        }
    }
    /**
     * 入出库  ===>>  RGV入出库作业下发
     */
    public synchronized void rgvIoExecute() {
    public synchronized void rgvIoExecuteOld() {
        for (RgvSlave rgv : slaveProperties.getRgv()) {
            // 获取RGV信息
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
@@ -624,12 +749,102 @@
                    && rgvProtocol.getModeType() == RgvModeType.AUTO
//                    && rgvProtocol.getTaskNo1() == 0 && rgvProtocol.getTaskNo2() == 0
//                    && rgvProtocol.getLoaded1() == 0 && rgvProtocol.getLoaded2() == 0
                    ) {
            ) {
                //查找是否存在入出库工作中等待RGV搬运的任务
                List<WrkMast> wrkMasts = wrkMastMapper.selectIoRgvNo(rgv.getId());
                for (WrkMast wrkMast : wrkMasts) {
                    if (wrkMast.getWrkSts() == 2) {//2.设备上走1 => 3.RGV取货中
                        if (rgvProtocol.getTaskNo1() != 0 || rgvProtocol.getLoaded1() != 0) {//RGV是否无任务、RGV是否无货
                            continue;
                        }
                        //判断行走路径是否被占用
                        Integer staNo = wrkMast.getSourceStaNo();
                        BasDevp basDevp = basDevpService.selectById(staNo);
                        if (basDevp == null) {
                            continue;//目标站不存在
                        }
                        //起始路径
                        int startPath = rgvProtocol.getRgvPos().intValue();
                        //目标路径值
                        int endPath = basDevp.getLocType3().intValue();
//                        boolean pathUsed = RgvUtils.isPathUsed(startPath, endPath);//判断行走路径是否被占用
                        boolean pathUsed = RgvUtils.isPathUsed(startPath, endPath);//判断行走路径是否被占用
                        if (pathUsed) {
                            //行走路径被占用,禁止下发命令
                            continue;
                        }
                        //行走路径空闲,锁定路径
                        RgvUtils.lockPath(startPath, endPath, rgvProtocol.getRgvNo(), wrkMast.getWrkNo(), true);
                        //  命令下发区 --------------------------------------------------------------------------
                        RgvCommand rgvCommand = new RgvCommand();
                        rgvCommand.setRgvNo(wrkMast.getRgvNo()); // RGV编号
                        rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
                        rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue()); // 工位1工作号
                        rgvCommand.setTaskMode1(RgvTaskModeType.FETCH); // 工位1任务模式:  取货
                        rgvCommand.setDestinationStaNo1(wrkMast.getRgvDstaNo().shortValue());   //工位1目标站点
                        rgvCommand.setCommand((short) 1);   //工位1任务确认
                        if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getRgvNo(), new Task(4, rgvCommand))) {
                            //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                            log.error("RGV命令下发失败,RGV号={},任务数据={}", wrkMast.getRgvNo(), JSON.toJSON(rgvCommand));
                        } else {
                            // 修改工作档状态 2.设备上走1 => 3.RGV取货中
                            Date now = new Date();
                            wrkMast.setWrkSts(3L);
                            wrkMast.setModiTime(now);
                            if (wrkMastMapper.updateById(wrkMast) == 0) {
                                log.error("修改工作档状态 2.设备上走1 => 3.RGV取货中 失败!!,工作号={}", wrkMast.getWrkNo());
                            }
                        }
                    } else if (wrkMast.getWrkSts() == 14) {//4.RGV取货完成 => 5.RGV放货中   14出库完成
                        if (rgvProtocol.getTaskNo1() == 0 || !rgvProtocol.getTaskNo1().equals(wrkMast.getWrkNo().shortValue())) {//RGV必须有任务且任务和当前工作档一致
                            continue;
                        }
                        if (rgvProtocol.getLoaded1() == 0) {//RGV必须有物
                            continue;
                        }
                        //判断行走路径是否被占用
                        Integer staNo = wrkMast.getStaNo();
                        BasDevp basDevp = basDevpService.selectById(staNo);
                        if (basDevp == null) {
                            continue;//目标站不存在
                        }
                        //起始路径
                        int startPath = rgvProtocol.getRgvPos().intValue();
                        //目标路径值
                        int endPath = basDevp.getLocType3().intValue();
                        boolean pathUsed = RgvUtils.isPathUsed(startPath, endPath);//判断行走路径是否被占用
                        if (pathUsed) {
                            //行走路径被占用,禁止下发命令
                            continue;
                        }
                        //行走路径空闲,锁定路径
                        RgvUtils.lockPath(startPath, endPath, rgvProtocol.getRgvNo(), wrkMast.getWrkNo(), true);
                        //  命令下发区 --------------------------------------------------------------------------
                        RgvCommand rgvCommand = new RgvCommand();
                        rgvCommand.setRgvNo(wrkMast.getRgvNo()); // RGV编号
                        rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
                        rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue()); // 工位1工作号
                        rgvCommand.setTaskMode1(RgvTaskModeType.PUT); // 工位1任务模式:  放货
                        rgvCommand.setDestinationStaNo1(wrkMast.getRgvDstaNo().shortValue());   //工位1目标站点
                        rgvCommand.setCommand((short) 1);   //工位1任务确认
                        if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getRgvNo(), new Task(4, rgvCommand))) {
                            //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                            log.error("RGV命令下发失败,RGV号={},任务数据={}", wrkMast.getRgvNo(), JSON.toJSON(rgvCommand));
                        } else {
                            // 修改工作档状态 4.RGV取货完成 => 5.RGV放货中
                            Date now = new Date();
                            wrkMast.setWrkSts(5L);
                            wrkMast.setModiTime(now);
                            if (wrkMastMapper.updateById(wrkMast) == 0) {
                                log.error("修改工作档状态 4.RGV取货完成 => 5.RGV放货中 失败!!,工作号={}", wrkMast.getWrkNo());
                            }
                        }
                    } else if (wrkMast.getWrkSts() == 23) {//23.设备上走1 => 24.RGV取货中
                        if (rgvProtocol.getTaskNo1() != 0 || rgvProtocol.getLoaded1() != 0) {//RGV是否无任务、RGV是否无货
                            continue;
                        }
@@ -664,6 +879,154 @@
                            //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                            log.error("RGV命令下发失败,RGV号={},任务数据={}", wrkMast.getRgvNo(), JSON.toJSON(rgvCommand));
                        } else {
                            // 修改工作档状态 23.设备上走1 => 24.RGV取货中
                            Date now = new Date();
                            wrkMast.setWrkSts(24L);
                            wrkMast.setModiTime(now);
                            if (wrkMastMapper.updateById(wrkMast) == 0) {
                                log.error("修改工作档状态 23.设备上走1 => 24.RGV取货中 失败!!,工作号={}", wrkMast.getWrkNo());
                            }
                        }
                    } else if (wrkMast.getWrkSts() == 25) {//25.RGV取货完成 => 26.RGV放货中
                        if (rgvProtocol.getTaskNo1() == 0 || !rgvProtocol.getTaskNo1().equals(wrkMast.getWrkNo().shortValue())) {//RGV必须有任务且任务和当前工作档一致
                            continue;
                        }
                        if (rgvProtocol.getLoaded1() == 0) {//RGV必须有物
                            continue;
                        }
                        //判断行走路径是否被占用
                        Integer staNo = wrkMast.getStaNo();
                        BasDevp basDevp = basDevpService.selectById(staNo);
                        if (basDevp == null) {
                            continue;//目标站不存在
                        }
                        //起始路径
                        int startPath = rgvProtocol.getRgvPos().intValue();
                        //目标路径值
                        int endPath = basDevp.getLocType3().intValue();
                        boolean pathUsed = RgvUtils.isPathUsed(startPath, endPath);//判断行走路径是否被占用
                        if (pathUsed) {
                            //行走路径被占用,禁止下发命令
                            continue;
                        }
                        //行走路径空闲,锁定路径
                        RgvUtils.lockPath(startPath, endPath, rgvProtocol.getRgvNo(), wrkMast.getWrkNo(), true);
                        //  命令下发区 --------------------------------------------------------------------------
                        RgvCommand rgvCommand = new RgvCommand();
                        rgvCommand.setRgvNo(wrkMast.getRgvNo()); // RGV编号
                        rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
                        rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue()); // 工位1工作号
                        rgvCommand.setTaskMode1(RgvTaskModeType.PUT); // 工位1任务模式:  放货
                        rgvCommand.setDestinationStaNo1(wrkMast.getRgvDstaNo().shortValue());   //工位1目标站点
                        rgvCommand.setCommand((short) 1);   //工位1任务确认
                        if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getRgvNo(), new Task(4, rgvCommand))) {
                            //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                            log.error("RGV命令下发失败,RGV号={},任务数据={}", wrkMast.getRgvNo(), JSON.toJSON(rgvCommand));
                        } else {
                            // 修改工作档状态 25.RGV取货完成 => 26.RGV放货中
                            Date now = new Date();
                            wrkMast.setWrkSts(26L);
                            wrkMast.setModiTime(now);
                            if (wrkMastMapper.updateById(wrkMast) == 0) {
                                log.error("修改工作档状态 25.RGV取货完成 => 26.RGV放货中 失败!!,工作号={}", wrkMast.getWrkNo());
                            }
                        }
                    }
                }
            }
        }
    }
    /**
     * 入出库  ===>>  RGV入出库作业下发
     */
    public synchronized void rgvIoExecute() {
        for (RgvSlave rgv : slaveProperties.getRgv()) {
            RgvSlave rgvSlave=null;
            if (rgv.getId()==1){
                rgvSlave = slaveProperties.getRgv().get(1);
            }else {
                rgvSlave = slaveProperties.getRgv().get(0);
            }
            // 获取RGV信息
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) {
                continue;
            }
            RgvThread rgvThreadSlave = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
            RgvProtocol rgvProtocolSlave = rgvThreadSlave.getRgvProtocol();
            BasRgv basRgvSlave = null;
            if (rgvProtocolSlave == null) {
                rgvSlave=null;
            }else {
                basRgvSlave = basRgvService.selectById(rgv.getId());
                if (basRgvSlave == null) {
                    rgvSlave=null;
                }
            }
            BasRgv basRgv = basRgvService.selectById(rgv.getId());
            if (basRgv == null) {
                log.error("{}号RGV尚未在数据库进行维护!", rgv.getId());
                continue;
            }
            boolean signSlave=false;//此处判断RgvSlave是否已经规避
            boolean signSlaveState=false;//此处判断RgvSlave是否空闲
            Integer staSlave = 0;//此处记录RgvSlave当前位置
            // 只有当RGV空闲、自动,
            if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                    && rgvProtocol.getModeType() == RgvModeType.AUTO
//                    && rgvProtocol.getTaskNo1() == 0 && rgvProtocol.getTaskNo2() == 0
//                    && rgvProtocol.getLoaded1() == 0 && rgvProtocol.getLoaded2() == 0
                    ) {
                //查找是否存在入出库工作中等待RGV搬运的任务
                List<WrkMast> wrkMasts = wrkMastMapper.selectIoRgvNo(rgv.getId());
                for (WrkMast wrkMast : wrkMasts) {
                    if (wrkMast.getWrkSts() == 2) {//2.设备上走1 => 3.RGV取货中
                        if (rgvProtocol.getTaskNo1() != 0 || rgvProtocol.getLoaded1() != 0) {//RGV是否无任务、RGV是否无货
                            continue;
                        }
                        //判断行走路径是否被占用
                        Integer staNo = wrkMast.getSourceStaNo();
                        BasDevp basDevp = basDevpService.selectById(staNo);
                        if (basDevp == null) {
                            continue;//目标站不存在
                        }
                        //起始路径
                        int startPath = rgvProtocol.getRgvPos().intValue();
                        //目标路径值
                        int endPath = basDevp.getLocType3().intValue();
//                        boolean pathUsed = RgvUtils.isPathUsed(startPath, endPath);//判断行走路径是否被占用
                        boolean pathUsed = RgvUtils.isPathUsed(startPath, endPath);//判断行走路径是否被占用
                        if (pathUsed) {
                            //行走路径被占用,禁止下发命令
                            continue;
                        }
                        //行走路径空闲,锁定路径
                        RgvUtils.lockPath(startPath, endPath, rgvProtocol.getRgvNo(), wrkMast.getWrkNo(), true);
                        //  命令下发区 --------------------------------------------------------------------------
                        RgvCommand rgvCommand = new RgvCommand();
                        rgvCommand.setRgvNo(wrkMast.getRgvNo()); // RGV编号
                        rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
                        rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue()); // 工位1工作号
                        rgvCommand.setTaskMode1(RgvTaskModeType.FETCH); // 工位1任务模式:  取货
                        rgvCommand.setDestinationStaNo1(wrkMast.getRgvDstaNo().shortValue());   //工位1目标站点
                        rgvCommand.setCommand((short) 1);   //工位1任务确认
                        if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getRgvNo(), new Task(4, rgvCommand))) {
                            //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                            log.error("RGV命令下发失败,RGV号={},任务数据={}", wrkMast.getRgvNo(), JSON.toJSON(rgvCommand));
                        } else {
                            // 修改工作档状态 2.设备上走1 => 3.RGV取货中
                            Date now = new Date();
                            wrkMast.setWrkSts(3L);
@@ -672,7 +1035,7 @@
                                log.error("修改工作档状态 2.设备上走1 => 3.RGV取货中 失败!!,工作号={}", wrkMast.getWrkNo());
                            }
                        }
                    } else if (wrkMast.getWrkSts() == 4) {//4.RGV取货完成 => 5.RGV放货中
                    } else if (wrkMast.getWrkSts() == 14) {//4.RGV取货完成 => 5.RGV放货中   14出库完成
                        if (rgvProtocol.getTaskNo1() == 0 || !rgvProtocol.getTaskNo1().equals(wrkMast.getWrkNo().shortValue())) {//RGV必须有任务且任务和当前工作档一致
                            continue;
                        }
@@ -2492,12 +2855,7 @@
                        LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
                        SearchLocParam param = new SearchLocParam();
                        if (emptyInSta.getStaNo().equals(214)){
                            //拆盘机处空板扫码,驱动托盘向码垛位,不入库
                            param.setIoType(201);
                        }else {
                            param.setIoType(10);
                        }
                        param.setIoType(10);
                        param.setSourceStaNo(emptyInSta.getStaNo());
                        param.setLocType1(locTypeDto.getLocType1());
                        String response = new HttpHandler.Builder()
@@ -3209,77 +3567,240 @@
        }
    }
    /**
     * 其他  ===>> 码垛位自动补充空板:驱动拆盘机输出托盘
     */
    public synchronized void dischargingMachineOutputTray() {
        try {
            List<WrkMast> wrkMasts = wrkMastMapper.selectDischargingMachineOutputTray();
            if (Cools.isEmpty(wrkMasts) || wrkMasts.size()>3){
                return;
            }
//    /**
//     * 其他  ===>> 码垛位自动补充空板:驱动拆盘机输出托盘
//     */
//    public synchronized void dischargingMachineOutputTray() {
//        try {
//            List<WrkMast> wrkMasts = wrkMastMapper.selectDischargingMachineOutputTray();
//            if (Cools.isEmpty(wrkMasts) || wrkMasts.size()>3){
//                return;
//            }
//
//            // 获取入库站信息
//            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
//            StaProtocol staProtocol = devpThread.getStation().get(213);
//            if (staProtocol == null) {
//                log.error("码垛位自动补充空板:驱动拆盘机输出托盘,任务下发失败,站点查询失败");
//                return;
//            } else {
//                staProtocol = staProtocol.clone();
//            }
//
//            if (!staProtocol.isLoading()){
//                log.info("码垛位自动补充空板:驱动拆盘机输出托盘,任务下发失败,站点无物,正在自动调出空板!");
//                int i = wrkMastMapper.selectConfigCount10468N();
//                if (i==1){
//                    wrkMastMapper.updateConfig10468Y();
//                }
//                return;
//            }else {
//                int i = wrkMastMapper.selectConfigCount10468N();
//                if (i==0){
//                    return;
//                }
//            }
//            StaProtocol staProtocol214 = devpThread.getStation().get(214);
//            // 判断是否满足入库条件
//            if (staProtocol.isAutoing() && staProtocol.getWorkNo() == 0 && staProtocol.isPakMk() && staProtocol214.getWorkNo()==0) {
//                staProtocol.setWorkNo((short)9999);
//                staProtocol.setStaNo((short)214);
//                devpThread.setPakMk(staProtocol.getSiteId(), false);
//                boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol));
//                if (!result) {
//                    throw new CoolException("更新plc站点信息失败==>码垛位自动补充空板:驱动拆盘机输出托盘!");
//                }
//                log.info("码垛位自动补充空板:驱动拆盘机输出托盘,任务下发成功:工作号9999、目标站214!");
//            }else {
//                log.error("码垛位自动补充空板:驱动拆盘机输出托盘,任务下发失败,站点状态不符合!");
//            }
//        }catch (Exception e){
//            e.printStackTrace();
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//        }
//    }
            // 获取入库站信息
            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
            StaProtocol staProtocol = devpThread.getStation().get(213);
            if (staProtocol == null) {
                log.error("码垛位自动补充空板:驱动拆盘机输出托盘,任务下发失败,站点查询失败");
                return;
            } else {
                staProtocol = staProtocol.clone();
            }
            if (!staProtocol.isLoading()){
                log.info("码垛位自动补充空板:驱动拆盘机输出托盘,任务下发失败,站点无物,正在自动调出空板!");
                int i = wrkMastMapper.selectConfigCount10468N();
                if (i==1){
                    wrkMastMapper.updateConfig10468Y();
                }
                return;
            }else {
                int i = wrkMastMapper.selectConfigCount10468N();
                if (i==0){
                    return;
                }
            }
            StaProtocol staProtocol214 = devpThread.getStation().get(214);
            // 判断是否满足入库条件
            if (staProtocol.isAutoing() && staProtocol.getWorkNo() == 0 && staProtocol.isPakMk() && staProtocol214.getWorkNo()==0) {
                staProtocol.setWorkNo((short)9999);
                staProtocol.setStaNo((short)214);
                devpThread.setPakMk(staProtocol.getSiteId(), false);
                boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol));
                if (!result) {
                    throw new CoolException("更新plc站点信息失败==>码垛位自动补充空板:驱动拆盘机输出托盘!");
                }
                log.info("码垛位自动补充空板:驱动拆盘机输出托盘,任务下发成功:工作号9999、目标站214!");
            }else {
                log.error("码垛位自动补充空板:驱动拆盘机输出托盘,任务下发失败,站点状态不符合!");
            }
        }catch (Exception e){
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
//    /**
//     * 其他  ===>> 拆盘机处空板扫码,驱动托盘向码垛位,不入库
//     */
//    public synchronized void scanBarcodeEmptyBoard() {
//        try {
//
//        }catch (Exception e){
//            e.printStackTrace();
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//        }
//    }
    /**
     * 其他  ===>> 拆盘机处空板扫码,驱动托盘向码垛位,不入库
     */
    public synchronized void scanBarcodeEmptyBoard() {
        try {
        }catch (Exception e){
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    /**
     * 其他  ===>> 码垛完成驱动托盘下一步扫码入库
     * 其他  ===>> 码垛完成驱动托盘进入下一步(入库前扫码)
     */
    public synchronized void stackingCompletionDriveTray() {
        try {
            int[] staNos=new int[]{216,220,123};//(3个入库站点,1楼1个退货码垛站,2楼两个入库码垛站)
            for (int staNo : staNos){
                BasDevp basDevp = basDevpService.selectById(staNo);
                if (basDevp.getWrkNo()!=9992 || Cools.isEmpty(basDevp.getBarcode())){
                    continue;
                }
                Integer zpallet = waitPakinMapper.selectCount(new EntityWrapper<WaitPakin>().eq("zpallet", basDevp.getBarcode()).eq("status","N"));
                if (zpallet<=0){
                    continue;
                }
                // 获取入库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 入出库模式判断
//                if ( inSta.getStaNo()==203 && devpThread.ioModeOf2F != IoModeType.PAKIN_MODE) { continue; }
//                if (inSta.getStaNo() == 203 && devpThread.ioModeOf2F == IoModeType.PAKOUT_MODE) {
//                    continue;
//                }
                if (!staProtocol.isLoading()){
                    log.info("{}站点无物,正在自动调出空板!",staNo);
                    continue;
                }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                        && staProtocol.isInEnable()
                        && !staProtocol.isEmptyMk()
                        && staProtocol.getWorkNo() == 9992
                ) {//&& staProtocol.isPakMk() && !Cools.isEmpty(barcode)) {
                    staProtocol.setWorkNo((short)9999);
                    staNo = staNo + 1;
                    staProtocol.setStaNo((short)staNo);
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol));
                    if (!result) {
                        throw new CoolException("更新plc站点信息失败==>驱动码垛位托盘前进失败!");
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    /**
     * 其他  ===>> 码垛完成驱动托盘进入下一步
     */
    public synchronized void stackingCompletionDriveTray2() {
        try {
            int[] staNos=new int[]{133,135};//(2个入库站点,1楼2个出库码垛站,根据现场修改)
            for (int staNo : staNos){
                BasDevp basDevp = basDevpService.selectById(staNo);
                if (basDevp.getWrkNo()<9990){
                    continue;
                }
                WrkMast wrkMast = wrkMastMapper.selectWrkMastUnstackingOne202(staNo);
                if (Cools.isEmpty(wrkMast)){
                    continue;
                }
                // 获取站点信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 入出库模式判断
//                if ( inSta.getStaNo()==203 && devpThread.ioModeOf2F != IoModeType.PAKIN_MODE) { continue; }
//                if (inSta.getStaNo() == 203 && devpThread.ioModeOf2F == IoModeType.PAKOUT_MODE) {
//                    continue;
//                }
                if (!staProtocol.isLoading()){
                    log.info("{}站点无物,异常!",staNo);
                    continue;
                }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                        && staProtocol.getWorkNo() >= 9990
                ) {//&& staProtocol.isPakMk() && !Cools.isEmpty(barcode)) {
                    staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());
                    staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol));
                    if (!result) {
                        throw new CoolException("更新plc站点信息失败==>驱动码垛位托盘前进失败!");
                    }
                    wrkMast.setWrkSts(52L);
                    wrkMastMapper.updateById(wrkMast);
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    /**
     * 其他  ===>> 贴标完成驱动托盘进入下一步
     */
    public synchronized void stackingCompletionDriveTray3() {
        try {
            int[] staNos=new int[]{144};//(1楼1个贴标位,根据现场修改)
            for (int staNo : staNos){
                BasDevp basDevp = basDevpService.selectById(staNo);
                if (basDevp.getWrkNo()<9990){
                    continue;
                }
                WrkMast wrkMast = wrkMastMapper.selectWrkMastUnstackingOne202(staNo);
                if (Cools.isEmpty(wrkMast)){
                    continue;
                }
                // 获取站点信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 入出库模式判断
//                if ( inSta.getStaNo()==203 && devpThread.ioModeOf2F != IoModeType.PAKIN_MODE) { continue; }
//                if (inSta.getStaNo() == 203 && devpThread.ioModeOf2F == IoModeType.PAKOUT_MODE) {
//                    continue;
//                }
                if (!staProtocol.isLoading()){
                    log.info("{}站点无物,异常!",staNo);
                    continue;
                }
                if (!staProtocol.getWorkNo().equals(wrkMast.getWrkNo().shortValue())){
                    log.info("站点工作号={} 与贴标工作号={} 不一致,异常!",staProtocol.getWorkNo(),wrkMast.getWrkNo().shortValue());
                }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                ) {//&& staProtocol.isPakMk() && !Cools.isEmpty(barcode)) {
                    staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());
                    staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol));
                    if (!result) {
                        throw new CoolException("更新plc站点信息失败==>驱动码垛位托盘前进失败!");
                    }
                    wrkMast.setWrkSts(55L);
                    wrkMastMapper.updateById(wrkMast);
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();