#
Junjie
2025-05-13 d6a0fd27dde43c28bc37c63eac3addfb6b52926d
#
7个文件已修改
1个文件已删除
1316 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/ConsoleController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/SiteController.java 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/enums/SiteStatusType.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/LocTypeDto.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 249 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread2.java 865 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -116,7 +116,7 @@
            SiteLatestDataVo vo = new SiteLatestDataVo();
            StaProtocol staProtocol = entry.getValue();
            vo.setSiteId(String.valueOf(entry.getKey())); // 站点编号
            vo.setWorkNo(staProtocol.getWorkNo()); // 工作号
            vo.setWorkNo(staProtocol.getWorkNo().shortValue()); // 工作号
            vo.setSiteStatus(SiteStatusType.process(staProtocol));  // 状态
            vos.add(vo);
        }
@@ -276,7 +276,7 @@
                        return R.error("数据库维护异常");
                    }
                    vo.setSiteId(siteId);   // 站点编号
                    vo.setWorkNo(staProtocol.getWorkNo());   // 工作号
                    vo.setWorkNo(staProtocol.getWorkNo().shortValue());   // 工作号
                    if (staProtocol.getWorkNo() > 0) {
                        TaskWrk taskWrk = taskWrkService.selectByWrkNo(staProtocol.getWorkNo().intValue());
@@ -290,8 +290,8 @@
                        }
                    }
                    vo.setAutoing(staProtocol.stateType == DevpStateType.AUTO ? "Y" : "N"); //  自动
//                    vo.setLoading(staProtocol.isLoading()?"Y":"N"); //  有物
                    vo.setAutoing(staProtocol.isAutoing() ? "Y" : "N"); //  自动
                    vo.setLoading(staProtocol.isLoading() ? "Y" : "N"); //  有物
                    vo.setCanining(basDevp.getCanining());  //  能入
                    vo.setCanouting(basDevp.getCanouting());    //  能出
src/main/java/com/zy/asrs/controller/SiteController.java
@@ -73,15 +73,15 @@
            list.add(vo);
            StaProtocol staProtocol = station.get(devp.getDevNo());
            if (null == staProtocol) { continue; }
            vo.setWorkNo(staProtocol.getWorkNo());   //  工作号
            vo.setAutoing(staProtocol.stateType == DevpStateType.AUTO?"Y":"N");     //  自动
            vo.setLoading(staProtocol.workType == DevpWorkType.BUSY?"Y":"N");     // 有物
            vo.setInEnable(staProtocol.requestType == DevpRequestType.IN?"Y":"N");   // 可入
            vo.setOutEnable(staProtocol.requestType == DevpRequestType.OUT?"Y":"N"); // 可出
            vo.setAutoing(staProtocol.isAutoing()?"Y":"N");     //  自动
            vo.setLoading(staProtocol.isLoading()?"Y":"N");     // 有物
            vo.setInEnable(staProtocol.isInEnable()?"Y":"N");   // 可入
            vo.setOutEnable(staProtocol.isOutEnable()?"Y":"N"); // 可出
            vo.setPakMk(staProtocol.isPakMk()?"Y":"N");       // 入库标记
            vo.setEmptyMk(staProtocol.trayType == DevpTrayType.EMPTY?"Y":"N");     // 空板信号
            vo.setEmptyMk(staProtocol.isEmptyMk()?"Y":"N");     // 空板信号
            vo.setStaNo(staProtocol.getStaNo());                // 目标站
            vo.setLocType1(staProtocol.locType.desc);
//            vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "低" : "高");     //高低库位
            vo.setLocType1(devp.getDevNo()==102 ? "高" : "低");
        }
        return R.ok().add(list);
    }
@@ -105,14 +105,15 @@
            list.add(vo);
            StaProtocol staProtocol = station.get(devp.getDevNo());
            if (null == staProtocol) { continue; }
            vo.setAutoing(staProtocol.stateType == DevpStateType.AUTO?"Y":"N");     //  自动
            vo.setLoading(staProtocol.workType == DevpWorkType.BUSY?"Y":"N");     // 有物
            vo.setInEnable(staProtocol.requestType == DevpRequestType.IN?"Y":"N");   // 可入
            vo.setOutEnable(staProtocol.requestType == DevpRequestType.OUT?"Y":"N"); // 可出
            vo.setAutoing(staProtocol.isAutoing()?"Y":"N");     //  自动
            vo.setLoading(staProtocol.isLoading()?"Y":"N");     // 有物
            vo.setInEnable(staProtocol.isInEnable()?"Y":"N");   // 可入
            vo.setOutEnable(staProtocol.isOutEnable()?"Y":"N"); // 可出
            vo.setPakMk(staProtocol.isPakMk()?"Y":"N");       // 入库标记
            vo.setEmptyMk(staProtocol.trayType == DevpTrayType.EMPTY?"Y":"N");     // 空板信号
            vo.setEmptyMk(staProtocol.isEmptyMk()?"Y":"N");     // 空板信号
            vo.setStaNo(staProtocol.getStaNo());                // 目标站
            vo.setLocType1(staProtocol.locType.desc);
//            vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "低" : "高");     //高低库位
            vo.setLocType1(devp.getDevNo()==102 ? "高" : "低");
        }
        return R.ok().add(list);
@@ -163,17 +164,15 @@
                if (siteId.equals(entry.getKey())) {
                    StaProtocol staProtocol = entry.getValue();
                    vo.setDevNo(entry.getKey());    // 站点编号
                    vo.setWorkNo(staProtocol.getWorkNo());   //  工作号
                    vo.setAutoing(staProtocol.stateType == DevpStateType.AUTO?"Y":"N");     //  自动
                    vo.setLoading(staProtocol.workType == DevpWorkType.BUSY?"Y":"N");     // 有物
                    vo.setInEnable(staProtocol.requestType == DevpRequestType.IN?"Y":"N");   // 可入
                    vo.setOutEnable(staProtocol.requestType == DevpRequestType.OUT?"Y":"N"); // 可出
                    vo.setPakMk(staProtocol.isPakMk()?"Y":"N");       // 入库标记
                    vo.setEmptyMk(staProtocol.trayType == DevpTrayType.EMPTY?"Y":"N");     // 空板信号
                    vo.setWorkNo(staProtocol.getWorkNo().shortValue());   //  工作号
                    vo.setAutoing(staProtocol.isAutoing()?"Y":"N");     //  自动
                    vo.setLoading(staProtocol.isLoading()?"Y":"N");     // 有物
                    vo.setInEnable(staProtocol.isInEnable()?"Y":"N");   // 可入
                    vo.setOutEnable(staProtocol.isOutEnable()?"Y":"N"); // 可出
                    vo.setPakMk(staProtocol.isPakMk()?"Y":"N");       // 需求1
                    vo.setEmptyMk(staProtocol.trayType == DevpTrayType.EMPTY?"Y":"N");     // 空板信号
                    vo.setEmptyMk(staProtocol.isEmptyMk()?"Y":"N");     // 空板信号
                    vo.setStaNo(staProtocol.getStaNo());                // 目标站
                    vo.setLocType1(staProtocol.locType.desc);     //高低库位
                    vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "低" : "高");     //高低库位
                    return R.ok().add(vo);
                }
            }
@@ -199,7 +198,7 @@
                        staProtocol = staProtocol.clone();
                    }
                    if (workNo != null) {
                        staProtocol.setWorkNo(workNo.shortValue());
                        staProtocol.setWorkNo(workNo);
                    }
                    if (staNo != null) {
                        staProtocol.setStaNo(staNo);
src/main/java/com/zy/asrs/domain/enums/SiteStatusType.java
@@ -27,19 +27,19 @@
        if (staProtocol == null) {
            return null;
        }
        if (staProtocol.stateType == DevpStateType.AUTO && staProtocol.workType == DevpWorkType.BUSY && staProtocol.getWorkNo() > 0) {
        if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0) {
            return SITE_AUTO_RUN_ID;
        }
        if (staProtocol.stateType == DevpStateType.AUTO && staProtocol.workType == DevpWorkType.BUSY) {
        if (staProtocol.isAutoing() && staProtocol.isLoading()) {
            return SITE_AUTO_RUN;
        }
        if (staProtocol.stateType == DevpStateType.AUTO && staProtocol.getWorkNo() > 0) {
        if (staProtocol.isAutoing() && staProtocol.getWorkNo() > 0) {
            return SITE_AUTO_ID;
        }
        if (staProtocol.stateType == DevpStateType.AUTO) {
        if (staProtocol.isAutoing()) {
            return SITE_AUTO;
        }
        if (staProtocol.stateType != DevpStateType.AUTO) {
        if (!staProtocol.isAutoing()) {
            return SITE_UNAUTO;
        }
        return null;
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -116,7 +116,7 @@
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    Short workNo = staProtocol.getWorkNo();
                    Short workNo = staProtocol.getWorkNo().shortValue();
                    Short stano = staProtocol.getStaNo();
                    // 尺寸检测异常
@@ -152,10 +152,10 @@
                    }
                    // 判断是否满足入库条件
                    if (staProtocol.stateType == DevpStateType.AUTO
                            && staProtocol.workType == DevpWorkType.BUSY
                            && staProtocol.requestType == DevpRequestType.IN
                            && staProtocol.trayType == DevpTrayType.FULL
                    if (staProtocol.isAutoing()
                            && staProtocol.isLoading()
                            && staProtocol.isInEnable()
                            && !staProtocol.isEmptyMk()
                            && staProtocol.isPakMk()) {
                        // 获取条码扫描仪信息
                        BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
@@ -252,7 +252,7 @@
                            StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                    .eq("crn_no", taskWrk.getCrnNo()).eq("type_no", 1).eq("stn_no", staProtocol.getSiteId()));
                            staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
                            staProtocol.setWorkNo(taskWrk.getWrkNo());
                            staProtocol.setStaNo(staDesc.getCrnStn().shortValue());
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
@@ -329,10 +329,7 @@
                            staProtocol = staProtocol.clone();
                        }
                        if (staProtocol.stateType == DevpStateType.AUTO
                                && staProtocol.workType == DevpWorkType.BUSY
                                && staProtocol.requestType == DevpRequestType.OUT
                                && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) {
                        if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == null)) {
                            // 查询工作档
                            TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnSlave.getId(), staDesc.getStnNo().toString());
                            if (taskWrk == null) {
@@ -340,7 +337,7 @@
                            }
                            log.info("下发输送线任务:taskWrk:" + JSON.toJSONString(taskWrk));
//                            R r = siteController.siteDetlUpdate(Integer.valueOf(taskWrk.getTargetPoint()), taskWrk.getWrkNo().shortValue(), (short) 0, "Y", false, false);
                            staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
                            staProtocol.setWorkNo(taskWrk.getWrkNo());
                            staProtocol.setStaNo(staDesc.getStnNo().shortValue());
                            boolean offer = false;
                            try {
@@ -442,7 +439,8 @@
                    continue;
                }
                if (staProtocol.stateType == DevpStateType.AUTO && staProtocol.workType == DevpWorkType.BUSY && staProtocol.getWorkNo() > 0) {
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable()
                        && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
                    flag = true;
                }
                if (!flag) {
@@ -564,10 +562,8 @@
                    }
                    // 判断堆垛机出库站状态
                    if (staProtocol.stateType == DevpStateType.AUTO
                            && staProtocol.workType == DevpWorkType.IDLE
                            && staProtocol.requestType == DevpRequestType.OUT
                            && staProtocol.getWorkNo() == 0) {
                    if (staProtocol.isAutoing() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")
                    ) {
                        // 命令下发区 --------------------------------------------------------------------------
                        // 堆垛机控制过滤
src/main/java/com/zy/common/model/LocTypeDto.java
@@ -32,12 +32,15 @@
    }
    public LocTypeDto(StaProtocol staProtocol) {
        if (staProtocol.locType.id.shortValue()!=1 && staProtocol.locType.id.shortValue()!=2 && staProtocol.locType.id.shortValue()!=3) {
        if (staProtocol.isHigh() == staProtocol.isLow()) {
            throw new CoolException("plc高低检测异常");
        }
        this.locType1 = staProtocol.locType.id.shortValue();
        if (staProtocol.isLow()) {
            this.locType1 = 1; // 低库位
        } else {
            this.locType1 = 2; // 高库位
        }
    }
    /**
     * 库位类型解析
     */
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -1,11 +1,7 @@
package com.zy.core.model.protocol;
import com.zy.asrs.entity.BasDevp;
import com.zy.core.enums.DevpType.*;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
 * 输送线plc单个站点详细信息
@@ -19,68 +15,36 @@
    // ----------------------------------------------------------------
    // 工作号
    private Short workNo = 0;
    private Integer workNo = 0;
    // ----------------------------------------------------------------
    // 目标站
    private Short staNo;
    //指令ID
    private Integer commandId;
    // ----------------------------------------------------------------
    //模式
    private Short mode;
    public DevpModeType modeType;
    //状态
    private Short state;
    public DevpStateType stateType;
    //工作状态
    private Short workIo;
    public DevpWorkType workType;
    //请求信号
    private Short requestIo;
    public DevpRequestType requestType;
    //托盘状态
    private Short trayIo;
    public DevpTrayType trayType;
    //库位状态
    private Short locIo;
    public DevpLocType locType;
    //条码信息
    private String barcode;
    //重量信息
    private Double weightIo;
    //备用
    private Short spare;
    // 自动
    private boolean autoing;
    public void setMode(Short mode) {
        this.mode = mode;
        this.modeType = DevpModeType.get(mode);
    }
    public void setState(Short state) {
        this.state = state;
        this.stateType = DevpStateType.get(state);
    }
    public void setWorkIo(Short workIo) {
        this.workIo = workIo;
        this.workType = DevpWorkType.get(workIo);
    }
    public void setRequestIo(Short requestIo) {
        this.requestIo = requestIo;
        this.requestType = DevpRequestType.get(requestIo);
    }
    public void setTrayIo(Short trayIo) {
        this.trayIo = trayIo;
        this.trayType = DevpTrayType.get(trayIo);
    }
    public void setLocIo(Short locIo) {
        this.locIo = locIo;
        this.locType = DevpLocType.get(locIo);
    }
    // 有物
    private boolean loading;
    // 可入
    private boolean inEnable;
    // 可出
    private boolean outEnable;
    // 空板信号
    private boolean emptyMk;
    // 满托盘
    private boolean fullPlt;
    // 高
    private boolean high;
    // 低
    private boolean low;
    // 锁定标记
    private boolean pakMk = true;
@@ -88,9 +52,14 @@
    // 入库暂存数
    private Short inQty;
    // 隔壁站点(台车位置)
    private String nearbySta;
    //lfd入库印记  当stamp>=2时才入库
    private Integer stamp = 0;
    //指令ID
    private Integer commandId;
    // 外形检测 ------------------------------------------------------------------------
@@ -140,26 +109,19 @@
        }
    }
    public Boolean isPakReset(){
        if (workNo == 0 && workType == DevpWorkType.BUSY && requestType != DevpRequestType.IN){
            return true;
        }
        return false;
    }
    public BasDevp toSqlModel(){
        BasDevp basDevp = new BasDevp();
        basDevp.setDevNo(siteId);
        basDevp.setWrkNo(workNo.intValue());
        basDevp.setAutoing(stateType == DevpStateType.AUTO?"Y":"N");
        basDevp.setLoading(workType == DevpWorkType.BUSY?"Y":"N");
        basDevp.setInEnable(requestType == DevpRequestType.IN?"Y":"N");
        basDevp.setOutEnable(requestType == DevpRequestType.OUT?"Y":"N");
        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(DevpLocType.get(locIo).id.shortValue());
//        basDevp.setInQty(inQty !=null ?(int)inQty : 0);
        basDevp.setLocType1(high != low && low ? (short) 1 : (short) 2);
        basDevp.setInQty(inQty !=null ?(int)inQty : 0);
        return basDevp;
    }
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -5,6 +5,7 @@
import HslCommunication.Profinet.Siemens.SiemensPLCS;
import HslCommunication.Profinet.Siemens.SiemensS7Net;
import com.alibaba.fastjson.JSON;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.core.exception.CoolException;
@@ -14,7 +15,7 @@
import com.zy.core.DevpThread;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.DevpType.DevpWorkType;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.IoModeType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.DevpSlave;
@@ -42,8 +43,9 @@
    private SiemensS7Net siemensS7Net;
    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
    private short heartBeatVal = 1;
    public static boolean is = true;
//    public static final ArrayList<Integer> staNos = new ArrayList<Integer>() {{
//
//    }};
    public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{
        add(101);add(102);add(103);add(104);
        add(105);add(106);add(107);add(108);
@@ -51,16 +53,20 @@
        add(206);add(207);add(208);add(209);add(210);
        add(211);add(212);
    }};
//    public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{
//       add(1040);add(1041);add(1042);add(1043);add(1044);add(1045);add(1046);add(1047);
//       add(2010);add(2011);add(2012);add(2013);add(2014);add(2015);add(2016);add(2017);
//       add(3010);add(3011);add(3012);add(3013);add(3014);add(3015);add(3016);add(3017);
//    }};
    public static final ArrayList<Integer> BarcodeList = new ArrayList<Integer>() {{
        add(1);add(2);add(3);add(4);
        add(5);add(6);add(7);add(8);
    }};
    public static final ArrayList<Integer> staNosErrList = new ArrayList<Integer>() {{
        add(106); add(107); add(159);
    }};
    /**
     * 条码数量
     */
    private int barcodeSize = 8;
    private int barcodeSize = 6;
    /**
     * 入出库模式
@@ -83,8 +89,6 @@
        switch (slave.getId()) {
            case 1:
                return staNos1;
//            case 2:
//                return staNos2;
            default:
                throw new CoolException("服务器异常");
        }
@@ -108,8 +112,8 @@
                        break;
                    // 写数据 ID+目标站
                    case 2:
                        writeD((StaProtocol)task.getData(),1);
//                        log.error("输送线下发命令:"+((StaProtocol) task.getData()).getWorkNo()+","+((StaProtocol) task.getData()).getStaNo());
                        write((StaProtocol)task.getData());
                        log.error("输送线下发命令:"+((StaProtocol) task.getData()).getWorkNo()+","+((StaProtocol) task.getData()).getStaNo());
                        break;
                    default:
                        break;
@@ -136,18 +140,15 @@
                staProtocol.setSiteId(siteId);
                station.put(siteId, staProtocol);
            }
            staProtocol.setWorkNo((short) 0);     // 工作号
            staProtocol.setStaNo((short) 0);   // 目标站
            staProtocol.setState((short) 0);  // 模式状态 0停机,=1手动,=2自动,=3故障
            staProtocol.setWorkIo((short) 0);
            staProtocol.setRequestIo((short) 0);
            staProtocol.setTrayIo((short) 0);
            staProtocol.setLocIo((short) 0);
            staProtocol.setBarcode("-");
            staProtocol.setWeightIo(0.0);
            staProtocol.setMode((short) 0);
            staProtocol.setWorkNo(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.workType == DevpWorkType.IDLE) {
            if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                staProtocol.setPakMk(true);
            }
        }
@@ -181,35 +182,91 @@
//        updateIoMode();
        ArrayList<Integer> staNos = getStaNo();
        int staNoSize = staNos.size();
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB100.0", (short) (staNoSize*66));
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB107.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.setSiteId(siteId);
                staProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, i*66 + 8));     // 工作号
                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*66 + 12));   // 目标站
                staProtocol.setState(siemensS7Net.getByteTransform().TransInt16(result.Content, i*66 + 14));  // 模式状态 0停机,=1手动,=2自动,=3故障
                staProtocol.setWorkIo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*66 + 16));
                staProtocol.setRequestIo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*66 + 18));
                staProtocol.setTrayIo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*66 + 20));
                staProtocol.setLocIo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*66 + 22));
                staProtocol.setBarcode(siemensS7Net.getByteTransform().TransString(result.Content,i*66 + 24,16, "UTF-8").trim());
//                staProtocol.setWeightIo(siemensS7Net.getByteTransform().TransDouble(result.Content,i*66 + 40));
                staProtocol.setMode(siemensS7Net.getByteTransform().TransInt16(result.Content, i*66 + 44));
                staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, i*8));     // 工作号
                if (!staProtocol.isPakMk() && (staProtocol.workType == DevpWorkType.IDLE  || staProtocol.isPakReset())) {
                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*8 + 4));   // 目标站
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i*8 + 6, 2);
                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]);      // 低库位
                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                }
            }
        }
        //条码扫描器
        ArrayList<Integer> barcodeList = BarcodeList;
        OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB107.840", (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 + 1);
                if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
                    barcodeThread.setBarcode(barcode);
                }
            }
        }
        //外形检测
        ArrayList<Integer> staNoErrs = staNosErrList;
        int staNoErrsSize = staNoErrs.size();
        OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB107.800", (short) (staNoErrsSize*8));
        if (resultErr.IsSuccess){
            for (int i = 0;i<3;i++){
                Integer siteId = staNoErrs.get(i); // 站点编号
                boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.Content, i*4+2, 1);
                StaProtocol staProtocol = station.get(siteId);
                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]);
            }
        }
        OperateResultExOne<byte[]> resultErr2 = siemensS7Net.Read("DB13.2", (short) (staNoSize*4));
        if (resultErr2.IsSuccess) {
            for (int i = 0; i < staNoSize; i++) {
                Integer siteId = staNos.get(i); // 站点编号
                boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr2.Content, i*4, 1);
                StaProtocol staProtocol = station.get(siteId);
                staProtocol.setBreakerErr(status[0]);
                staProtocol.setInfraredErr(status[1]);
                staProtocol.setOutTimeErr(status[2]);
                staProtocol.setSeizeSeatErr(status[3]);
                staProtocol.setWrkYgoodsN(status[4]);
                staProtocol.setInverterErr(status[5]);
                staProtocol.setContactErr(status[6]);
                staProtocol.setUpcontactErr(status[7]);
            }
        }
        if (result.IsSuccess) {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
            // 根据实时信息更新数据库
            try {
                List<BasDevp> basDevps = new ArrayList<>();
@@ -217,6 +274,7 @@
                    StaProtocol staProtocol = station.get(siteId);
                    basDevps.add(staProtocol.toSqlModel());
                }
                BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
                if (null != basDevpService && !basDevpService.updateBatchById(basDevps)) {
                    throw new Exception("更新数据库数据失败");
@@ -245,14 +303,14 @@
        int index = staNos.indexOf(staProtocol.getSiteId());
        OperateResult write = null;
        OperateResult write1 = null;
        OperateResult write2 = null;
        //任务下发次数
        int writeCount = 0;
        do {
            write = siemensS7Net.Write("DB100." + index*66, staProtocol.getWorkNo());    // 工作号
            write = siemensS7Net.Write("DB108." + index*6, staProtocol.getWorkNo());    // 工作号
            Thread.sleep(200);
            write1 = siemensS7Net.Write("DB100." + (index*66+4), staProtocol.getStaNo());    // 目标站
            write1 = siemensS7Net.Write("DB108." + (index*6+4), staProtocol.getStaNo().shortValue());    // 目标站
            if(write.IsSuccess && write1.IsSuccess){
                log.error("写入输送线命令成功。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                break;
            }
            else {
@@ -274,114 +332,15 @@
        }
    }
    private void writeD(StaProtocol staProtocol,Integer count)throws InterruptedException{
        boolean reset = true;
        if (null == staProtocol) {
            return;
        }
        staProtocol = staProtocol.clone();
        short oriWrkNo = staProtocol.getWorkNo();
        short oriStaNo = staProtocol.getStaNo();
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        if(writeWrk(staProtocol,1)){
            int whileCount = 0;
            OperateResult write3 = siemensS7Net.Write("DB100." + (index*66+6), (short) 1);
            if (write3.IsSuccess){
                News.info("输送线命令下发[id:"+slave.getId()+"] >>>>>"+"["+1+"]");
                Thread.sleep(100);
                do {
                    OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB100." + (index * 66 + 6), (short) 2);
                    short mk = siemensS7Net.getByteTransform().TransInt16(result2.Content, 0);
                    if (mk == 2) {
                        OperateResult write5 = siemensS7Net.Write("DB100." + index * 66, 0);    // 工作号
                        Thread.sleep(100);
                        OperateResult write6 = siemensS7Net.Write("DB100." + (index * 66 + 4), (short) 0);    // 目标站
                        Thread.sleep(100);
                        OperateResult write4 = siemensS7Net.Write("DB100." + (index * 66 + 6), (short) 0);
                        reset = false;
                        if (write4.IsSuccess && write5.IsSuccess && write6.IsSuccess) {
                            News.info("输送线命令下发[id:" + slave.getId() + "] >>>>>" + "[" + "0,0,0" + "]");
                            OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB100." + (index * 66), (short) 8);
                            Integer wrkNo1 = siemensS7Net.getByteTransform().TransInt32(result1.Content, 0);
                            short staNo1 = siemensS7Net.getByteTransform().TransInt16(result1.Content, 4);
                            short mk1 = siemensS7Net.getByteTransform().TransInt16(result1.Content, 6);
                            if (wrkNo1 != 0 || staNo1 != 0 || mk1 != 0) {
                                whileCount++;
                                News.info("复位失败,输送线命令下发[id:" + slave.getId() + "] >>>>>" + "[" + "0,0,0" + "]");
                            } else {
                                News.info("输送线复位完成");
                                break;
                            }
                        }
                    } else if (reset && mk == 0) {
                        OperateResult write7 = siemensS7Net.Write("DB100." + (index * 66 + 6), (short) 1);
                        News.info("回读1失败,输送线命令下发[id:" + slave.getId() + "] >>>>>" + "[" + "1" + "]");
                        Thread.sleep(100);
                        whileCount++;
                    } else {
                        whileCount++;
                    }
                } while (whileCount < 10);
    // 更新入出库模式
    private void updateIoMode() throws InterruptedException {
        if (this.ioModeOf2F != IoModeType.NONE) {
            if (!siemensS7Net.Write("DB107.180", this.ioModeOf2F.id).IsSuccess) {
                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线2F入出库模式失败。输送线plc编号={1}", slave.getId()));
                News.error("SiemensDevp"+" - 6"+" - 写入输送线2F入出库模式失败。输送线plc编号={}", slave.getId());
            }
        }else {
            log.error("输送命令下发失败"+JSON.toJSONString(staProtocol));
        }
    }
    private boolean writeWrk(StaProtocol staProtocol,Integer count)throws InterruptedException {
        if (null == staProtocol) {
            return false;
        }
        short oriWrkNo = staProtocol.getWorkNo();
        short oriStaNo = staProtocol.getStaNo();
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        do {
            log.info("输送递归次数:" + count);
            OperateResult write1 = siemensS7Net.Write("DB100." + index * 66, staProtocol.getWorkNo().intValue());    // 工作号
            Thread.sleep(100);
            OperateResult write2 = siemensS7Net.Write("DB100." + (index * 66 + 4), staProtocol.getStaNo());    // 目标站
            if (write1.IsSuccess && write2.IsSuccess) {
                News.info("输送线命令下发[id:" + slave.getId() + "] >>>>>" + "[" + staProtocol.getWorkNo() + "," + staProtocol.getStaNo() + "]");
                OperateResultExOne<byte[]> result = siemensS7Net.Read("DB100." + (index * 66), (short) 6);
                Integer wrkNo = siemensS7Net.getByteTransform().TransInt32(result.Content, 0);
                short staNo = siemensS7Net.getByteTransform().TransInt16(result.Content, 4);
                if (!(oriWrkNo == wrkNo) || oriStaNo != staNo) {
                    if (count >= 5) {
                        log.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), count);
                        return false;
                    }
                    count++;
                }else {
                    return true;
                }
            }
        }while (count <=5);
        return true;
    }
//    // 更新入出库模式
//    private void updateIoMode() throws InterruptedException {
//        if (this.ioModeOf2F != IoModeType.NONE) {
//            if (!siemensS7Net.Write("DB100.180", this.ioModeOf2F.id).IsSuccess) {
//                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线2F入出库模式失败。输送线plc编号={1}", slave.getId()));
//                News.error("SiemensDevp"+" - 6"+" - 写入输送线2F入出库模式失败。输送线plc编号={}", slave.getId());
//            }
//        }
//    }
    /**
     * 心跳
src/main/java/com/zy/core/thread/SiemensDevpThread2.java
File was deleted