lty
4 天以前 2d56913050a638662390da14ea65a56badf1b392
#优化
4个文件已修改
439 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 389 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -20,6 +20,8 @@
    List<WrkMast> selectToBeHistoryData();
    WrkMast selectPakInOne(@Param("crnNo")Integer crnNo);
    // wcs ---------------------------------------------
    // 入库第一步,扫码仪获取条码信息时查询
//    @Select("select top 1 * from asr_wrk_mast where source_sta_no=#{sourceStaNo} and wrk_sts=2 and barcode=#{barcode} and (io_type=1 or io_type=10) order by io_pri desc,io_time,wrk_no ASC")
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -50,7 +50,9 @@
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -554,168 +556,203 @@
//
//    }
    // 静态线程安全Set,用于存储正在调用接口的工位号
    private static final Set<Integer> callingStations = ConcurrentHashMap.newKeySet();
    public synchronized void generateStoreWrkFile(Integer mark) {
        String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
        final Set<String> INVALID_BARCODES = new HashSet<>(Arrays.asList("NG", "NoRead", "00000000"));
        for (DevpSlave devp : slaveProperties.getDevp()) {
            for (DevpSlave.Sta inSta : devp.getInSta()) {
                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                StaProtocol staProtocolIn = devpThread.getStation().get(inSta.getStaNo() - 1);
                // 【判断工位是否正在调用接口,跳过正在调用的】
                int staNo = inSta.getStaNo();
                if (!callingStations.add(staNo)) {
                    // 如果已存在调用中,跳过
                    log.info("工位{}接口调用中,跳过本次", staNo);
                    continue;
                }
                if (staProtocolIn == null || barcodeThread == null) continue;
                staProtocolIn = staProtocolIn.clone();
                String barcode = barcodeThread.getBarcode();
                try {
                    BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
                    LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                // 如果前工位有货 + 扫码器有条码
                if (staProtocolIn.getStamp() == 1 && barcode != null && !barcode.isEmpty()) {
                    if (wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                            .eq("barcode", barcode)
                            .in("io_type", 107, 103, 57)) != null) {
                        continue;
                    }
                    StaProtocol staProtocol = devpThread.getStation().get(staNo);
                    StaProtocol staProtocolIn = devpThread.getStation().get(staNo - 1);
                    try {
                        SearchLocParam param = new SearchLocParam();
                        param.setBarcode(barcode);
                        param.setIoType(1);
                        param.setSourceStaNo(inSta.getStaNo());
                        param.setLocType1((short) 1);
                        param.setWeight(staProtocolIn.getWeight());
                    if (staProtocolIn == null || barcodeThread == null) continue;
                    staProtocolIn = staProtocolIn.clone();
                    String barcode = barcodeThread.getBarcode();
                        String response = new HttpHandler.Builder()
                                .setTimeout(30, TimeUnit.SECONDS)
                                .setUri(wmsUrl)
                                .setPath("/rpc/pakin/loc/v1")
                                .setJson(JSON.toJSONString(param))
                                .build()
                                .doPost();
                        JSONObject json = JSON.parseObject(response);
                        if (json.getInteger("code").equals(200)) {
                            StartupDto dto = json.getObject("data", StartupDto.class);
                            barcodeThread.setBarcode("");
                            staProtocolIn.setWorkNo(dto.getWorkNo());
                            devpThread.setPakMk(staProtocolIn.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocolIn));
                            ledThread.errorReset();
                            log.error("工作号下发2:" + dto.getWorkNo() + "," + dto.getStaNo());
                            if (!result) {
                                News.error(methodName + ":更新plc站点信息失败");
                                throw new CoolException("更新plc站点信息失败");
                            }
                    // 如果前工位有货 + 扫码器有条码
                    if (staProtocolIn.getStamp() == 1 && barcode != null && !barcode.isEmpty()) {
                        log.info("生成信号时间: {}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
                        if (wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                                .eq("barcode", barcode)
                                .in("io_type", 107, 103, 57)) != null) {
                            continue;
                        }
                    } catch (Exception e) {
                        log.error("组托任务异常:", e);
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
                    continue;
                }
                        try {
                // 尺寸/重量/扫码异常检测
                if (staProtocol == null) continue;
                staProtocol = staProtocol.clone();
                boolean back = false;
                String errMsg = "";
                if (staProtocol.isFrontErr()) { errMsg = "前超限"; back = true; }
                else if (staProtocol.isBackErr()) { errMsg = "后超限"; back = true; }
                else if (staProtocol.isHighErr()) { errMsg = "高超限"; back = true; }
                else if (staProtocol.isLeftErr()) { errMsg = "左超限"; back = true; }
                else if (staProtocol.isRightErr()) { errMsg = "右超限"; back = true; }
                else if (staProtocol.getWeight() > 1000) { errMsg = "超重或未读取"; back = true; }
                else if (staProtocol.isBarcodeErr()) { errMsg = "扫码失败"; back = true; }
                            SearchLocParam param = new SearchLocParam();
                            param.setBarcode(barcode);
                            param.setIoType(1);
                            param.setSourceStaNo(staNo);
                            param.setLocType1((short) 1);
                            param.setWeight(staProtocol.getWeight());
                // 尺寸异常回退
                if (back) {
                    log.info("errmsg: " + errMsg);
                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg));
                            String response = new HttpHandler.Builder()
                                    .setTimeout(30, TimeUnit.SECONDS)
                                    .setUri(wmsUrl)
                                    .setPath("/rpc/pakin/loc/v1")
                                    .setJson(JSON.toJSONString(param))
                                    .build()
                                    .doPost();
                    if (!staProtocol.isLoading() || !staProtocol.isPakMk()) continue;
                    staProtocol.setWorkNo(wrkNo++);
                    staProtocol.setStaNo(inSta.getBackSta().shortValue());
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                    log.error("输送线下发1:" + wrkNo + "," + inSta.getBackSta());
                    continue;
                }
                            JSONObject json = JSON.parseObject(response);
                            if (json.getInteger("code").equals(200)) {
                                StartupDto dto = json.getObject("data", StartupDto.class);
                                barcodeThread.setBarcode("");
                                staProtocolIn.setWorkNo(dto.getWorkNo());
                                devpThread.setPakMk(staProtocolIn.getSiteId(), false);
                                boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocolIn));
                                log.info("生成任务时间: {}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
                // 入库条件满足,开始请求入库地址
                if (staProtocol.isAutoing() && staProtocol.isLoading()
                        && staProtocol.isInEnable() && !staProtocol.isEmptyMk() && staProtocol.isPakMk()) {
                                ledThread.errorReset();
                                log.error("工作号下发2:" + dto.getWorkNo() + "," + dto.getStaNo());
                    if (Cools.isEmpty(barcode) || INVALID_BARCODES.contains(barcode)) {
                        News.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
                        staProtocol.setWorkNo(wrkNo++);
                        staProtocol.setStaNo(inSta.getBackSta().shortValue());
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        log.error("输送线下发1:{} , {}", wrkNo, inSta.getBackSta());
                        continue;
                    }
                    if (wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode) != null ||
                            wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                                    .eq("barcode", barcode)
                                    .in("io_type", 107, 103, 57)) != null) {
                        News.error(barcode + "条码已存在状态为(2.设备上走)的数据,请查看WCS输送线界面");
                        continue;
                    }
                    try {
                        SearchLocParam param = new SearchLocParam();
                        param.setBarcode(barcode);
                        param.setIoType(1);
                        param.setSourceStaNo(inSta.getStaNo());
                        param.setLocType1((short) 1);
                        param.setWeight(staProtocol.getWeight());
                        String response = new HttpHandler.Builder()
                                .setTimeout(30, TimeUnit.SECONDS)
                                .setUri(wmsUrl)
                                .setPath("/rpc/pakin/loc/v1")
                                .setJson(JSON.toJSONString(param))
                                .build()
                                .doPost();
                        JSONObject json = JSON.parseObject(response);
                        if (json.getInteger("code").equals(200)) {
                            StartupDto dto = json.getObject("data", StartupDto.class);
                            barcodeThread.setBarcode("");
                            staProtocol.setWorkNo(dto.getWorkNo());
                            staProtocol.setStaNo(dto.getStaNo().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            ledThread.errorReset();
                            log.error("输送线下发2:" + dto.getWorkNo() + "," + dto.getStaNo());
                            if (!result) {
                                News.error(methodName + ":更新plc站点信息失败");
                                throw new CoolException("更新plc站点信息失败");
                            }
                        } else {
                            String msg = json.getString("msg");
                            if (!"工作档已存在".equals(msg)) {
                                staProtocol.setWorkNo(wrkNo++);
                                staProtocol.setStaNo(inSta.getBackSta().shortValue());
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                log.error("输送线下发2:" + staProtocol.getWorkNo() + "," + staProtocol.getStaNo());
                                if (!Cools.isEmpty(msg)) {
                                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, msg));
                                if (!result) {
                                    News.error(methodName + ":更新plc站点信息失败");
                                    throw new CoolException("更新plc站点信息失败");
                                }
                            } else {
                                String msg = json.getString("msg");
                                if (!"工作档已存在".equals(msg)) {
                                    staProtocol.setWorkNo(wrkNo++);
                                    staProtocol.setStaNo(inSta.getBackSta().shortValue());
                                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                    log.error("输送线下发2:" + staProtocol.getWorkNo() + "," + staProtocol.getStaNo());
                                    if (!Cools.isEmpty(msg)) {
                                        MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, msg));
                                    }
                                }
                            }
                        } catch (Exception e) {
                            log.error("组托任务异常:", e);
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        }
                    } catch (Exception e) {
                        log.error("组托任务异常:", e);
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        continue;
                    } else {
                        // 尺寸/重量/扫码异常检测
                        if (staProtocol == null) continue;
                        staProtocol = staProtocol.clone();
                        boolean back = false;
                        String errMsg = "";
                        if (staProtocol.isFrontErr()) { errMsg = "前超限"; back = true; }
                        else if (staProtocol.isBackErr()) { errMsg = "后超限"; back = true; }
                        else if (staProtocol.isHighErr()) { errMsg = "高超限"; back = true; }
                        else if (staProtocol.isLeftErr()) { errMsg = "左超限"; back = true; }
                        else if (staProtocol.isRightErr()) { errMsg = "右超限"; back = true; }
                        else if (staProtocol.getWeight() > 1000) { errMsg = "超重或未读取"; back = true; }
                        else if (staProtocol.isBarcodeErr()) { errMsg = "扫码失败"; back = true; }
                        // 尺寸异常回退
                        if (back && staProtocol.getWorkNo() <9999) {
//                            log.info("errmsg: " + errMsg);
                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg));
                            if (!staProtocol.isLoading() || !staProtocol.isPakMk()) continue;
                            staProtocol.setWorkNo(wrkNo++);
                            staProtocol.setStaNo(inSta.getBackSta().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            log.error("输送线下发1:" + wrkNo + "," + inSta.getBackSta());
                            continue;
                        }
//                        // 入库条件满足,开始请求入库地址
//                        if (staProtocol.isAutoing() && staProtocol.isLoading()
//                                && staProtocol.isInEnable() && !staProtocol.isEmptyMk() && staProtocol.isPakMk()) {
//
//                            if (Cools.isEmpty(barcode) || INVALID_BARCODES.contains(barcode)) {
//                                News.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
//                                staProtocol.setWorkNo(wrkNo++);
//                                staProtocol.setStaNo(inSta.getBackSta().shortValue());
//                                devpThread.setPakMk(staProtocol.getSiteId(), false);
//                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                                log.error("输送线下发1:{} , {}", wrkNo, inSta.getBackSta());
//                                continue;
//                            }
//
//                            if (wrkMastMapper.selectPakInStep1(staNo, barcode) != null ||
//                                    wrkMastService.selectOne(new EntityWrapper<WrkMast>()
//                                            .eq("barcode", barcode)
//                                            .in("io_type", 107, 103, 57)) != null) {
//                                News.error(barcode + "条码已存在状态为(2.设备上走)的数据,请查看WCS输送线界面");
//                                continue;
//                            }
//
//                            try {
//                                SearchLocParam param = new SearchLocParam();
//                                param.setBarcode(barcode);
//                                param.setIoType(1);
//                                param.setSourceStaNo(staNo);
//                                param.setLocType1((short) 1);
//                                param.setWeight(staProtocol.getWeight());
//
//                                String response = new HttpHandler.Builder()
//                                        .setTimeout(30, TimeUnit.SECONDS)
//                                        .setUri(wmsUrl)
//                                        .setPath("/rpc/pakin/loc/v1")
//                                        .setJson(JSON.toJSONString(param))
//                                        .build()
//                                        .doPost();
//
//                                JSONObject json = JSON.parseObject(response);
//                                if (json.getInteger("code").equals(200)) {
//                                    StartupDto dto = json.getObject("data", StartupDto.class);
//                                    barcodeThread.setBarcode("");
//                                    staProtocol.setWorkNo(dto.getWorkNo());
//                                    staProtocol.setStaNo(dto.getStaNo().shortValue());
//                                    devpThread.setPakMk(staProtocol.getSiteId(), false);
//                                    boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                                    ledThread.errorReset();
//                                    log.error("输送线下发2:" + dto.getWorkNo() + "," + dto.getStaNo());
//
//                                    if (!result) {
//                                        News.error(methodName + ":更新plc站点信息失败");
//                                        throw new CoolException("更新plc站点信息失败");
//                                    }
//                                } else {
//                                    String msg = json.getString("msg");
//                                    if (!"工作档已存在".equals(msg)) {
//                                        staProtocol.setWorkNo(wrkNo++);
//                                        staProtocol.setStaNo(inSta.getBackSta().shortValue());
//                                        devpThread.setPakMk(staProtocol.getSiteId(), false);
//                                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                                        log.error("输送线下发2:" + staProtocol.getWorkNo() + "," + staProtocol.getStaNo());
//                                        if (!Cools.isEmpty(msg)) {
//                                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, msg));
//                                        }
//                                    }
//                                }
//                            } catch (Exception e) {
//                                log.error("组托任务异常:", e);
//                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//                            }
//                        }
                    }
                } finally {
                    // 【无论接口调用是否成功,最后都释放调用标记】
                    callingStations.remove(staNo);
                    log.debug("工位{}接口调用完成,释放调用标记", staNo);
                }
            }
        }
@@ -1307,7 +1344,7 @@
                if (crnProtocol.getLastIo().equals("I")) {
                    if (basCrnp.getInEnable().equals("Y")) {
                        //mark - 1 - ....
                        this.crnStnToLoc(crn, crnProtocol, mark); //  入库
                        this.crnStnToLoc(crn, crnProtocol, mark, crnThread); //  入库
                        crnProtocol.setLastIo("O");
                    } else if (basCrnp.getOutEnable().equals("Y")) {
                        //mark - 2 - ....
@@ -1321,7 +1358,7 @@
                        this.locToCrnStn(crn, crnProtocol, mark); //  出库
                        crnProtocol.setLastIo("I");
                    } else if (basCrnp.getInEnable().equals("Y")) {
                        this.crnStnToLoc(crn, crnProtocol, mark); //  入库
                        this.crnStnToLoc(crn, crnProtocol, mark, crnThread); //  入库
                        crnProtocol.setLastIo("O");
                    }
                }
@@ -1341,7 +1378,7 @@
    public synchronized void crnRebackHp(CrnProtocol crnProtocol, CrnThread crnThread,String staNo) {
        if(staNo == null){
            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
                if (crnProtocol.getBay() == 121) {
                if (crnProtocol.getBay() == 121 || crnProtocol.getBay() == 1) {
                    return;
                }
                int x=1;
@@ -1397,7 +1434,7 @@
            int z = staNoInt / 100; // 层
            if ((staNoInt >= 121 && staNoInt <= 126) || (staNoInt >= 221 && staNoInt <= 230) || (staNoInt >= 411 && staNoInt <= 414)) {
            if ((staNoInt >= 121 && staNoInt <= 126) || (staNoInt >= 221 && staNoInt <= 231) || (staNoInt >= 411 && staNoInt <= 414)) {
                y = 121;
            }
@@ -1442,7 +1479,7 @@
    /**
     * 入库  ===>>  堆垛机站到库位
     */
    public synchronized void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol, Integer mark) {
    public synchronized void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol, Integer mark,CrnThread crnThread) {
        News.warnNoLog("" + mark + " - 1" + " - 0" + " - 堆垛机入出库作业下发:执行入库");
        for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) {
            boolean flag = false;
@@ -1461,11 +1498,22 @@
                News.error("" + mark + " - 1" + " - 2" + " - 入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                continue;
            }
//            if(staProtocol.getWorkNo() == 9998){
//                continue;
            WrkMast wrkMast1 = wrkMastMapper.selectPakInOne(slave.getId());
            if(wrkMast1 != null){
                crnRebackHp(crnProtocol,crnThread,wrkMast1.getStaNo().toString());
            }
//            if(staProtocol.getSiteId() == 225){
//                News.info("入库站点信息{}",staProtocol);
//            staProtocol.isLoading() &&
//            }
            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable()
            if(staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() <9998){
                log.info("读取到工作号时间: {}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
            }
            if (staProtocol.isAutoing()  && staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() <9998
                    && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
                log.info("可入时间: {}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
                flag = true;
            }
            if (!flag) {
@@ -1476,8 +1524,9 @@
                continue;
            }
            // 获取工作状态为2(设备上走)的入库工作档
            WrkMast wrkMast = wrkMastMapper.selectPakInStep2(slave.getId(), staProtocol.getWorkNo().intValue(), crnStn.getStaNo());
            WrkMast wrkMast = wrkMastMapper.selectPakInStep2(slave.getId(), staProtocol.getWorkNo(), crnStn.getStaNo());
            if (null == wrkMast) {
                log.info("" + mark + " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts=2, 工作号={}", staProtocol.getWorkNo());
                News.infoNoLog("" + mark + " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts=2, 工作号={}", staProtocol.getWorkNo());
//                log.error("查询无待入库数据--wrk_sts=2, 工作号={}", staProtocol.getWorkNo());
                continue;
@@ -1504,48 +1553,6 @@
                continue;
            }
//            // 双深库位且浅库位有货,则需先对浅库位进行库位移转
//            if (Utils.isDeepLoc(slaveProperties, wrkMast.getLocNo())) {
//                News.warnNoLog("" + mark + " - 1" + " - 8" + " - 双深库位且浅库位有货,则需先对浅库位进行库位移转 : 开始执行 任务号={}", wrkMast.getWrkNo());
//                String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getLocNo());
//                LocMast shallowLoc = locMastService.selectById(shallowLocNo);
//                // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!
//                if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
//                    News.warnNoLog("" + mark + " - 1" + " - 9" + " - // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!库位状态={}", shallowLoc.getLocSts());
//                    WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
//                    if (null == waitWrkMast) {
//                        News.error("" + mark + " - 1" + " - 10" + " - {}库位异常,未检索到相应工作档!", shallowLocNo);
//                    } else {
//                        waitWrkMast.setIoPri(15D);
//                        waitWrkMast.setModiTime(new Date());
//                        if (wrkMastMapper.updateById(waitWrkMast) == 0) {
//                            News.error("" + mark + " - 1" + " - 11" + " - 调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo());
//                        }
//                        continue;
//                    }
//
//                } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
//                    News.warnNoLog("" + mark + " - 1" + " - 12" + " - // F、D  库位状态={}", shallowLoc.getLocSts());
//                    // 此标记避免多次执行移库任务
//                    if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) {
//                        wrkMast.setUpdMk("Y");
//                        wrkMast.setIoPri(14D);
//                        wrkMastMapper.updateById(wrkMast);
//                        // 生成工作档,将浅库位移转到新的库位中
//                        moveLocForDeepLoc(slave, shallowLoc, mark);
//                        // 生成工作档、改变浅库位的源库/目标库 库位状态、下发堆垛机命令(立马执行)
////                        moveLocForDeepLocPakin(slave, shallowLoc, wrkMast);
//                    }
//                    continue;
//                } else if (shallowLoc.getLocSts().equals("Q")) {
//                    News.warnNoLog("" + mark + " - 1" + " - 13" + " - // Q  库位状态={}", shallowLoc.getLocSts());
//                    WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
//                    if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) {
//                        News.infoNoLog("" + mark + " - 1" + " - 14" + " - // F、D  工作状态(判断条件为==4)={}", waitWrkMast.getWrkSts());
//                        continue;
//                    }
//                }
//            }
            News.warnNoLog("" + mark + " - 1" + " - 15" + " - 命令下发 : 工作号={},源排={},源列={},源层={},目标排={},目标列={},目标层={}", wrkMast.getWrkNo().shortValue()
                    , crnStn.getRow().shortValue(), crnStn.getBay().shortValue(), crnStn.getLev().shortValue()
                    , locMast.getRow1().shortValue(), locMast.getBay1().shortValue(), locMast.getLev1().shortValue());
@@ -1563,6 +1570,8 @@
            crnCommand.setDestinationPosY((short) (locMast.getBay1() + slave.getOffset()));     // 目标库位列
            crnCommand.setDestinationPosZ((short) (locMast.getLev1() + slave.getOffset()));     // 目标库位层
//            crnCommand.setTraySize(locMast.getLocType1() == 2);
            log.info("堆垛机任务下发时间: {}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
            if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                News.error("" + mark + " - 1" + " - 16" + " - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
            } else {
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -518,20 +518,52 @@
        OperateResult write = null;
        OperateResult write1 = null;
        boolean flag1 = false;
        boolean flag2 = false;
        //任务下发次数
        int writeCount = 0;
        do {
            write = siemensS7Net.Write("DB100." + offset, staProtocol.getWorkNo());    // 工作号
            Thread.sleep(200);
            write1 = siemensS7Net.Write("DB100." + (offset+4), staProtocol.getStaNo().shortValue());    // 目标站
            if(write.IsSuccess && write1.IsSuccess){
            if (!flag1) {
                write = siemensS7Net.Write("DB100." + offset, staProtocol.getWorkNo());    // 工作号
                if (write.IsSuccess) {
                    OperateResultExOne<byte[]> result = siemensS7Net.Read("DB100." + offset, (short) 2);
                    if (result.IsSuccess) {
                        if (staProtocol.getWorkNo().equals(siemensS7Net.getByteTransform().TransInt16(result.Content, (short) 0))) {
                            flag1 = true;
                        }
                    }
                }
            }
            if (!flag2) {
                Thread.sleep(200);
                write1 = siemensS7Net.Write("DB100." + (offset+4), staProtocol.getStaNo().shortValue());    // 目标站
                if (write1.IsSuccess) {
                    OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB100." + (offset+4), (short) 2);
                    if (result2.IsSuccess) {
                        if (staProtocol.getStaNo().equals(siemensS7Net.getByteTransform().TransInt16(result2.Content, (short) 0))) {
                            flag2 = true;
                        }
                    }
                }
            }
            if (flag1 && flag2) {
                log.error("写入输送线命令成功。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                break;
            }
            else {
            } else {
                writeCount++;
                log.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
            }
//            write = siemensS7Net.Write("DB100." + offset, staProtocol.getWorkNo());    // 工作号
//            Thread.sleep(200);
//            write1 = siemensS7Net.Write("DB100." + (offset+4), staProtocol.getStaNo().shortValue());    // 目标站
//            if(write.IsSuccess && write1.IsSuccess){
//                log.error("写入输送线命令成功。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
//                break;
//            }
//            else {
//                writeCount++;
//                log.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
//            }
        }while (writeCount<5);
        if (!write.IsSuccess) {
src/main/resources/mapper/WrkMastMapper.xml
@@ -98,6 +98,10 @@
        select top 1 * from dbo.asr_wrk_mast where wrk_sts=2 and crn_no=#{crnNo} and wrk_no=#{workNo} and sta_no=#{staNo} and (io_type=1 or io_type=10 or io_type=53 or io_type=54 or io_type=57) order by io_pri desc,io_time,wrk_no ASC
    </select>
    <select id="selectPakInOne" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where wrk_sts=2 and crn_no=#{crnNo}  and (io_type=1 or io_type=10 or io_type=53 or io_type=54 or io_type=57) order by io_pri desc,io_time,wrk_no ASC
    </select>
    <select id="selectPakInStep3" resultMap="BaseResultMap">
        select top 1 * from dbo.asr_wrk_mast where wrk_no=#{workNo}
    </select>