pang.jiabao
2025-10-16 29ccba30133dec6ec0516c0782da5fe7d046848d
wcs功能完善
1个文件已删除
10个文件已修改
389 ■■■■■ 已修改文件
src/main/java/com/zy/common/model/LocTypeDto.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/MatDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/controller/OpenController.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/LedCommand.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/service/impl/MainServiceImpl.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/console.html 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
@@ -31,14 +30,7 @@
    }
    public LocTypeDto(StaProtocol staProtocol) {
//        if (staProtocol.isHigh() == staProtocol.isLow()) {
//            throw new CoolException("plc高低检测异常");
//        }
        if (staProtocol.getSiteId() == 106 || staProtocol.getSiteId() == 159){
            this.locType1 = 2; // 高库位
        }else {
            this.locType1 = 1; // 低库位
        }
        this.locType1 = staProtocol.getGoodsHeight();
    }
    /**
src/main/java/com/zy/common/model/MatDto.java
@@ -8,6 +8,8 @@
@Data
public class MatDto {
    private String orderNo;
    // 物料编号
    private String matnr;
@@ -19,6 +21,8 @@
    private String specs;
    private String model;
    private Double anfme;
    private String manuDate;
@@ -51,15 +55,15 @@
        this.count = count;
        this.total = total;
    }
    public MatDto(String matnr,String batch,String specs,String manuDate,String model,double weight, double length,double volume) {
    public MatDto(String orderNo,String matnr,String maknx, String batch,String specs,String manuDate,String model,Double anfme) {
        this.orderNo = orderNo;
        this.matnr = matnr;
        this.maknx = maknx;
        this.batch = batch;
        this.specs = specs;
        this.manuDate = manuDate;
        this.model = model;
        this.weight = weight;
        this.length = length;
        this.volume = volume;
        this.anfme = anfme;
    }
    public MatDto(String matNo, String maknx, Double count) {
src/main/java/com/zy/controller/OpenController.java
File was deleted
src/main/java/com/zy/core/MainProcess.java
@@ -65,7 +65,7 @@
                    mainService.storeEmptyPlt(8);
                    // 出库  ===>> 工作档信息写入led显示器
                    mainService.ledExecute(9);
                    mainService.ledExecute();
                    // 其他  ===>> LED显示器复位,显示默认信息
                    mainService.ledReset();
src/main/java/com/zy/core/model/command/LedCommand.java
@@ -56,7 +56,7 @@
        ledCommand.setStaNo(100);
        ledCommand.setWorkNo(7001);
        List<MatDto> matDtos = new ArrayList<>();
        MatDto matDto = new MatDto("0205040001","K44132-09-0724","PE","20240724",",HD-233L",70,2816,53908.56626);
        MatDto matDto = new MatDto();
        matDtos.add(matDto);
        ledCommand.setMatDtos(matDtos);
        System.out.println(ledCommand);
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -43,6 +43,9 @@
    // 高
    private boolean high;
    // 中
    private boolean center;
    // 低
    private boolean low;
@@ -75,11 +78,17 @@
    // 右超限
    private boolean rightErr = false;
    // 未组托报警
    private boolean groupSupportErr = false;
    // 超重
    private boolean weightErr = false;
    // 扫码失败
    private boolean barcodeErr = false;
    // 货物高度 1.低 2.中 3.高
    private short goodsHeight;
    //故障-----------------------------------------------------------------------
    private Boolean breakerErr = false; //断路器故障
@@ -98,18 +107,10 @@
    private Boolean upcontactErr = false; //顶升电机接触器故障
    private Boolean ifOpenDoor = false; // 是否打开
    private Boolean ifCloseDoor = false; // 是否关闭
    private Boolean openAskDoor = false; // 请求开门
    private Boolean closeAskDoor = false; // 请求关门
    public BasDevp toSqlModel(){
        BasDevp basDevp = new BasDevp();
        basDevp.setDevNo(siteId);
        basDevp.setWrkNo(workNo.intValue());
        basDevp.setWrkNo(workNo);
        basDevp.setAutoing(autoing?"Y":"N");
        basDevp.setLoading(loading?"Y":"N");
        basDevp.setInEnable(inEnable?"Y":"N");
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -111,14 +111,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);
@@ -126,17 +126,17 @@
        crnProtocol.setyDistance((short) 0);
        crnProtocol.setxDuration((short) 0);
        crnProtocol.setyDuration((short) 0);
        try{
        try {
            // 根据实时信息更新数据库
            BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class);
            BasCrnp basCrnp = new BasCrnp();
            basCrnp.setCrnErr(crnProtocol.getAlarm()==null?0:crnProtocol.getAlarm().longValue());
            basCrnp.setCrnErr(crnProtocol.getAlarm() == null ? 0 : crnProtocol.getAlarm().longValue());
            basCrnp.setCrnNo(slave.getId());
            basCrnp.setCrnSts((int)crnProtocol.getMode());
            if (!basCrnpService.updateById(crnProtocol.toSqlModel(basCrnp))){
                News.error("MelsecCrn"+" - 4"+" - 堆垛机plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            basCrnp.setCrnSts((int) crnProtocol.getMode());
            if (!basCrnpService.updateById(crnProtocol.toSqlModel(basCrnp))) {
                News.error("MelsecCrn" + " - 4" + " - 堆垛机plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            }
        } catch (Exception e){
        } catch (Exception e) {
        }
    }
@@ -198,6 +198,7 @@
                // 复位信号
                if (!Cools.isEmpty(crnProtocol.getStatusType()) && crnProtocol.getStatusType().equals(CrnStatusType.WAITING)) {
                    News.info("{}号堆垛机,收到任务{}完成信号",crnProtocol.getCrnNo(),crnProtocol.getTaskNo());
                    if (resetFlag) {
                        if(crnProtocol.getTaskNo()==9999){
                            backHpFlag = false;
@@ -231,15 +232,6 @@
            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());
            initCrn();
        }
    }
    private void convertRow(CrnCommand crnCommand) {
        if (crnCommand.getSourcePosX() != null && crnCommand.getSourcePosX() != 0) {
            crnCommand.setSourcePosX((short) (crnCommand.getSourcePosX() - ((slave.getId() - 1) * 4)));
        }
        if (crnCommand.getDestinationPosX() != null && crnCommand.getDestinationPosX() != 0) {
            crnCommand.setDestinationPosX((short) (crnCommand.getDestinationPosX() - ((slave.getId() - 1) * 4)));
        }
    }
@@ -277,9 +269,9 @@
        }catch (Exception e){
            News.error("堆垛机命令地址写入后回读出错");
        }
//        convertRow(command);
        command.setCrnNo(slave.getId());
//        short[] array = new short[10];
        short[] array = new short[10];
        array[0] = command.getAckFinish(); // 任务完成确认位
        array[1] = command.getTaskNo();  // 任务号
@@ -293,14 +285,10 @@
        array[9] = command.getCommand();
//        array[10] = 0;   //备用1
//        boolean[] array2 = new boolean[1];
//        array2[0] = command.isTraySize();
        OperateResult result = siemensNet.Write("DB100.0", array);
//        OperateResult result2 = siemensNet.Write("DB100.22", array2);
        News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), array);
//        if(!result.IsSuccess || !result2.IsSuccess){
            if(!result.IsSuccess){
        if (!result.IsSuccess) {
            News.error("写入堆垛机plc数据失败,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
            MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command));
            Thread.sleep(100);
@@ -383,6 +371,11 @@
                    }
                }while (writeCount2<5);
            }
        } else {
            BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class);
            BasCrnp basCrnp = basCrnpService.selectById(slave.getId());
            basCrnp.setModiTime(new Date());
            basCrnpService.updateById(basCrnp);
        }
        try {
@@ -408,7 +401,7 @@
            bean.insert(basCrnOpt);
        } catch (Exception ignore) {}
        if (result != null && result.IsSuccess) {
        if (result.IsSuccess) {
            this.readStatus();
            News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
@@ -419,11 +412,6 @@
            return false;
        }
    }
    public void requestStop() {
        isRunning = false;
    }
    @Override
    public void close() {
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -8,7 +8,6 @@
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.core.exception.CoolException;
import com.zy.core.DevpThread;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
@@ -53,7 +52,7 @@
        add(1); add(2);
    }};
    public static final ArrayList<Integer> staNosErrList = new ArrayList<Integer>() {{
        add(101); add(103);
        add(104); add(106);
    }};
    /**
@@ -183,10 +182,10 @@
     */
    private void read() {
        // 读一楼连续8个站点
        // 站点信息
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (8*8));
        if (result.IsSuccess) {
            for (int i = 0; i < 8; i++) {
            for (int i = 0; i < staNos.size(); i++) {
                Integer siteId = staNos.get(i); // 站点编号
                StaProtocol staProtocol = station.get(siteId);
                if (null == staProtocol) {
@@ -206,19 +205,25 @@
                staProtocol.setEmptyMk(status[4]);  // 空板信号
                staProtocol.setFullPlt(status[5]);  // 满托盘
                staProtocol.setHigh(status[6]);     // 高库位
                staProtocol.setLow(status[7]);      // 低库位
                staProtocol.setLow(status[7]);      // 中库位
                staProtocol.setCenter(status[8]);   // 低库位
                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                }
            }
        } else {
            initSite();
            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());
            return;
        }
        // 条码扫描器
        OperateResultExOne<byte[]> barcodeResult = siemensS7Net.Read("DB101.1672", (short) ((BarcodeList.size()+1) * 8)); // 不连续
        OperateResultExOne<byte[]> barcodeResult = siemensS7Net.Read("DB101.400", (short) (BarcodeList.size() * 10));
        if (barcodeResult.IsSuccess) {
            for (int i = 0; i < BarcodeList.size(); i++) {
                String barcode = siemensS7Net.getByteTransform().TransString(barcodeResult.Content,i*16,8, "UTF-8");
                String barcode = siemensS7Net.getByteTransform().TransString(barcodeResult.Content,i*10 + 2,8, "UTF-8");
                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, BarcodeList.get(i));
                if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
                    barcodeThread.setBarcode(barcode);
@@ -227,26 +232,29 @@
        }
        // 外形检测
        OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.1652", (short) ((staNosErrList.size()+1)*4)); // 不连续,多读中间一个
        OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.430", (short) (staNosErrList.size() *4)); // 不连续,多读中间一个
        if (resultErr.IsSuccess){
            for (int i = 0;i<staNosErrList.size();i++){
                boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.Content, i*8+2, 1);
                boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.Content, i*4, 1);
                StaProtocol staProtocol = station.get(staNosErrList.get(i));
                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.setGroupSupportErr(status[5]);
                staProtocol.setBarcodeErr(status[6]);
                staProtocol.setWeightErr(status[7]);
                short goodsHeight = siemensS7Net.getByteTransform().TransInt16(resultErr.Content, i * 4 + 2);
                staProtocol.setGoodsHeight(goodsHeight);
            }
        }
        // 读一楼连续8个站点,故障信息反馈
        OperateResultExOne<byte[]> resultErr2 = siemensS7Net.Read("DB101.3312", (short) (8*2));
        // 故障信息反馈
        OperateResultExOne<byte[]> resultErr2 = siemensS7Net.Read("DB101.442", (short) (staNos.size() * 4));
        if (resultErr2.IsSuccess) {
            for (int i = 0; i < 8; i++) {
                boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr2.Content, i*2 + 1, 1);
            for (int i = 0; i < staNos.size(); i++) {
                boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr2.Content, i*4 + 2, 1);
                StaProtocol staProtocol = station.get(staNos.get(i)); // 站点编号
                staProtocol.setBreakerErr(status[0]);
                staProtocol.setInfraredErr(status[1]);
@@ -297,35 +305,22 @@
            return;
        }
        int address = -1;
        switch (staProtocol.getSiteId()) {
            case 100: address = 0; break;
            case 101: address = 4; break;
            case 102: address = 8; break;
            case 103: address = 12; break;
            case 104: address = 16; break;
            case 105: address = 20; break;
            case 106: address = 24; break;
            case 107: address = 28; break;
            default:
        }
        if(address == -1) {
            throw new CoolException("写入站点异常:" + staProtocol.getSiteId());
        }
        int address = staNos.indexOf(staProtocol.getSiteId()) * 4;
        OperateResult write;
        OperateResult write1;
        //任务下发次数
        int writeCount = 0;
        do {
            write1 = siemensS7Net.Write("DB100." + (address+2), staProtocol.getStaNo());    // 目标站
            write = siemensS7Net.Write("DB100." + address, staProtocol.getWorkNo().shortValue());    // 工作号
            write1 = siemensS7Net.Write("DB100." + (address + 2), staProtocol.getStaNo());    // 目标站
            Thread.sleep(200);
            if(write.IsSuccess && write1.IsSuccess){
                break;
            }
            else {
                writeCount++;
                log.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                News.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
            }
        }while (writeCount<5);
@@ -340,6 +335,7 @@
            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));
        }
        read();
    }
    /**
src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -93,7 +93,7 @@
    @Value("${wms.url}")
    private String wmsUrl;
    public Integer wrkNo = 9901;
    public Integer wrkNo = 9997;
    /**
     * 组托
@@ -147,20 +147,13 @@
                    errMsg = "超重";
                    back = true;
                }
                if (!back && staProtocol.isBarcodeErr()) {
                if (!back && (staProtocol.isBarcodeErr()||Cools.isEmpty(barcode))) {
                    errMsg = "扫码失败";
                    back = true;
                }
                // 退回
                if (back) {
                if (back && staProtocol.getWorkNo() == 9999 && staProtocol.isInEnable() && staProtocol.isLoading() && staProtocol.isPakMk()) {
                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg));
                    if (!staProtocol.isLoading()){
                        continue;
                    }
                    if (!staProtocol.isPakMk()) {
                        continue;
                    }
                    staProtocol.setWorkNo(wrkNo);
                    News.info("{}入库回退:{},任务号:{}", inSta.getStaNo(), errMsg,wrkNo);
                    staProtocol.setStaNo(inSta.getBackSta().shortValue());
@@ -175,8 +168,9 @@
                        && staProtocol.isLoading()
                        && staProtocol.isInEnable()
                        && !staProtocol.isEmptyMk()
                        && staProtocol.isPakMk()) {
                        && staProtocol.isPakMk() && staProtocol.getWorkNo() == 9999) {
                    if(Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "00000000".equals(barcode)) {
                        News.info("{}条码扫描错误:{}",barcodeThread.getSlave().getId(),barcode);
                        continue;
                    }
                    // 判断重复工作档
@@ -209,14 +203,12 @@
                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
                            barcodeThread.setBarcode("");
                            staProtocol.setWorkNo(dto.getWorkNo());
                            staProtocol.setStaNo(RouteUtils.SouStaEnd(dto.getStaNo(),dto.getSourceStaNo()));
                            staProtocol.setStaNo(dto.getStaNo().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            log.error("输送线下发2:"+dto.getWorkNo()+","+dto.getStaNo());
                            if (!result) {
                                News.error(methodName + ":更新plc站点信息失败");
                                throw new CoolException("更新plc站点信息失败");
                            }else {
                                ledThread.errorReset();
                            }
@@ -237,7 +229,6 @@
                    }
                }
            }
        }
@@ -274,7 +265,7 @@
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()) {
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk() && staProtocol.getWorkNo() == 9999) {
                    News.warnNoLog(""+mark+" - 0"+" - 开始执行");
                    WrkMast wrkMast = wrkMastMapper.selectPickStep(barcode);
                    if (wrkMast == null) {
@@ -298,7 +289,7 @@
                        staProtocol.setStaNo((short) (pickSta.getStaNo().shortValue()-(short)1));
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        log.error("输送线下发4:"+9989+","+(pickSta.getStaNo().shortValue()-(short)1));
                        log.error("输送线下发4:"+wrkNo+","+(pickSta.getStaNo().shortValue()-(short)1));
                        //LED
                        LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed());
                        // led 异常显示
@@ -351,7 +342,7 @@
                    // 更新站点信息 且 下发plc命令
                    staProtocol.setWorkNo(wrkMast.getWrkNo());
                    staProtocol.setStaNo((short) 161);
                    staProtocol.setStaNo(staProtocol.getSiteId().shortValue());
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                    log.error("输送线下发5:"+wrkMast.getWrkNo()+","+wrkMast.getStaNo());
@@ -419,7 +410,7 @@
                        wrkMast.setCrnEndTime(new Date());
                        if (wrkMastMapper.updateById(wrkMast) != 0) {
                            // 复位堆垛机
                            log.info("出库任务完成下发堆垛机复位,任务号:{}",wrkMast.getWrkNo());
                            News.info("出库任务完成下发堆垛机复位,任务号:{}",wrkMast.getWrkNo());
                            crnThread.setResetFlag(true);
                        } else {
                            News.error(""+mark+" - 1"+" - 更新工作档的工作状态为14失败!!! [工作号:{}]", wrkMast.getWrkNo());
@@ -429,7 +420,7 @@
                        News.errorNoLog(""+mark+" - 6"+" - 堆垛机信息不符合入库条件!!!"
                                +" 堆垛机状态:"+crnProtocol.modeType+"==自动AUTO:" + CrnModeType.AUTO
                                +"、堆垛机任务号:"+crnProtocol.getTaskNo()+"==工作档任务号:" + wrkMast.getWrkNo().shortValue()
                                +"、状态枚举:"+crnProtocol.statusType+"==WAITING:90 //任务完成等待WCS确认):" + CrnStatusType.WAITING
                                +"、状态枚举:"+crnProtocol.statusType+"==WAITING:10 //任务完成等待WCS确认):" + CrnStatusType.WAITING
                                +"、货叉位置:"+crnProtocol.forkPosType+"==HOME:0  // 货叉原位:" + CrnForkPosType.HOME);
                    }
@@ -672,7 +663,7 @@
                }
                // 判断堆垛机出库站状态
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")
                if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")
                        && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
@@ -797,7 +788,7 @@
            News.error(""+mark+" - 3"+" - 2"+" - 工作档库位移转失败,原因:检索目标库位失败!工作号={},源库位={}", wrkMast.getWrkNo(), wrkMast.getLocNo());
            return;
        }
        if(sta.getLocType1() != sourceSta.getLocType1()){
        if(!Objects.equals(sta.getLocType1(), sourceSta.getLocType1())){
            News.error("移库目标库位类型与源库位类型不符");
            return;
        }
@@ -973,7 +964,7 @@
                            String errName = crnError == null ? String.valueOf(crnProtocol.getAlarm()) : crnError.getErrName();
                            BasErrLog basErrLog = new BasErrLog(
                                    null,    // 编号
                                    null,    // 工作号
                                    crnProtocol.getTaskNo().intValue(),    // 工作号
                                    now,    // 发生时间
                                    null,    // 结束时间
                                    null,    // 工作状态
@@ -1047,7 +1038,7 @@
                        && staProtocol.isInEnable()
                        && staProtocol.isEmptyMk()
                        && staProtocol.isPakMk()
                        && (staProtocol.getWorkNo() !=0 && staProtocol.getWorkNo() > 9700)
                        && staProtocol.getWorkNo() == 9998 // 9997 回退 9998 空 9999 满
                        ) {
                    News.warnNoLog(""+mark+" - 0"+" - 开始执行:空栈板初始化入库,叉车入库站放货");
@@ -1094,7 +1085,7 @@
//                                ledThread.errorReset();
                            }
                        } else {
                            staProtocol.setWorkNo(wrkNo++);
                            staProtocol.setWorkNo(wrkNo);
                            staProtocol.setStaNo(emptyInSta.getBackSta().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
@@ -1179,7 +1170,7 @@
                                        "任务中异常"    // 备注
                                );
                                if (!basDevpErrLogService.insert(basErrLog)) {
                                    log.error("输送线异常信息插入表asr_bas_devp_err_log异常:{}", basErrLog);
                                    News.error("输送线异常信息插入表asr_bas_devp_err_log异常:{}", basErrLog);
                                }
                            }
                        } else {
@@ -1189,7 +1180,7 @@
                                latestByTaskNo.setUpdateTime(now);
                                latestByTaskNo.setStatus(2);
                                if (!basDevpErrLogService.updateById(latestByTaskNo)) {
                                    log.error("输送线异常记录修复失败asr_bas_devp_err_log异常:{}", latestByTaskNo);
                                    News.error("输送线异常记录修复失败asr_bas_devp_err_log异常:{}", latestByTaskNo);
                                }
                            }
                        }
@@ -1202,7 +1193,7 @@
                            if (latest == null || !latest.getError().equals(plcErr) || latest.getStatus() == 2 ) {
                                BasDevpErrLog basErrLog = new BasDevpErrLog(
                                        null,    // 编号
                                        null,    // 工作号
                                        staProtocol.getWorkNo(),    // 工作号
                                        now,    // 发生时间
                                        null,    // 结束时间
                                        null,    // 工作状态
@@ -1224,7 +1215,7 @@
                                        "无任务异常"    // 备注
                                );
                                if (!basDevpErrLogService.insert(basErrLog)) {
                                    log.error("输送线异常记录asr_bas_devp_err_log异常:{}", basErrLog);
                                    News.error("输送线异常记录asr_bas_devp_err_log异常:{}", basErrLog);
                                }
                            }
                            // 无异常
@@ -1235,7 +1226,7 @@
                                latest.setUpdateTime(now);
                                latest.setStatus(2);
                                if (!basDevpErrLogService.updateById(latest)) {
                                    log.error("输送线异常记录修复失败asr_bas_devp_err_log异常:{}", latest);
                                    News.error("输送线异常记录修复失败asr_bas_devp_err_log异常:{}", latest);
                                }
                            }
                        }
@@ -1296,7 +1287,7 @@
    /**
     * 出库  ===>> 工作档信息写入led显示器
     */
    public synchronized void ledExecute(Integer mark) {
    public synchronized void ledExecute() {
        for (LedSlave led : slaveProperties.getLed()) {
            // 获取输送线plc线程
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
@@ -1348,32 +1339,16 @@
                        News.error("任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType());
                        break;
                }
                ledCommand.setLocNo(wrkMast.getLocNo());
                ledCommand.setSourceLocNo(wrkMast.getSourceLocNo());
                ledCommand.setStaNo(wrkMast.getStaNo());
                ledCommand.setBarcode(wrkMast.getBarcode());
                if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) {
                    List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
//                    List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo());
                    wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getSpecs(),wrkDetl.getManuDate(),wrkDetl.getModel(),wrkDetl.getWeight(),wrkDetl.getLength(),wrkDetl.getVolume())));
//                    wrkDetls.forEach(wrkDetl -> {
//                        Double total = 0.0;
//                        EntityWrapper<LocDetl> wrapper = new EntityWrapper<>();
//                        LocDetl locDetl = locDetlService.selectOne(wrapper.eq("zpallet", wrkDetl.getZpallet()).eq("matnr", wrkDetl.getMatnr()));
//                        if (Cools.isEmpty(locDetl)) {
//                            total = wrkDetl.getAnfme();
//                        } else {
//                            total = locDetl.getAnfme();
//                        }
//                        if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 1) {
//                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total));
//                        }
//                        if (wrkMast.getIoType() == 103 && (null == wrkDetl.getInspect() || 0 == wrkDetl.getInspect())) {
//                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total));
//                        }
//                        if (wrkMast.getIoType() == 107) {
//                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total));
//                        }
//                    });
                    wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl.getOrderNo(),wrkDetl.getMatnr(),wrkDetl.getMaktx(),
                            wrkDetl.getBatch(), wrkDetl.getSpecs(),wrkDetl.getManuDate(),wrkDetl.getModel(),wrkDetl.getAnfme())));
                } else {
                    ledCommand.getMatDtos().add(new MatDto("","","","","","","",1.0));
                }
                commands.add(ledCommand);
            }
@@ -1440,7 +1415,7 @@
                }
                ledThread.errorReset();
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(2, new ArrayList<>()))) {
                    News.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                    News.error("显示默认内容{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                }
            }
        }
@@ -1477,7 +1452,7 @@
            if (null == loc) {
                for (Integer row : rows) {
                    if (Utils.isShallowLoc(slaveProperties, row)) {
                        loc = locMastService.queryFreeLocMast(row, shallowLoc.getLocType2());
                        loc = locMastService.queryFreeLocMast(row, shallowLoc.getLocType1());
                        if (null != loc) {//对应深库位非在库状态,不能移库
                            String deepLoc = Utils.getDeepLoc(slaveProperties, loc.getLocNo());
@@ -1609,7 +1584,7 @@
            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
                    && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) {
                // 判断是不是已在原点
                if(crnProtocol.getBay() == 0 && crnProtocol.getLevel() == 1) {
                if(crnProtocol.getBay() == 1 && crnProtocol.getLevel() == 1) {
                    continue;
                }
                // 判断是不是空闲三分钟
@@ -1623,7 +1598,7 @@
                if(diffInMillis < 10 * 1000) { // 空闲小于10秒则跳过
                    continue;
                } else {  // 有入库任务或大于2分钟,回原点
                    int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 1).eq("crn_no", crn.getId()).in("wrk_sts", 2, 9, 10));
                    int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 1).eq("crn_no", crn.getId()).in("wrk_sts", 2));
                    if(count == 0 && diffInMillis < 2 * 60 * 1000) {
                        continue;
                    }
@@ -1639,8 +1614,8 @@
                crnCommand.setCrnNo(crn.getId()); // 堆垛机编号
                crnCommand.setTaskNo((short) 9999); // 工作号
                crnCommand.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式:  回原点
                crnCommand.setSourcePosX((short) (crn.getId() == 1 ? 4 : crn.getId() == 2 ? 6 : crn.getId() == 3 ? 7 : 11));     // 源库位排
                crnCommand.setSourcePosY((short) 0);     // 源库位列
                crnCommand.setSourcePosX((short) (crn.getId() == 1 ? 3 : 6));     // 源库位排
                crnCommand.setSourcePosY((short) 1);     // 源库位列
                crnCommand.setSourcePosZ((short) 1);     // 源库位层
                crnCommand.setDestinationPosX((short) 0);     // 目标库位排
                crnCommand.setDestinationPosY((short) 0);     // 目标库位列
src/main/resources/application.yml
@@ -48,7 +48,7 @@
  # 堆垛机1
  crn[0]:
    id: 1
    ip: 10.10.10.1
    ip: 192.168.5.10
    port: 102
    rack: 0
    slot: 0
@@ -72,7 +72,7 @@
  # 堆垛机2
  crn[1]:
    id: 2
    ip: 10.10.10.10
    ip: 192.168.5.20
    port: 102
    rack: 0
    slot: 0
@@ -97,7 +97,7 @@
  # 输送线1
  devp[0]:
    id: 1
    ip: 10.10.10.18
    ip: 192.168.5.40
    port: 102
    rack: 0
    slot: 0
@@ -149,18 +149,18 @@
  # 条码扫描仪1
  barcode[0]:
    id: 1
    ip: 10.10.10.121
    ip: 192.168.5.42
    port: 51236
  # 条码扫描仪2
  barcode[1]:
    id: 2
    ip: 10.10.10.122
    ip: 192.168.5.43
    port: 51236
  # LED1
  led[0]:
    id: 1
    ip: 10.10.10.190
    ip: 192.168.5.104
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 101
@@ -168,7 +168,7 @@
  # LED2
  led[1]:
    id: 2
    ip: 10.10.10.191
    ip: 192.168.5.105
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 104
@@ -176,7 +176,7 @@
  # LED3
  led[2]:
    id: 3
    ip: 10.10.10.192
    ip: 192.168.5.106
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 106
@@ -184,7 +184,7 @@
  # LED4
  led[3]:
    id: 4
    ip: 10.10.10.192
    ip: 192.168.5.107
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 107
src/main/webapp/views/console.html
@@ -595,37 +595,17 @@
                    for (var i = 0; i < crns.length; i++) {
                        var crnEl = $("#crn-" + crns[i].crnId);
                        crnEl.attr("class", "machine " + crns[i].crnStatus);
                        var unit = 31;//($('.item').eq(0).width() + 13) / 2;
                        if (crns[i].bay < 0 || crns[i].bay === -2) {
                        if (crns[i].bay < 0) {
                            crns[i].bay = 1
                        }
                        // crnEl.animate({left: (crns[i].bay * unit) + 'px'}, 1000);
                        // crns[i].bay = 15;
                        var offSet = 1450;
                        // switch (i) 5
                        //     case 0:
                        //     case 1:
                        //     case 2:
                        //     case 3:
                        //         unit = 35;
                        //         offSet = 500;
                        //         break;
                        //     case 5:
                        //         unit = 124;
                        //         offSet = 550;
                        //         break;
                        //     case 4:
                        //     case 6:
                        //         unit = 62;
                        //         offSet = 550;
                        //         break;
                        // }
                        console.log(offSet)
                        var offSet = 350;
                        if(crns[i].bay === 1){
                            crnEl.animate({left: offSet + 'px'}, 1000);
                        } else {
                            let lf = (offSet - crns[i].bay * 42);
                            let lf = (offSet + (crns[i].bay - 1 )* 50);
                            crnEl.animate({left: lf + 'px'}, 1000);
                        }