#
lsh
2024-06-21 c147a3dc2a56ab23b1cfeafef3de2867593f4206
#
9个文件已修改
2个文件已添加
580 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/BasJar.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/JarTaskModeType.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/JarSlave.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/JarCommand.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/SteCommand.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/JarProtocol.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/JarThread.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SteThread.java 301 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasJar.java
@@ -1,6 +1,6 @@
package com.zy.asrs.entity;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -4417,7 +4417,7 @@
                    continue;
                }
                BasJarMast jarMastByJarIdMax = basJarMastService.getJarMastByJarIdMax(jarSlave.getId().longValue());
                if (jarMastByJarIdMax.getJarLocDigit()==7){
                if (!Cools.isEmpty(jarMastByJarIdMax) && jarMastByJarIdMax.getJarLocDigit()==7){
                    continue;
                }
                jarGenerateWrkMastStaExecute(jarSlave);
@@ -4441,7 +4441,20 @@
            if (jarProtocol.modeType != JarModeType.AUTO){
                return false;
            }
            //  状态:等待确认 并且  任务完成位 = 1
            JarThread jarOtherThread = (JarThread) SlaveConnection.get(SlaveType.Jar, jarSlave.getJarOtherId());
            JarProtocol jarOtherProtocol = jarOtherThread.getJarProtocol();
            if (jarOtherProtocol == null) {
                return false;
            }
            if (jarOtherProtocol.modeType != JarModeType.AUTO){
                return false;
            }
            //自动、空闲、右门关闭、
            if (jarProtocol.isAutoing() && !jarProtocol.isRightDoor() && jarProtocol.jarErr==0 && !jarOtherProtocol.isLeftDoor() && jarOtherProtocol.jarErr==0){
            }
        } catch (Exception e){
//            log.error("堆垛机工位二完成等待确认异常,堆垛机号={},异常信息={},工位号={}",crn.getId(),e.getMessage(),2);
@@ -4449,6 +4462,75 @@
        return false;
    }
    /**
     *  Jar任务创建  执行
     */
    public synchronized boolean jarGenerateWrkMastStaExecuteOne(JarSlave jarSlave) {
        try{
            // 获取堆垛机信息
            JarThread jarThread = (JarThread) SlaveConnection.get(SlaveType.Jar, jarSlave.getId());
            JarProtocol jarProtocol = jarThread.getJarProtocol();
            if (jarProtocol == null) {
                return false;
            }
            if (jarProtocol.modeType != JarModeType.AUTO){
                return false;
            }
            JarThread jarOtherThread = (JarThread) SlaveConnection.get(SlaveType.Jar, jarSlave.getJarOtherId());
            JarProtocol jarOtherProtocol = jarOtherThread.getJarProtocol();
            if (jarOtherProtocol == null) {
                return false;
            }
            if (jarOtherProtocol.modeType != JarModeType.AUTO){
                return false;
            }
            //自动、空闲、右门关闭、
            if (jarProtocol.isAutoing() && !jarProtocol.isRightDoor() && jarProtocol.jarErr==0 && !jarOtherProtocol.isLeftDoor() && jarOtherProtocol.jarErr==0){
            }
        } catch (Exception e){
//            log.error("堆垛机工位二完成等待确认异常,堆垛机号={},异常信息={},工位号={}",crn.getId(),e.getMessage(),2);
        }
        return false;
    }
    /**
     *  Jar任务创建  执行
     */
    public synchronized boolean jarGenerateWrkMastStaExecuteTwo(JarSlave jarSlave) {
        try{
            // 获取堆垛机信息
            JarThread jarThread = (JarThread) SlaveConnection.get(SlaveType.Jar, jarSlave.getId());
            JarProtocol jarProtocol = jarThread.getJarProtocol();
            if (jarProtocol == null) {
                return false;
            }
            if (jarProtocol.modeType != JarModeType.AUTO){
                return false;
            }
            JarThread jarOtherThread = (JarThread) SlaveConnection.get(SlaveType.Jar, jarSlave.getJarOtherId());
            JarProtocol jarOtherProtocol = jarOtherThread.getJarProtocol();
            if (jarOtherProtocol == null) {
                return false;
            }
            if (jarOtherProtocol.modeType != JarModeType.AUTO){
                return false;
            }
            //自动、空闲、右门关闭、
            if (jarProtocol.isAutoing() && !jarProtocol.isRightDoor() && jarProtocol.jarErr==0 && !jarOtherProtocol.isLeftDoor() && jarOtherProtocol.jarErr==0){
            }
        } catch (Exception e){
//            log.error("堆垛机工位二完成等待确认异常,堆垛机号={},异常信息={},工位号={}",crn.getId(),e.getMessage(),2);
        }
        return false;
    }
    /**
     *  Jar任务执行
src/main/java/com/zy/core/MainProcess.java
@@ -76,6 +76,11 @@
                        mainService.storeFinishedTwo();
                    }
                    i++;
                    if (i>5){
                        i=0;
                    }
//                    // 异常信息记录
//                    mainService.recErr();
                    // 入库  ===>> 空栈板初始化入库
src/main/java/com/zy/core/enums/JarTaskModeType.java
New file
@@ -0,0 +1,44 @@
package com.zy.core.enums;
/*
* 2024/6/21
* */
public enum JarTaskModeType {
    INIT(1, "左门开"),    // 初始
    OUT_RIGHT(2, "左门关"),    // 右出库
    OUT_LEFT(3, "右门开"),    // 左出库
    IN_RIGHT(4, "右门关"),    // 右入库
    ;
    public Integer id;
    public String desc;
    JarTaskModeType(Integer id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static JarTaskModeType get(Short id) {
        if (null == id) {
            return null;
        }
        for (JarTaskModeType type : JarTaskModeType.values()) {
            if (type.id.equals(id.intValue())) {
                return type;
            }
        }
        return null;
    }
    public static JarTaskModeType get(JarTaskModeType type) {
        if (null == type) {
            return null;
        }
        for (JarTaskModeType crnTaskModeType : JarTaskModeType.values()) {
            if (crnTaskModeType == type) {
                return crnTaskModeType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/model/JarSlave.java
@@ -20,6 +20,8 @@
    private Boolean demo;
    private Integer jarOtherId;
    // 硫化罐入库站点
    private List<StaStn> jarInSta = new ArrayList<>();
src/main/java/com/zy/core/model/command/JarCommand.java
New file
@@ -0,0 +1,47 @@
package com.zy.core.model.command;
import com.alibaba.fastjson.annotation.JSONField;
import com.zy.core.enums.SteTaskModeType;
import lombok.Data;
/**
 * 穿梭车命令报文
 * Created by vincent on 2024/6/21
 */
@Data
public class JarCommand {
    // 硫化罐号
    private Integer jarNo = 0;
    // 任务号
    private Integer taskNo = 0;
    // 作业类型
    private Short taskMode = 0;
    // 正在执行任务
    public Boolean execute = Boolean.FALSE;
    // 确认任务完成
    public Boolean complete = Boolean.FALSE;
    @JSONField(serialize = false)
    private SteTaskModeType taskModeType;
    /**
     * 输入穿梭车运行禁止 1运行,0禁止
     */
    private Short run;
    public void setTaskMode(Short taskMode){
        this.taskMode = taskMode;
        this.taskModeType = SteTaskModeType.get(taskModeType);
    }
    public void setTaskMode(SteTaskModeType type) {
        this.taskModeType = type;
        this.taskMode = SteTaskModeType.get(type).id.shortValue();
    }
}
src/main/java/com/zy/core/model/command/SteCommand.java
@@ -6,7 +6,7 @@
/**
 * 穿梭车命令报文
 * Created by vincent on 2020/8/11
 * Created by vincent on 2024/6/21
 */
@Data
public class SteCommand {
src/main/java/com/zy/core/model/protocol/JarProtocol.java
@@ -8,7 +8,7 @@
import lombok.extern.slf4j.Slf4j;
/**
 * Created by vincent on 2020/8/7
 * Created by vincent on 2024/6/21
 */
@Slf4j
@Data
@@ -73,6 +73,26 @@
     * */
    private boolean autoing;
    /*
     * open the left door
     * */
    public Integer leftDoorOpen;
    /*
     * close the left door
     * */
    public Integer leftDoorClose;
    /*
     * open the right door
     * */
    public Integer rightDoorOpen;
    /*
     * close the right door
     * */
    public Integer rightDoorClose;
    /**
     * 异常码
src/main/java/com/zy/core/thread/JarThread.java
@@ -5,7 +5,6 @@
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;
@@ -21,9 +20,8 @@
import com.zy.core.enums.SlaveType;
import com.zy.core.model.JarSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.SteCommand;
import com.zy.core.model.command.JarCommand;
import com.zy.core.model.protocol.JarProtocol;
import com.zy.core.model.protocol.StaProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -32,8 +30,7 @@
/**
 * shuttle 硫化罐线程
 * Created by vincent on 2020/8/4
 * 不能有 槽号 和 机架号
 * Created by vincent on 2024/3/01
 */
@Data
@Slf4j
@@ -139,6 +136,14 @@
                jarProtocol.setStatus(siemensS7Net.getByteTransform().TransInt16(result.Content, 16));//状态
                jarProtocol.setLeftDoorOpen((int)siemensS7Net.getByteTransform().TransInt16(result.Content, 18));//open the left door
                jarProtocol.setLeftDoorClose((int)siemensS7Net.getByteTransform().TransInt16(result.Content, 20));//close the left door
                jarProtocol.setRightDoorOpen((int)siemensS7Net.getByteTransform().TransInt16(result.Content, 22));//open the right door
                jarProtocol.setRightDoorClose((int)siemensS7Net.getByteTransform().TransInt16(result.Content, 24));//close the right door
                jarProtocol.setAutoing(siemensS7Net.getByteTransform().TransInt16(result.Content, 12) != 2);//自动
                // 根据实时信息更新数据库
@@ -168,12 +173,12 @@
    /**
     * 写入数据
     */
    private synchronized boolean write(SteCommand command){
    private synchronized boolean write(JarCommand command){
        if (null == command) {
            News.error("穿梭车写入命令为空");
            return false;
        }
        command.setSteNo(slave.getId());
        command.setJarNo(slave.getId());
        OperateResult result = null;
        // 开始任务
        if (!command.getComplete()) {
@@ -212,7 +217,7 @@
                if (null != bean) {
                    BasSteOpt basSteOpt = new BasSteOpt(
                            command.getTaskNo(),    // 任务号
                            command.getSteNo(),    // 穿梭车
                            command.getJarNo(),    // 硫化罐
                            new Date(),    // 下发时间
                            command.getTaskModeType().desc,    // 作业
                            null,    // 源排
@@ -236,30 +241,18 @@
        if (result != null && result.IsSuccess) {
            News.info("穿梭车命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.STE.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
            News.info("硫化罐命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSONString(command));
            OutputQueue.STE.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 硫化罐命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSONString(command)));
            try {
                Thread.sleep(500);
            } catch (Exception e){
            }
            OperateResultExOne<byte[]> result1 = siemensS7Net.Read("V998", (short) 4);
            if (result1.IsSuccess) {
                short taskNo = siemensS7Net.getByteTransform().TransInt16(result1.Content, 0);
                short taskType = siemensS7Net.getByteTransform().TransInt16(result1.Content, 2);
//                readStatus();
            }
            return true;
        } else {
            OutputQueue.STE.offer(MessageFormat.format("【{0}】写入穿梭车plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            News.error("写入穿梭车plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            //写入失败后,重新添加commanddao 任务队列中,并立即回读一次设备状态
//            MessageQueue.offer(SlaveType.Ste, slave.getId(), new Task(2, command));
//            readStatus();
            OutputQueue.STE.offer(MessageFormat.format("【{0}】写入硫化罐plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            News.error("写入硫化罐plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            initSte();
            return false;
        }
src/main/java/com/zy/core/thread/SteThread.java
@@ -17,8 +17,8 @@
import com.zy.core.ThreadHandler;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.enums.SteLocaType;
import com.zy.core.enums.SteStatusType;
import com.zy.core.model.SteSlave;
import com.zy.core.model.Task;
@@ -43,8 +43,6 @@
    private SteSlave slave;
    private SteProtocol steProtocol;
    private short heartBeatVal = 1;
    private boolean V20011 = true;
    private boolean V20001 = true;
    private boolean resetFlag = false;
    public SteThread(SteSlave slave) {
@@ -102,10 +100,10 @@
    @Override
    public boolean connect() {
        boolean result = false;
        // 不能有 槽号 和 机架号
        siemensS7Net = new SiemensS7Net(SiemensPLCS.S200Smart, slave.getIp());
//        siemensS7Net.setRack(slave.getRack().byteValue());
//        siemensS7Net.setSlot(slave.getSlot().byteValue());
        //
        siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200, slave.getIp());
        siemensS7Net.setRack(slave.getRack().byteValue());
        siemensS7Net.setSlot(slave.getSlot().byteValue());
        OperateResult connect = siemensS7Net.ConnectServer();
        if(connect.IsSuccess){
            result = true;
@@ -125,106 +123,77 @@
     */
    private void readStatus(){
        try {
            OperateResultExOne<byte[]> result = siemensS7Net.Read("V800", (short) 70);
            OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) 22);
            if (result.IsSuccess) {
                if (null == steProtocol) {
                    steProtocol = new SteProtocol();
                    steProtocol.setSteNo(slave.getId().shortValue());
                }
//                steProtocol.setSteNo(siemensS7Net.getByteTransform().TransInt16(result.Content, 0));
                steProtocol.setMode(siemensS7Net.getByteTransform().TransInt16(result.Content, 2));
                steProtocol.setStatus(siemensS7Net.getByteTransform().TransInt16(result.Content, 4));
                OperateResultExOne<Boolean> executeRes = siemensS7Net.ReadBool("V2001.0");
                if (executeRes.IsSuccess) {
                    steProtocol.setExecute(executeRes.Content);
                }
                OperateResultExOne<Boolean> waitingRes = siemensS7Net.ReadBool("V2001.1");
                OperateResultExOne<Boolean> waitingRes = siemensS7Net.ReadBool("DB101.20.2");
                if (waitingRes.IsSuccess) {
                    steProtocol.setWaiting(waitingRes.Content);
                }
//                if (steProtocol.getSteNo()==1){
//                    if (!steProtocol.getWaiting().equals(V20011)){
//                        News.error("小车号 ={} :V2001.1地址读取值不一致,读={}  记录={}",steProtocol.getSteNo(),steProtocol.getWaiting(),V20011);
//                    }
//                    V20011=steProtocol.getWaiting();
//                    OperateResultExOne<Boolean> waitingRes2 = siemensS7Net.ReadBool("V2000.1");
//                    if (waitingRes2.IsSuccess) {
//                        if (!waitingRes2.Content.equals(V20001)){
//                            News.error("小车号 ={} :V2000.1地址读取值不一致,读={} 记录={}",steProtocol.getSteNo(),waitingRes2.Content,V20001);
//                        }
//                        V20001=waitingRes2.Content;
//                    }
//                    OperateResultExOne<Boolean> waitingRes3 = siemensS7Net.ReadBool("V2500.1");
//                    if (waitingRes3.IsSuccess) {
//                        if (!waitingRes3.Content.equals(waitingRes2.Content)){
//                            News.error("小车号 ={} :V2000.1地址读取值不一致,读={} , V2500.1地址读取值不一致,读={}",steProtocol.getSteNo(),waitingRes2.Content,waitingRes3.Content);
//                        }
//                    }
//                }
                OperateResultExOne<Boolean> inEmptyRes = siemensS7Net.ReadBool("V2001.2");
                if (inEmptyRes.IsSuccess) {
                    steProtocol.setInEmpty(inEmptyRes.Content);
                }
                OperateResultExOne<Boolean> outEmptyRes = siemensS7Net.ReadBool("V2001.3");
                if (outEmptyRes.IsSuccess) {
                    steProtocol.setOutEmpty(outEmptyRes.Content);
                }
                steProtocol.setAlarm(siemensS7Net.getByteTransform().TransInt16(result.Content, 6));
                steProtocol.setAlarm0(siemensS7Net.getByteTransform().TransInt16(result.Content, 8));
                steProtocol.setCharge(siemensS7Net.getByteTransform().TransSingle(result.Content, 10));
//                steProtocol.setFullCharge();
//                steProtocol.setLowCharge();
                steProtocol.setFeed(siemensS7Net.getByteTransform().TransInt16(result.Content, 14));
                steProtocol.setLoca(siemensS7Net.getByteTransform().TransInt16(result.Content, 16));
//                steProtocol.setCloser();
//                steProtocol.setSpeed();
                steProtocol.setPos(siemensS7Net.getByteTransform().TransInt16(result.Content, 18));
                steProtocol.setLoad(siemensS7Net.getByteTransform().TransInt16(result.Content, 20));
                steProtocol.setTrack(siemensS7Net.getByteTransform().TransInt16(result.Content, 22));
                steProtocol.setTaskNo(siemensS7Net.getByteTransform().TransInt16(result.Content, 24));
                steProtocol.setTaskType(siemensS7Net.getByteTransform().TransInt16(result.Content, 28));
                steProtocol.setRow(siemensS7Net.getByteTransform().TransInt16(result.Content, 30));
                steProtocol.setBay(siemensS7Net.getByteTransform().TransInt16(result.Content, 32));
                steProtocol.setLev(siemensS7Net.getByteTransform().TransInt16(result.Content, 34));
//                steProtocol.setHisTaskNo(siemensS7Net.getByteTransform().TransInt32(result.Content, 58));
//                steProtocol.setHisTaskStatus(siemensS7Net.getByteTransform().TransInt16(result.Content, 62));
//                steProtocol.setCheckQty(siemensS7Net.getByteTransform().TransInt16(result.Content, 64));
                steProtocol.setReady(siemensS7Net.getByteTransform().TransInt16(result.Content, 36));
//                steProtocol.setChargeNo(siemensS7Net.getByteTransform().TransInt16(result.Content, 68));
                steProtocol.setCharge(siemensS7Net.getByteTransform().TransSingle(result.Content, 6));
                steProtocol.setTaskNo(siemensS7Net.getByteTransform().TransInt16(result.Content, 10));
                steProtocol.setTaskType(siemensS7Net.getByteTransform().TransInt16(result.Content, 12));
                steProtocol.setRow(siemensS7Net.getByteTransform().TransInt16(result.Content, 14));
                steProtocol.setBay(siemensS7Net.getByteTransform().TransInt16(result.Content, 16));
                steProtocol.setLev(siemensS7Net.getByteTransform().TransInt16(result.Content, 18));
//                steProtocol.setHeart(siemensS7Net.getByteTransform().TransInt16(result.Content, 72));
                steProtocol.setCrnStopRun(siemensS7Net.getByteTransform().TransInt16(result.Content, 38));
                steProtocol.setCrnStopFork(siemensS7Net.getByteTransform().TransInt16(result.Content, 40));
                steProtocol.setCrnAllowRun(siemensS7Net.getByteTransform().TransInt16(result.Content, 42));
                steProtocol.setChargeStatus(siemensS7Net.getByteTransform().TransInt16(result.Content, 44));
                OperateResultExOne<Boolean> steChargeRes = siemensS7Net.ReadBool("V740.6");
                if (steChargeRes.IsSuccess) {
                    steProtocol.setSteCharge(steChargeRes.Content);
                    if (steChargeRes.Content){
                        steProtocol.setChargeStatus((short)1);
//                steProtocol.setReady(siemensS7Net.getByteTransform().TransInt16(result.Content, 20));
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, 20, 1);
                steProtocol.setReady(status[0]?(short)1:(short)0);
//                steProtocol.setReady(status[1]?(short)1:(short)0);
//                steProtocol.setReady(status[2]?(short)1:(short)0);
//                steProtocol.setLoad(status[3]?(short)1:(short)0);
//                steProtocol.setReady(status[4]?(short)1:(short)0);
                steProtocol.setChargeStatus(status[5]?(short)1:(short)0);
                steProtocol.setTrack(status[6]?(short)1:(short)0);
                SteLocaType locaType = SteLocaType.NONE;
                boolean[] status2 = siemensS7Net.getByteTransform().TransBool(result.Content, 21, 1);
                if (steProtocol.getRow().intValue() >= 6) {
                    if (status[7]){//A点
                        locaType = SteLocaType.A;
                    }
                }
                OutputQueue.STE.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功", DateUtils.convert(new Date()), slave.getId()));
                // 复位信号
                if (steProtocol.getWaiting()) {
                    News.info("-------------第一步、[穿梭车号:{}, 工作号:{}]==>> 状态为{},等待WCS确认!!{}",
                            slave.getId(),steProtocol.getTaskNo(),steProtocol.getStatus(), resetFlag);
                    if (resetFlag) {
                        News.info("第二步、收到主线程复位标记 resetFlag = true,[穿梭车号:{}, 工作号:{}]==>> 状态为{},等待WCS确认!!{}",
                                slave.getId(),steProtocol.getTaskNo(),steProtocol.getStatus(), resetFlag);
                        SteCommand steCommand = new SteCommand();
                        steCommand.setComplete(true);
                        if (write(steCommand) && confirmPos()) {
                            resetFlag = false;
                            News.info("第三步、发送复位命令成功 resetFlag = false,[穿梭车号:{}, 工作号:{}]==>> 状态为{},等待WCS确认!!{}",
                                    slave.getId(),steProtocol.getTaskNo(),steProtocol.getStatus(), resetFlag);
                    if (status2[1]){//A待机点
                        if (locaType.equals(SteLocaType.NONE)) {
                            locaType = SteLocaType.A_WAITING;
                        }
                    }
                }else {
                    if (status2[0]){//B点
                        if (locaType.equals(SteLocaType.NONE)) {
                            locaType = SteLocaType.B;
                        }
                    }
                    if (status2[2]){//B待机点
                        if (locaType.equals(SteLocaType.NONE)) {
                            locaType = SteLocaType.B_WAITING;
                        }
                    }
                }
                steProtocol.setLoca(locaType.id.shortValue());
                steProtocol.setReady(status2[3]?(short)1:(short)0);
                steProtocol.setLoad(status2[4]?(short)1:(short)0);
                OutputQueue.STE.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
                // 复位信号
                if (steProtocol.getWaiting()) {
                    if (resetFlag) {
                        SteCommand steCommand = new SteCommand();
                        steCommand.setComplete(true);
                        if (write(steCommand) && confirmPos()) {
                            resetFlag = false;
                        }
                    }
                }
                // 根据实时信息更新数据库
                BasSteService service = SpringUtils.getBean(BasSteService.class);
@@ -243,13 +212,11 @@
                }
            } else {
                OutputQueue.STE.offer(MessageFormat.format("【{0}】{1}穿梭车plc状态信息失败", DateUtils.convert(new Date()), slave.getId()));
                OutputQueue.STE.offer(MessageFormat.format("【{0}】{1}穿梭车plc状态信息失败",DateUtils.convert(new Date()), slave.getId()));
                throw new CoolException(MessageFormat.format( "穿梭车plc状态信息失败 ===>> [id:{0}] [ip:{1}] [port:{2}]", slave.getId(), slave.getIp(), slave.getPort()));
            }
        } catch (Exception e) {
//            e.printStackTrace();
            OutputQueue.STE.offer(MessageFormat.format("【{0}】读取穿梭车plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
//            News.error("读取穿梭车plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            initSte();
        }
@@ -258,40 +225,16 @@
    /**
     * 写入数据
     */
    private boolean write(SteCommand command) throws InterruptedException {
        if (null == command) {
    private boolean write(SteCommand command){
        return this.write(command, 1);
    }
    /**
     * 写入数据
     */
    private boolean write(SteCommand command, int times){
        if (null == command || times > 2) {
            News.error("穿梭车写入命令为空");
            return false;
        }
        //判断小车是否在充电
        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
        if (devpThread.charge0
                && !Cools.isEmpty(command.getRow(),command.getBay(),command.getLev())
                && command.getRow().intValue()==1 && command.getBay().intValue()==1 && command.getLev().intValue()==1){
            // led 异常显示
            LedThread ledThread1 = (LedThread) SlaveConnection.get(SlaveType.Led, 1);
            LedThread ledThread2 = (LedThread) SlaveConnection.get(SlaveType.Led, 2);
            LedThread ledThread3 = (LedThread) SlaveConnection.get(SlaveType.Led, 3);
            if (ledThread1 != null && ledThread2 != null && ledThread3 != null) {
                MessageQueue.offer(SlaveType.Led, 1, new Task(3, "穿梭车正在1排充电桩充电"));
                MessageQueue.offer(SlaveType.Led, 2, new Task(3, "穿梭车正在1排充电桩充电"));
                MessageQueue.offer(SlaveType.Led, 3, new Task(3, "穿梭车正在1排充电桩充电"));
            }
            News.error("穿梭车正在1排充电桩充电");
            return false;
        }else if (devpThread.charge1
                && !Cools.isEmpty(command.getRow(),command.getBay(),command.getLev())
                && command.getRow().intValue()==13 && command.getBay().intValue()==1 && command.getLev().intValue()==1){
            // led 异常显示
            LedThread ledThread1 = (LedThread) SlaveConnection.get(SlaveType.Led, 1);
            LedThread ledThread2 = (LedThread) SlaveConnection.get(SlaveType.Led, 2);
            LedThread ledThread3 = (LedThread) SlaveConnection.get(SlaveType.Led, 3);
            if (ledThread1 != null && ledThread2 != null && ledThread3 != null) {
                MessageQueue.offer(SlaveType.Led, 1, new Task(3, "穿梭车正在13排充电桩充电"));
                MessageQueue.offer(SlaveType.Led, 2, new Task(3, "穿梭车正在13排充电桩充电"));
                MessageQueue.offer(SlaveType.Led, 3, new Task(3, "穿梭车正在13排充电桩充电"));
            }
            News.error("穿梭车正在13排充电桩充电");
            return false;
        }
        command.setSteNo(slave.getId());
@@ -299,23 +242,12 @@
        // 开始任务
        if (!command.getComplete()) {
            //组织任务前,先清空写任务确认位,以及任务完成确认位
            siemensS7Net.Write("V2000.0", false);
            siemensS7Net.Write("V2000.1", false);
//            siemensS7Net.Write("V2500.1", false);
            Thread.sleep(200);
            OperateResultExOne<Boolean> waitingRes2 = siemensS7Net.ReadBool("V2000.1");
            if (waitingRes2.IsSuccess) {
                if(!waitingRes2.Content){
                    News.error("重置任务完成确认位成功");
                } else {
                    News.error("重置任务完成确认位失败1");
                }
            } else {
                News.error("重置任务完成确认位失败2");
            }
            siemensS7Net.Write("DB100.0", (short) 0);//设备号
            siemensS7Net.Write("DB100.2", (short) 0);//任务号
            siemensS7Net.Write("DB100.12.0", false);//任务开始确认位
            siemensS7Net.Write("DB100.12.1", false);//任务完成确认
            // 1.任务号
            OperateResult result0 = siemensS7Net.Write("V998", command.getTaskNo().shortValue());
            OperateResult result0 = siemensS7Net.Write("DB100.2", command.getTaskNo().shortValue());
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
@@ -324,41 +256,25 @@
            // 作业
            if (command.getTaskMode() != 0) {
                // 2.作业
                OperateResult result1 = siemensS7Net.Write("V1000", command.getTaskMode());
                OperateResult result1 = siemensS7Net.Write("DB100.4", command.getTaskMode());
                // 3.确认开始任务
                if (result0.IsSuccess && result1.IsSuccess) {
                    result = siemensS7Net.Write("V2000.0", true);
                    siemensS7Net.Write("V2000.1", false);
//                    siemensS7Net.Write("V2500.1", false);
                }
                    result = siemensS7Net.Write("DB100.12.0", true);
            // 其他指令
            } else {
                // 控制模式
                if (command.getControlMode() != null) {
                    result =  siemensS7Net.Write("V1010", command.getControlMode());
                // 复位信号
                } else if (command.getReset() != null) {
                    result =  siemensS7Net.Write("V2000.2", command.getReset());
                // 删除指令
                } else if (command.getDelete() != null) {
                    result =  siemensS7Net.Write("V2000.3", command.getDelete());
                // 无效指令
                } else if (command.getRun() != null) {
                    result =  siemensS7Net.Write("V1016", command.getRun());
                    // 无效指令
                }else {
                    return false;
                    try {
                        Thread.sleep(300);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        // 任务完成
            // 任务完成
        } else {
            siemensS7Net.Write("V2000.0", false);
            siemensS7Net.Write("V998", (short) 0);
            siemensS7Net.Write("V1000", (short) 0);
            result = siemensS7Net.Write("V2000.1", true);
//            result = siemensS7Net.Write("V2500.1", true);
            siemensS7Net.Write("DB100.2", (short) 0);//任务号
            siemensS7Net.Write("DB100.4.0", (short) 0);//任务类型
            siemensS7Net.Write("DB100.12.0", false);//任务开始确认位
            result = siemensS7Net.Write("DB100.12.1", true);//任务完成确认
        }
        try {
@@ -421,7 +337,7 @@
        if (basSte != null) {
            // 更新plc数据块
            short[] arr = new short[] {basSte.getRow().shortValue(), basSte.getBay().shortValue(), basSte.getLev().shortValue()};
            OperateResult result = siemensS7Net.Write("V1002", arr);
            OperateResult result = siemensS7Net.Write("DB100.6", arr);
            if (result.IsSuccess) {
                // 更新数据库
                if (service.updatePakMk(this.slave.getId(), "N")) {
@@ -436,7 +352,7 @@
    public boolean modifyPosHandle(Integer row, Integer bay, Integer lev) {
        short[] arr = new short[] {row.shortValue(), bay.shortValue(), lev.shortValue()};
        OperateResult result = siemensS7Net.Write("V1002", arr);
        OperateResult result = siemensS7Net.Write("DB100.6", arr);
        if (!result.IsSuccess) {
            News.error("更新{}号穿梭车定位失败 ===>> 排:【{}】, 列:【{}】,层:【{}】", this.slave.getId(), row, bay, lev);
            return false;
@@ -451,7 +367,7 @@
    @Override
    public void close() {
//        siemensS7Net.ConnectClose();
        siemensS7Net.ConnectClose();
    }
    /**
@@ -469,13 +385,6 @@
        }
    }
//    public void modifyPos(int wrkNo, int row, int bay, int lev) {
//        BasSteService service = SpringUtils.getBean(BasSteService.class);
//        if (!service.updatePos(wrkNo,this.slave.getId(), row, bay, lev)) {
//            News.error("更新{}号穿梭车定位失败 ===>> 排:【{}】, 列:【{}】,层:【{}】", this.slave.getId(), row, bay, lev);
//        }
//    }
    /******************************************************************************************/
    /**************************************** 测试专用 *****************************************/
    /*****************************************************************************************/
@@ -488,36 +397,6 @@
        thread.connect();
        thread.readStatus();
        System.out.println(JSON.toJSONString(thread.steProtocol));
        // 任务作业
//        SteCommand command = new SteCommand();
//        command.setSteNo(1); // 堆垛机编号
//        Random random = new Random();
//        int taskNo = random.nextInt(9090);
//        command.setTaskNo(taskNo); // 工作号
//        command.setTaskMode(SteTaskModeType.MOVE_LEFT); // 任务模式
//        thread.write(command);
        // 任务完成
//        SteCommand command = new SteCommand();
//        command.setSteNo(1); // 堆垛机编号
//        command.setComplete(Boolean.TRUE); // 任务模式
//        thread.write(command);
        // 控制模式
//        SteCommand command = new SteCommand();
//        command.setControlMode((short) 1);
//        thread.write(command);
        // 复位信号
//        SteCommand command = new SteCommand();
//        command.setReset(Boolean.TRUE);
//        thread.write(command);
        // 删除指令
//        SteCommand command = new SteCommand();
//        command.setDelete(Boolean.TRUE);
//        thread.write(command);
        // 穿梭车运行禁止
        SteCommand command = new SteCommand();
src/main/resources/application.yml
@@ -345,6 +345,7 @@
    id: 1
    ip: 10.10.10.190
    port: 120
    jarOtherId: 2
    # 硫化罐入库站点
    jarInSta[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
@@ -385,6 +386,7 @@
    id: 2
    ip: 10.10.10.191
    port: 120
    jarOtherId: 1
    # 硫化罐入库站点
    jarInSta[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
@@ -425,6 +427,7 @@
    id: 3
    ip: 10.10.10.192
    port: 120
    jarOtherId: 4
    # 硫化罐入库站点
    jarInSta[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
@@ -465,6 +468,7 @@
    id: 4
    ip: 10.10.10.193
    port: 120
    jarOtherId: 3
    # 硫化罐入库站点
    jarInSta[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
@@ -503,20 +507,28 @@
  # ste1
  ste[0]:
    id: 1
    ip: 10.10.10.100
    port: 120
    ip: 10.10.10.10
    port: 502
    rack: 0
    slot: 0
  # ste2
  ste[1]:
    id: 2
    ip: 10.10.10.100
    port: 120
    ip: 10.10.10.10
    port: 502
    rack: 0
    slot: 0
  # ste3
  ste[2]:
    id: 3
    ip: 10.10.10.100
    port: 120
    ip: 10.10.10.10
    port: 502
    rack: 0
    slot: 0
  # ste4
  ste[3]:
    id: 4
    ip: 10.10.10.100
    port: 120
    ip: 10.10.10.10
    port: 502
    rack: 0
    slot: 0