#
Junjie
2025-11-18 8f2b1fc281755c110faff41b75d0182b44243811
#
4个文件已添加
1个文件已删除
8个文件已修改
707 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OpenController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/SiteController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 272 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/LocTypeDto.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/DevpThread.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/LiftCommand.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/LiftProtocol.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/TemperatureProtocol.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/WCS与PLC通讯协议.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
File was deleted
src/main/java/com/zy/asrs/controller/SiteController.java
@@ -188,9 +188,6 @@
                    if (staNo != null) {
                        staProtocol.setStaNo(staNo);
                    }
                    if (palletSize != null) {
                        staProtocol.setPalletSize(palletSize);
                    }
                    if (pakMk != null) {
                        staProtocol.setPakMk(pakMk.equals("Y"));
                    }
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -5,15 +5,12 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.mapper.BasCrnErrorMapper;
import com.zy.asrs.mapper.WaitPakinMapper;
import com.zy.asrs.mapper.WrkMastMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
import com.zy.common.constant.RedisConstantType;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.MatDto;
import com.zy.common.model.SearchLocParam;
@@ -29,28 +26,23 @@
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.*;
import com.zy.core.model.*;
import com.zy.core.model.command.CrnCommand;
import com.zy.core.model.command.LedCommand;
import com.zy.core.model.command.RgvCommand;
import com.zy.core.model.command.LiftCommand;
import com.zy.core.model.protocol.CrnProtocol;
import com.zy.core.model.protocol.RgvProtocol;
import com.zy.core.model.protocol.LiftProtocol;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.BarcodeThread;
import com.zy.core.thread.LedThread;
import com.zy.core.thread.RgvThread;
import com.zy.core.thread.SiemensDevpThread;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.*;
import java.util.stream.Collectors;
/**
 * ç«‹ä½“仓库WCS系统主流程业务
@@ -74,8 +66,6 @@
    private WrkDetlService wrkDetlService;
    @Autowired
    private WrkDetlLogService wrkDetlLogService;
    @Autowired
    private WaitPakinMapper waitPakinMapper;
    @Autowired
    private LocMastService locMastService;
    @Autowired
@@ -136,17 +126,13 @@
                        && staProtocol.isInEnable()
                        && !staProtocol.isEmptyMk()
                        && staProtocol.getWorkNo() == 9999
                        && staProtocol.isPakMk() && (staProtocol.getEmptyInType() != 1 && staProtocol.getEmptyInType() != 2)) {
                        && staProtocol.isPakMk()) {
                    News.warnNoLog("" + mark + " - 0" + " - å¼€å§‹æ‰§è¡Œ");
                    String barcode = barcodeThread.getBarcode();
                    if (!Cools.isEmpty(barcode)) {
                        News.info("" + mark + " - 1" + " - {}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
                        if ("NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode)) {
//                            staProtocol.setWorkNo((short) 9992);
//                            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) {
@@ -156,11 +142,6 @@
                            continue;
                        }
                    } else {
//                        staProtocol.setWorkNo((short) 9992);
//                        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) {
@@ -181,13 +162,6 @@
                    }
                    if (wrkMast != null) {
                        News.error("" + mark + " - 4" + " - å·¥ä½œæ¡£ä¸­å·²å­˜åœ¨è¯¥ç«™çŠ¶æ€ä¸ºï¼ˆ 2.设备上走 ï¼‰çš„æ•°æ®,工作号={}", wrkMast.getWrkNo());
//                        staProtocol.setWorkNo((short)9992);
//                        staProtocol.setStaNo(inSta.getBackSta().shortValue());
//                        devpThread.setPakMk(staProtocol.getSiteId(), false);
//                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                        if (!result) {
//                            throw new CoolException("更新plc站点信息失败");
//                        }
                        // led å¼‚常显示
                        if (ledThread != null) {
@@ -197,16 +171,21 @@
                        continue;
                    }
                    if (inSta.getStaNo() == 1002 || inSta.getStaNo() == 1007) {
                        //检测是否有出库任务
                        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                                .in("io_type", 101, 103, 107)
                                .in("sta_no", 1003, 1004)
                        );
                        if (!wrkMasts.isEmpty()) {
                            News.error("" + mark + " - 4" + " - å…¥åº“,检测存在出库任务,等待出库任务执行完成,托盘码={}", barcode);
                            continue;
                        }
                    LiftProtocol liftProtocol = devpThread.getLiftStatus();
                    if(liftProtocol == null) {
                        continue;
                    }
                    if (liftProtocol.getMode() != 1) {
                        continue;
                    }
                    if (liftProtocol.getDeviceStatus() != 0) {
                        continue;
                    }
                    if (liftProtocol.getWorkNo() > 0) {
                        continue;
                    }
                    try {
@@ -227,54 +206,29 @@
                        if (jsonObject.getInteger("code").equals(200)) {
                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
                            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("loc_no", dto.getLocNo()));
                            short staNo = dto.getStaNo().shortValue();
                            int sourceStaNo = dto.getSourceStaNo();
                            if (sourceStaNo == 1007) {
                                staNo = 2002;
                            WrkMast currentWrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", dto.getWorkNo()));
                            if (currentWrkMast == null) {
                                throw new CoolException("WMS生成任务后,WCS查询为空");
                            }
                            if (inSta.getStaNo() == 1002) {
                                staNo = 2002;
                            }
                            Integer staNo = Utils.getStaNoByLocNo(dto.getLocNo());
                            LiftCommand command = new LiftCommand();
                            command.setWorkNo(dto.getWorkNo());
                            command.setSourceStaNo(inSta.getStaNo());
                            command.setTargetStaNo(staNo);
                            barcodeThread.setBarcode("");
                            staProtocol.setWorkNo(dto.getWorkNo().shortValue());
                            staProtocol.setStaNo(staNo);
                            staProtocol.setPalletSize(locMast.getLocType2());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, command));
                            if (!result) {
                                throw new CoolException("更新plc站点信息失败");
                            }
//                            // led å…¥åº“信息显示
//                            if (ledThread != null) {
//                                // å‘½ä»¤é›†åˆ
//                                List<LedCommand> commands = new ArrayList<>();
//                                // ç»„装命令
//                                LedCommand ledCommand = new LedCommand();
//                                ledCommand.setWorkNo(dto.getWorkNo());
//                                ledCommand.setIoType(1);
//                                ledCommand.setTitle("全板入库");
//                                ledCommand.setLocNo(dto.getLocNo());
//                                ledCommand.setStaNo(dto.getStaNo());
//                                commands.add(ledCommand);
//                                MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, commands));
////                                ledThread.errorReset();
//                            }
                            currentWrkMast.setWrkSts(3L);// 3.设备执行中
                            currentWrkMast.setCrnStrTime(new Date());
                            wrkMastService.updateById(currentWrkMast);
                        } else {
                            News.error("" + mark + " - 5" + " - è¯·æ±‚接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
//                            staProtocol.setWorkNo((short)9992);
//                            staProtocol.setStaNo(inSta.getBackSta().shortValue());
//                            devpThread.setPakMk(staProtocol.getSiteId(), false);
//                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                            if (!result) {
//                                throw new CoolException("更新plc站点信息失败");
//                            }
                            // led å¼‚常显示
                            if (ledThread != null) {
@@ -358,11 +312,6 @@
                                .eq("crn_no", wrkMast.getCrnNo()); // å †åž›æœºå·
                        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.setStaNo((short) (pickSta.getStaNo().shortValue()-(short)1));
//                        devpThread.setPakMk(staProtocol.getSiteId(), false);
//                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            //LED
                            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed());
                            // led å¼‚常显示
@@ -370,6 +319,23 @@
                                String errorMsg = "此为拣料、并板、盘点再入库.请放在" + pickSta.getBackSta().shortValue() + "站点";
                                MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(5, errorMsg));
                            }
                            continue;
                        }
                        LiftProtocol liftProtocol = devpThread.getLiftStatus();
                        if(liftProtocol == null) {
                            continue;
                        }
                        if (liftProtocol.getMode() != 1) {
                            continue;
                        }
                        if (liftProtocol.getDeviceStatus() != 0) {
                            continue;
                        }
                        if (liftProtocol.getWorkNo() > 0) {
                            continue;
                        }
@@ -405,16 +371,20 @@
                                    continue;
                                }
                                LocMast locMast = locMastService.selectById(newWrkMast.getLocNo());
                                // æ›´æ–°ç«™ç‚¹ä¿¡æ¯ ä¸” ä¸‹å‘plc命令
                                staProtocol.setWorkNo(newWrkMast.getWrkNo().shortValue());
                                staProtocol.setStaNo(newWrkMast.getStaNo().shortValue());
                                staProtocol.setPalletSize(locMast.getLocType2());
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                                boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                Integer staNo = Utils.getStaNoByLocNo(newWrkMast.getLocNo());
                                LiftCommand command = new LiftCommand();
                                command.setWorkNo(newWrkMast.getWrkNo());
                                command.setSourceStaNo(pickSta.getStaNo());
                                command.setTargetStaNo(staNo);
                                boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, command));
                                if (!result) {
                                    News.error("" + mark + " - 3" + " - å‘布命令至输送线队列失败!!! [plc编号:{}]", devp.getId());
                                    throw new CoolException("更新plc站点信息失败");
                                }
                                newWrkMast.setWrkSts(3L);// 3.设备执行中
                                newWrkMast.setCrnStrTime(new Date());
                                wrkMastService.updateById(newWrkMast);
                            } else {
                                News.error("" + mark + " - 5" + " - è¯·æ±‚接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/pick/loc/v1", JSON.toJSONString(param), response);
                            }
@@ -436,6 +406,128 @@
    }
    /**
     * æ‰§è¡Œå‡ºåº“任务
     */
    public synchronized void executeOutTask() {
        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1);
        if(devpThread == null) {
            return;
        }
        LiftProtocol liftProtocol = devpThread.getLiftStatus();
        if(liftProtocol == null) {
            return;
        }
        if (liftProtocol.getMode() != 1) {
            return;
        }
        if (liftProtocol.getDeviceStatus() != 0) {
            return;
        }
        if (liftProtocol.getWorkNo() > 0) {
            return;
        }
        //检测出库站是否可出
        StaProtocol staProtocol = devpThread.getStation().get(100);
        if (staProtocol == null) {
            return;
        }
        if (!staProtocol.isAutoing()) {
            return;
        }
        if (staProtocol.isLoading()) {
            return;
        }
        if (!staProtocol.isOutEnable()) {
            return;
        }
        //检查是否有正在执行的任务
        List<WrkMast> workingWrkMast = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts", 3, 12));
        if (!workingWrkMast.isEmpty()) {
            return;
        }
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", 11));
        if (wrkMasts.isEmpty()) {
            return;
        }
        WrkMast wrkMast = wrkMasts.get(0);
        Integer sourceStaNo = Utils.getStaNoByLocNo(wrkMast.getSourceLocNo());
        LiftCommand command = new LiftCommand();
        command.setWorkNo(wrkMast.getWrkNo());
        command.setSourceStaNo(sourceStaNo);
        command.setTargetStaNo(100);
        boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, command));
        if (!result) {
            throw new CoolException("更新plc站点信息失败");
        }
        wrkMast.setWrkSts(12L);// 12.设备执行中
        wrkMast.setCrnStrTime(new Date());
        wrkMastService.updateById(wrkMast);
    }
    /**
     * æ£€æµ‹ä»»åŠ¡å®Œæˆ
     */
    public synchronized void deviceFinished() {
        // æ ¹æ®plc遍历
        for (DevpSlave devp : slaveProperties.getDevp()) {
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
            if (devpThread == null) {
                continue;
            }
            LiftProtocol liftProtocol = devpThread.getLiftStatus();
            if (liftProtocol == null) {
                continue;
            }
            if (liftProtocol.getWorkNo() <= 0) {
                continue;
            }
            if (liftProtocol.getMode() != 1) {
                continue;
            }
            if (liftProtocol.getDeviceStatus() != 0) {
                continue;
            }
            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", liftProtocol.getWorkNo()));
            if (wrkMast == null) {
                continue;
            }
            if (wrkMast.getWrkSts() == 3) {
                wrkMast.setWrkSts(4L);
                wrkMast.setCrnEndTime(new Date());
                wrkMast.setIoTime(new Date());
                wrkMastService.updateById(wrkMast);
            }else if (wrkMast.getWrkSts() == 12) {
                wrkMast.setWrkSts(14L);
                wrkMast.setCrnEndTime(new Date());
                wrkMast.setIoTime(new Date());
                wrkMastService.updateById(wrkMast);
            }else {
                News.error("未知的工作状态");
            }
        }
    }
    /**
     * å †åž›æœºå¼‚常信息记录
     */
    public synchronized void recCrnErr(Integer mark) {
src/main/java/com/zy/asrs/utils/Utils.java
@@ -6,6 +6,7 @@
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
@@ -22,6 +23,31 @@
        return (float) Arith.multiplys(2, f, 1);
    }
    public static Integer getStaNoByLocNo(String locNo) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("0100101", 102);
        map.put("0100202", 103);
        map.put("0100102", 104);
        map.put("0100203", 105);
        map.put("0100103", 106);
        map.put("0100204", 107);
        map.put("0100104", 108);
        map.put("0100205", 109);
        map.put("0100105", 110);
        map.put("0100206", 111);
        map.put("0100106", 112);
        map.put("0100207", 113);
        map.put("0100107", 114);
        map.put("0100208", 115);
        map.put("0100108", 116);
        map.put("0100209", 117);
        map.put("0100109", 118);
        map.put("0100210", 119);
        map.put("0100110", 120);
        return map.get(locNo);
    }
    public static String zerofill(String msg, Integer count){
        if (msg.length() == count){
            return msg;
src/main/java/com/zy/common/model/LocTypeDto.java
@@ -29,14 +29,10 @@
    }
    public LocTypeDto(StaProtocol staProtocol) {
        if (staProtocol.isHigh() == staProtocol.isLow()) {
        if (staProtocol.getLocHeight() == null) {
            throw new CoolException("plc高低检测异常");
        }
        if (staProtocol.isLow()) {
            this.locType1 = 1; // ä½Žåº“位
        } else {
            this.locType1 = 2; // é«˜åº“位
        }
        this.locType1 = staProtocol.getLocHeight();
    }
    /**
src/main/java/com/zy/core/DevpThread.java
@@ -1,6 +1,8 @@
package com.zy.core;
import com.zy.core.model.protocol.LiftProtocol;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.model.protocol.TemperatureProtocol;
import java.util.Map;
@@ -8,6 +10,10 @@
    Map<Integer, StaProtocol> getStation();
    Map<Integer, TemperatureProtocol> getTemperatureList();
    LiftProtocol getLiftStatus();
    void setPakMk(Integer siteId, boolean pakMk);
}
src/main/java/com/zy/core/MainProcess.java
@@ -46,8 +46,12 @@
                    Thread.sleep(200);
                    // æ‹£æ–™ã€å¹¶æ¿ã€ç›˜ç‚¹å†å…¥åº“
                    mainService.stnToCrnStnPick(2);
                    // å †åž›æœºå¼‚常信息记录
                    mainService.recCrnErr(3);
                    // æ‰§è¡Œå‡ºåº“任务
                    mainService.executeOutTask();
                    // æ£€æµ‹ä»»åŠ¡å®Œæˆ
                    mainService.deviceFinished();
//                    // å †åž›æœºå¼‚常信息记录
//                    mainService.recCrnErr(3);
                    // å‡ºåº“  ===>> å·¥ä½œæ¡£ä¿¡æ¯å†™å…¥led显示器
                    mainService.ledExecute(4);
                    // å…¶ä»–  ===>> LED显示器复位,显示默认信息
src/main/java/com/zy/core/model/command/LiftCommand.java
New file
@@ -0,0 +1,14 @@
package com.zy.core.model.command;
import lombok.Data;
@Data
public class LiftCommand {
    private Integer workNo;
    private Integer sourceStaNo;
    private Integer targetStaNo;
}
src/main/java/com/zy/core/model/protocol/LiftProtocol.java
New file
@@ -0,0 +1,19 @@
package com.zy.core.model.protocol;
import lombok.Data;
@Data
public class LiftProtocol {
    //0手动 1自动
    private Short mode = 0;
    //0空闲 1运行中
    private Short deviceStatus = 0;
    private Short workNo = 0;
    //0未完成 1已完成
    private Short taskStatus = 0;
}
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -1,6 +1,5 @@
package com.zy.core.model.protocol;
import com.zy.asrs.entity.BasDevp;
import lombok.Data;
/**
@@ -40,59 +39,14 @@
    // æ»¡æ‰˜ç›˜
    private boolean fullPlt;
    // é«˜
    private boolean high;
    // ä½Ž
    private boolean low;
    // é«˜åº¦
    private Short locHeight;
    // é”å®šæ ‡è®°
    private boolean pakMk = true;
    //报警
    private Short error;
    // å‰è¶…报警
    private boolean frontError;
    // åŽè¶…报警
    private boolean backError;
    // è¶…高报警
    private boolean highError;
    // å·¦é«˜æŠ¥è­¦
    private boolean leftError;
    // å³é«˜æŠ¥è­¦
    private boolean rightError;
    // è¶…重报警
    private boolean weightError;
    // æ‰«ç æŠ¥è­¦
    private boolean barcodeError;
    // æ‰˜ç›˜å°ºå¯¸
    private Short palletSize;
    //空托入库类型
    private Short emptyInType;
    public BasDevp toSqlModel(){
        BasDevp basDevp = new BasDevp();
        basDevp.setDevNo(siteId);
        basDevp.setWrkNo(workNo.intValue());
        basDevp.setAutoing(autoing?"Y":"N");
        basDevp.setLoading(loading?"Y":"N");
        basDevp.setInEnable(inEnable?"Y":"N");
        basDevp.setOutEnable(outEnable?"Y":"N");
        basDevp.setLocType1((short) 0);  // é«˜ä½Žç±»åž‹{0:未知,1:低库位,2:高库位}
        basDevp.setLocType2((short) 0);  // å®½çª„类型{0:未知,1:窄库位,2:宽库位}
        basDevp.setLocType3((short) 0);  // è½»é‡ç±»åž‹{0:未知,1:轻库位,2:重库位}
        basDevp.setLocType1(high != low && low ? (short) 1 : (short) 2);
        return basDevp;
    }
    @Override
    public StaProtocol clone() {
src/main/java/com/zy/core/model/protocol/TemperatureProtocol.java
New file
@@ -0,0 +1,14 @@
package com.zy.core.model.protocol;
import lombok.Data;
@Data
public class TemperatureProtocol {
    private Integer deviceId;
    private Short temperature;
    private Short humidity;
}
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -9,9 +9,7 @@
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.DeviceDataLog;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.DeviceDataLogService;
import com.zy.common.utils.News;
import com.zy.core.DevpThread;
@@ -22,7 +20,10 @@
import com.zy.core.enums.SlaveType;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.LiftCommand;
import com.zy.core.model.protocol.LiftProtocol;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.model.protocol.TemperatureProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -32,7 +33,6 @@
/**
 * è¾“送线线程
 * Created by vincent on 2020/8/4
 */
@Data
@Slf4j
@@ -41,7 +41,8 @@
    private DevpSlave slave;
    private SiemensS7Net siemensS7Net;
    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
    private short heartBeatVal = 1;
    private LiftProtocol liftProtocol = new LiftProtocol();
    private Map<Integer, TemperatureProtocol> temperatureMap = new ConcurrentHashMap<>();
    /**
     * æ—¥å¿—采集时间
@@ -51,24 +52,16 @@
    public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{
        add(100);add(101);add(102);add(103);add(104);
        add(105);add(106);add(107);add(108);add(109);
        add(110);
        add(110);add(111);add(112);add(113);add(114);
        add(115);add(116);add(117);add(118);add(119);add(120);
    }};
    public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{
        add(2000);add(2001);add(2002);add(1001);add(1002);add(1003);add(1004);add(1005);add(1006);add(1007);
    }};
    private Integer count = 0;
    public static final ArrayList<Integer> barcode1 = new ArrayList<Integer>() {{
        add(1);
        add(2);
    }};
    public static final ArrayList<Integer> barcode2 = new ArrayList<Integer>() {{
        add(3);
        add(4);
    public static final ArrayList<Integer> temperature1 = new ArrayList<Integer>() {{
        add(1);add(2);add(3);add(4);add(5);add(6);add(7);add(8);add(9);
    }};
    /**
@@ -108,6 +101,15 @@
        }
    }
    private ArrayList<Integer> getTemperature() {
        switch (slave.getId()) {
            case 1:
                return temperature1;
            default:
                throw new CoolException("服务器异常");
        }
    }
    @Override
    @SuppressWarnings("InfiniteLoopStatement")
    public void run() {
@@ -126,7 +128,7 @@
                        break;
                    // å†™æ•°æ® ID+目标站
                    case 2:
                        write((StaProtocol)task.getData());
                        write((LiftCommand) task.getData());
                        break;
                    default:
                        break;
@@ -142,30 +144,26 @@
     * åˆå§‹åŒ–站点状态
     */
    private void initSite() {
        count ++;
        ArrayList<Integer> staNos = getStaNo();
        if(count > 77) {
            // ç«™ç‚¹ç¼–号
            for (Integer siteId : staNos) {
                StaProtocol staProtocol = station.get(siteId);
                if (null == staProtocol) {
                    staProtocol = new StaProtocol();
                    staProtocol.setSiteId(siteId);
                    station.put(siteId, staProtocol);
                }
                staProtocol.setWorkNo((short) 0);    // ID
                staProtocol.setAutoing(false);      // è‡ªåЍ
                staProtocol.setLoading(false);      // æœ‰ç‰©
                staProtocol.setInEnable(false);     // å¯å…¥
                staProtocol.setOutEnable(false);    // å¯å‡º
                staProtocol.setEmptyMk(false);      // ç©ºæ¿ä¿¡å·
                staProtocol.setStaNo((short) 0);     // ç›®æ ‡ç«™
                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                }
        // ç«™ç‚¹ç¼–号
        for (Integer siteId : staNos) {
            StaProtocol staProtocol = station.get(siteId);
            if (null == staProtocol) {
                staProtocol = new StaProtocol();
                staProtocol.setSiteId(siteId);
                station.put(siteId, staProtocol);
            }
            count = 0;
            staProtocol.setWorkNo((short) 0);    // ID
            staProtocol.setAutoing(false);      // è‡ªåЍ
            staProtocol.setLoading(false);      // æœ‰ç‰©
            staProtocol.setInEnable(false);     // å¯å…¥
            staProtocol.setOutEnable(false);    // å¯å‡º
            staProtocol.setEmptyMk(false);      // ç©ºæ¿ä¿¡å·
            staProtocol.setStaNo((short) 0);     // ç›®æ ‡ç«™
            if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                staProtocol.setPakMk(true);
            }
        }
    }
@@ -195,7 +193,7 @@
    private void read() throws InterruptedException {
        ArrayList<Integer> staNos = getStaNo();
        int staNoSize = staNos.size();
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNoSize * 18));
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNoSize * 13));
        if (result.IsSuccess) {
            for (int i = 0; i < staNoSize; i++) {
                Integer siteId = staNos.get(i); // ç«™ç‚¹ç¼–号
@@ -206,21 +204,12 @@
                    station.put(siteId, staProtocol);
                }
                staProtocol.setSiteId(siteId);
                staProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, (i * 18)));     // å·¥ä½œå·
                staProtocol.setStaNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, (i * 18) + 4));   // ç›®æ ‡ç«™
                staProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, (i * 13)));     // å·¥ä½œå·
                staProtocol.setStaNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, (i * 13) + 4));   // ç›®æ ‡ç«™
                staProtocol.setLocHeight(siemensS7Net.getByteTransform().TransInt16(result.Content, (i * 13) + 8));//库位高度
                staProtocol.setError(siemensS7Net.getByteTransform().TransInt16(result.Content, (i * 13) + 10));   // æŠ¥è­¦
                short locHeight = siemensS7Net.getByteTransform().TransInt16(result.Content, (i * 18) + 8);//库位高度
                if (locHeight == 2) {//high
                    staProtocol.setHigh(true);
                    staProtocol.setLow(false);
                }else {//low
                    staProtocol.setHigh(false);
                    staProtocol.setLow(true);
                }
                staProtocol.setError(siemensS7Net.getByteTransform().TransInt16(result.Content, (i * 18) + 10));   // æŠ¥è­¦
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, (i * 18) + 12, 1);
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, (i * 13) + 12, 1);
                staProtocol.setAutoing(status[0]);  // è‡ªåЍ
                staProtocol.setLoading(status[1]);  // æœ‰ç‰©
                staProtocol.setInEnable(status[2]); // å¯å…¥
@@ -228,21 +217,37 @@
                staProtocol.setEmptyMk(status[4]);  // ç©ºæ¿ä¿¡å·
                staProtocol.setFullPlt(status[5]);  // æ»¡æ‰˜ç›˜
                boolean[] statusError = siemensS7Net.getByteTransform().TransBool(result.Content, (i * 18) + 13, 1);
                staProtocol.setFrontError(statusError[0]);  // å‰è¶…报警
                staProtocol.setBackError(statusError[1]);  // åŽè¶…报警
                staProtocol.setHighError(statusError[2]); // è¶…高报警
                staProtocol.setLeftError(statusError[3]);// å·¦é«˜æŠ¥è­¦
                staProtocol.setRightError(statusError[4]);  // å³é«˜æŠ¥è­¦
                staProtocol.setWeightError(statusError[5]);  // è¶…重报警
                staProtocol.setBarcodeError(statusError[6]);  // æ‰«ç æŠ¥è­¦
                short emptyInType = siemensS7Net.getByteTransform().TransInt16(result.Content, (i * 18) + 14);//预留1-空托入库类型,1:立库方向 2:产线方向
                staProtocol.setEmptyInType(emptyInType);
                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                }
            }
        }
        //任务信息反馈
        Thread.sleep(200);
        OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB101.400", (short) 10);
        if (result3.IsSuccess) {
            liftProtocol.setMode(siemensS7Net.getByteTransform().TransInt16(result3.Content, 0));     // æ¨¡å¼
            liftProtocol.setDeviceStatus(siemensS7Net.getByteTransform().TransInt16(result3.Content, 2));     // è®¾å¤‡çŠ¶æ€
            liftProtocol.setTaskStatus(siemensS7Net.getByteTransform().TransInt16(result3.Content, 4));     // å®Œæˆä¿¡å·
            liftProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt32(result3.Content, 6));     // å·¥ä½œå·
        }
        //温湿度信息反馈
        Thread.sleep(200);
        ArrayList<Integer> temperatureList = getTemperature();
        OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB101.300", (short) (temperatureList.size() * 4));
        if (result4.IsSuccess) {
            for (int i = 0; i < temperatureList.size(); i++) {
                Integer deviceId = temperatureList.get(i); // ç¼–号
                TemperatureProtocol temperatureProtocol = temperatureMap.get(deviceId);
                if (null == temperatureProtocol) {
                    temperatureProtocol = new TemperatureProtocol();
                    temperatureProtocol.setDeviceId(deviceId);
                    temperatureMap.put(deviceId, temperatureProtocol);
                }
                temperatureProtocol.setTemperature(siemensS7Net.getByteTransform().TransInt16(result4.Content, (i * 4)));     // æ¸©åº¦
                temperatureProtocol.setHumidity(siemensS7Net.getByteTransform().TransInt16(result4.Content, (i * 4) + 2));   // æ¹¿åº¦
            }
        }
@@ -280,91 +285,31 @@
        if (result.IsSuccess && result2.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()));
        }
    }
    /**
     * å†™å…¥ ID+目标站 =====> å•站点写入
     * å†™å…¥å‘½ä»¤
     */
    private void write(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {
    private void write(LiftCommand liftCommand) throws InterruptedException {
        if (null == liftCommand) {
            return;
        }
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        int[] array = new int[3];
        array[0] = staProtocol.getWorkNo().intValue();
        array[1] = staProtocol.getStaNo().intValue();
        array[2] = staProtocol.getPalletSize().intValue();
        array[0] = liftCommand.getWorkNo();
        array[1] = liftCommand.getSourceStaNo();
        array[2] = liftCommand.getTargetStaNo();
        OperateResult write = siemensS7Net.Write("DB102." + index * 16, array);
//        OperateResult write = null;
//        OperateResult write1 = null;
//        //任务下发次数
//        int writeCount = 0;
//        do {
//            write = siemensS7Net.Write("DB100." + index*2, staProtocol.getWorkNo());    // å·¥ä½œå·
//            Thread.sleep(500);
//            write1 = siemensS7Net.Write("DB101." + index*2, staProtocol.getStaNo());    // ç›®æ ‡ç«™
//            if(write.IsSuccess || write1.IsSuccess){
//                Thread.sleep(200);
//                OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB100." + index*2, (short) 2);
//                OperateResultExOne<byte[]> readResult1 = siemensS7Net.Read("DB101." + index*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);
        OperateResult write = siemensS7Net.Write("DB100.0", array);
        if (!write.IsSuccess) {
            staProtocol = station.get(staProtocol.getSiteId());
            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
                staProtocol.setPakMk(true);
            }
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
            News.error("SiemensDevp"+" - 4"+" - å†™å…¥è¾“送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(liftCommand)));
            News.error("SiemensDevp"+" - 4"+" - å†™å…¥è¾“送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(liftCommand));
        } 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));
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 è¾“送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(liftCommand)));
            News.info("SiemensDevp"+" - 5"+" - è¾“送线命令下发 [id:{}] >>>>> å‘½ä»¤ä¸‹å‘: {}",  slave.getId(), JSON.toJSON(liftCommand));
        }
    }
@@ -384,17 +329,13 @@
        siemensS7Net.ConnectClose();
    }
    public static void main(String[] args) {
        System.out.println(staNos1.indexOf(129));
        System.out.println(staNos1.size());
        for (int i = 0; i<staNos1.size(); i++) {
//            System.out.println(i*2);
//            System.out.println(i*2 + 200);
//            System.out.println(i);
        }
        int index = staNos1.indexOf(128);
        System.out.println(index*2);
        System.out.println(index*2 + 200);
    @Override
    public Map<Integer, TemperatureProtocol> getTemperatureList() {
        return this.temperatureMap;
    }
    @Override
    public LiftProtocol getLiftStatus() {
        return this.liftProtocol;
    }
}
src/main/resources/WCSÓëPLCͨѶЭÒé.docx
Binary files differ