pang.jiabao
2024-06-23 4f64a5b70500e1ec7b0b350eb66749180ed2634a
# 捷众二期开发
6个文件已修改
886 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 83 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/LocTypeDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 243 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 268 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 274 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -117,12 +117,16 @@
                    staProtocol = staProtocol.clone();
                }
                /*
                  无条码
                  没有可入信号
                  有空板信号
                  不是满托盘
                  是2号输送线9995拣料任务
                 */
                String barcode = barcodeThread.getBarcode();
                if (Cools.isEmpty(barcode)) {
                    continue;
                }
                if(!staProtocol.isInEnable()) {
                if (Cools.isEmpty(barcode) || !staProtocol.isInEnable() || staProtocol.isEmptyMk()
                || !staProtocol.isFullPlt() || (staProtocol.getWorkNo() == 9995 && devp.getId() == 2)) {
                    continue;
                }
@@ -169,11 +173,6 @@
                    }
                }
                //拣料、盘点任务,不进入新板入库方法,直接跳出
                if(staProtocol.getWorkNo() == 9995){
                    continue;
                }
                // 退回
                if (back) {
//                    News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg);
@@ -195,59 +194,9 @@
                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(5, errMsg));
                }
//                String barcode11 = barcodeThread.getBarcode();
//                if (Cools.isEmpty(barcode)){
//                    if (staProtocol.isAutoing()&& !staProtocol.isEmptyMk() && staProtocol.isPakMk() && staProtocol.getStamp()>=2){
//                        staProtocol.setStamp(0);
//                        News.info(""+mark+" - 7"+" - 扫码失败2 ===>> {}号条码扫描器检测条码信息:{},站点:{}", inSta.getBarcode(), barcode11, inSta.getStaNo());
//                        staProtocol.setWorkNo((short) 9989);
//                        staProtocol.setStaNo(inSta.getBackSta().shortValue());
//                        devpThread.setPakMk(staProtocol.getSiteId(), false);
//                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                        // led 异常显示
//                        if (ledThread != null) {
//                            String errorMsg = "扫码失败,请重试";
//                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(5, errorMsg));
//                        }
//                        continue;
//                    }
//                }
                if (staProtocol.isAutoing() && staProtocol.isInEnable()
                        && !staProtocol.isEmptyMk() && staProtocol.getWorkNo() > 9000
                        && staProtocol.isPakMk() && !back) { //&& staProtocol.getStamp()>=2) {// && !Cools.isEmpty(barcode)) {
                    News.warnNoLog(""+mark+" - 0"+" - 开始执行");
//                    if(!Cools.isEmpty(barcode) ) {
////                        News.info(""+mark+" - 1"+" - {}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
//
//                        if("NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode)) {
//                            staProtocol.setWorkNo((short) 9999);
//                            staProtocol.setStaNo(inSta.getBackSta().shortValue());
//                            devpThread.setPakMk(staProtocol.getSiteId(), false);
//                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//
//                            News.info(""+mark+" - 2"+" - 扫码失败1 ===>> {}号条码扫描器检测条码信息:{},站点:{}", inSta.getBarcode(), barcode, inSta.getStaNo());
//                            // led 异常显示
//                            if (ledThread != null) {
//                                String errorMsg = "扫码失败,请重试";
//                                MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(5, errorMsg));
//                            }
//                            continue;
//                        }
//                    } else {
//                        staProtocol.setWorkNo((short) 9999);
//                        staProtocol.setStaNo(inSta.getBackSta().shortValue());
//                        devpThread.setPakMk(staProtocol.getSiteId(), false);
//                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//
//                        News.info(""+mark+" - 3"+" - 扫码失败2 ===>> {}号条码扫描器检测条码信息:{},站点:{}", inSta.getBarcode(), barcode, inSta.getStaNo());
//                        // led 异常显示
//                        if (ledThread != null) {
//                            String errorMsg = "扫码失败,请重试";
//                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(5, errorMsg));
//                        }
//                        continue;
//                    }
                        && staProtocol.isPakMk() &&!Cools.isEmpty(barcode) && !back) {
                    // 判断重复工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode);
                    //过滤判断,防止拣料再入库货物,经过入库站再入库时,被退回到退库站
@@ -495,7 +444,7 @@
                    StaDesc staDesc = staDescService.selectOne(wrapper);
                    if (Cools.isEmpty(staDesc)) {
                        News.error(""+mark+" - 2"+" - 入库路径不存在!type_no={},stn_no={},crn_no={}", wrkMast.getIoType(), pickSta.getStaNo(), wrkMast.getCrnNo());
                        staProtocol.setWorkNo((short) 9989);
                        staProtocol.setWorkNo((short) 9999);
                        staProtocol.setStaNo(pickSta.getBackSta().shortValue());
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
@@ -875,7 +824,7 @@
                    continue;
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable()
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() <= 9000 && staProtocol.isInEnable()
                        && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
                    flag = true;
                }
@@ -1337,6 +1286,7 @@
        crnCommand.setDestinationPosX(sta.getRow1().shortValue());     // 目标库位排
        crnCommand.setDestinationPosY(sta.getBay1().shortValue());     // 目标库位列
        crnCommand.setDestinationPosZ(sta.getLev1().shortValue());     // 目标库位层
        crnCommand.setCommand((short) 1);
        if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
            News.error(""+mark+" - 3"+" - 4"+" - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
        } else {
@@ -1373,7 +1323,6 @@
                    crnThread.setResetFlag(true);
                } else {
                    // 获取入库待确认工作档
                    System.out.println("任务号"+crnProtocol.getTaskNo());
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep3(Integer.valueOf(crnProtocol.getTaskNo()));
                    if (wrkMast == null) {
                        News.error(""+mark+" - 1"+" - 堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo());
@@ -1548,15 +1497,13 @@
                    ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, emptyInSta.getLed());
                }
                if (!staProtocol.isLoading()){
                    continue;
                }
                // 站点条件判断
                if (staProtocol.isAutoing()
                        && staProtocol.isInEnable()
                        && staProtocol.isEmptyMk()
                        && (staProtocol.getWorkNo() >= 9990 && staProtocol.getWorkNo() <= 9999)
                        && staProtocol.getWorkNo() > 9000
                        && staProtocol.isPakMk()
                        && staProtocol.isLoading()
                ) {
                    News.warnNoLog(""+mark+" - 0"+" - 开始执行:空栈板初始化入库,叉车入库站放货");
src/main/java/com/zy/common/model/LocTypeDto.java
@@ -1,6 +1,5 @@
package com.zy.common.model;
import com.core.exception.CoolException;
import com.zy.core.model.protocol.StaProtocol;
import lombok.Data;
@@ -29,9 +28,11 @@
    }
    public LocTypeDto(StaProtocol staProtocol) {
        if (staProtocol.isHigh() == staProtocol.isLow() == staProtocol.isMedium() == staProtocol.isMedium_high()) {
            throw new CoolException("plc高低检测异常");
        }
        System.out.println("----------"+staProtocol.getSiteId()+"库位检测原始数据为:"+staProtocol.isWeight()+"------------");
//        if (staProtocol.isHigh() == staProtocol.isLow() == staProtocol.isMedium() == staProtocol.isMedium_high()) {
//            throw new CoolException("plc高低检测异常");
//        }
        if (staProtocol.isLow()) {
            this.locType1 = 1; // 低库位
        } else if (staProtocol.isHigh()){
@@ -41,7 +42,12 @@
        } else if (staProtocol.isMedium_high()) {
            this.locType1 = 4; // 高库位
        }
        if (staProtocol.isWeight() && staProtocol.getSiteId() == 204 || staProtocol.getSiteId() == 104) {
            this.locType1 = 2;
        } else {
            this.locType1 = 1;
        }
        System.out.println("----------"+staProtocol.getSiteId()+"库位检测处理为数据为:"+this.locType1+"------------");
    }
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -74,6 +74,8 @@
    // 扫码失败
    private boolean barcodeErr = false;
    private boolean weight = false;
    // 入库暂存数
    private Short inQty;
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -89,12 +89,12 @@
                        command.setTaskNo((short) 0); // 工作号
                        command.setAckFinish((short) 1);  // 任务完成确认位
                        command.setTaskMode(CrnTaskModeType.NONE); // 任务模式
                        command.setSourcePosX((short)0);     // 源库位排
                        command.setSourcePosY((short)0);     // 源库位列
                        command.setSourcePosZ((short)0);     // 源库位层
                        command.setDestinationPosX((short)0);     // 目标库位排
                        command.setDestinationPosY((short)0);     // 目标库位列
                        command.setDestinationPosZ((short)0);     // 目标库位层
                        command.setSourcePosX((short) 0);     // 源库位排
                        command.setSourcePosY((short) 0);     // 源库位列
                        command.setSourcePosZ((short) 0);     // 源库位层
                        command.setDestinationPosX((short) 0);     // 目标库位排
                        command.setDestinationPosY((short) 0);     // 目标库位列
                        command.setDestinationPosZ((short) 0);     // 目标库位层
                        write(command);
                        break;
                    default:
@@ -117,14 +117,14 @@
        }
        crnProtocol.setMode((short) -1);
//        crnProtocol.setTaskNo((short)0);
        crnProtocol.setStatus((short)-1);
        crnProtocol.setBay((short)0);
        crnProtocol.setLevel((short)0);
        crnProtocol.setStatus((short) -1);
        crnProtocol.setBay((short) 0);
        crnProtocol.setLevel((short) 0);
        crnProtocol.setForkPos((short) -1);
        crnProtocol.setLiftPos((short) -1);
        crnProtocol.setWalkPos((short)0);
        crnProtocol.setLoaded((short)0);
        crnProtocol.setAlarm((short)0);
        crnProtocol.setWalkPos((short) 0);
        crnProtocol.setLoaded((short) 0);
        crnProtocol.setAlarm((short) 0);
        crnProtocol.setxSpeed((short) 0);
        crnProtocol.setySpeed((short) 0);
        crnProtocol.setzSpeed((short) 0);
@@ -141,13 +141,13 @@
        siemensNet.setRack(slave.getRack().byteValue());
        siemensNet.setSlot(slave.getSlot().byteValue());
        OperateResult connect = siemensNet.ConnectServer();
        if(connect.IsSuccess){
        if (connect.IsSuccess) {
            result = true;
            OutputQueue.CRN.offer(MessageFormat.format( "【{0}】堆垛机plc连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
            News.info("SiemensCrn"+" - 1"+" - 堆垛机plc连接成功 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】堆垛机plc连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
            News.info("SiemensCrn" + " - 1" + " - 堆垛机plc连接成功 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
        } else {
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】堆垛机plc连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
            News.error("SiemensCrn"+" - 2"+" - 堆垛机plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            News.error("SiemensCrn" + " - 2" + " - 堆垛机plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            initCrn();
        }
//        siemensNet.ConnectClose();
@@ -157,7 +157,7 @@
    /**
     * 读取状态
     */
    private void readStatus(){
    private void readStatus() {
        try {
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 54);
            if (result.IsSuccess) {
@@ -175,79 +175,46 @@
                crnProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 14));
                crnProtocol.setLoaded(siemensNet.getByteTransform().TransInt16(result.Content, 16));
                crnProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 18));
                crnProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 28));
                crnProtocol.setySpeed(siemensNet.getByteTransform().TransInt16(result.Content, 32));
                crnProtocol.setzSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 36));
//                crnProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 34));
//                crnProtocol.setySpeed(siemensNet.getByteTransform().TransInt16(result.Content, 36));
//                crnProtocol.setzSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 38));
                crnProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 40));
                crnProtocol.setyDistance(siemensNet.getByteTransform().TransInt16(result.Content, 44));
                crnProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 48));
//                crnProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 40));
//                crnProtocol.setyDistance(siemensNet.getByteTransform().TransInt16(result.Content, 42));
//                crnProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 44));
                crnProtocol.setyDuration(siemensNet.getByteTransform().TransInt16(result.Content, 52));
//                crnProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 20));
//                crnProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 22));
//                crnProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 24));
//                crnProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 26));
                OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
                // 复位信号
//                if (!Cools.isEmpty(crnProtocol.getStatusType()) && crnProtocol.getStatusType().equals(CrnStatusType.WAITING)) {
//                    if (resetFlag) {
//                        if(crnProtocol.getTaskNo()==9999){
//                            backHpFlag = false;
//                        }
//                        CrnCommand crnCommand = new CrnCommand();
//                        crnCommand.setAckFinish((short)1);
//                        if (write(crnCommand)) {
//                            resetFlag = false;
//                        }
//                    }
//                }
                if (crnProtocol.getStatusType().equals(CrnStatusType.WAITING)) {
//                    News.error("-------------------------------------------第一步、[堆垛机号:{}, 工作号:{}, 载货台信号:{}]==>> 状态为10,等待确认!!",
//                            slave.getId(),crnProtocol.getTaskNo(), crnProtocol.getLoaded()==1 ? "有物" : "无物");
                    if (resetFlag) {
                        CrnCommand crnCommand = new CrnCommand();
                        crnCommand.setAckFinish((short)1);
                        if (write(crnCommand)) {
                            resetFlag = false;
//                            cmdFlag = true;
                        }
                    }
                }
                try {
                    // 根据实时信息更新数据库
                    BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class);
                    BasCrnp basCrnp = new BasCrnp();
                    basCrnp.setCrnNo(slave.getId());
                    basCrnp.setCrnSts((int)crnProtocol.getMode());
                    if (!basCrnpService.updateById(crnProtocol.toSqlModel(basCrnp))){
                        News.error("SiemensCrn"+" - 3"+" - 堆垛机plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
                    }
                } catch (Exception ignore){}
            } else {
                initCrn();
                OutputQueue.CRN.offer(MessageFormat.format("【{0}】读取堆垛机plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
                News.error("SiemensCrn"+" - 4"+" - 读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
                News.error("SiemensCrn" + " - 4" + " - 读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            }
            // 复位信号
            if (crnProtocol.getStatusType().equals(CrnStatusType.WAITING) && resetFlag) {
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setAckFinish((short) 1);
                if (write(crnCommand)) {
                    resetFlag = false;
                }
            }
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功", DateUtils.convert(new Date()), slave.getId()));
            try {
                // 根据实时信息更新数据库
                BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class);
                BasCrnp basCrnp = new BasCrnp();
                basCrnp.setCrnNo(slave.getId());
                basCrnp.setCrnSts((int) crnProtocol.getMode());
                if (!basCrnpService.updateById(crnProtocol.toSqlModel(basCrnp))) {
                    News.error("SiemensCrn" + " - 3" + " - 堆垛机plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
                }
            } catch (Exception ignore) {
            }
        } catch (Exception e) {
            e.printStackTrace();
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】读取堆垛机plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            News.error("SiemensCrn"+" - 5"+" - 读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            News.error("SiemensCrn" + " - 5" + " - 读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            initCrn();
        }
    }
@@ -266,43 +233,55 @@
     */
    private boolean write(CrnCommand command) throws InterruptedException {
        if (null == command) {
            News.error("SiemensCrn"+" - 6"+" - 堆垛机写入命令为空");
            News.error("SiemensCrn" + " - 6" + " - 堆垛机写入命令为空");
            return false;
        }
        OperateResult result;
//        convertRow(command);
        if (command.getAckFinish() == 1) {
            result = siemensNet.Write("DB100.0", (short) 1);
//            result = siemensNet.Write("DB100.18", 0);
        OperateResult result = null;
        // 写3号堆垛机
        if (slave.getId() == 3) {
            // 写任务完成确认
            if (command.getAckFinish() == 1) {
                result = siemensNet.Write("DB100.0", (short) 1);
            } else {
                command.setCrnNo(slave.getId());
                short[] array = new short[10];
                array[0] = command.getAckFinish();
                array[1] = command.getTaskNo();
                array[2] = command.getTaskMode();
                array[3] = command.getSourcePosX();
                array[4] = command.getSourcePosY();
                array[5] = command.getSourcePosZ();
                array[6] = command.getDestinationPosX();
                array[7] = command.getDestinationPosY();
                array[8] = command.getDestinationPosZ();
                array[9] = command.getCommand();
                result = siemensNet.Write("DB100.0", array);
            }
        } else {
            command.setCrnNo(slave.getId());
            short[] array = new short[10];
            array[0] = command.getAckFinish();
            array[1] = command.getTaskNo();
            array[2] = command.getTaskMode();
            array[3] = command.getSourcePosX();
            array[4] = command.getSourcePosY();
            array[5] = command.getSourcePosZ();
            array[6] = command.getDestinationPosX();
            array[7] = command.getDestinationPosY();
            array[8] = command.getDestinationPosZ();
//        array[9] = command.getSourceStaNo();
//        array[10] = command.getDestinationStaNo();
            array[9] = command.getCommand();
            result = siemensNet.Write("DB100.0", array);
//            if (command.getAckFinish() == 0) {
//                short commandFinish = 1;
//                Thread.sleep(100L);
//                result = siemensNet.Write("DB100.18", commandFinish);
//            }
            // 写任务完成确认
            if (command.getAckFinish() == 1) {
                result = siemensNet.Write("DB100.0", (short) 1);
            } else {
                command.setCrnNo(slave.getId());
                short[] array = new short[10];
                array[0] = command.getAckFinish();
                array[1] = command.getTaskNo();
                array[2] = command.getTaskMode();
                array[3] = command.getSourcePosX();
                array[4] = command.getSourcePosY();
                array[5] = command.getSourcePosZ();
                array[6] = command.getDestinationPosX();
                array[7] = command.getDestinationPosY();
                array[8] = command.getDestinationPosZ();
                array[9] = command.getCommand();
                result = siemensNet.Write("DB100.0", array);
            }
        }
        try {
            // 日志记录
            BasCrnOptService bean = SpringUtils.getBean(BasCrnOptService.class);
            BasCrnOpt basCrnOpt = new BasCrnOpt(
                    command.getTaskNo().intValue(),    // 任务号
            BasCrnOpt basCrnOpt = new BasCrnOpt(command.getTaskNo().intValue(),    // 任务号
                    command.getCrnNo(),    // 堆垛机[非空]
                    new Date(),    // 下发时间
                    command.getTaskModeType().toString(),    // 模式
@@ -319,17 +298,18 @@
                    null    // 修改人员
            );
            bean.insert(basCrnOpt);
        } catch (Exception ignore) {}
        } catch (Exception ignore) {
        }
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
            this.readStatus();
            News.info("SiemensCrn"+" - 7"+" - 堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            News.info("SiemensCrn" + " - 7" + " - 堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
            return true;
        } else {
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            News.error("SiemensCrn"+" - 8"+" - 写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            News.error("SiemensCrn" + " - 8" + " - 写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }
@@ -345,8 +325,8 @@
    /*****************************************************************************************/
    public static void main(String[] args) throws InterruptedException {
        CrnSlave slave = new CrnSlave();
        slave.setId(1);
        slave.setIp("10.10.10.10");
        slave.setId(2);
        slave.setIp("10.10.10.20");
        slave.setPort(0);
        slave.setRack(0);
        slave.setSlot(0);
@@ -357,19 +337,19 @@
        Thread.sleep(3000L);
        // 1.入库 源和目标都发
//        CrnCommand command = new CrnCommand();
////        command.setCrnNo(3); // 堆垛机编号
//        command.setTaskNo((short) 2); // 工作号
//        command.setAckFinish((short) 0);  // 任务完成确认位
//        command.setTaskMode(CrnTaskModeType.PAKIN); // 任务模式
//        command.setSourcePosX((short) 6);     // 源库位排
//        command.setSourcePosY((short) 2);     // 源库位列
//        command.setSourcePosZ((short) 2);     // 源库位层
//        command.setDestinationPosX((short) 6);     // 目标库位排
//        command.setDestinationPosY((short) 0);     // 目标库位列
//        command.setDestinationPosZ((short) 1);     // 目标库位层
//        command.setCommand((short)1);
//        crnThread.write(command);
        CrnCommand command = new CrnCommand();
//        command.setCrnNo(3); // 堆垛机编号
        command.setTaskNo((short) 4676); // 工作号
        command.setAckFinish((short) 0);  // 任务完成确认位
        command.setTaskMode(CrnTaskModeType.PAKIN); // 任务模式
        command.setSourcePosX((short) 5);     // 源库位排
        command.setSourcePosY((short) 1);     // 源库位列
        command.setSourcePosZ((short) 1);     // 源库位层
        command.setDestinationPosX((short) 4);     // 目标库位排
        command.setDestinationPosY((short) 2);     // 目标库位列
        command.setDestinationPosZ((short) 1);     // 目标库位层
        command.setCommand((short) 1);
        crnThread.write(command);
        // 2.出库 源和目标都发
//        CrnCommand command = new CrnCommand();
@@ -386,18 +366,19 @@
//        crnThread.write(command);
//        // 3.库位移转   源和目标都发 pass
        // 3.库位移转   源和目标都发 pass
//        CrnCommand command = new CrnCommand();
//        command.setCrnNo(slave.getId()); // 堆垛机编号
//        command.setTaskNo((short) 0); // 工作号
////        command.setCrnNo(slave.getId()); // 堆垛机编号
//        command.setTaskNo((short) 3); // 工作号
//        command.setAckFinish((short) 0);  // 任务完成确认位
//        command.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
//        command.setSourcePosX((short)2);     // 源库位排
//        command.setSourcePosX((short)4);     // 源库位排
//        command.setSourcePosY((short)2);     // 源库位列
//        command.setSourcePosZ((short)3);     // 源库位层
//        command.setDestinationPosX((short)2);     // 目标库位排
//        command.setDestinationPosY((short)4);     // 目标库位列
//        command.setDestinationPosZ((short)4);     // 目标库位层
//        command.setSourcePosZ((short)10);     // 源库位层
//        command.setDestinationPosX((short)4);     // 目标库位排
//        command.setDestinationPosY((short)1);     // 目标库位列
//        command.setDestinationPosZ((short)9);     // 目标库位层
//        command.setCommand((short)1);
//        crnThread.write(command);
        // 4.站位移转   源和目标都发
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -192,15 +192,58 @@
     * 读取状态 ====> 整块plc
     */
    private void read() throws InterruptedException {
//        // 更新入出库模式
//        updateIoMode();
        String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
        ArrayList<Integer> staNos = getStaNo();
        int staNoSize = staNos.size();
        // 读取1号输送线
        if (slave.getId() == 1) {
            OperateResultExOne<byte[]> result = siemensS7Net.Read("DB100.0", (short) (staNoSize * 8));
            if (result.IsSuccess) {
                for (int i = 0; i < staNoSize; i++) {
                    Integer siteId = staNos.get(i); // 站点编号
                    StaProtocol staProtocol = station.get(siteId);
                    if (null == staProtocol) {
                        staProtocol = new StaProtocol();
                        staProtocol.setSiteId(siteId);
                        station.put(siteId, staProtocol);
                    }
                    staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i * 4));     // 工作号
                    staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i * 4 + 2));   // 目标站
                    boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, 60+i, 1);
                    staProtocol.setAutoing(status[0]);  // 自动
                    staProtocol.setLoading(status[1]);  // 有物
                    staProtocol.setInEnable(status[2]); // 可入
                    staProtocol.setOutEnable(status[3]);// 可出
                    staProtocol.setEmptyMk(status[4]);  // 空板信号
                    staProtocol.setFullPlt(status[5]);  // 满托盘
                    staProtocol.setHigh(status[6]);     // 高库位
                    staProtocol.setLow(status[7]);      // 低库位
                    staProtocol.setWeight(status[6]);  //是否为重货
                    if (!staProtocol.isPakMk() && staProtocol.isLoading()) {
                        staProtocol.setPakMk(true);
                    }
                }
            } else {
                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】读取输送线plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
                log.error("读取输送线plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] ", slave.getId(), slave.getIp(), slave.getPort());
            }
            //条码扫描器
            Thread.sleep(200);
            ArrayList<Integer> barcodeList = getBarcodeList();
            OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB100.90", (short) (barcodeList.size() * 8));
            if (result2.IsSuccess) {
                for (int i = 0; i < barcodeList.size(); i++) {
                    Integer barcodeId = barcodeList.get(i);
                    String barcode = siemensS7Net.getByteTransform().TransString(result2.Content, i * 8, 8, "UTF-8");
                    BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId);
                    if (!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
                        barcodeThread.setBarcode(barcode);
                    }
                }
            }
        } else if (slave.getId() == 2) {
            OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNoSize*8));
            OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNoSize * 8));
            if (result.IsSuccess) {
                for (int i = 0; i < staNoSize; i++) {
                    Integer siteId = staNos.get(i); // 站点编号
@@ -211,8 +254,8 @@
                        station.put(siteId, staProtocol);
                    }
                    staProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, i * 8));     // 工作号
                    staProtocol.setStaNo( siemensS7Net.getByteTransform().TransInt16(result.Content, i*8 + 4 ));   // 目标站
                    boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i*8+6, 1);
                    staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i * 8 + 4));   // 目标站
                    boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i * 8 + 6, 1);
                    staProtocol.setAutoing(status[0]);  // 自动
                    staProtocol.setLoading(status[1]);  // 有物
                    staProtocol.setInEnable(status[2]); // 可入
@@ -226,24 +269,6 @@
                        staProtocol.setPakMk(true);
                    }
                }
                // 根据实时信息更新数据库
                try {
                    List<BasDevp> basDevps = new ArrayList<>();
                    for (Integer siteId : staNos) {
                        StaProtocol staProtocol = station.get(siteId);
                        basDevps.add(staProtocol.toSqlModel());
                    }
                    BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
                    if (null != basDevpService && !basDevpService.updateBatchById(basDevps)) {
                        throw new Exception("更新数据库数据失败");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    OutputQueue.DEVP.offer(MessageFormat.format("【{0}】更新数据库数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
                    News.error(methodName + ":更新数据库数据失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
                }
            } else {
                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】读取输送线plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
                log.error("读取输送线plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] ", slave.getId(), slave.getIp(), slave.getPort());
@@ -251,16 +276,16 @@
            //外形检测
            OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.42", (short) 8);
            if (resultErr.IsSuccess){
                    boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.Content, 0, 1);
                    StaProtocol staProtocol = station.get(303);
                    staProtocol.setFrontErr(status[0]);
                    staProtocol.setBackErr(status[1]);
                    staProtocol.setHighErr(status[2]);
                    staProtocol.setLeftErr(status[3]);
                    staProtocol.setRightErr(status[4]);
                    staProtocol.setWeightErr(status[5]);
                    staProtocol.setBarcodeErr(status[6]);
            if (resultErr.IsSuccess) {
                boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.Content, 0, 1);
                StaProtocol staProtocol = station.get(303);
                staProtocol.setFrontErr(status[0]);
                staProtocol.setBackErr(status[1]);
                staProtocol.setHighErr(status[2]);
                staProtocol.setLeftErr(status[3]);
                staProtocol.setRightErr(status[4]);
                staProtocol.setWeightErr(status[5]);
                staProtocol.setBarcodeErr(status[6]);
            }
            //条码扫描器
@@ -270,118 +295,31 @@
            if (result2.IsSuccess) {
                for (int i = 0; i < barcodeList.size(); i++) {
                    Integer barcodeId = barcodeList.get(i);
                    String barcode = siemensS7Net.getByteTransform().TransString(result2.Content,i*8,8, "UTF-8");
                    String barcode = siemensS7Net.getByteTransform().TransString(result2.Content, i * 8, 8, "UTF-8");
                    BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId);
                    if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
                    if (!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
                        barcodeThread.setBarcode(barcode);
                    }
                }
            }
//            //条码扫描器
//            Thread.sleep(200);
//            OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.60",(short)8);
//            if (result2.IsSuccess) {
//                    String barcode = siemensS7Net.getByteTransform().TransString(result2.Content,0,8, "UTF-8");
//                    BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, 3);
//                    if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
//                        barcodeThread.setBarcode(barcode);
//                    }
//            }
        }
        // 根据实时信息更新数据库
        try {
            List<BasDevp> basDevps = new ArrayList<>();
            for (Integer siteId : staNos) {
                StaProtocol staProtocol = station.get(siteId);
                basDevps.add(staProtocol.toSqlModel());
            }
//
//        if (result.IsSuccess) {
//            for (int i = 0; i < staNoSize; i++) {
//                Integer siteId = staNos.get(i); // 站点编号
//                StaProtocol staProtocol = station.get(siteId);
//                if (null == staProtocol) {
//                    staProtocol = new StaProtocol();
//                    staProtocol.setSiteId(siteId);
//                    station.put(siteId, staProtocol);
//                }
//                staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*4));     // 工作号
//
//                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*4+2));   // 目标站
//            }
//        }
//        Thread.sleep(200);
//        OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB100.60", (short) (staNoSize * 2));
//        if (result1.IsSuccess) {
//            for (int i = 0; i < staNoSize; i++) {
//                Integer siteId = staNos.get(i); // 站点编号
//                boolean[] status = siemensS7Net.getByteTransform().TransBool(result1.Content, i*2, 1);
//                boolean[] status2 = siemensS7Net.getByteTransform().TransBool(result1.Content, i*2+1, 1);
//                StaProtocol staProtocol = station.get(siteId);
//                staProtocol.setAutoing(status[0]);  // 自动
//                staProtocol.setLoading(status[1]);  // 有物
//                staProtocol.setInEnable(status[2]); // 可入
//                staProtocol.setOutEnable(status[3]);// 可出
//                staProtocol.setEmptyMk(status[4]);  // 空板信号
//                staProtocol.setFullPlt(status[5]);  // 满托盘
//                staProtocol.setLow(status[6]);      // 低库位
//                staProtocol.setMedium(status[7]);   // 中库位
//                staProtocol.setMedium_high(status2[0]); //中高库位
//                staProtocol.setHigh(status2[1]);     // 高库位
//                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
//                    staProtocol.setPakMk(true);
//                }
//
//                if (!staProtocol.isLoading()){
//                    staProtocol.setStamp(0);
//                }
//            }
//        }
        //接收超宽超高没扫到条码报警
//        Thread.sleep(200);
//        OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB101.34",(short)(1));
//        if (result4.IsSuccess) {
//            startSignal = siemensS7Net.getByteTransform().TransBool(result4.Content, 0, 1);
//        }
        //条码扫描器
//        Thread.sleep(200);
//        OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.60",(short)(barcodeSize*8));
//        if (result2.IsSuccess) {
//            for (int i = 0; i < barcodeSize; i++) {
//                String barcode = siemensS7Net.getByteTransform().TransString(result2.Content,i*8,8, "UTF-8");
//                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, i + 1);
//                if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
//                    barcodeThread.setBarcode(barcode);
//                }
//            }
//        }
//        if (result.IsSuccess && result1.IsSuccess) {
//
//            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
//
//            // 根据实时信息更新数据库
//            try {
//                List<BasDevp> basDevps = new ArrayList<>();
//                for (Integer siteId : staNos) {
//                    StaProtocol staProtocol = station.get(siteId);
//                    basDevps.add(staProtocol.toSqlModel());
//                }
//
//                BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
//                if (null != basDevpService && !basDevpService.updateBatchById(basDevps)) {
//                    throw new Exception("更新数据库数据失败");
//                }
//            } catch (Exception e) {
//                initSite();
//                e.printStackTrace();
//                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】更新数据库数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
//                News.error("SiemensDevp"+" - 3"+" - 更新数据库数据失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
//            }
//
//        } else {
//            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】读取输送线plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
////            log.error("读取输送线plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
//        }
            BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
            if (null != basDevpService && !basDevpService.updateBatchById(basDevps)) {
                throw new Exception("更新数据库数据失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】更新数据库数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
        }
    }
    /**
@@ -392,57 +330,31 @@
            return;
        }
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        short[] array = new short[2];
        array[0] = staProtocol.getWorkNo();
        array[1] = staProtocol.getStaNo();
//        OperateResult write = siemensS7Net.Write("DB100." + index*4, array);
        OperateResult write = null;
        OperateResult write1 = null;
//        //任务下发次数
//        int writeCount = 0;
//        do {
        write1 = siemensS7Net.Write("DB100." + (index*6+4), staProtocol.getStaNo());    // 目标站
        // 写2号输送线
        if (slave.getId() == 1) {
            int index = staNos.indexOf(staProtocol.getSiteId());
            write = siemensS7Net.Write("DB100." + index * 4, staProtocol.getWorkNo());    // 工作号
            Thread.sleep(500);
        write = siemensS7Net.Write("DB100." + index*6, staProtocol.getWorkNo().intValue());    // 工作号
//            if(write.IsSuccess || write1.IsSuccess){
//                Thread.sleep(200);
//                OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB100." + index*4, (short) 2);
//                OperateResultExOne<byte[]> readResult1 = siemensS7Net.Read("DB100." + (index*4+2), (short) 2);
//                if(readResult.IsSuccess && readResult1.IsSuccess){
//                    short workNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 0);
//                    short staNo = siemensS7Net.getByteTransform().TransInt16(readResult1.Content, 0);
//                    if(staProtocol.getWorkNo().equals(workNo) && staProtocol.getStaNo().equals(staNo)){
//                        //任务命令写入成功
//                        log.info("写入堆垛机命令后返回成功,并且回读成功。堆垛机plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
//                        break;
//                    } else {//返回结果是成功了,但是真实值不相同
//                        writeCount++;
//                        log.error("写入堆垛机命令后返回成功,但是读取任务值不一致。堆垛机plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
//                    }
//                } else {
//                    writeCount++;
//                    log.error("写入堆垛机命令后读取失败。堆垛机plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
//                }
//            }
//            else {
//                writeCount++;
//                log.error("写入堆垛机命令后读取失败。堆垛机plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
//            }
//        }while (writeCount<5);
            write1 = siemensS7Net.Write("DB100." + (4 * index + 2), staProtocol.getStaNo());    // 目标站e
        } else {
            int index = staNos.indexOf(staProtocol.getSiteId());
            write1 = siemensS7Net.Write("DB100." + (index * 6 + 4), staProtocol.getStaNo());    // 目标站
            Thread.sleep(500);
            write = siemensS7Net.Write("DB100." + index * 6, staProtocol.getWorkNo().intValue());    // 工作号
        }
        if (!write.IsSuccess || !write1.IsSuccess) {
            staProtocol = station.get(staProtocol.getSiteId());
            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() == 0) {
                staProtocol.setPakMk(true);
            }
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol)));
            News.error("SiemensDevp"+" - 4"+" - 写入输送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
            News.error("SiemensDevp" + " - 4" + " - 写入输送线站点数据失败。输送线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)));
            News.info("SiemensDevp"+" - 5"+" - 输送线命令下发 [id:{}] >>>>> 命令下发: {}",  slave.getId(), JSON.toJSON(staProtocol));
            News.info("SiemensDevp" + " - 5" + " - 输送线命令下发 [id:{}] >>>>> 命令下发: {}", slave.getId(), JSON.toJSON(staProtocol));
        }
    }
src/main/resources/application.yml
@@ -39,61 +39,61 @@
# 下位机配置
wcs-slave:
  # 双深
  doubleDeep: true
  doubleDeep: false
  # 双深库位排号
  doubleLocs: 1
  # 一个堆垛机负责的货架排数
  groupCount: 3
#  # 堆垛机1
#  crn[0]:
#    id: 1
#    ip: 10.10.10.10
#    port: 102
#    rack: 0
#    slot: 0
#    # 偏移量,当堆垛机站点列号=1时,偏移量=2
#    offset: 2
#    demo: false
#    # 堆垛机入库站点
#    crnInStn[0]:
#      devpPlcId: ${wcs-slave.devp[0].id}
#      staNo: 104
#      row: 3
#      bay: 39
#      lev: 1
#    # 堆垛机出库站点
#    crnOutStn[0]:
#      devpPlcId: ${wcs-slave.devp[0].id}
#      staNo: 100
#      row: 2
#      bay: 39
#      lev: 1
#  # 堆垛机2
#  crn[1]:
#    id: 2
#    ip: 10.10.10.18
#    port: 102
#    rack: 0
#    slot: 0
#    # 偏移量,当堆垛机站点列号=1时,偏移量=2
#    offset: 2
#    demo: false
#    # 堆垛机入库站点
#    crnInStn[0]:
#      devpPlcId: ${wcs-slave.devp[0].id}
#      staNo: 204
#      row: 5
#      bay: 39
#      lev: 1
#    # 堆垛机出库站点
#    crnOutStn[0]:
#      devpPlcId: ${wcs-slave.devp[0].id}
#      staNo: 200
#      row: 4
#      bay: 39
#      lev: 1
  # 堆垛机3
  # 堆垛机1
  crn[0]:
    id: 1
    ip: 10.10.10.10
    port: 0
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 104
      row: 3
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
      row: 2
      bay: 1
      lev: 1
  # 堆垛机2
  crn[1]:
    id: 2
    ip: 10.10.10.20
    port: 0
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 204
      row: 5
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 200
      row: 4
      bay: 1
      lev: 1
  # 堆垛机3
  crn[2]:
    id: 3
    ip: 10.10.10.30
    port: 0
@@ -104,67 +104,67 @@
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 304
      row: 7
      bay: 0
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 300
      row: 6
      bay: 0
      lev: 1
#  # 输送线1
#  devp[0]:
#    id: 1
#    ip: 10.10.10.100
#    port: 102
#    rack: 0
#    slot: 0
#    # 入库口1
#    inSta[0]:
#      staNo: 104
#      barcode: ${wcs-slave.barcode[0].id}
#      backSta: 103
#      led: ${wcs-slave.led[0].id}
#    # 入库口2
#    inSta[1]:
#      staNo: 204
#      barcode: ${wcs-slave.barcode[1].id}
#      backSta: 203
#      led: ${wcs-slave.led[1].id}
#    # 空板入库口1
#    emptyInSta[0]:
#      staNo: 104
#      barcode: ${wcs-slave.barcode[0].id}
#      led: ${wcs-slave.led[0].id}
#    # 空板入库口2
#    emptyInSta[1]:
#      staNo: 204
#      barcode: ${wcs-slave.barcode[1].id}
#      led: ${wcs-slave.led[1].id}
#    # 拣料入库口1
#    pickSta[0]:
#      staNo: 204
#      barcode: ${wcs-slave.barcode[1].id}
#      led: ${wcs-slave.led[1].id}
#    # 拣料入库口2
#    pickSta[1]:
#      staNo: 104
#      barcode: ${wcs-slave.barcode[0].id}
#      led: ${wcs-slave.led[0].id}
#    # 出库口1
#    outSta[0]:
#      staNo: 101
#      led: ${wcs-slave.led[0].id}
#    # 出库口2
#    outSta[1]:
#      staNo: 201
#      led: ${wcs-slave.led[1].id}
  # 输送线2
  # 输送线1
  devp[0]:
    id: 1
    ip: 10.10.10.100
    port: 0
    rack: 0
    slot: 0
    # 入库口1
    inSta[0]:
      staNo: 104
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 103
      led: ${wcs-slave.led[0].id}
    # 入库口2
    inSta[1]:
      staNo: 204
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 203
      led: ${wcs-slave.led[1].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 104
      barcode: ${wcs-slave.barcode[0].id}
      led: ${wcs-slave.led[0].id}
    # 空板入库口2
    emptyInSta[1]:
      staNo: 204
      barcode: ${wcs-slave.barcode[1].id}
      led: ${wcs-slave.led[1].id}
    # 拣料入库口1
    pickSta[0]:
      staNo: 204
      barcode: ${wcs-slave.barcode[1].id}
      led: ${wcs-slave.led[1].id}
    # 拣料入库口2
    pickSta[1]:
      staNo: 104
      barcode: ${wcs-slave.barcode[0].id}
      led: ${wcs-slave.led[0].id}
    # 出库口1
    outSta[0]:
      staNo: 101
      led: ${wcs-slave.led[0].id}
    # 出库口2
    outSta[1]:
      staNo: 201
      led: ${wcs-slave.led[1].id}
  # 输送线2
  devp[1]:
    id: 2
    ip: 10.10.10.130
    port: 0
@@ -173,61 +173,57 @@
    # 入库口1
    inSta[0]:
      staNo: 304
      barcode: ${wcs-slave.barcode[0].id}
      barcode: ${wcs-slave.barcode[2].id}
      backSta: 303
      led: ${wcs-slave.led[0].id}
      led: ${wcs-slave.led[3].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 304
      barcode: ${wcs-slave.barcode[0].id}
      led: ${wcs-slave.led[0].id}
      barcode: ${wcs-slave.barcode[2].id}
      led: ${wcs-slave.led[3].id}
    # 拣料入库口1
    pickSta[0]:
      staNo: 304
      barcode: ${wcs-slave.barcode[0].id}
      led: ${wcs-slave.led[0].id}
      barcode: ${wcs-slave.barcode[2].id}
      led: ${wcs-slave.led[3].id}
    # 出库口1
    outSta[0]:
      staNo: 301
      led: ${wcs-slave.led[0].id}
      led: ${wcs-slave.led[2].id}
  # 条码扫描仪1
#  barcode[0]:
#    id: 1
#    ip: 10.10.10.102
#    port: 51236
#  # 条码扫描仪2
#  barcode[1]:
#    id: 2
#    ip: 10.10.10.104
#    port: 51236
  # 条码扫描仪3
  barcode[0]:
    id: 1
  # 条码扫描仪2
  barcode[1]:
    id: 2
  # 条码扫描仪3
  barcode[2]:
    id: 3
   # LED1
#  led[0]:
#    id: 1
#    ip: 10.10.10.107
#    port: 5005
#    devpPlcId: ${wcs-slave.devp[0].id}
#    staArr: 101
#  # LED2
#  led[1]:
#    id: 2
#    ip: 10.10.10.105
#    port: 5005
#    devpPlcId: ${wcs-slave.devp[0].id}
#    staArr: 201
  # LED3
  led[0]:
    id: 3
    id: 1
    ip: 10.10.10.107
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 101
  # LED2
  led[1]:
    id: 2
    ip: 10.10.10.105
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 201
  # LED3
  led[2]:
    id: 3
    ip: 10.10.10.108
    port: 5005
    devpPlcId: ${wcs-slave.devp[1].id}
    staArr: 301
#  # LED4
#  led[3]:
#    id: 4
#    ip: 10.10.10.105
#    port: 5005
#    devpPlcId: ${wcs-slave.devp[1].id}
#    staArr: 304
  # LED4
  led[3]:
    id: 4
    ip: 10.10.10.109
    port: 5005
    devpPlcId: ${wcs-slave.devp[1].id}
    staArr: 304