pang.jiabao
2026-04-24 7b8021d7ff94015d7034ead10fea5006d0032301
WCS功能完善
18个文件已修改
1090 ■■■■■ 已修改文件
src/main/java/com/zy/controller/CrnController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnTaskModeType.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvStatusType.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/RgvCommand.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/CrnProtocol.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/RgvProtocol.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/RgvThread.java 191 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 543 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/entity/WrkDetl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/entity/WrkMast.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/entity/vo/RgvStateTableVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/service/impl/MainServiceImpl.java 272 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/console.map.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/console.html 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/crn.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/controller/CrnController.java
@@ -249,7 +249,7 @@
        command.setDestinationPosY(param.getBay());     // 目标库位列
        command.setDestinationPosZ(param.getLev());     // 目标库位层
        boolean locSts = isLocSts(param.getRow().toString(), param.getBay().toString(), param.getLev().toString());
        command.setTraySize(locSts);
//        command.setTraySize(locSts);
        return crnControl(command)?R.ok():R.error();
    }
@@ -268,7 +268,7 @@
        command.setDestinationPosY(param.getBay());     // 目标库位列
        command.setDestinationPosZ(param.getLev());     // 目标库位层
        boolean locSts = isLocSts(param.getSourceRow().toString(), param.getSourceBay().toString(), param.getSourceLev().toString());
        command.setTraySize(locSts);
//        command.setTraySize(locSts);
        return crnControl(command)?R.ok():R.error();
    }
@@ -293,7 +293,7 @@
        if (sourceLoc.getLocType1() != loc.getLocType1()){
            return R.error("库位类型不一致");
        }
        command.setTraySize(loc.getLocType1() == 2);
//        command.setTraySize(loc.getLocType1() == 2);
//        VersionUtils.locMoveCheckLocType(sourceLoc, loc);
        return crnControl(command)?R.ok():R.error();
    }
src/main/java/com/zy/core/MainProcess.java
@@ -75,6 +75,9 @@
                    // 堆垛机回原点
                    mainService.originGo();
                    // rgv搬运
                    mainService.rgvCarry();
                } catch (Exception e) {
                    e.printStackTrace();
                }
src/main/java/com/zy/core/enums/CrnTaskModeType.java
@@ -7,7 +7,7 @@
    PAKOUT(2),    // 出库
    LOC_MOVE(3),    // 库位移转
    X_MOVE(4),    // 站位移转
    Y_MOVE(5),    // 站位移转
    RESET(5),    // 复位
    XY_MOVE(6),    // 站位移转
    GO_ORIGIN(7),    // 回原点
    BACK_ORIGIN(8),      // 回反原点
src/main/java/com/zy/core/enums/RgvStatusType.java
@@ -6,11 +6,11 @@
    IDLE(0, "空闲"),
    WORKING(1, "作业中"),
    SOS(2, "报警"),
    WORKING1(3, "作业中"),
    FETCHING(11, "取货中"),
    PUTTING(12, "放货中"),
    WAITING(90, "任务完成等待WCS确认"),
    FETCHWAITING(91, "取货任务完成等待WCS确认"),
//    WORKING1(3, "作业中"),
//    FETCHING(11, "取货中"),
//    PUTTING(12, "放货中"),
//    WAITING(90, "任务完成等待WCS确认"),
//    FETCHWAITING(91, "取货任务完成等待WCS确认"),
    ;
    public Integer id;
src/main/java/com/zy/core/model/command/RgvCommand.java
@@ -28,7 +28,7 @@
     * 0 = 无
     * 1 = 取货
     * 2 = 放货
     * 3 = 取放货
     * 3 = 取放货 固定为3.取放货
     */
    private Short taskMode1 = 0;
src/main/java/com/zy/core/model/protocol/CrnProtocol.java
@@ -187,6 +187,11 @@
     */
    public Float yDuration;
//    /**
//     * 任务接收
//     */
//    public Short taskReceive;
    public void setMode(Short mode) {
        this.mode = mode;
        this.modeType = CrnModeType.get(mode);
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -39,6 +39,16 @@
    public RgvStatusType statusType;
    /**
     * 起点
     */
    public Short startSta;
    /**
     * 终点
     */
    public Short endSta;
    /**
     * 工位1任务号
     */
    public Short taskNo1 = 0;
@@ -65,7 +75,7 @@
    /**
     * RGV当前位置
     */
    public Short RgvPos;
    public Integer RgvPos;
    /**
     * 走行在定位
src/main/java/com/zy/core/thread/RgvThread.java
@@ -7,21 +7,19 @@
import com.alibaba.fastjson.JSON;
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.zy.entity.BasRgv;
import com.zy.entity.BasRgvOpt;
import com.zy.service.BasRgvOptService;
import com.zy.service.BasRgvService;
import com.zy.utils.News;
import com.zy.core.RgvThread2;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.RgvStatusType;
import com.zy.core.enums.RgvTaskModeType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.RgvSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.RgvCommand;
import com.zy.core.model.protocol.RgvProtocol;
import com.zy.entity.BasRgv;
import com.zy.entity.BasRgvOpt;
import com.zy.service.BasRgvOptService;
import com.zy.service.BasRgvService;
import com.zy.utils.News;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -72,52 +70,52 @@
                        readStatus();
                        break;
//                    // 工位1、2写入数据
//                    case 2:
//                        write((RgvCommand) task.getData());
//                        break;
                    //工位1写入数据
                    case 4:
                        write1((RgvCommand) task.getData());
                    case 2:
                        write((RgvCommand) task.getData());
                        break;
                    //工位1写入数据
//                    case 4:
//                        write1((RgvCommand) task.getData());
//                        break;
//                    //工位2写入数据
//                    case 5:
//                        write2((RgvCommand) task.getData());
//                        break;
                    // 复位
                    case 3:
                        RgvCommand command = (RgvCommand) task.getData();
                        if (null == command) {
                            command = new RgvCommand();
                        }
                        command.setRgvNo(slave.getId()); // RGV编号
                        command.setTaskNo1((short) 0); // 工作号
                        command.setAckFinish1((short) 1);  // 任务完成确认位
                        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
                        command.setSourceStaNo1((short)0);     // 源站
                        command.setDestinationStaNo1((short)0);     // 目标站
                        command.setCommand((short)0);
                        write1(command);
                        break;
                    // 回原点  避让
                    case 9:
                        RgvCommand commandAvoidanceXY = (RgvCommand) task.getData();
                        if (null == commandAvoidanceXY) {
                            commandAvoidanceXY = new RgvCommand();
                        }
                        commandAvoidanceXY.setRgvNo(slave.getId()); // RGV编号
                        commandAvoidanceXY.setTaskNo1((short) 9999); // 工作号
                        commandAvoidanceXY.setAckFinish1((short) 1);  // 任务完成确认位
                        commandAvoidanceXY.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 任务模式
                        commandAvoidanceXY.setSourceStaNo1((short)0);     // 源站
                        commandAvoidanceXY.setDestinationStaNo1((short)0);     // 目标站
//                        commandAvoidanceXY.setTaskNo2((short) 0); // 工作号
//                        commandAvoidanceXY.setAckFinish2((short) 1);  // 任务完成确认位
//                        commandAvoidanceXY.setTaskMode2(RgvTaskModeType.GO_ORIGIN); // 任务模式
//                        commandAvoidanceXY.setSourceStaNo2((short)0);     // 源站
//                        commandAvoidanceXY.setDestinationStaNo2((short)0);     // 目标站
                        commandAvoidanceXY.setCommand((short)0);
                        write(commandAvoidanceXY);
                        break;
//                    case 3:
//                        RgvCommand command = (RgvCommand) task.getData();
//                        if (null == command) {
//                            command = new RgvCommand();
//                        }
//                        command.setRgvNo(slave.getId()); // RGV编号
//                        command.setTaskNo1((short) 0); // 工作号
//                        command.setAckFinish1((short) 1);  // 任务完成确认位
//                        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
//                        command.setSourceStaNo1((short)0);     // 源站
//                        command.setDestinationStaNo1((short)0);     // 目标站
//                        command.setCommand((short)0);
//                        write1(command);
//                        break;
//                    // 回原点  避让
//                    case 9:
//                        RgvCommand commandAvoidanceXY = (RgvCommand) task.getData();
//                        if (null == commandAvoidanceXY) {
//                            commandAvoidanceXY = new RgvCommand();
//                        }
//                        commandAvoidanceXY.setRgvNo(slave.getId()); // RGV编号
//                        commandAvoidanceXY.setTaskNo1((short) 9999); // 工作号
//                        commandAvoidanceXY.setAckFinish1((short) 1);  // 任务完成确认位
//                        commandAvoidanceXY.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 任务模式
//                        commandAvoidanceXY.setSourceStaNo1((short)0);     // 源站
//                        commandAvoidanceXY.setDestinationStaNo1((short)0);     // 目标站
////                        commandAvoidanceXY.setTaskNo2((short) 0); // 工作号
////                        commandAvoidanceXY.setAckFinish2((short) 1);  // 任务完成确认位
////                        commandAvoidanceXY.setTaskMode2(RgvTaskModeType.GO_ORIGIN); // 任务模式
////                        commandAvoidanceXY.setSourceStaNo2((short)0);     // 源站
////                        commandAvoidanceXY.setDestinationStaNo2((short)0);     // 目标站
//                        commandAvoidanceXY.setCommand((short)0);
//                        write(commandAvoidanceXY);
//                        break;
                    default:
                        break;
                }
@@ -135,21 +133,25 @@
    private void initRgv() {
        if (null == rgvProtocol) {
            rgvProtocol = new RgvProtocol();
            rgvProtocol.setRgvNo(slave.getId());
        }
        rgvProtocol.setMode((short) -1);
        rgvProtocol.setStatus((short)-1);
        rgvProtocol.setTaskNo1((short)0);
        rgvProtocol.setStatus1((short)-1);
        rgvProtocol.setLoaded1((short)0);
        rgvProtocol.setWalkPos((short)0);
        rgvProtocol.setRgvPos((short)0);
        rgvProtocol.setRgvPos(0);
        rgvProtocol.setStartSta((short)0);
        rgvProtocol.setEndSta((short)0);
        rgvProtocol.setTaskNo1((short)0);
        rgvProtocol.setAlarm((short)0);
        rgvProtocol.setStatus((short)-1);
//        rgvProtocol.setStatus1((short)-1);
//        rgvProtocol.setWalkPos((short)0);
//        rgvProtocol.setTaskNo2((short)0);
//        rgvProtocol.setStatus2((short)-1);
//        rgvProtocol.setLoaded2((short)0);
        rgvProtocol.setAlarm((short)0);
        rgvProtocol.setxSpeed((short) 0);
        rgvProtocol.setxDistance((short) 0);
        rgvProtocol.setxDuration((short) 0);
//        rgvProtocol.setxSpeed((short) 0);
//        rgvProtocol.setxDistance((short) 0);
//        rgvProtocol.setxDuration((short) 0);
    }
    @Override
@@ -177,26 +179,29 @@
     */
    private void readStatus(){
        try {
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 30);
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 22);
            if (result.IsSuccess) {
                if (null == rgvProtocol || rgvProtocol.getRgvNo() == null) {
                    rgvProtocol = new RgvProtocol();
                    rgvProtocol.setRgvNo(slave.getId());
                }
                rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0));
                rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 2));
                rgvProtocol.setTaskNo1(siemensNet.getByteTransform().TransInt16(result.Content, 4));
                rgvProtocol.setStatus1(siemensNet.getByteTransform().TransInt16(result.Content, 6));
                rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 8));
                rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt16(result.Content, 10));
                rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 12));
                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 14));
                rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 2));
                rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 4));
                rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt32(result.Content, 6));
                rgvProtocol.setStartSta(siemensNet.getByteTransform().TransInt16(result.Content, 10));
                rgvProtocol.setEndSta(siemensNet.getByteTransform().TransInt16(result.Content, 12));
                rgvProtocol.setTaskNo1((short) siemensNet.getByteTransform().TransInt32(result.Content, 14));
                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 18));
                rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 20));
//                rgvProtocol.setStatus1(siemensNet.getByteTransform().TransInt16(result.Content, 6));
//                rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 12));
//                rgvProtocol.setStatus2(siemensNet.getByteTransform().TransInt16(result.Content, 16));
                rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 18));
//                rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 18));
//                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 20));
                rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 22));
//                rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 22));
//                rgvProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 24));
                rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 26));
//                rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 26));
//                rgvProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 28));
//                rgvProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 30));
//                rgvProtocol.setTemp5(siemensNet.getByteTransform().TransInt16(result.Content, 32));
@@ -207,16 +212,16 @@
                OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功", DateUtils.convert(new Date()), slave.getId()));
                // 工位1复位信号
                if (rgvProtocol.getStatusType1().equals(RgvStatusType.WAITING)
                        || rgvProtocol.getStatusType1().equals(RgvStatusType.FETCHWAITING)) {
                    if (resetFlag1) {
                        RgvCommand rgvCommand = new RgvCommand();
                        rgvCommand.setAckFinish1((short)1);
                        if (write(rgvCommand)) {
                            resetFlag1 = false;
                        }
                    }
                }
//                if (rgvProtocol.getStatusType1().equals(RgvStatusType.WAITING)
//                        || rgvProtocol.getStatusType1().equals(RgvStatusType.FETCHWAITING)) {
//                    if (resetFlag1) {
//                        RgvCommand rgvCommand = new RgvCommand();
//                        rgvCommand.setAckFinish1((short)1);
//                        if (write(rgvCommand)) {
//                            resetFlag1 = false;
//                        }
//                    }
//                }
                // 工位2复位信号
//                if (rgvProtocol.getStatusType2().equals(RgvStatusType.WAITING)
@@ -266,12 +271,18 @@
        }
//        convertRow(command);
        command.setRgvNo(slave.getId());
        short[] array = new short[11];
        array[0] = command.getAckFinish1();
        array[1] = command.getTaskNo1();
        short[] array = new short[3];
        array[0] = command.getSourceStaNo1();
        array[1] = command.getDestinationStaNo1();
        array[2] = command.getTaskMode1();
        array[3] = command.getSourceStaNo1();
        array[4] = command.getDestinationStaNo1();
        OperateResult result1 = siemensNet.Write("DB100.0", array);
        OperateResult result2 = siemensNet.Write("DB100.6", command.getTaskNo1().intValue());
        Thread.sleep(100);
        OperateResult result3 = siemensNet.Write("DB100.10", command.getCommand());
//        array[0] = command.getAckFinish1();
//        array[1] = command.getTaskNo1();
//        array[2] = command.getTaskMode1();
@@ -283,7 +294,7 @@
//        array[8] = command.getSourceStaNo2();
//        array[9] = command.getDestinationStaNo2();
//        array[10] = command.getCommand();
        OperateResult result = siemensNet.Write("DB100.0", array);
//        if (command.getAckFinish1() == 0 && command.getAckFinish2() == 0) {
//            short commandFinish = 3;  //工位1、2任务同时写入
@@ -311,7 +322,7 @@
            bean.insert(basRgvOpt);
        } catch (Exception ignore) {}
        if (result != null && result.IsSuccess) {
        if (result1 != null && result1.IsSuccess && result2 != null && result2.IsSuccess && result3 != null && result3.IsSuccess) {
            Thread.sleep(200);
            this.readStatus();
            log.info("RGV 命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
@@ -557,7 +568,7 @@
    public static void main(String[] args) throws InterruptedException {
        RgvSlave slave = new RgvSlave();
        slave.setId(1);
        slave.setIp("192.168.6.9");
        slave.setIp("10.10.10.53");
        slave.setRack(0);
        slave.setSlot(0);
        RgvThread rgvThread = new RgvThread(slave);
@@ -565,6 +576,14 @@
        rgvThread.readStatus();
        System.out.println(JSON.toJSONString(rgvThread.rgvProtocol));
        Thread.sleep(3000L);
        RgvCommand command = new RgvCommand();
        command.setRgvNo(1);
        command.setSourceStaNo1((short)1120);
        command.setDestinationStaNo1((short)1101);
        command.setTaskNo1((short)1);
        command.setTaskMode1((short)3);
        command.setCommand((short)1);
        rgvThread.write(command);
    }
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -5,22 +5,22 @@
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.zy.core.CrnThread;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.CrnTaskModeType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.CrnSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.CrnCommand;
import com.zy.core.model.protocol.CrnProtocol;
import com.zy.entity.BasCrnOpt;
import com.zy.entity.BasCrnp;
import com.zy.service.BasCrnOptService;
import com.zy.service.BasCrnpService;
import com.zy.utils.News;
import com.zy.core.CrnThread;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.*;
import com.zy.core.model.CrnSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.CrnCommand;
import com.zy.core.model.protocol.CrnProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -80,15 +80,16 @@
                            command = new CrnCommand();
                        }
                        command.setCrnNo(slave.getId()); // 堆垛机编号
                        command.setTaskNo((short) 0); // 工作号
                        command.setTaskNo((short)0); // 工作号
                        command.setAckFinish((short) 1);  // 任务完成确认位
                        command.setTaskMode(CrnTaskModeType.NONE); // 任务模式
                        command.setTaskMode(CrnTaskModeType.RESET); // 任务模式
                        command.setSourcePosX((short)0);     // 源库位排
                        command.setSourcePosY((short)0);     // 源库位列
                        command.setSourcePosZ((short)0);     // 源库位层
                        command.setDestinationPosX((short)0);     // 目标库位排
                        command.setDestinationPosY((short)0);     // 目标库位列
                        command.setDestinationPosZ((short)0);     // 目标库位层
                        command.setCommand((short)0);
                        write(command);
                        break;
                    default:
@@ -194,23 +195,57 @@
                crnProtocol.setyDistance(siemensNet.getByteTransform().TransSingle(result.Content, 44));
                crnProtocol.setxDuration(siemensNet.getByteTransform().TransSingle(result.Content, 48));
                crnProtocol.setyDuration(siemensNet.getByteTransform().TransSingle(result.Content, 52));
//                crnProtocol.setTaskReceive(siemensNet.getByteTransform().TransInt16(result.Content, 60));
                OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
//                if (crnProtocol.getStatus() == 0 && crnProtocol.getTaskReceive() == 0) {
//                    OperateResultExOne<byte[]> taskResult = siemensNet.Read("DB100.0", (short) 20);
//                    if (taskResult.IsSuccess) {
//                        short taskNo = siemensNet.getByteTransform().TransInt16(taskResult.Content, 2);
//                        short taskMode = siemensNet.getByteTransform().TransInt16(taskResult.Content, 4);
//                        short sourcePosX = siemensNet.getByteTransform().TransInt16(taskResult.Content, 6);
//                        short sourcePosY = siemensNet.getByteTransform().TransInt16(taskResult.Content, 8);
//                        short sourcePosZ = siemensNet.getByteTransform().TransInt16(taskResult.Content, 10);
//                        short destinationPosX = siemensNet.getByteTransform().TransInt16(taskResult.Content, 12);
//                        short destinationPosY = siemensNet.getByteTransform().TransInt16(taskResult.Content, 14);
//                        short destinationPosZ = siemensNet.getByteTransform().TransInt16(taskResult.Content, 16);
//                        short confirm = siemensNet.getByteTransform().TransInt16(taskResult.Content, 18);
//
//                        if(taskNo != 0 || taskMode != 0 || sourcePosX != 0 || sourcePosY != 0 || sourcePosZ != 0 || destinationPosX != 0 || destinationPosY != 0 || destinationPosZ != 0 || confirm != 0) {
//                            short[] array = new short[10];
//                            array[0] = (short) 0;
//                            array[1] = (short) 0;
//                            array[2] = (short) 0;
//                            array[3] = (short) 0;
//                            array[4] = (short) 0;
//                            array[5] = (short) 0;
//                            array[6] = (short) 0;
//                            array[7] = (short) 0;
//                            array[8] = (short) 0;
//                            array[9] = (short) 0;
//                            siemensNet.Write("DB100.0", array);
//
//                            // 最后任务完成时间
//                            basCrnp.setModiTime(new Date());
//                            Thread.sleep(300);
//                        }
//                    }
//                }
                // 复位信号
                if (!Cools.isEmpty(crnProtocol.getStatusType()) && crnProtocol.getStatusType().equals(CrnStatusType.WAITING)) {
                    News.info("{}号堆垛机,收到任务{}完成信号",crnProtocol.getCrnNo(),crnProtocol.getTaskNo());
                    if (resetFlag) {
                        if(crnProtocol.getTaskNo()==9999){
                            backHpFlag = false;
                        }
                        CrnCommand crnCommand = new CrnCommand();
                        crnCommand.setAckFinish((short)1);
                        if (write(crnCommand)) {
                            resetFlag = false;
                        }
                    }
                }
//                if (!Cools.isEmpty(crnProtocol.getStatusType()) && crnProtocol.getStatusType().equals(CrnStatusType.WAITING)) {
//                    News.info("{}号堆垛机,收到任务{}完成信号",crnProtocol.getCrnNo(),crnProtocol.getTaskNo());
//                    if (resetFlag) {
//                        if(crnProtocol.getTaskNo()==9999){
//                            backHpFlag = false;
//                        }
//                        CrnCommand crnCommand = new CrnCommand();
//                        crnCommand.setAckFinish((short)1);
//                        if (write(crnCommand)) {
//                            resetFlag = false;
//                        }
//                    }
//                }
                try {
                    // 根据实时信息更新数据库
@@ -244,140 +279,297 @@
            News.error("堆垛机写入命令为空");
            return false;
        }
        // 向堆垛机发任务前的堆垛机状态
        try{
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24);
            if (resultRead.IsSuccess) {
                CrnCommand one = new CrnCommand();
                one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
                one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
                one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
                one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
                if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
                        || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
                        || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
                        || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
                ){
                    News.error("下发前:[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                } else {
                    News.info("下发前:[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
        // 任务完成确认位是否置0
        int writeAck = 0;
        boolean commandResult = false;
        do {
            OperateResult result = siemensNet.Write("DB100.0", (short) 0);
            if (result.IsSuccess) {
                OperateResultExOne<byte[]> commandReadResult = siemensNet.Read("DB100.0", (short) 2);
                if (commandReadResult.IsSuccess) {
                    short commandRead = siemensNet.getByteTransform().TransInt16(commandReadResult.Content, 0);
                    if (commandRead == 1) {
                        Thread.sleep(500);
                    } else {
                        commandResult = true;
                        break;
                    }
                }
            }
        }catch (Exception e){
            News.error("堆垛机命令地址写入后回读出错");
        }
            writeAck++;
            Thread.sleep(200);
        } while (writeAck < 5);
        command.setCrnNo(slave.getId());
        short[] array = new short[10];
        array[0] = command.getAckFinish(); // 任务完成确认位
        array[1] = command.getTaskNo();  // 任务号
        array[2] = command.getTaskMode();  // 模式
        array[3] = command.getSourcePosX(); // 源位置排号
        array[4] = command.getSourcePosY(); // 源位置列号
        array[5] = command.getSourcePosZ(); // 源位置层号
        array[6] = command.getDestinationPosX();  // 目标位置排号
        array[7] = command.getDestinationPosY(); // 目标位置列号
        array[8] = command.getDestinationPosZ(); // 目标位置层号
        array[9] = command.getCommand();
//        array[10] = 0;   //备用1
        OperateResult result = siemensNet.Write("DB100.0", array);
        News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), array);
        if (!result.IsSuccess) {
            News.error("写入堆垛机plc数据失败,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
            MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command));
            Thread.sleep(100);
            readStatus();
        if (!commandResult) {
            News.error("堆垛机命令下发[id:{}] >>>>> {}" + command.getCrnNo() + "任务状态位异常");
            return false;
        }
        //堆垛机任务写入后,回读一次,看是否成功
        Thread.sleep(200);
        try{
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24);
            if (resultRead.IsSuccess) {
                CrnCommand one = new CrnCommand();
                one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
                one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
                one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
                one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
                one.setTraySize(siemensNet.getByteTransform().TransBool(resultRead.Content, 22));
                if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
                        || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
                        || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
                        || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
        if(command.getTaskModeType() == CrnTaskModeType.RESET) {
            short[] array = new short[9];
            array[0] = command.getAckFinish();
            array[1] = (short) 0;
            array[2] = (short) 0;
            array[3] = (short) 0;
            array[4] = (short) 0;
            array[5] = (short) 0;
            array[6] = (short) 0;
            array[7] = (short) 0;
            array[8] = (short) 0;
                ){
                    try{
                        News.error("堆垛机命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    }catch (Exception e){
                        try{
                            News.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead));
                        }catch (Exception e1){
                            News.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
            // 写入任务数据
            int idx = 0;
            boolean commandDataResult = false;
            do {
                OperateResult result = siemensNet.Write("DB100.0", array);
                if (result.IsSuccess) {
                    OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 20);
                    if (resultRead.IsSuccess) {
                        short taskNo = siemensNet.getByteTransform().TransInt16(resultRead.Content, 2);
                        short taskMode = siemensNet.getByteTransform().TransInt16(resultRead.Content, 4);
                        short sourcePosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 6);
                        short sourcePosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 8);
                        short sourcePosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 10);
                        short destinationPosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 12);
                        short destinationPosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 14);
                        short destinationPosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 16);
                        if (taskNo != 0 || taskMode != 0 || sourcePosX != 0 || sourcePosY != 0 || sourcePosZ != 0 || destinationPosX != 0 || destinationPosY != 0 || destinationPosZ != 0) {
                            result = siemensNet.Write("DB100.0", array);
                        } else {
                            commandDataResult = true;
                            break;
                        }
                    }
                    News.error("堆垛机命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
                    MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command));
                    Thread.sleep(100);
                    readStatus();
                    return false;
                } else {
                    News.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                }
                idx++;
                Thread.sleep(200);
            } while (idx < 5);
            if (!commandDataResult) {
                News.error("堆垛机命令下发[id:{}] >>>>> {}" + command.getCrnNo() + "堆垛机写入任务数据失败");
                return false;
            }
        }catch (Exception e){
            News.error("堆垛机命令地址写入后回读出错");
        }
        if (command.getAckFinish() == 0) {
            if (result.IsSuccess) {
                Thread.sleep(300);
                //任务下发次数
                int writeCount2 = 0;
                do {
                    writeCount2++;
                    short commandFinish = (short) 1;
                    result = siemensNet.Write("DB100.18", commandFinish);
                    if(result.IsSuccess){
                        //堆垛机任务写入后,回读一次,看是否成功
                        Thread.sleep(200);
                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.18", (short) 2);
                        if (resultRead.IsSuccess) {
                            commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
                            if (commandFinish != 1){
                                News.error("堆垛机任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次");
                            }else{
                                //任务命令写入成功
                                News.info("堆垛机任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次");
                                break;
                            }
                        }else {
                            News.error("堆垛机任务确认位"+commandFinish+"回读失败!"+"循环执行次数:"+writeCount2+"次");
                        }
                    } else {
                        News.error("堆垛机任务确认位"+commandFinish+"写入失败!"+"循环执行次数:"+writeCount2+"次");
                    }
                }while (writeCount2<5);
            }
        } else {
            BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class);
            BasCrnp basCrnp = basCrnpService.selectById(slave.getId());
            basCrnp.setModiTime(new Date());
            basCrnpService.updateById(basCrnp);
        } else {
            short[] array = new short[9];
            array[0] = command.getAckFinish();
            array[1] = command.getTaskNo();
            array[2] = command.getTaskMode();
            array[3] = command.getSourcePosX();
            array[4] = command.getSourcePosY();
            array[5] = command.getSourcePosZ();
            array[6] = command.getDestinationPosX();
            array[7] = command.getDestinationPosY();
            array[8] = command.getDestinationPosZ();
            // 写入任务数据
            int idx = 0;
            boolean commandDataResult = false;
            do {
                OperateResult result = siemensNet.Write("DB100.0", array);
                if (result.IsSuccess) {
                    OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 20);
                    if (resultRead.IsSuccess) {
                        short taskNo = siemensNet.getByteTransform().TransInt16(resultRead.Content, 2);
                        short taskMode = siemensNet.getByteTransform().TransInt16(resultRead.Content, 4);
                        short sourcePosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 6);
                        short sourcePosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 8);
                        short sourcePosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 10);
                        short destinationPosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 12);
                        short destinationPosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 14);
                        short destinationPosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 16);
                        if (taskNo != command.getTaskNo()
                                || taskMode != command.getTaskMode()
                                || sourcePosX != command.getSourcePosX()
                                || sourcePosY != command.getSourcePosY()
                                || sourcePosZ != command.getSourcePosZ()
                                || destinationPosX != command.getDestinationPosX()
                                || destinationPosY != command.getDestinationPosY()
                                || destinationPosZ != command.getDestinationPosZ()) {
                            result = siemensNet.Write("DB100.0", array);
                        } else {
                            commandDataResult = true;
                            break;
                        }
                    }
                }
                idx++;
                Thread.sleep(200);
            } while (idx < 5);
            if (!commandDataResult) {
                News.error("堆垛机命令下发[id:{}] >>>>> {}" + command.getCrnNo() + "堆垛机写入任务数据失败");
                return false;
            }
            // 下发任务下发确认位
            int writeConfirmIdx = 0;
            boolean commandConfirmResult = false;
            do {
                OperateResult result = siemensNet.Write("DB100.18", (short) 1);
                if (result.IsSuccess) {
                    OperateResultExOne<byte[]> commandReadResult = siemensNet.Read("DB100.18", (short) 2);
                    if (commandReadResult.IsSuccess) {
                        short commandRead = siemensNet.getByteTransform().TransInt16(commandReadResult.Content, 0);
                        if (commandRead == 0) {
                            Thread.sleep(500);
                        } else {
                            commandConfirmResult = true;
                            break;
                        }
                    }
                }
                writeConfirmIdx++;
                Thread.sleep(200);
            } while (writeConfirmIdx < 5);
            if (!commandConfirmResult) {
                News.error("堆垛机写入确认数据失败 ===>> [id:{}]", command.getCrnNo());
                return false;
            }
        }
        // 向堆垛机发任务前的堆垛机状态
//        try{
//            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24);
//            if (resultRead.IsSuccess) {
//                CrnCommand one = new CrnCommand();
//                one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
//                one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
//                one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
//                one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
//                one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
//                one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
//                one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
//                one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
//                if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
//                        || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
//                        || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
//                        || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
//                ){
//                    News.error("下发前:[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
//                } else {
//                    News.info("下发前:[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
//                }
//            }
//        }catch (Exception e){
//            News.error("堆垛机命令地址写入后回读出错");
//        }
//
//        command.setCrnNo(slave.getId());
//
//        short[] array = new short[10];
//        array[0] = command.getAckFinish(); // 任务完成确认位
//        array[1] = command.getTaskNo();  // 任务号
//        array[2] = command.getTaskMode();  // 模式
//        array[3] = command.getSourcePosX(); // 源位置排号
//        array[4] = command.getSourcePosY(); // 源位置列号
//        array[5] = command.getSourcePosZ(); // 源位置层号
//        array[6] = command.getDestinationPosX();  // 目标位置排号
//        array[7] = command.getDestinationPosY(); // 目标位置列号
//        array[8] = command.getDestinationPosZ(); // 目标位置层号
//        array[9] = command.getCommand();
////        array[10] = 0;   //备用1
//
//        OperateResult result = siemensNet.Write("DB100.0", array);
//        News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), array);
//
//        if (!result.IsSuccess) {
//            News.error("写入堆垛机plc数据失败,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
//            MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command));
//            Thread.sleep(100);
//            readStatus();
//            return false;
//        }
//
//        //堆垛机任务写入后,回读一次,看是否成功
//        Thread.sleep(200);
//        try{
//            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24);
//            if (resultRead.IsSuccess) {
//                CrnCommand one = new CrnCommand();
//                one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
//                one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
//                one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
//                one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
//                one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
//                one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
//                one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
//                one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
//                one.setTraySize(siemensNet.getByteTransform().TransBool(resultRead.Content, 22));
//                if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
//                        || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
//                        || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
//                        || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
//
//                ){
//                    try{
//                        News.error("堆垛机命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
//                    }catch (Exception e){
//                        try{
//                            News.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead));
//                        }catch (Exception e1){
//                            News.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
//                        }
//                    }
//                    News.error("堆垛机命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
//                    MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command));
//                    Thread.sleep(100);
//                    readStatus();
//                    return false;
//                } else {
//                    News.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
//                }
//            }
//        }catch (Exception e){
//            News.error("堆垛机命令地址写入后回读出错");
//        }
//
//
//        if (command.getAckFinish() == 0) {
//            if (result.IsSuccess) {
//                Thread.sleep(300);
//                //任务下发次数
//                int writeCount2 = 0;
//
//                do {
//                    writeCount2++;
//                    short commandFinish = (short) 1;
//                    result = siemensNet.Write("DB100.18", commandFinish);
//                    if(result.IsSuccess){
//                        //堆垛机任务写入后,回读一次,看是否成功
//                        Thread.sleep(200);
//                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.18", (short) 2);
//                        if (resultRead.IsSuccess) {
//                            commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
//                            if (commandFinish != 1){
//                                News.error("堆垛机任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次");
//                            }else{
//                                //任务命令写入成功
//                                News.info("堆垛机任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次");
//                                break;
//                            }
//                        }else {
//                            News.error("堆垛机任务确认位"+commandFinish+"回读失败!"+"循环执行次数:"+writeCount2+"次");
//                        }
//                    } else {
//                        News.error("堆垛机任务确认位"+commandFinish+"写入失败!"+"循环执行次数:"+writeCount2+"次");
//                    }
//                }while (writeCount2<5);
//            }
//        } else {
//            BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class);
//            BasCrnp basCrnp = basCrnpService.selectById(slave.getId());
//            basCrnp.setModiTime(new Date());
//            basCrnpService.updateById(basCrnp);
//        }
//        if (command.getAckFinish() == 1) {
//        }
        try {
            // 日志记录
@@ -402,16 +594,16 @@
            bean.insert(basCrnOpt);
        } catch (Exception ignore) {}
        if (result.IsSuccess) {
            this.readStatus();
//        if (result.IsSuccess) {
//            this.readStatus();
            News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
            return true;
        } else {
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            News.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
//        } else {
//            OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
//            News.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
//            return false;
//        }
    }
    @Override
@@ -424,8 +616,8 @@
    /*****************************************************************************************/
    public static void main(String[] args) throws InterruptedException {
        CrnSlave slave = new CrnSlave();
        slave.setId(1);
        slave.setIp("10.10.10.1");
        slave.setId(3);
        slave.setIp("10.10.10.100");
        slave.setRack(0);
        slave.setSlot(0);
        SiemensCrnThread crnThread = new SiemensCrnThread(slave);
@@ -435,39 +627,41 @@
        Thread.sleep(3000L);
        // 1.入库 源和目标都发
//        CrnCommand command = new CrnCommand();
//        command.setCrnNo(1); // 堆垛机编号
//        command.setTaskNo((short) 0); // 工作号
        CrnCommand command = new CrnCommand();
        command.setCrnNo(1); // 堆垛机编号
        command.setTaskNo((short) 80); // 工作号
//        command.setAckFinish((short) 0);  // 任务完成确认位
//        command.setTaskMode(CrnTaskModeType.PAKIN); // 任务模式
//        command.setSourcePosX((short) 1);     // 源库位排
//        command.setSourcePosY((short) 0);     // 源库位列
//        command.setSourcePosZ((short) 1);     // 源库位层
//        command.setDestinationPosX((short) 2);     // 目标库位排
//        command.setDestinationPosY((short) 3);     // 目标库位列
//        command.setDestinationPosZ((short) 1);     // 目标库位层
//        crnThread.write(command);
        command.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式
        command.setSourcePosX((short) 11);     // 源库位排
        command.setSourcePosY((short) 4);     // 源库位列
        command.setSourcePosZ((short) 1);     // 源库位层
        command.setDestinationPosX((short) 12);     // 目标库位排
        command.setDestinationPosY((short) 5);     // 目标库位列
        command.setDestinationPosZ((short) 1);     // 目标库位层
        command.setCommand((short) 1);     // 目标库位层
        crnThread.write(command);
        // 2.出库 源和目标都发
//        CrnCommand command = new CrnCommand();
//        command.setCrnNo(1); // 堆垛机编号
//        command.setTaskNo((short) 0); // 工作号
//        command.setAckFinish((short) 0);  // 任务完成确认位
//        command.setTaskMode(CrnTaskModeType.PAKOUT); // 任务模式
//        command.setSourcePosX((short) 2);     // 源库位排
//        command.setSourcePosY((short) 4);     // 源库位列
//        command.setSourcePosZ((short) 3);     // 源库位层
//        command.setDestinationPosX((short) 1);     // 目标库位排
//        command.setDestinationPosY((short) 0);     // 目标库位列
//        command.setCrnNo(2); // 堆垛机编号
//        command.setTaskNo((short) 80); // 工作号
////        command.setAckFinish((short) 0);  // 任务完成确认位
//        command.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式
//        command.setSourcePosX((short) 5);     // 源库位排
//        command.setSourcePosY((short) 1);     // 源库位列
//        command.setSourcePosZ((short) 1);     // 源库位层
//        command.setDestinationPosX((short) 7);     // 目标库位排
//        command.setDestinationPosY((short) 1);     // 目标库位列
//        command.setDestinationPosZ((short) 1);     // 目标库位层
//        command.setCommand((short) 1);
//        crnThread.write(command);
//        // 3.库位移转   源和目标都发 pass
//        CrnCommand command = new CrnCommand();
//        command.setCrnNo(slave.getId()); // 堆垛机编号
//        command.setTaskNo((short) 2); // 工作号
//        command.setAckFinish((short) 0);  // 任务完成确认位
//        command.setCrnNo(2); // 堆垛机编号
//        command.setTaskNo((short) 88); // 工作号
////        command.setAckFinish((short) 0);  // 任务完成确认位
//        command.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
//        command.setSourcePosX((short)2);     // 源库位排
//        command.setSourcePosY((short)1);     // 源库位列
@@ -475,6 +669,7 @@
//        command.setDestinationPosX((short)3);     // 目标库位排
//        command.setDestinationPosY((short)1);     // 目标库位列
//        command.setDestinationPosZ((short)1);     // 目标库位层
//        command.setCommand((short)1);
//        crnThread.write(command);
        // 4.站位移转   源和目标都发
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -44,16 +44,16 @@
    // 站点
    public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{
        for(int i = 1 ;i <= 20; i ++) {add(1100+i);}
        for(int i = 1 ;i <= 21; i ++) {add(1100+i);}
    }};
    public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{
        for(int i = 1 ;i <= 20; i ++) {add(1200+i);}
        for(int i = 1 ;i <= 21; i ++) {add(1200+i);}
    }};
    public static final ArrayList<Integer> staNos3 = new ArrayList<Integer>() {{
        for(int i = 1 ;i <= 20; i ++) {add(1300+i);}
        for(int i = 1 ;i <= 21; i ++) {add(1300+i);}
    }};
    public static final ArrayList<Integer> staNos4 = new ArrayList<Integer>() {{
        for(int i = 1 ;i <= 20; i ++) {add(1400+i);}
        for(int i = 1 ;i <= 21; i ++) {add(1400+i);}
    }};
    private ArrayList<Integer> getStaNo() {
        switch (this.slave.getId()) {
src/main/java/com/zy/entity/WrkDetl.java
@@ -166,8 +166,7 @@
    /**
     * 长度
     */
    @ApiModelProperty(value= "长度")
    private Double length;
//    @ApiModelProperty(value= "长度")\\\\\\\\\\
    /**
     * 体积
src/main/java/com/zy/entity/WrkMast.java
@@ -42,6 +42,9 @@
    @ApiModelProperty(value= "")
    private String mk;
    /**
     * 0默认,1.已给RGV发任务,一层楼只能有一个为1
     */
    @ApiModelProperty(value= "")
    @TableField("whs_type")
    private Integer whsType;
src/main/java/com/zy/entity/vo/RgvStateTableVo.java
@@ -27,7 +27,7 @@
    private String loading1 = "-";
    // RGV位置
    private Short RgvPos = 0;
    private Integer RgvPos = 0;
    // 走行定位
    private String walkPos = "-";
src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -22,11 +22,14 @@
import com.zy.core.model.Task;
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.protocol.CrnProtocol;
import com.zy.core.model.protocol.RgvProtocol;
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.entity.*;
import com.zy.mapper.*;
@@ -319,11 +322,12 @@
                        wrkMast.setIoTime(now);
                        wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57
                        wrkMast.setWrkSts(2L); // 工作状态: 2.设备上走
                        wrkMast.setSourceStaNo(wrkMast.getStaNo()); // 源站
                        wrkMast.setSourceStaNo(pickSta.getStaNo()); // 源站
                        wrkMast.setStaNo(staNo); // 目标站
                        wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 目标库位 = 出库时的源库位
                        wrkMast.setSourceLocNo(""); // 源库位清空
                        wrkMast.setModiTime(now);
                        wrkMast.setWhsType(0);
                        if (wrkMastMapper.updateById(wrkMast) == 0) {
                            throw new CoolException("更新工作档数据状态失败");
                        }
@@ -344,7 +348,7 @@
                    // 更新站点信息 且 下发plc命令
                    staProtocol.setWorkNo(wrkMast.getWrkNo());
                    staProtocol.setStaNo(staProtocol.getSiteId().shortValue());
                    staProtocol.setStaNo(staDesc.getCrnStn().shortValue());
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                    log.error("输送线下发5:"+wrkMast.getWrkNo()+","+wrkMast.getStaNo());
@@ -413,7 +417,13 @@
                        if (wrkMastMapper.updateById(wrkMast) != 0) {
                            // 复位堆垛机
                            News.info("出库任务完成下发堆垛机复位,任务号:{}",wrkMast.getWrkNo());
                            crnThread.setResetFlag(true);
                            // 堆垛机复位
                            if (!MessageQueue.offer(SlaveType.Crn, crnThread.getCrnProtocol().getCrnNo(), new Task(3, null))) {
                                News.error(crnThread.getCrnProtocol().getCrnNo() + "出库任务完成下发堆垛机复位,下发复位命令失败");
                            } else {
                                News.warnNoLog(""+mark+" - 2"+" - 出库任务完成下发堆垛机复位成功 : 堆垛机号={}",crnThread.getCrnProtocol().getCrnNo());
                            }
//                            crnThread.setResetFlag(true);
                        } else {
                            News.error(""+mark+" - 1"+" - 更新工作档的工作状态为14失败!!! [工作号:{}]", wrkMast.getWrkNo());
                        }
@@ -451,7 +461,7 @@
            // 只有当堆垛机空闲 并且 无任务时才继续执行
            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
                    && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) {
                    && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0 && crnProtocol.getAlarm() == 0) {
                News.warnNoLog(""+mark+" - 0"+" - 开始执行堆垛机入出库作业下发");
                // 如果最近一次是入库模式
                if (crnProtocol.getLastIo().equals("I")) {
@@ -550,40 +560,42 @@
                News.warnNoLog(""+mark+" - 1"+" - 8"+" - 双深库位且浅库位有货,则需先对浅库位进行库位移转 : 开始执行 任务号={}",wrkMast.getWrkNo());
                String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getLocNo());
                LocMast shallowLoc = locMastService.selectById(shallowLocNo);
                // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!
                if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
                    News.warnNoLog(""+mark+" - 1"+" - 9"+" - // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!库位状态={}",shallowLoc.getLocSts());
                    WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                    if (null == waitWrkMast) {
                        News.error(""+mark+" - 1"+" - 10"+" - {}库位异常,未检索到相应工作档!", shallowLocNo);
                    } else {
                        waitWrkMast.setIoPri(15D);
                        waitWrkMast.setModiTime(new Date());
                        if (wrkMastMapper.updateById(waitWrkMast) == 0) {
                            News.error(""+mark+" - 1"+" - 11"+" - 调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo());
                if(shallowLoc != null) {
                    // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!
                    if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
                        News.warnNoLog(""+mark+" - 1"+" - 9"+" - // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!库位状态={}",shallowLoc.getLocSts());
                        WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                        if (null == waitWrkMast) {
                            News.error(""+mark+" - 1"+" - 10"+" - {}库位异常,未检索到相应工作档!", shallowLocNo);
                        } else {
                            waitWrkMast.setIoPri(15D);
                            waitWrkMast.setModiTime(new Date());
                            if (wrkMastMapper.updateById(waitWrkMast) == 0) {
                                News.error(""+mark+" - 1"+" - 11"+" - 调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo());
                            }
                            continue;
                        }
                    } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
                        News.warnNoLog(""+mark+" - 1"+" - 12"+" - // F、D  库位状态={}",shallowLoc.getLocSts());
                        // 此标记避免多次执行移库任务
                        if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) {
                            wrkMast.setUpdMk("Y");
                            wrkMast.setIoPri(14D);
                            wrkMastMapper.updateById(wrkMast);
                            // 生成工作档,将浅库位移转到新的库位中
                            moveLocForDeepLoc(slave, shallowLoc,mark);
                            // 生成工作档、改变浅库位的源库/目标库 库位状态、下发堆垛机命令(立马执行)
//                        moveLocForDeepLocPakin(slave, shallowLoc, wrkMast);
                        }
                        continue;
                    }
                } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
                    News.warnNoLog(""+mark+" - 1"+" - 12"+" - // F、D  库位状态={}",shallowLoc.getLocSts());
                    // 此标记避免多次执行移库任务
                    if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) {
                        wrkMast.setUpdMk("Y");
                        wrkMast.setIoPri(14D);
                        wrkMastMapper.updateById(wrkMast);
                        // 生成工作档,将浅库位移转到新的库位中
                        moveLocForDeepLoc(slave, shallowLoc,mark);
                        // 生成工作档、改变浅库位的源库/目标库 库位状态、下发堆垛机命令(立马执行)
//                        moveLocForDeepLocPakin(slave, shallowLoc, wrkMast);
                    }
                    continue;
                } else if (shallowLoc.getLocSts().equals("Q")) {
                    News.warnNoLog(""+mark+" - 1"+" - 13"+" - // Q  库位状态={}",shallowLoc.getLocSts());
                    WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                    if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) {
                        News.infoNoLog(""+mark+" - 1"+" - 14"+" - // F、D  工作状态(判断条件为==4)={}",waitWrkMast.getWrkSts());
                        continue;
                    } else if (shallowLoc.getLocSts().equals("Q")) {
                        News.warnNoLog(""+mark+" - 1"+" - 13"+" - // Q  库位状态={}",shallowLoc.getLocSts());
                        WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                        if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) {
                            News.infoNoLog(""+mark+" - 1"+" - 14"+" - // F、D  工作状态(判断条件为==4)={}",waitWrkMast.getWrkSts());
                            continue;
                        }
                    }
                }
            }
@@ -603,7 +615,8 @@
            crnCommand.setDestinationPosX(locMast.getRow1().shortValue());     // 目标库位排
            crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列
            crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层
            crnCommand.setTraySize(locMast.getLocType1() == 2);
            crnCommand.setCommand((short) 1);     // 任务确认
//            crnCommand.setTraySize(locMast.getLocType1() == 2);
            if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                News.error(""+mark+" - 1"+" - 16"+" - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
            } else {
@@ -688,46 +701,48 @@
                        News.warnNoLog(""+mark+" - 2"+" - 6"+" - 双深库位且浅库位有货,则需先对浅库位进行库位移转 : 开始执行 任务号={}",wrkMast.getWrkNo());
                        String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getSourceLocNo());
                        LocMast shallowLoc = locMastService.selectById(shallowLocNo);
                        // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!
                        if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
                            News.warnNoLog(""+mark+" - 2"+" - 7"+" - // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!库位状态={}",shallowLoc.getLocSts());
                            WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                            if (null == waitWrkMast) {
                                News.error("{}库位异常,未检索到相应工作档!", shallowLocNo);
                            } else {
                                if (waitWrkMast.getWrkSts() == 11) {
                                    waitWrkMast.setIoPri(15D);
                                    waitWrkMast.setModiTime(new Date());
                                    if (wrkMastMapper.updateById(waitWrkMast) == 0) {
                                        News.error(""+mark+" - 2"+" - 8"+" - 调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo());
                                    }
                                    continue;
                        if (shallowLoc != null) {
                            // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!
                            if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
                                News.warnNoLog(""+mark+" - 2"+" - 7"+" - // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!库位状态={}",shallowLoc.getLocSts());
                                WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                                if (null == waitWrkMast) {
                                    News.error("{}库位异常,未检索到相应工作档!", shallowLocNo);
                                } else {
                                    if (waitWrkMast.getWrkSts() == 11) {
                                        waitWrkMast.setIoPri(15D);
                                        waitWrkMast.setModiTime(new Date());
                                        if (wrkMastMapper.updateById(waitWrkMast) == 0) {
                                            News.error(""+mark+" - 2"+" - 8"+" - 调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo());
                                        }
                                        continue;
                                    } else {
                                    }
                                }
                            }
                        } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
                            News.warnNoLog(""+mark+" - 2"+" - 9"+" - // F、D  库位状态={}",shallowLoc.getLocSts());
                            } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
                                News.warnNoLog(""+mark+" - 2"+" - 9"+" - // F、D  库位状态={}",shallowLoc.getLocSts());
//                            WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                            //2022-08-16 modify,不根据updmk标记移库任务(容易被取消导致堵塞),查询工作档是否存在任务
                            WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo);
                            // 此标记避免多次执行移库任务
                                //2022-08-16 modify,不根据updmk标记移库任务(容易被取消导致堵塞),查询工作档是否存在任务
                                WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo);
                                // 此标记避免多次执行移库任务
//                            if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())
//                                || Cools.isEmpty(waitWrkMast)) {
                            if (Cools.isEmpty(waitWrkMast)) {
                                wrkMast.setUpdMk("Y");
                                wrkMastMapper.updateById(wrkMast);
                                // 生成工作档,将浅库位移转到新的库位中
                                moveLocForDeepLoc(slave, shallowLoc,mark);
                            }
                            News.error("{}任务出库失败,浅库位堵塞!浅库位号:{}", wrkMast.getWrkNo(), shallowLocNo);
                            break;
                        } else if (shallowLoc.getLocSts().equals("Q") || shallowLoc.getLocSts().equals("S")) {
                            News.warnNoLog(""+mark+" - 2"+" - 10"+" - // Q、S  库位状态={}",shallowLoc.getLocSts());
                            WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo);
                            if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) {
                                News.infoNoLog(""+mark+" - 2"+" - 11"+" - // F、D  工作状态(判断条件为==4)={}",waitWrkMast.getWrkSts());
                                continue;
                                if (Cools.isEmpty(waitWrkMast)) {
                                    wrkMast.setUpdMk("Y");
                                    wrkMastMapper.updateById(wrkMast);
                                    // 生成工作档,将浅库位移转到新的库位中
                                    moveLocForDeepLoc(slave, shallowLoc,mark);
                                }
                                News.error("{}任务出库失败,浅库位堵塞!浅库位号:{}", wrkMast.getWrkNo(), shallowLocNo);
                                break;
                            } else if (shallowLoc.getLocSts().equals("Q") || shallowLoc.getLocSts().equals("S")) {
                                News.warnNoLog(""+mark+" - 2"+" - 10"+" - // Q、S  库位状态={}",shallowLoc.getLocSts());
                                WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo);
                                if (null != waitWrkMast && waitWrkMast.getWrkSts() == 4) {
                                    News.infoNoLog(""+mark+" - 2"+" - 11"+" - // F、D  工作状态(判断条件为==4)={}",waitWrkMast.getWrkSts());
                                    continue;
                                }
                            }
                        }
                    }
@@ -754,7 +769,8 @@
                    crnCommand.setDestinationPosX(crnStn.getRow().shortValue());     // 目标库位排
                    crnCommand.setDestinationPosY(crnStn.getBay().shortValue());     // 目标库位列
                    crnCommand.setDestinationPosZ(crnStn.getLev().shortValue());     // 目标库位层
                    crnCommand.setTraySize(sourceSta.getLocType1() == 2);     //库位类型
                    crnCommand.setCommand((short)1);     // 任务确认
//                    crnCommand.setTraySize(sourceSta.getLocType1() == 2);     //库位类型
                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                        News.error(""+mark+" - 2"+" - 13"+" - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
@@ -828,7 +844,7 @@
        CrnCommand crnCommand = new CrnCommand();
        crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
        crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
        crnCommand.setAckFinish((short) 0);  // 任务完成确认位
//        crnCommand.setAckFinish((short) 0);  // 任务完成确认位
        crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
        crnCommand.setSourcePosX(sourceSta.getRow1().shortValue());     // 源库位排
        crnCommand.setSourcePosY(sourceSta.getBay1().shortValue());     // 源库位列
@@ -836,7 +852,8 @@
        crnCommand.setDestinationPosX(sta.getRow1().shortValue());     // 目标库位排
        crnCommand.setDestinationPosY(sta.getBay1().shortValue());     // 目标库位列
        crnCommand.setDestinationPosZ(sta.getLev1().shortValue());     // 目标库位层
        crnCommand.setTraySize(sourceSta.getLocType1() == 2);     //库位类型
        crnCommand.setCommand((short)1);     // 任务确认
//        crnCommand.setTraySize(sourceSta.getLocType1() == 2);     //库位类型
        if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
            News.error(""+mark+" - 3"+" - 4"+" - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
        } else {
@@ -866,11 +883,12 @@
                continue;
            }
            //  状态:等待确认 并且  任务完成位 = 1
            if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) {
            if (crnProtocol.getMode().intValue() == CrnModeType.AUTO.id && crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) {
                News.warnNoLog(""+mark+" - 0"+" - 开始执行对工作档的完成操作");
                if (crnProtocol.getTaskNo() == 9999) {
                    // 堆垛机复位
                    crnThread.setResetFlag(true);
                    if (!MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(3, null))) {
                        News.error(crn.getId() + "堆垛机回原点任务,下发复位命令失败");
                    }
                } else {
                    // 获取入库待确认工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep3(crnProtocol.getTaskNo().intValue());
@@ -890,8 +908,11 @@
                    // 修改成功后复位堆垛机
                    if (wrkMastMapper.updateById(wrkMast) > 0) {
                        // 堆垛机复位
                        News.warnNoLog(""+mark+" - 2"+" - 修改成功后复位堆垛机 : 堆垛机号={}",crnThread.getCrnProtocol().getCrnNo());
                        crnThread.setResetFlag(true);
                        if (!MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(3, null))) {
                            News.error(crn.getId() + "入库完成,下发复位命令失败");
                        } else {
                            News.warnNoLog(""+mark+" - 2"+" - 入库完成复位堆垛机 : 堆垛机号={}",crnThread.getCrnProtocol().getCrnNo());
                        }
                    }
                }
@@ -1073,7 +1094,7 @@
                            // 更新站点信息 且 下发plc命令
                            staProtocol.setWorkNo(dto.getWorkNo());
                            staProtocol.setStaNo(staProtocol.getSiteId().shortValue());
                            staProtocol.setStaNo(dto.getStaNo().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            log.error("输送线下发6:"+dto.getWorkNo()+","+staProtocol.getSiteId());
@@ -1585,7 +1606,10 @@
     * 堆垛机回原点
     */
    public synchronized void originGo() throws InterruptedException {
        Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "crnAutoHome").eq("status", 1));
        if (config == null || Cools.isEmpty(config.getValue()) || !config.getValue().equals("Y")) {
            return;
        }
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
@@ -1625,13 +1649,15 @@
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(crn.getId()); // 堆垛机编号
                crnCommand.setTaskNo((short) 9999); // 工作号
                crnCommand.setAckFinish((short)0);
                crnCommand.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式:  回原点
                crnCommand.setSourcePosX((short) (crn.getId() == 1 ? 3 : 6));     // 源库位排
                crnCommand.setSourcePosY((short) 1);     // 源库位列
                crnCommand.setSourcePosZ((short) 1);     // 源库位层
                crnCommand.setSourcePosX((short) 0);     // 源库位排
                crnCommand.setSourcePosY((short) 0);     // 源库位列
                crnCommand.setSourcePosZ((short) 0);     // 源库位层
                crnCommand.setDestinationPosX((short) 0);     // 目标库位排
                crnCommand.setDestinationPosY((short) 0);     // 目标库位列
                crnCommand.setDestinationPosZ((short) 0);     // 目标库位层
                crnCommand.setCommand((short)1);
                if (!MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, crnCommand))) {
                    News.error("回原点任务下发失败", crn.getId(), JSON.toJSON(crnCommand));
                } else {
@@ -1644,4 +1670,82 @@
        }
    }
    public static final HashMap<Integer,Integer> wrkStaNoToRgvStaMap = new HashMap<>();
    static {
        wrkStaNoToRgvStaMap.put(1101,1114);
        wrkStaNoToRgvStaMap.put(1201,1203);
        wrkStaNoToRgvStaMap.put(1206,1203);
        wrkStaNoToRgvStaMap.put(1301,1303);
        wrkStaNoToRgvStaMap.put(1306,1303);
        wrkStaNoToRgvStaMap.put(1408,1413);
    }
    public static final HashMap<Integer,Integer> wrkSourceStaNoToRgvStaMap = new HashMap<>();
    static {
        wrkSourceStaNoToRgvStaMap.put(1112,1114);
        wrkSourceStaNoToRgvStaMap.put(1109,1114);
        wrkSourceStaNoToRgvStaMap.put(1209,1213);
        wrkSourceStaNoToRgvStaMap.put(1309,1313);
        wrkSourceStaNoToRgvStaMap.put(1402,1403);
        wrkSourceStaNoToRgvStaMap.put(1407,1403);
    }
    public synchronized void rgvCarry() {
        for(int i = 1; i <= 4; i ++) {
            List<Integer> rgvCarrySiteList;
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, i);
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) {
                continue;
            }
            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, i);
            if(rgvProtocol.modeType == RgvModeType.AUTO && rgvProtocol.statusType == RgvStatusType.IDLE && rgvProtocol.loaded1 == 0
            && rgvProtocol.alarm == 0 && rgvProtocol.getTaskNo1() == 0) {
                switch (i) {
                    case 1: rgvCarrySiteList = Arrays.asList(1114,1118,1120); break;
                    case 2: rgvCarrySiteList = Arrays.asList(1213,1216,1218,1220); break;
                    case 3: rgvCarrySiteList = Arrays.asList(1313,1316,1318,1320); break;
                    case 4: rgvCarrySiteList = Arrays.asList(1403,1418,1420); break;
                    default:
                        return;
                }
                List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<BasDevp>().ne("wrk_no", 0).in("dev_no", rgvCarrySiteList));
                if(!basDevps.isEmpty()) {
                    List<Integer> wrkNos = basDevps.stream().map(BasDevp::getWrkNo).distinct().collect(Collectors.toList());
                    List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_no", wrkNos)
                            .last("ORDER BY CASE WHEN crn_end_time IS NULL THEN 0 ELSE 1 END,crn_end_time ASC"));
                    Optional<WrkMast> first = wrkMastList.stream().filter(wrkMast -> wrkMast.getWhsType() == 1).findFirst();
                    if(first.isPresent()) {
                        log.warn("有任务处在{}号小车搬运中,任务号{}",i,first.get().getWrkNo());
                        continue;
                    }
                    for(WrkMast wrkMast:wrkMastList) {
                        // 判断目标站点是否可用
                        StaProtocol staProtocol = devpThread.getStation().get(wrkStaNoToRgvStaMap.get(wrkMast.getStaNo()) == null ?
                                wrkMast.getStaNo() : wrkStaNoToRgvStaMap.get(wrkMast.getStaNo()));
                        if (staProtocol != null && staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.getWorkNo() == 0) {
                            RgvCommand rgvCommand = new RgvCommand();
                            rgvCommand.setRgvNo(rgvProtocol.getRgvNo());
//                            rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
                            rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());
                            rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式:  取放货
                            Integer sourcesStaNo = wrkSourceStaNoToRgvStaMap.get(wrkMast.getSourceStaNo());
                            rgvCommand.setSourceStaNo1(sourcesStaNo == null ? wrkMast.getSourceStaNo().shortValue() : sourcesStaNo.shortValue());   //工位1起点
                            rgvCommand.setDestinationStaNo1(wrkMast.getStaNo().shortValue());   //工位1目标站点
                            rgvCommand.setCommand((short) 1);   //工位1任务确认
                            if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(2, rgvCommand))) {
                                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                                break;
                            }
                            wrkMast.setWhsType(1);
                            wrkMastService.updateById(wrkMast);
                            break;
                        }
                    }
                }
            }
        }
    }
}
src/main/resources/application.yml
@@ -492,7 +492,7 @@
    port: 5005
    devpPlcId: ${wcs-slave.devp[1].id}
    staArr: 1206
    crnId: 1
    crnId: 2
  # LED6
  led[5]:
    id: 6
@@ -500,7 +500,7 @@
    port: 5005
    devpPlcId: ${wcs-slave.devp[1].id}
    staArr: 1209
    crnId: 1
    crnId: 3
  # LED7
  led[6]:
    id: 7
@@ -516,7 +516,7 @@
    port: 5005
    devpPlcId: ${wcs-slave.devp[2].id}
    staArr: 1306
    crnId: 1
    crnId: 2
  # LED9
  led[8]:
    id: 9
@@ -524,7 +524,7 @@
    port: 5005
    devpPlcId: ${wcs-slave.devp[2].id}
    staArr: 1309
    crnId: 1
    crnId: 3
  # LED10
  led[9]:
    id: 10
@@ -540,7 +540,7 @@
    port: 5005
    devpPlcId: ${wcs-slave.devp[3].id}
    staArr: 1407
    crnId: 1
    crnId: 2
  # LED12
  led[11]:
    id: 12
@@ -548,11 +548,11 @@
    port: 5005
    devpPlcId: ${wcs-slave.devp[3].id}
    staArr: 1408
    crnId: 1
    crnId: 3
  rgv[0]:
    id: 1
    ip: 192.168.5.20
    ip: 10.10.10.53
    port: 102
    rack: 0
    slot: 0
src/main/webapp/static/js/console.map.js
@@ -389,8 +389,8 @@
                    }
                    ,{
                        "type": "stn",
                        "id": "site-1",
                        "text": "1",
                        "id": "site-1121",
                        "text": "1121",
                        "top": 442,
                        "left": 1629,
                        "width": 50,
src/main/webapp/views/console.html
@@ -44,11 +44,11 @@
            <div class="machine-status">
                <div class="body-head">堆垛机状态</div>
                <div class="state">
                    <span>堆垛机 1</span>
                    <span>堆垛机状态</span>
                    <span class="state-ss machine-put-flag    ">入库</span>
                </div>
                <div class="state">
                    <span>堆垛机 2</span>
                    <span>堆垛机状态</span>
                    <span class="state-ss machine-auto-flag    ">自动</span>
                </div>
@@ -600,12 +600,12 @@
                            crns[i].bay = 1
                        }
                        var offSet = 350;
                        var offSet = 1520;
                        if(crns[i].bay === 1){
                            crnEl.animate({left: offSet + 'px'}, 1000);
                        } else {
                            let lf = (offSet + (crns[i].bay - 1 )* 50);
                            let lf = (offSet -  crns[i].bay * 40);
                            crnEl.animate({left: lf + 'px'}, 1000);
                        }
src/main/webapp/views/crn.html
@@ -144,7 +144,7 @@
                    <div class="select-container" style="padding: 20px 0;">
                        <label><input type="radio" name="crnSelect" value="1" checked>&nbsp;1号堆垛机</label>
                        <label><input type="radio" name="crnSelect" value="2">&nbsp;2号堆垛机</label>
<!--                        <label><input type="radio" name="crnSelect" value="3">&nbsp;3号堆垛机</label>-->
                        <label><input type="radio" name="crnSelect" value="3">&nbsp;3号堆垛机</label>
<!--                        <label><input type="radio" name="crnSelect" value="4">&nbsp;4号堆垛机</label>-->
                    </div>
                </div>