#
Junjie
1 天以前 3c45d4f9f3aba5bc85a9577e43c0dffc71b93a22
#
17个文件已修改
1个文件已添加
2个文件已删除
2821 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/ForkLiftController.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasLift.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 153 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/ForkLiftOperaUtils.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/ForkLiftTaskModeType.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/DeviceCommandMsgModel.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/DeviceMsgModel.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/ForkLiftCommand.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/ForkLiftThread.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/LfdZyForkLiftMasterThread.java 306 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java 950 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/NyShuttleThread.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/ZyForkLiftThread.java 452 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/ZyForkLiftThread2.java 451 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/utils/DeviceMsgUtils.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasLiftMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/basLift/basLift.js 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/admin/basLift/basLift.html 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ForkLiftController.java
@@ -59,7 +59,7 @@
        for (DeviceConfig device : forkliftList) {
            // 表格行
            JSONObject baseObj = new JSONObject();
            baseObj.put("shuttleNo", device.getDeviceNo());
            baseObj.put("liftNo", device.getDeviceNo());
            list.add(baseObj);
            // 获取提升机信息
            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, device.getDeviceNo());
@@ -112,7 +112,7 @@
        StringBuilder str = new StringBuilder();
        String s;
        int i = 0;
        while((s = OutputQueue.LIFT.poll()) != null && i <=10) {
        while((s = OutputQueue.FORKLIFT.poll()) != null && i <=10) {
            str.append("\n").append(s);
            i++;
        }
@@ -286,9 +286,9 @@
            Integer targetSta = param.getStaNo();
            //获取提升机命令
            List<ForkLiftCommand> liftCommand = forkLiftThread.getShuttleSwitchCommand(workNo, startSta, targetSta);
            ForkLiftCommand liftCommand = forkLiftThread.getShuttleSwitchCommand(workNo, startSta, targetSta);
            ArrayList<ForkLiftCommand> commands = new ArrayList<>();
            commands.addAll(liftCommand);
            commands.add(liftCommand);
            //提交到线程去工作
            LiftAssignCommand assignCommand = new LiftAssignCommand();
@@ -308,9 +308,9 @@
            Integer targetSta = param.getStaNo();
            //获取提升机命令
            List<ForkLiftCommand> liftCommand = forkLiftThread.getPickAndPutCommand(workNo, startSta, targetSta);
            ForkLiftCommand liftCommand = forkLiftThread.getPickAndPutCommand(workNo, startSta, targetSta);
            ArrayList<ForkLiftCommand> commands = new ArrayList<>();
            commands.addAll(liftCommand);
            commands.add(liftCommand);
            //提交到线程去工作
            LiftAssignCommand assignCommand = new LiftAssignCommand();
@@ -330,9 +330,9 @@
            Integer targetSta = param.getStaNo();
            //获取提升机命令
            List<ForkLiftCommand> liftCommand = forkLiftThread.getMoveCommand(workNo, startSta, targetSta);
            ForkLiftCommand liftCommand = forkLiftThread.getMoveCommand(workNo, startSta, targetSta);
            ArrayList<ForkLiftCommand> commands = new ArrayList<>();
            commands.addAll(liftCommand);
            commands.add(liftCommand);
            //提交到线程去工作
            LiftAssignCommand assignCommand = new LiftAssignCommand();
src/main/java/com/zy/asrs/entity/BasLift.java
@@ -1,11 +1,14 @@
package com.zy.asrs.entity;
import com.alibaba.fastjson.JSON;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import com.zy.core.model.LiftStation;
import org.springframework.format.annotation.DateTimeFormat;
import com.core.common.SpringUtils;
import com.zy.system.service.UserService;
@@ -15,6 +18,7 @@
import lombok.Data;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
import java.util.List;
@Data
@TableName("asr_bas_lift")
@@ -86,6 +90,13 @@
    @TableField("point")
    private String point;
    /**
     * 提升机站点
     */
    @ApiModelProperty(value= "提升机站点")
    @TableField("station_list")
    private String stationList;
    public BasLift() {}
    public BasLift(Integer liftNo, Integer status, Integer wrkNo, Date updateTime, Long updateBy, String memo, Boolean pakMk, String deviceStatus) {
@@ -115,4 +126,15 @@
        return null;
    }
    public List<LiftStation> getStationList$(){
        List<LiftStation> list = new ArrayList<>();
        if (Cools.isEmpty(this.stationList)){
            return list;
        }
        List<LiftStation> liftStations = JSON.parseArray(stationList, LiftStation.class);
        list.addAll(liftStations);
        return list;
    }
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -762,9 +762,9 @@
            }
            //获取提升机命令
            List<ForkLiftCommand> liftCommands = forkLiftThread.getPickAndPutCommand(wrkMast.getWrkNo(), wrkMast.getSourceStaNo(), liftSta.getLev());
            ForkLiftCommand liftCommand = forkLiftThread.getPickAndPutCommand(wrkMast.getWrkNo(), wrkMast.getSourceStaNo(), liftSta.getLev());
            ArrayList<ForkLiftCommand> commands = new ArrayList<>();
            commands.addAll(liftCommands);
            commands.add(liftCommand);
            //提交到线程去工作
            LiftAssignCommand assignCommand = new LiftAssignCommand();
@@ -890,9 +890,9 @@
            }
            //获取提升机命令
            List<ForkLiftCommand> liftCommands = forkLiftThread.getPickAndPutCommand(wrkMast.getWrkNo(), liftSta.getLev(), wrkMast.getStaNo());
            ForkLiftCommand liftCommand = forkLiftThread.getPickAndPutCommand(wrkMast.getWrkNo(), liftSta.getLev(), wrkMast.getStaNo());
            ArrayList<ForkLiftCommand> commands = new ArrayList<>();
            commands.addAll(liftCommands);
            commands.add(liftCommand);
            //提交到线程去工作
            LiftAssignCommand assignCommand = new LiftAssignCommand();
@@ -924,6 +924,9 @@
            for (DeviceConfig device : forkliftList) {
                //获取提升机信息
                ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, device.getDeviceNo());
                if(forkLiftThread == null) {
                    continue;
                }
                ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
                if (forkLiftProtocol == null) {
                    continue;
@@ -1775,9 +1778,9 @@
            }
            //获取提升机命令
            List<ForkLiftCommand> liftCommands = forkLiftThread.getShuttleSwitchCommand(wrkMast.getWrkNo(), sourceLiftSta.getLev(), liftSta.getLev());
            ForkLiftCommand liftCommand = forkLiftThread.getShuttleSwitchCommand(wrkMast.getWrkNo(), sourceLiftSta.getLev(), liftSta.getLev());
            ArrayList<ForkLiftCommand> commands = new ArrayList<>();
            commands.addAll(liftCommands);
            commands.add(liftCommand);
            //提交到线程去工作
            LiftAssignCommand assignCommand = new LiftAssignCommand();
@@ -1919,73 +1922,73 @@
    //自动切换出入库模式
    public void autoSwitchForkLiftIOMode() {
        List<DeviceConfig> forkliftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.ForkLift)));
        for (DeviceConfig device : forkliftList) {
            Integer liftNo = device.getDeviceNo();
            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo);
            if (forkLiftThread == null) {
                continue;
            }
            ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
            if (forkLiftProtocol == null) {
                continue;
            }
            List<Integer> liftAllStaNo = ForkLiftUtils.getLiftAllStaNo(liftNo);
            if (liftAllStaNo.isEmpty()) {
                continue;
            }
            List<Integer> conveyorBindLiftAllStaNo = ForkLiftUtils.getConveyorBindLiftAllStaNo(liftNo);
            if (conveyorBindLiftAllStaNo.isEmpty()) {
                continue;
            }
            //获取入库任务
            List<WrkMast> inWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .in("sta_no", liftAllStaNo)
                    .in("wrk_sts"
                            , WrkStsType.NEW_INBOUND.sts
                            , WrkStsType.INBOUND_DEVICE_RUN.sts
                            , WrkStsType.INBOUND_LIFT_RUN.sts
                            , WrkStsType.INBOUND_LIFT_RUN_COMPLETE.sts
                            , WrkStsType.INBOUND_SHUTTLE_RUN.sts
                            , WrkStsType.INBOUND_SHUTTLE_RUN_COMPLETE.sts
                    ));
            //获取出库任务
            List<WrkMast> outWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .in("sta_no", conveyorBindLiftAllStaNo)
                    .in("wrk_sts"
                            , WrkStsType.NEW_OUTBOUND.sts
                            , WrkStsType.OUTBOUND_SHUTTLE_RUN.sts
                            , WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts
                            , WrkStsType.OUTBOUND_LIFT_RUN.sts
                            , WrkStsType.OUTBOUND_LIFT_RUN_COMPLETE.sts
                    ));
            if (forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.NONE)) {
                //未知模式
                if (!inWrkMasts.isEmpty()) {
                    forkLiftThread.switchIOMode(ForkLiftIoModeType.IN);
                } else if (!outWrkMasts.isEmpty()) {
                    forkLiftThread.switchIOMode(ForkLiftIoModeType.OUT);
                }else {
                    forkLiftThread.switchIOMode(ForkLiftIoModeType.IN);
                }
            } else if (forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.IN)) {
                //入库模式
                if (inWrkMasts.isEmpty() && !outWrkMasts.isEmpty()) {
                    forkLiftThread.switchIOMode(ForkLiftIoModeType.OUT);
                }
            } else if (forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.OUT)) {
                //出库模式
                if (outWrkMasts.isEmpty() && !inWrkMasts.isEmpty()) {
                    forkLiftThread.switchIOMode(ForkLiftIoModeType.IN);
                }
            }
        }
//        List<DeviceConfig> forkliftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
//                .eq("device_type", String.valueOf(SlaveType.ForkLift)));
//        for (DeviceConfig device : forkliftList) {
//            Integer liftNo = device.getDeviceNo();
//            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo);
//            if (forkLiftThread == null) {
//                continue;
//            }
//            ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
//            if (forkLiftProtocol == null) {
//                continue;
//            }
//
//            List<Integer> liftAllStaNo = ForkLiftUtils.getLiftAllStaNo(liftNo);
//            if (liftAllStaNo.isEmpty()) {
//                continue;
//            }
//
//            List<Integer> conveyorBindLiftAllStaNo = ForkLiftUtils.getConveyorBindLiftAllStaNo(liftNo);
//            if (conveyorBindLiftAllStaNo.isEmpty()) {
//                continue;
//            }
//
//            //获取入库任务
//            List<WrkMast> inWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
//                    .in("sta_no", liftAllStaNo)
//                    .in("wrk_sts"
//                            , WrkStsType.NEW_INBOUND.sts
//                            , WrkStsType.INBOUND_DEVICE_RUN.sts
//                            , WrkStsType.INBOUND_LIFT_RUN.sts
//                            , WrkStsType.INBOUND_LIFT_RUN_COMPLETE.sts
//                            , WrkStsType.INBOUND_SHUTTLE_RUN.sts
//                            , WrkStsType.INBOUND_SHUTTLE_RUN_COMPLETE.sts
//                    ));
//
//            //获取出库任务
//            List<WrkMast> outWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
//                    .in("sta_no", conveyorBindLiftAllStaNo)
//                    .in("wrk_sts"
//                            , WrkStsType.NEW_OUTBOUND.sts
//                            , WrkStsType.OUTBOUND_SHUTTLE_RUN.sts
//                            , WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts
//                            , WrkStsType.OUTBOUND_LIFT_RUN.sts
//                            , WrkStsType.OUTBOUND_LIFT_RUN_COMPLETE.sts
//                    ));
//
//            if (forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.NONE)) {
//                //未知模式
//                if (!inWrkMasts.isEmpty()) {
//                    forkLiftThread.switchIOMode(ForkLiftIoModeType.IN);
//                } else if (!outWrkMasts.isEmpty()) {
//                    forkLiftThread.switchIOMode(ForkLiftIoModeType.OUT);
//                }else {
//                    forkLiftThread.switchIOMode(ForkLiftIoModeType.IN);
//                }
//            } else if (forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.IN)) {
//                //入库模式
//                if (inWrkMasts.isEmpty() && !outWrkMasts.isEmpty()) {
//                    forkLiftThread.switchIOMode(ForkLiftIoModeType.OUT);
//                }
//            } else if (forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.OUT)) {
//                //出库模式
//                if (outWrkMasts.isEmpty() && !inWrkMasts.isEmpty()) {
//                    forkLiftThread.switchIOMode(ForkLiftIoModeType.IN);
//                }
//            }
//        }
    }
    //出库任务预调度提升机
@@ -2056,9 +2059,9 @@
            int workNo = commonService.getWorkNo(WrkIoType.FORKLIFT_MOVE.id);//获取任务号
            //获取提升机命令
            List<ForkLiftCommand> liftCommand = forkLiftThread.getMoveCommand(workNo, forkLiftProtocol.getLev(), Utils.getLev(wrkMast.getSourceLocNo()));
            ForkLiftCommand liftCommand = forkLiftThread.getMoveCommand(workNo, forkLiftProtocol.getLev(), Utils.getLev(wrkMast.getSourceLocNo()));
            ArrayList<ForkLiftCommand> commands = new ArrayList<>();
            commands.addAll(liftCommand);
            commands.add(liftCommand);
            //提交到线程去工作
            LiftAssignCommand assignCommand = new LiftAssignCommand();
src/main/java/com/zy/common/utils/ForkLiftOperaUtils.java
File was deleted
src/main/java/com/zy/core/ServerBootstrap.java
@@ -3,13 +3,16 @@
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.exception.CoolException;
import com.zy.asrs.entity.BasLift;
import com.zy.asrs.entity.DeviceConfig;
import com.zy.asrs.service.BasLiftService;
import com.zy.asrs.service.DeviceConfigService;
import com.zy.common.utils.RedisUtil;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.thread.impl.NyShuttleThread;
import com.zy.core.thread.impl.ZyForkLiftThread;
import com.zy.core.utils.DeviceMsgUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -36,6 +39,8 @@
    private DeviceConfigService deviceConfigService;
    @Autowired
    private DeviceMsgUtils deviceMsgUtils;
    @Autowired
    private BasLiftService basLiftService;
    @PostConstruct
    @Async
@@ -70,44 +75,38 @@
        List<DeviceConfig> allDevices = new ArrayList<>();
        List<DeviceConfig> fakeDevices = new ArrayList<>();
//        // 初始化货叉提升机
//        List<DeviceConfig> forkLiftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
//                .eq("device_type", String.valueOf(SlaveType.ForkLift)));
//        allDevices.addAll(forkLiftList);
//        for (DeviceConfig deviceConfig : forkLiftList) {
//            News.info("初始化货叉提升机........................................................");
//            ThreadHandler thread = null;
//            if (deviceConfig.getThreadImpl().equals("ZyForkLiftThread")) {
//                thread = new ZyForkLiftThread(forkLiftSlave, redisUtil);
//            } else if (deviceConfig.getThreadImpl().equals("LfdZyForkLiftSlaveThread")) {
//                thread = new LfdZyForkLiftSlaveThread(forkLiftSlave, redisUtil, forkLiftSlave.getMasterId());
//            } else {
//                throw new CoolException("未知的线程实现");
//            }
//
//            new Thread(thread).start();
//            SlaveConnection.put(SlaveType.ForkLift, deviceConfig.getDeviceNo(), thread);
//        }
        // 初始化货叉提升机
        News.info("初始化货叉提升机........................................................");
        List<DeviceConfig> forkLiftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.ForkLift)));
        for (DeviceConfig deviceConfig : forkLiftList) {
            BasLift basLift = basLiftService.selectOne(new EntityWrapper<BasLift>().eq("lift_no", deviceConfig.getDeviceNo()));
            if (basLift == null) {
                throw new CoolException("未配置货叉提升机数据");
            }
//        // 初始化货叉提升机
//        for (ForkLiftSlave forkLiftSlave : slaveProperties.getForkLiftMaster()) {
//            News.info("初始化货叉提升机Master........................................................");
//            ThreadHandler thread = null;
//            if (forkLiftSlave.getThreadImpl().equals("LfdZyForkLiftMasterThread")) {
//                thread = new LfdZyForkLiftMasterThread(forkLiftSlave, redisUtil);
//            } else {
//                throw new CoolException("未知的线程实现");
//            }
//
//            new Thread(thread).start();
//            SlaveConnection.put(SlaveType.ForkLiftMaster, forkLiftSlave.getId(), thread);
//        }
            ThreadHandler thread = null;
            if (deviceConfig.getThreadImpl().equals("ZyForkLiftThread")) {
                thread = new ZyForkLiftThread(deviceConfig, basLift.getStationList$(), redisUtil);
            } else {
                throw new CoolException("未知的线程实现");
            }
            new Thread(thread).start();
            SlaveConnection.put(SlaveType.ForkLift, deviceConfig.getDeviceNo(), thread);
            if (deviceConfig.getFake() == 1) {
                fakeDevices.add(deviceConfig);
            }else {
                allDevices.add(deviceConfig);
            }
        }
        // 初始化四向穿梭车
        News.info("初始化四向穿梭车......................................................");
        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
        for (DeviceConfig deviceConfig : shuttleList) {
            News.info("初始化四向穿梭车......................................................");
            ThreadHandler thread = null;
            if (deviceConfig.getThreadImpl().equals("NyShuttleThread")) {
                thread = new NyShuttleThread(deviceConfig, redisUtil);
src/main/java/com/zy/core/enums/ForkLiftTaskModeType.java
@@ -9,6 +9,10 @@
    PICK_PUT(3, "取放货"),
    SHUTTLE_SWITCH(4, "小车换层"),
    MOVE(5, "提升机移动"),
    RESET(9996, "复位"),
    SWITCH_IN(9997, "切换入库模式"),
    SWITCH_OUt(9998, "切换出库模式"),
    READ_STATUS(9999, "读取状态"),
    ;
    public Integer id;
src/main/java/com/zy/core/model/DeviceCommandMsgModel.java
@@ -9,6 +9,8 @@
    private String deviceType;
    private String resultKey;
    private Object command;
}
src/main/java/com/zy/core/model/DeviceMsgModel.java
@@ -13,4 +13,6 @@
    private String deviceOriginMsg;
    private String resultKey;
}
src/main/java/com/zy/core/model/command/ForkLiftCommand.java
@@ -17,27 +17,27 @@
    /**
     * 任务号
     */
    private Short taskNo;
    private Integer taskNo;
    /**
     * 任务模式
     */
    private Short mode;
    private Integer mode;
    /**
     * 取货数据
     */
    private Short pick;
    private Integer pick;
    /**
     * 放货数据
     */
    private Short put;
    private Integer put;
    /**
     * 任务确认
     */
    private Short confirm;
    private Integer confirm;
    /**
     * 命令是否完成,默认false未完成
src/main/java/com/zy/core/thread/ForkLiftThread.java
@@ -26,6 +26,8 @@
    CommandResponse move(ForkLiftCommand command);//小车换层
    CommandResponse switchIOMode(ForkLiftCommand command);//切换出入库模式
    CommandResponse reset();//复位
    boolean isIdle();//是否空闲
@@ -38,16 +40,18 @@
    boolean setSyncTaskNo(Integer taskNo);//设置工作号
    boolean switchIOMode(ForkLiftIoModeType type);//切换出入库模式
    int generateDeviceTaskNo(int taskNo, ForkLiftTaskModeType type);//生成硬件设备工作号
    //***************获取命令*****************
    List<ForkLiftCommand> getPickAndPutCommand(Integer taskNo, Integer pick, Integer put);//取放货指令
    ForkLiftCommand getPickAndPutCommand(Integer taskNo, Integer pick, Integer put);//取放货指令
    List<ForkLiftCommand> getShuttleSwitchCommand(Integer taskNo, Integer pick, Integer put);//小车换层
    ForkLiftCommand getShuttleSwitchCommand(Integer taskNo, Integer pick, Integer put);//小车换层
    List<ForkLiftCommand> getMoveCommand(Integer taskNo, Integer pick, Integer put);//提升机移动
    ForkLiftCommand getMoveCommand(Integer taskNo, Integer pick, Integer put);//提升机移动
    ForkLiftCommand getSwitchIOCommand(Integer taskNo, ForkLiftIoModeType mode);
    ForkLiftCommand getResetCommand(Integer taskNo);
}
src/main/java/com/zy/core/thread/impl/LfdZyForkLiftMasterThread.java
@@ -1,153 +1,153 @@
package com.zy.core.thread.impl;
import HslCommunication.Core.Types.OperateResult;
import HslCommunication.Core.Types.OperateResultExOne;
import HslCommunication.Profinet.Siemens.SiemensPLCS;
import HslCommunication.Profinet.Siemens.SiemensS7Net;
import com.core.common.DateUtils;
import com.zy.common.utils.RedisUtil;
import com.zy.core.News;
import com.zy.core.ThreadHandler;
import com.zy.core.cache.OutputQueue;
import com.zy.core.model.ForkLiftSlave;
import com.zy.core.model.protocol.ForkLiftProtocol;
import lombok.extern.slf4j.Slf4j;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@Slf4j
@SuppressWarnings("all")
public class LfdZyForkLiftMasterThread implements ThreadHandler {
    private ForkLiftSlave slave;
    private ForkLiftProtocol forkLiftProtocol;
    private RedisUtil redisUtil;
    private SiemensS7Net siemensS7Net;
    private List<HashMap<String,Object>> slaveAddressList = null;
    private boolean connect = false;
    public LfdZyForkLiftMasterThread(ForkLiftSlave slave, RedisUtil redisUtil) {
        this.slave = slave;
        this.redisUtil = redisUtil;
        ArrayList<HashMap<String, Object>> addressList = new ArrayList<>();
        HashMap<String, Object> lift1 = new HashMap<>();
        lift1.put("status", new DbData("DB101.0", (short) 18));//提升机数据
        lift1.put("staStatusTray", new DbData("DB102.0", (short) 14));//站点数据
        lift1.put("staStatusCar", new DbData("DB102.50", (short) 14));//站点数据
        lift1.put("write", new DbData("DB103.0", null));//写入数据
        lift1.put("writeConfirm", new DbData("DB103.8", null));//写入确认数据
        lift1.put("confirm", new DbData("DB103.10", null));//确认命令
        lift1.put("switchIOMode", new DbData("DB103.12", null));//出入库模式
        HashMap<String, Object> lift2 = new HashMap<>();
        lift2.put("status", new DbData("DB104.0", (short) 18));//提升机数据
        lift2.put("staStatusTray", new DbData("DB105.0", (short) 14));//站点数据
        lift2.put("staStatusCar", new DbData("DB105.50", (short) 14));//站点数据
        lift2.put("write", new DbData("DB106.0", null));//写入数据
        lift2.put("writeConfirm", new DbData("DB106.8", null));//写入确认数据
        lift2.put("confirm", new DbData("DB106.10", null));//确认命令
        lift2.put("switchIOMode", new DbData("DB106.12", null));//出入库模式
        addressList.add(lift1);
        addressList.add(lift2);
        this.slaveAddressList = addressList;
    }
    @Override
    public boolean connect() {
        boolean result = false;
        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;
            OutputQueue.FORKLIFT.offer(MessageFormat.format( "【{0}】货叉提升机连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
            News.info("货叉提升机连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        } else {
            OutputQueue.FORKLIFT.offer(MessageFormat.format( "【{0}】货叉提升机连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}]  [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
            News.error("货叉提升机连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
        // siemensS7Net.ConnectClose();
        this.connect = result;
        return result;
    }
    @Override
    public void close() {
    }
    @Override
    public void run() {
        News.info("{}号货叉提升机Master线程启动", slave.getId());
        this.connect();
        while (true) {
            try {
                if (!this.connect) {
                    this.connect();
                }
                Thread.sleep(500);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    public SiemensS7Net getSiemensS7Net() {
        return siemensS7Net;
    }
    public synchronized OperateResultExOne<byte[]> read(Integer slaveId, String dbTag) {
        try {
            HashMap<String, Object> map = this.slaveAddressList.get(slaveId - 1);
            DbData dbData = (DbData) map.get(dbTag);
            OperateResultExOne<byte[]> result = siemensS7Net.Read(dbData.dbAddress, dbData.dbAddressLength);
            return result;
        } catch (Exception e) {
            OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】读取提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
        }
        return null;
    }
    public synchronized OperateResult write(Integer slaveId, String dbTag, short[] array) {
        try {
            HashMap<String, Object> map = this.slaveAddressList.get(slaveId - 1);
            DbData dbData = (DbData) map.get(dbTag);
            OperateResult result = siemensS7Net.Write(dbData.dbAddress, array);
            return result;
        } catch (Exception e) {
            OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】写入提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
        }
        return null;
    }
    public synchronized OperateResult write(Integer slaveId, String dbTag, short val) {
        try {
            HashMap<String, Object> map = this.slaveAddressList.get(slaveId - 1);
            DbData dbData = (DbData) map.get(dbTag);
            OperateResult result = siemensS7Net.Write(dbData.dbAddress, val);
            return result;
        } catch (Exception e) {
            OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】写入提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
        }
        return null;
    }
    private class DbData {
        private String dbAddress;
        private Short dbAddressLength;
        public DbData(String dbAddress, Short dbAddressLength) {
            this.dbAddress = dbAddress;
            this.dbAddressLength = dbAddressLength;
        }
    }
}
//package com.zy.core.thread.impl;
//
//import HslCommunication.Core.Types.OperateResult;
//import HslCommunication.Core.Types.OperateResultExOne;
//import HslCommunication.Profinet.Siemens.SiemensPLCS;
//import HslCommunication.Profinet.Siemens.SiemensS7Net;
//import com.core.common.DateUtils;
//import com.zy.common.utils.RedisUtil;
//import com.zy.core.News;
//import com.zy.core.ThreadHandler;
//import com.zy.core.cache.OutputQueue;
//import com.zy.core.model.ForkLiftSlave;
//import com.zy.core.model.protocol.ForkLiftProtocol;
//import lombok.extern.slf4j.Slf4j;
//
//import java.text.MessageFormat;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.List;
//
//@Slf4j
//@SuppressWarnings("all")
//public class LfdZyForkLiftMasterThread implements ThreadHandler {
//
//    private ForkLiftSlave slave;
//    private ForkLiftProtocol forkLiftProtocol;
//    private RedisUtil redisUtil;
//    private SiemensS7Net siemensS7Net;
//    private List<HashMap<String,Object>> slaveAddressList = null;
//    private boolean connect = false;
//
//    public LfdZyForkLiftMasterThread(ForkLiftSlave slave, RedisUtil redisUtil) {
//        this.slave = slave;
//        this.redisUtil = redisUtil;
//        ArrayList<HashMap<String, Object>> addressList = new ArrayList<>();
//
//        HashMap<String, Object> lift1 = new HashMap<>();
//        lift1.put("status", new DbData("DB101.0", (short) 18));//提升机数据
//        lift1.put("staStatusTray", new DbData("DB102.0", (short) 14));//站点数据
//        lift1.put("staStatusCar", new DbData("DB102.50", (short) 14));//站点数据
//        lift1.put("write", new DbData("DB103.0", null));//写入数据
//        lift1.put("writeConfirm", new DbData("DB103.8", null));//写入确认数据
//        lift1.put("confirm", new DbData("DB103.10", null));//确认命令
//        lift1.put("switchIOMode", new DbData("DB103.12", null));//出入库模式
//
//        HashMap<String, Object> lift2 = new HashMap<>();
//        lift2.put("status", new DbData("DB104.0", (short) 18));//提升机数据
//        lift2.put("staStatusTray", new DbData("DB105.0", (short) 14));//站点数据
//        lift2.put("staStatusCar", new DbData("DB105.50", (short) 14));//站点数据
//        lift2.put("write", new DbData("DB106.0", null));//写入数据
//        lift2.put("writeConfirm", new DbData("DB106.8", null));//写入确认数据
//        lift2.put("confirm", new DbData("DB106.10", null));//确认命令
//        lift2.put("switchIOMode", new DbData("DB106.12", null));//出入库模式
//
//        addressList.add(lift1);
//        addressList.add(lift2);
//        this.slaveAddressList = addressList;
//    }
//
//    @Override
//    public boolean connect() {
//        boolean result = false;
//        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;
//            OutputQueue.FORKLIFT.offer(MessageFormat.format( "【{0}】货叉提升机连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
//            News.info("货叉提升机连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
//        } else {
//            OutputQueue.FORKLIFT.offer(MessageFormat.format( "【{0}】货叉提升机连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}]  [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
//            News.error("货叉提升机连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
//        }
//        // siemensS7Net.ConnectClose();
//        this.connect = result;
//        return result;
//    }
//
//    @Override
//    public void close() {
//
//    }
//
//    @Override
//    public void run() {
//        News.info("{}号货叉提升机Master线程启动", slave.getId());
//        this.connect();
//        while (true) {
//            try {
//                if (!this.connect) {
//                    this.connect();
//                }
//
//                Thread.sleep(500);
//            }catch (Exception e){
//                e.printStackTrace();
//            }
//        }
//    }
//
//    public SiemensS7Net getSiemensS7Net() {
//        return siemensS7Net;
//    }
//
//    public synchronized OperateResultExOne<byte[]> read(Integer slaveId, String dbTag) {
//        try {
//            HashMap<String, Object> map = this.slaveAddressList.get(slaveId - 1);
//            DbData dbData = (DbData) map.get(dbTag);
//            OperateResultExOne<byte[]> result = siemensS7Net.Read(dbData.dbAddress, dbData.dbAddressLength);
//            return result;
//        } catch (Exception e) {
//            OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】读取提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
//        }
//        return null;
//    }
//
//    public synchronized OperateResult write(Integer slaveId, String dbTag, short[] array) {
//        try {
//            HashMap<String, Object> map = this.slaveAddressList.get(slaveId - 1);
//            DbData dbData = (DbData) map.get(dbTag);
//            OperateResult result = siemensS7Net.Write(dbData.dbAddress, array);
//            return result;
//        } catch (Exception e) {
//            OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】写入提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
//        }
//        return null;
//    }
//
//    public synchronized OperateResult write(Integer slaveId, String dbTag, short val) {
//        try {
//            HashMap<String, Object> map = this.slaveAddressList.get(slaveId - 1);
//            DbData dbData = (DbData) map.get(dbTag);
//            OperateResult result = siemensS7Net.Write(dbData.dbAddress, val);
//            return result;
//        } catch (Exception e) {
//            OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】写入提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
//        }
//        return null;
//    }
//
//    private class DbData {
//        private String dbAddress;
//        private Short dbAddressLength;
//
//        public DbData(String dbAddress, Short dbAddressLength) {
//            this.dbAddress = dbAddress;
//            this.dbAddressLength = dbAddressLength;
//        }
//
//    }
//}
src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java
@@ -1,475 +1,475 @@
package com.zy.core.thread.impl;
import HslCommunication.Core.Types.OperateResult;
import HslCommunication.Core.Types.OperateResultExOne;
import HslCommunication.Profinet.Siemens.SiemensPLCS;
import HslCommunication.Profinet.Siemens.SiemensS7Net;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.BasLift;
import com.zy.asrs.entity.DeviceDataLog;
import com.zy.asrs.service.BasLiftService;
import com.zy.asrs.service.DeviceDataLogService;
import com.zy.asrs.utils.Utils;
import com.zy.common.ExecuteSupport;
import com.zy.common.utils.RedisUtil;
import com.zy.core.News;
import com.zy.core.action.ForkLiftAction;
import com.zy.core.cache.OutputQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.*;
import com.zy.core.model.CommandResponse;
import com.zy.core.model.ForkLiftSlave;
import com.zy.core.model.command.ForkLiftCommand;
import com.zy.core.model.protocol.ForkLiftProtocol;
import com.zy.core.model.protocol.ForkLiftStaProtocol;
import com.zy.core.thread.ForkLiftThread;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.text.MessageFormat;
import java.util.*;
@Slf4j
@SuppressWarnings("all")
public class LfdZyForkLiftSlaveThread implements ForkLiftThread {
    private Integer masterId;
    private ForkLiftSlave slave;
    private ForkLiftProtocol forkLiftProtocol;
    private RedisUtil redisUtil;
    private List<ForkLiftStaProtocol> forkLiftStaProtocols = new ArrayList<>();
    private LfdZyForkLiftMasterThread masterThread;
    public LfdZyForkLiftSlaveThread(ForkLiftSlave slave, RedisUtil redisUtil, Integer masterId) {
        this.slave = slave;
        this.redisUtil = redisUtil;
        this.masterId = masterId;
        //初始化站点
        for (ForkLiftSlave.Sta sta : this.slave.getSta()) {
            ForkLiftStaProtocol forkLiftStaProtocol = new ForkLiftStaProtocol();
            forkLiftStaProtocol.setStaNo(sta.getStaNo());//站点号
            forkLiftStaProtocol.setLev(sta.getLev());//站点楼层
            String locNo = Utils.getLocNo(this.slave.getStaRow(), this.slave.getStaBay(), sta.getLev());
            forkLiftStaProtocol.setLocNo(locNo);//站点库位号
            forkLiftStaProtocol.setLiftNo(sta.getLiftNo());//提升机号
            forkLiftStaProtocols.add(forkLiftStaProtocol);
        }
    }
    @Override
    public boolean connect() {
        boolean result = false;
        LfdZyForkLiftMasterThread masterThread = (LfdZyForkLiftMasterThread) SlaveConnection.get(SlaveType.ForkLiftMaster, masterId);
        if(masterThread != null) {
            result = true;
            this.masterThread = masterThread;
        }
        return result;
    }
    @Override
    public void close() {
    }
    @Override
    public void run() {
        News.info("{}号货叉提升机线程启动", slave.getId());
        this.connect();
        while (true) {
            try {
                if (this.masterThread == null) {
                    this.connect();
                    continue;
                }
                read();
                Thread.sleep(300);
                execute();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    private void execute() {
        ForkLiftAction forkLiftAction = null;
        try {
            forkLiftAction = SpringUtils.getBean(ForkLiftAction.class);
        }catch (Exception e){}
        if (forkLiftAction == null) {
            return;
        }
        Object object = redisUtil.get(RedisKeyType.FORK_LIFT_FLAG.key + slave.getId());
        if (object == null) {
            return;
        }
        Integer taskNo = Integer.valueOf(String.valueOf(object));
        if (taskNo != 0) {
            //存在任务需要执行
            boolean result = forkLiftAction.executeWork(slave.getId(), taskNo);
        }
    }
    private void read() {
        try {
            readStatus();
            //提升机处于运行状态,将标记置为true
            if (forkLiftProtocol.getProtocolStatusType().equals(ForkLiftProtocolStatusType.PICK_UP)
                    || forkLiftProtocol.getProtocolStatusType().equals(ForkLiftProtocolStatusType.PUT_DOWN)
                    || forkLiftProtocol.getProtocolStatusType().equals(ForkLiftProtocolStatusType.WAITING)) {
                forkLiftProtocol.setPakMk(true);
            }
        } catch (Exception e) {
            OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】读取提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
        }
    }
    private void readStatus() {
        try {
            //获取提升机数据
            OperateResultExOne<byte[]> result1 = this.masterThread.read(this.slave.getId(), "status");
            SiemensS7Net siemensS7Net = this.masterThread.getSiemensS7Net();
            if (result1.IsSuccess) {
                if (null == forkLiftProtocol) {
                    forkLiftProtocol = new ForkLiftProtocol();
                    forkLiftProtocol.setLiftNo(slave.getId());
                    forkLiftProtocol.setProtocolStatus(ForkLiftProtocolStatusType.NONE);
                    InnerForkLiftExtend innerForkLiftExtend = new InnerForkLiftExtend();
                }
                //----------读取提升机状态-----------
                //模式
                forkLiftProtocol.setModel((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 0));
                //PLC任务号
                forkLiftProtocol.setWrkNo((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 2));
                //任务状态
                forkLiftProtocol.setProtocolStatus((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 4));
                //任务模式
                forkLiftProtocol.setTaskMode((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 6));
                //取货数据
                forkLiftProtocol.setPick((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 8));
                //放货数据
                forkLiftProtocol.setPut((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 10));
                //出入库模式
                forkLiftProtocol.setIOMode((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 12));
                //故障码
                forkLiftProtocol.setErrorCode((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 14));
                //当前层
                forkLiftProtocol.setLev((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 16));
                //************补充扩展字段*************
                InnerForkLiftExtend forkLiftExtend = (InnerForkLiftExtend) forkLiftProtocol.getExtend();
                forkLiftProtocol.setExtend(forkLiftExtend);
            }else {
                OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】{1}读取货叉提升机状态信息失败", DateUtils.convert(new Date()), slave.getId()));
            }
            OperateResultExOne<byte[]> result2 = this.masterThread.read(this.slave.getId(), "staStatusTray");
            if (result2.IsSuccess) {
                for (int i = 0; i < this.slave.getSta().size(); i++) {
                    ForkLiftSlave.Sta sta = this.slave.getSta().get(i);
                    if (forkLiftStaProtocols.isEmpty()) {
                        continue;
                    }
                    short val = siemensS7Net.getByteTransform().TransInt16(result2.Content, i * 2);
                    ForkLiftStaProtocol forkLiftStaProtocol = forkLiftStaProtocols.get(i);
                    forkLiftStaProtocol.setHasTray(val == 1);
                }
            }
            OperateResultExOne<byte[]> result3 = this.masterThread.read(this.slave.getId(), "staStatusCar");
            if (result3.IsSuccess) {
                for (int i = 0; i < this.slave.getSta().size(); i++) {
                    ForkLiftSlave.Sta sta = this.slave.getSta().get(i);
                    if (forkLiftStaProtocols.isEmpty()) {
                        continue;
                    }
                    short val = siemensS7Net.getByteTransform().TransInt16(result3.Content, i * 2);
                    ForkLiftStaProtocol forkLiftStaProtocol = forkLiftStaProtocols.get(i);
                    forkLiftStaProtocol.setHasCar(val == 1);
                }
            }
            if (System.currentTimeMillis() - forkLiftProtocol.getDeviceDataLog() > 1000 * 5) {
                //采集时间超过5s,保存一次数据记录
                //保存数据记录
                DeviceDataLogService deviceDataLogService = SpringUtils.getBean(DeviceDataLogService.class);
                DeviceDataLog deviceDataLog = new DeviceDataLog();
                deviceDataLog.setOriginData(Base64.getEncoder().encodeToString(result1.Content));
                deviceDataLog.setWcsData(JSON.toJSONString(forkLiftProtocol));
                deviceDataLog.setType("forkLift");
                deviceDataLog.setDeviceNo(forkLiftProtocol.getLiftNo());
                deviceDataLog.setCreateTime(new Date());
                deviceDataLogService.insert(deviceDataLog);
                //保存数据记录
                DeviceDataLog deviceDataLog2 = new DeviceDataLog();
                deviceDataLog2.setOriginData(Base64.getEncoder().encodeToString(result2.Content));
                deviceDataLog2.setWcsData(JSON.toJSONString(forkLiftStaProtocols));
                deviceDataLog2.setType("forkLiftStaProtocols");
                deviceDataLog2.setDeviceNo(forkLiftProtocol.getLiftNo());
                deviceDataLog2.setCreateTime(new Date());
                deviceDataLogService.insert(deviceDataLog2);
                //更新采集时间
                forkLiftProtocol.setDeviceDataLog(System.currentTimeMillis());
            }
            //将提升机状态保存至数据库
            BasLiftService basLiftService = SpringUtils.getBean(BasLiftService.class);
            BasLift basLift = basLiftService.selectOne(new EntityWrapper<BasLift>()
                    .eq("lift_no", slave.getId()));
            if (basLift == null) {
                basLift = new BasLift();
                //提升机号
                basLift.setLiftNo(forkLiftProtocol.getLiftNo());
                basLift.setStatus(1);
                basLiftService.insert(basLift);
            }
            //任务号
            basLift.setWrkNo(forkLiftProtocol.getTaskNo());
            //修改时间
            basLift.setUpdateTime(new Date());
            //设备状态
            basLift.setDeviceStatus(JSON.toJSONString(forkLiftProtocol));
            if (basLiftService.updateById(basLift)) {
                OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), forkLiftProtocol.getLiftNo()));
            }
        } catch (Exception e) {
            OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】读取货叉提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
        }
    }
    @Override
    public ForkLiftProtocol getStatus(boolean clone) {
        if (this.forkLiftProtocol == null) {
            return null;
        }
        return clone ? this.forkLiftProtocol.clone() : this.forkLiftProtocol;
    }
    @Override
    public List<ForkLiftStaProtocol> getForkLiftStaProtocols() {
        return this.forkLiftStaProtocols;
    }
    @Override
    public ForkLiftProtocol getStatus() {
        return getStatus(true);
    }
    @Override
    public CommandResponse pickAndPut(ForkLiftCommand command) {
        CommandResponse response = new CommandResponse(false);
        short[] array = new short[4];
        array[0] = command.getTaskNo();//任务号
        array[1] = command.getMode();//任务模式
        array[2] = command.getPick();//取货数据
        array[3] = command.getPut();//放货数据
        OperateResult result = this.masterThread.write(this.slave.getId(), "write", array);
        if (result.IsSuccess) {
            OperateResult result2 = this.masterThread.write(this.slave.getId(), "writeConfirm", command.getConfirm());
            if (result2.IsSuccess) {
                response.setResult(true);
            }
        }
        return response;
    }
    @Override
    public CommandResponse shuttleSwitch(ForkLiftCommand command) {
        CommandResponse response = new CommandResponse(false);
        short[] array = new short[4];
        array[0] = command.getTaskNo();//任务号
        array[1] = command.getMode();//任务模式
        array[2] = command.getPick();//取货数据
        array[3] = command.getPut();//放货数据
        OperateResult result = this.masterThread.write(this.slave.getId(), "write", array);
        if (result.IsSuccess) {
            OperateResult result2 = this.masterThread.write(this.slave.getId(), "writeConfirm", command.getConfirm());
            if (result2.IsSuccess) {
                response.setResult(true);
            }
        }
        return response;
    }
    @Override
    public CommandResponse move(ForkLiftCommand command) {
        CommandResponse response = new CommandResponse(false);
        short[] array = new short[4];
        array[0] = command.getTaskNo();//任务号
        array[1] = command.getMode();//任务模式
        array[2] = command.getPut();//放货数据
        OperateResult result = this.masterThread.write(this.slave.getId(), "write", array);
        if (result.IsSuccess) {
            OperateResult result2 = this.masterThread.write(this.slave.getId(), "writeConfirm", command.getConfirm());
            if (result2.IsSuccess) {
                response.setResult(true);
            }
        }
        return response;
    }
    @Override
    public CommandResponse reset() {
        CommandResponse response = new CommandResponse(false);
        OperateResult result = this.masterThread.write(this.slave.getId(), "confirm", (short) 1);
        if (result.IsSuccess) {
            News.info("货叉提升机确认命令下发成功,提升机号={}", forkLiftProtocol.getLiftNo());
            response.setResult(true);
        }
        return response;
    }
    @Override
    public boolean isIdle() {
        if (this.forkLiftProtocol.getTaskNo() == null
                || this.forkLiftProtocol.getProtocolStatus() == null
                || this.forkLiftProtocol.getModel() == null
                || this.forkLiftProtocol.getErrorCode() == null
        ) {
            return false;
        }
        boolean res = this.forkLiftProtocol.getProtocolStatus() == ForkLiftProtocolStatusType.IDLE.id
                && this.forkLiftProtocol.getWrkNo() == 0
                && this.forkLiftProtocol.getTaskNo() == 0
                && this.forkLiftProtocol.getModel() == 2
                && this.forkLiftProtocol.getErrorCode() == 0
                ;
        return res;
    }
    @Override
    public boolean isDeviceIdle() {
        return isDeviceIdle(null);
    }
    @Override
    public boolean isDeviceIdle(ExecuteSupport support) {
        if (null != support) {
            Boolean judgement = support.judgement();
            if (judgement != null && !judgement) {
                return true;
            }
        }
        if (this.forkLiftProtocol.getTaskNo() == null
                || this.forkLiftProtocol.getProtocolStatus() == null
                || this.forkLiftProtocol.getModel() == null
                || this.forkLiftProtocol.getErrorCode() == null
        ) {
            return false;
        }
        boolean res = this.forkLiftProtocol.getProtocolStatus() == ForkLiftProtocolStatusType.IDLE.id
                && this.forkLiftProtocol.getWrkNo() == 0
                && this.forkLiftProtocol.getModel() == 2
                && this.forkLiftProtocol.getErrorCode() == 0
                ;
        return res;
    }
    @Override
    public boolean setProtocolStatus(ForkLiftProtocolStatusType status) {
        return false;
    }
    @Override
    public boolean setSyncTaskNo(Integer taskNo) {
        this.forkLiftProtocol.setSyncTaskNo(taskNo);
        return true;
    }
    @Override
    public boolean switchIOMode(ForkLiftIoModeType type) {
        OperateResult result = this.masterThread.write(this.slave.getId(), "switchIOMode", type.id.shortValue());
        if (result.IsSuccess) {
            return true;
        }
        return false;
    }
    @Override
    public int generateDeviceTaskNo(int taskNo, ForkLiftTaskModeType type) {
        return taskNo;
    }
    @Override
    public List<ForkLiftCommand> getPickAndPutCommand(Integer taskNo, Integer pick, Integer put) {
        Integer realPick = pick % 1000;
        Integer realPut = put % 1000;
        List<ForkLiftCommand> commands = new ArrayList<>();
        ForkLiftCommand command = new ForkLiftCommand();
        command.setLiftNo(slave.getId());
        command.setTaskNo(taskNo.shortValue());
        command.setMode(ForkLiftTaskModeType.PICK_PUT.id.shortValue());
        command.setPick(realPick.shortValue());
        command.setPut(realPut.shortValue());
        command.setConfirm((short) 1);
        commands.add(command);
        return commands;
    }
    @Override
    public List<ForkLiftCommand> getShuttleSwitchCommand(Integer taskNo, Integer pick, Integer put) {
        Integer realPick = pick % 1000;
        Integer realPut = put % 1000;
        List<ForkLiftCommand> commands = new ArrayList<>();
        ForkLiftCommand command = new ForkLiftCommand();
        command.setLiftNo(slave.getId());
        command.setTaskNo(taskNo.shortValue());
        command.setMode(ForkLiftTaskModeType.SHUTTLE_SWITCH.id.shortValue());
        command.setPick(realPick.shortValue());
        command.setPut(realPut.shortValue());
        command.setConfirm((short) 1);
        commands.add(command);
        return commands;
    }
    @Override
    public List<ForkLiftCommand> getMoveCommand(Integer taskNo, Integer pick, Integer put) {
        Integer realPick = pick % 1000;
        Integer realPut = put % 1000;
        List<ForkLiftCommand> commands = new ArrayList<>();
        ForkLiftCommand command = new ForkLiftCommand();
        command.setLiftNo(slave.getId());
        command.setTaskNo(taskNo.shortValue());
        command.setMode(ForkLiftTaskModeType.MOVE.id.shortValue());
        command.setPick(realPick.shortValue());
        command.setPut(realPut.shortValue());
        command.setConfirm((short) 1);
        commands.add(command);
        return commands;
    }
    /**
     * 扩展字段
     */
    @Data
    private class InnerForkLiftExtend {
    }
}
//package com.zy.core.thread.impl;
//
//import HslCommunication.Core.Types.OperateResult;
//import HslCommunication.Core.Types.OperateResultExOne;
//import HslCommunication.Profinet.Siemens.SiemensPLCS;
//import HslCommunication.Profinet.Siemens.SiemensS7Net;
//import com.alibaba.fastjson.JSON;
//import com.baomidou.mybatisplus.mapper.EntityWrapper;
//import com.core.common.DateUtils;
//import com.core.common.SpringUtils;
//import com.zy.asrs.entity.BasLift;
//import com.zy.asrs.entity.DeviceDataLog;
//import com.zy.asrs.service.BasLiftService;
//import com.zy.asrs.service.DeviceDataLogService;
//import com.zy.asrs.utils.Utils;
//import com.zy.common.ExecuteSupport;
//import com.zy.common.utils.RedisUtil;
//import com.zy.core.News;
//import com.zy.core.action.ForkLiftAction;
//import com.zy.core.cache.OutputQueue;
//import com.zy.core.cache.SlaveConnection;
//import com.zy.core.enums.*;
//import com.zy.core.model.CommandResponse;
//import com.zy.core.model.ForkLiftSlave;
//import com.zy.core.model.command.ForkLiftCommand;
//import com.zy.core.model.protocol.ForkLiftProtocol;
//import com.zy.core.model.protocol.ForkLiftStaProtocol;
//import com.zy.core.thread.ForkLiftThread;
//import lombok.Data;
//import lombok.extern.slf4j.Slf4j;
//
//import java.text.MessageFormat;
//import java.util.*;
//
//@Slf4j
//@SuppressWarnings("all")
//public class LfdZyForkLiftSlaveThread implements ForkLiftThread {
//
//    private Integer masterId;
//    private ForkLiftSlave slave;
//    private ForkLiftProtocol forkLiftProtocol;
//    private RedisUtil redisUtil;
//    private List<ForkLiftStaProtocol> forkLiftStaProtocols = new ArrayList<>();
//    private LfdZyForkLiftMasterThread masterThread;
//
//    public LfdZyForkLiftSlaveThread(ForkLiftSlave slave, RedisUtil redisUtil, Integer masterId) {
//        this.slave = slave;
//        this.redisUtil = redisUtil;
//        this.masterId = masterId;
//        //初始化站点
//        for (ForkLiftSlave.Sta sta : this.slave.getSta()) {
//            ForkLiftStaProtocol forkLiftStaProtocol = new ForkLiftStaProtocol();
//            forkLiftStaProtocol.setStaNo(sta.getStaNo());//站点号
//            forkLiftStaProtocol.setLev(sta.getLev());//站点楼层
//            String locNo = Utils.getLocNo(this.slave.getStaRow(), this.slave.getStaBay(), sta.getLev());
//            forkLiftStaProtocol.setLocNo(locNo);//站点库位号
//            forkLiftStaProtocol.setLiftNo(sta.getLiftNo());//提升机号
//            forkLiftStaProtocols.add(forkLiftStaProtocol);
//        }
//    }
//
//    @Override
//    public boolean connect() {
//        boolean result = false;
//        LfdZyForkLiftMasterThread masterThread = (LfdZyForkLiftMasterThread) SlaveConnection.get(SlaveType.ForkLiftMaster, masterId);
//        if(masterThread != null) {
//            result = true;
//            this.masterThread = masterThread;
//        }
//        return result;
//    }
//
//    @Override
//    public void close() {
//
//    }
//
//    @Override
//    public void run() {
//        News.info("{}号货叉提升机线程启动", slave.getId());
//        this.connect();
//        while (true) {
//            try {
//                if (this.masterThread == null) {
//                    this.connect();
//                    continue;
//                }
//
//                read();
//                Thread.sleep(300);
//                execute();
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//    private void execute() {
//        ForkLiftAction forkLiftAction = null;
//        try {
//            forkLiftAction = SpringUtils.getBean(ForkLiftAction.class);
//        }catch (Exception e){}
//        if (forkLiftAction == null) {
//            return;
//        }
//
//        Object object = redisUtil.get(RedisKeyType.FORK_LIFT_FLAG.key + slave.getId());
//        if (object == null) {
//            return;
//        }
//
//        Integer taskNo = Integer.valueOf(String.valueOf(object));
//        if (taskNo != 0) {
//            //存在任务需要执行
//            boolean result = forkLiftAction.executeWork(slave.getId(), taskNo);
//        }
//    }
//
//    private void read() {
//        try {
//            readStatus();
//
//            //提升机处于运行状态,将标记置为true
//            if (forkLiftProtocol.getProtocolStatusType().equals(ForkLiftProtocolStatusType.PICK_UP)
//                    || forkLiftProtocol.getProtocolStatusType().equals(ForkLiftProtocolStatusType.PUT_DOWN)
//                    || forkLiftProtocol.getProtocolStatusType().equals(ForkLiftProtocolStatusType.WAITING)) {
//                forkLiftProtocol.setPakMk(true);
//            }
//        } catch (Exception e) {
//            OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】读取提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
//        }
//    }
//
//    private void readStatus() {
//        try {
//            //获取提升机数据
//            OperateResultExOne<byte[]> result1 = this.masterThread.read(this.slave.getId(), "status");
//            SiemensS7Net siemensS7Net = this.masterThread.getSiemensS7Net();
//            if (result1.IsSuccess) {
//                if (null == forkLiftProtocol) {
//                    forkLiftProtocol = new ForkLiftProtocol();
//                    forkLiftProtocol.setLiftNo(slave.getId());
//                    forkLiftProtocol.setProtocolStatus(ForkLiftProtocolStatusType.NONE);
//
//                    InnerForkLiftExtend innerForkLiftExtend = new InnerForkLiftExtend();
//                }
//
//                //----------读取提升机状态-----------
//                //模式
//                forkLiftProtocol.setModel((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 0));
//                //PLC任务号
//                forkLiftProtocol.setWrkNo((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 2));
//                //任务状态
//                forkLiftProtocol.setProtocolStatus((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 4));
//                //任务模式
//                forkLiftProtocol.setTaskMode((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 6));
//                //取货数据
//                forkLiftProtocol.setPick((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 8));
//                //放货数据
//                forkLiftProtocol.setPut((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 10));
//                //出入库模式
//                forkLiftProtocol.setIOMode((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 12));
//                //故障码
//                forkLiftProtocol.setErrorCode((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 14));
//                //当前层
//                forkLiftProtocol.setLev((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 16));
//
//                //************补充扩展字段*************
//                InnerForkLiftExtend forkLiftExtend = (InnerForkLiftExtend) forkLiftProtocol.getExtend();
//                forkLiftProtocol.setExtend(forkLiftExtend);
//
//            }else {
//                OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】{1}读取货叉提升机状态信息失败", DateUtils.convert(new Date()), slave.getId()));
//            }
//
//            OperateResultExOne<byte[]> result2 = this.masterThread.read(this.slave.getId(), "staStatusTray");
//            if (result2.IsSuccess) {
//                for (int i = 0; i < this.slave.getSta().size(); i++) {
//                    ForkLiftSlave.Sta sta = this.slave.getSta().get(i);
//                    if (forkLiftStaProtocols.isEmpty()) {
//                        continue;
//                    }
//
//                    short val = siemensS7Net.getByteTransform().TransInt16(result2.Content, i * 2);
//                    ForkLiftStaProtocol forkLiftStaProtocol = forkLiftStaProtocols.get(i);
//                    forkLiftStaProtocol.setHasTray(val == 1);
//                }
//            }
//
//            OperateResultExOne<byte[]> result3 = this.masterThread.read(this.slave.getId(), "staStatusCar");
//            if (result3.IsSuccess) {
//                for (int i = 0; i < this.slave.getSta().size(); i++) {
//                    ForkLiftSlave.Sta sta = this.slave.getSta().get(i);
//                    if (forkLiftStaProtocols.isEmpty()) {
//                        continue;
//                    }
//
//                    short val = siemensS7Net.getByteTransform().TransInt16(result3.Content, i * 2);
//                    ForkLiftStaProtocol forkLiftStaProtocol = forkLiftStaProtocols.get(i);
//                    forkLiftStaProtocol.setHasCar(val == 1);
//                }
//            }
//
//            if (System.currentTimeMillis() - forkLiftProtocol.getDeviceDataLog() > 1000 * 5) {
//                //采集时间超过5s,保存一次数据记录
//                //保存数据记录
//                DeviceDataLogService deviceDataLogService = SpringUtils.getBean(DeviceDataLogService.class);
//                DeviceDataLog deviceDataLog = new DeviceDataLog();
//                deviceDataLog.setOriginData(Base64.getEncoder().encodeToString(result1.Content));
//                deviceDataLog.setWcsData(JSON.toJSONString(forkLiftProtocol));
//                deviceDataLog.setType("forkLift");
//                deviceDataLog.setDeviceNo(forkLiftProtocol.getLiftNo());
//                deviceDataLog.setCreateTime(new Date());
//                deviceDataLogService.insert(deviceDataLog);
//
//                //保存数据记录
//                DeviceDataLog deviceDataLog2 = new DeviceDataLog();
//                deviceDataLog2.setOriginData(Base64.getEncoder().encodeToString(result2.Content));
//                deviceDataLog2.setWcsData(JSON.toJSONString(forkLiftStaProtocols));
//                deviceDataLog2.setType("forkLiftStaProtocols");
//                deviceDataLog2.setDeviceNo(forkLiftProtocol.getLiftNo());
//                deviceDataLog2.setCreateTime(new Date());
//                deviceDataLogService.insert(deviceDataLog2);
//
//                //更新采集时间
//                forkLiftProtocol.setDeviceDataLog(System.currentTimeMillis());
//            }
//
//            //将提升机状态保存至数据库
//            BasLiftService basLiftService = SpringUtils.getBean(BasLiftService.class);
//            BasLift basLift = basLiftService.selectOne(new EntityWrapper<BasLift>()
//                    .eq("lift_no", slave.getId()));
//            if (basLift == null) {
//                basLift = new BasLift();
//                //提升机号
//                basLift.setLiftNo(forkLiftProtocol.getLiftNo());
//                basLift.setStatus(1);
//                basLiftService.insert(basLift);
//            }
//            //任务号
//            basLift.setWrkNo(forkLiftProtocol.getTaskNo());
//            //修改时间
//            basLift.setUpdateTime(new Date());
//            //设备状态
//            basLift.setDeviceStatus(JSON.toJSONString(forkLiftProtocol));
//            if (basLiftService.updateById(basLift)) {
//                OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), forkLiftProtocol.getLiftNo()));
//            }
//
//        } catch (Exception e) {
//            OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】读取货叉提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
//        }
//    }
//
//    @Override
//    public ForkLiftProtocol getStatus(boolean clone) {
//        if (this.forkLiftProtocol == null) {
//            return null;
//        }
//        return clone ? this.forkLiftProtocol.clone() : this.forkLiftProtocol;
//    }
//
//    @Override
//    public List<ForkLiftStaProtocol> getForkLiftStaProtocols() {
//        return this.forkLiftStaProtocols;
//    }
//
//    @Override
//    public ForkLiftProtocol getStatus() {
//        return getStatus(true);
//    }
//
//    @Override
//    public CommandResponse pickAndPut(ForkLiftCommand command) {
//        CommandResponse response = new CommandResponse(false);
//
//        short[] array = new short[4];
//        array[0] = command.getTaskNo();//任务号
//        array[1] = command.getMode();//任务模式
//        array[2] = command.getPick();//取货数据
//        array[3] = command.getPut();//放货数据
//        OperateResult result = this.masterThread.write(this.slave.getId(), "write", array);
//        if (result.IsSuccess) {
//            OperateResult result2 = this.masterThread.write(this.slave.getId(), "writeConfirm", command.getConfirm());
//            if (result2.IsSuccess) {
//                response.setResult(true);
//            }
//        }
//        return response;
//    }
//
//    @Override
//    public CommandResponse shuttleSwitch(ForkLiftCommand command) {
//        CommandResponse response = new CommandResponse(false);
//
//        short[] array = new short[4];
//        array[0] = command.getTaskNo();//任务号
//        array[1] = command.getMode();//任务模式
//        array[2] = command.getPick();//取货数据
//        array[3] = command.getPut();//放货数据
//        OperateResult result = this.masterThread.write(this.slave.getId(), "write", array);
//        if (result.IsSuccess) {
//            OperateResult result2 = this.masterThread.write(this.slave.getId(), "writeConfirm", command.getConfirm());
//            if (result2.IsSuccess) {
//                response.setResult(true);
//            }
//        }
//        return response;
//    }
//
//    @Override
//    public CommandResponse move(ForkLiftCommand command) {
//        CommandResponse response = new CommandResponse(false);
//
//        short[] array = new short[4];
//        array[0] = command.getTaskNo();//任务号
//        array[1] = command.getMode();//任务模式
//        array[2] = command.getPut();//放货数据
//        OperateResult result = this.masterThread.write(this.slave.getId(), "write", array);
//        if (result.IsSuccess) {
//            OperateResult result2 = this.masterThread.write(this.slave.getId(), "writeConfirm", command.getConfirm());
//            if (result2.IsSuccess) {
//                response.setResult(true);
//            }
//        }
//        return response;
//    }
//
//    @Override
//    public CommandResponse reset() {
//        CommandResponse response = new CommandResponse(false);
//        OperateResult result = this.masterThread.write(this.slave.getId(), "confirm", (short) 1);
//        if (result.IsSuccess) {
//            News.info("货叉提升机确认命令下发成功,提升机号={}", forkLiftProtocol.getLiftNo());
//            response.setResult(true);
//        }
//        return response;
//    }
//
//    @Override
//    public boolean isIdle() {
//        if (this.forkLiftProtocol.getTaskNo() == null
//                || this.forkLiftProtocol.getProtocolStatus() == null
//                || this.forkLiftProtocol.getModel() == null
//                || this.forkLiftProtocol.getErrorCode() == null
//        ) {
//            return false;
//        }
//
//        boolean res = this.forkLiftProtocol.getProtocolStatus() == ForkLiftProtocolStatusType.IDLE.id
//                && this.forkLiftProtocol.getWrkNo() == 0
//                && this.forkLiftProtocol.getTaskNo() == 0
//                && this.forkLiftProtocol.getModel() == 2
//                && this.forkLiftProtocol.getErrorCode() == 0
//                ;
//        return res;
//    }
//
//    @Override
//    public boolean isDeviceIdle() {
//        return isDeviceIdle(null);
//    }
//
//    @Override
//    public boolean isDeviceIdle(ExecuteSupport support) {
//        if (null != support) {
//            Boolean judgement = support.judgement();
//            if (judgement != null && !judgement) {
//                return true;
//            }
//        }
//
//        if (this.forkLiftProtocol.getTaskNo() == null
//                || this.forkLiftProtocol.getProtocolStatus() == null
//                || this.forkLiftProtocol.getModel() == null
//                || this.forkLiftProtocol.getErrorCode() == null
//        ) {
//            return false;
//        }
//
//        boolean res = this.forkLiftProtocol.getProtocolStatus() == ForkLiftProtocolStatusType.IDLE.id
//                && this.forkLiftProtocol.getWrkNo() == 0
//                && this.forkLiftProtocol.getModel() == 2
//                && this.forkLiftProtocol.getErrorCode() == 0
//                ;
//        return res;
//    }
//
//    @Override
//    public boolean setProtocolStatus(ForkLiftProtocolStatusType status) {
//        return false;
//    }
//
//    @Override
//    public boolean setSyncTaskNo(Integer taskNo) {
//        this.forkLiftProtocol.setSyncTaskNo(taskNo);
//        return true;
//    }
//
//    @Override
//    public boolean switchIOMode(ForkLiftIoModeType type) {
//        OperateResult result = this.masterThread.write(this.slave.getId(), "switchIOMode", type.id.shortValue());
//        if (result.IsSuccess) {
//            return true;
//        }
//        return false;
//    }
//
//    @Override
//    public int generateDeviceTaskNo(int taskNo, ForkLiftTaskModeType type) {
//        return taskNo;
//    }
//
//    @Override
//    public List<ForkLiftCommand> getPickAndPutCommand(Integer taskNo, Integer pick, Integer put) {
//        Integer realPick = pick % 1000;
//        Integer realPut = put % 1000;
//
//        List<ForkLiftCommand> commands = new ArrayList<>();
//        ForkLiftCommand command = new ForkLiftCommand();
//        command.setLiftNo(slave.getId());
//        command.setTaskNo(taskNo.shortValue());
//        command.setMode(ForkLiftTaskModeType.PICK_PUT.id.shortValue());
//        command.setPick(realPick.shortValue());
//        command.setPut(realPut.shortValue());
//        command.setConfirm((short) 1);
//
//        commands.add(command);
//        return commands;
//    }
//
//    @Override
//    public List<ForkLiftCommand> getShuttleSwitchCommand(Integer taskNo, Integer pick, Integer put) {
//        Integer realPick = pick % 1000;
//        Integer realPut = put % 1000;
//
//        List<ForkLiftCommand> commands = new ArrayList<>();
//        ForkLiftCommand command = new ForkLiftCommand();
//        command.setLiftNo(slave.getId());
//        command.setTaskNo(taskNo.shortValue());
//        command.setMode(ForkLiftTaskModeType.SHUTTLE_SWITCH.id.shortValue());
//        command.setPick(realPick.shortValue());
//        command.setPut(realPut.shortValue());
//        command.setConfirm((short) 1);
//
//        commands.add(command);
//        return commands;
//    }
//
//    @Override
//    public List<ForkLiftCommand> getMoveCommand(Integer taskNo, Integer pick, Integer put) {
//        Integer realPick = pick % 1000;
//        Integer realPut = put % 1000;
//
//        List<ForkLiftCommand> commands = new ArrayList<>();
//        ForkLiftCommand command = new ForkLiftCommand();
//        command.setLiftNo(slave.getId());
//        command.setTaskNo(taskNo.shortValue());
//        command.setMode(ForkLiftTaskModeType.MOVE.id.shortValue());
//        command.setPick(realPick.shortValue());
//        command.setPut(realPut.shortValue());
//        command.setConfirm((short) 1);
//
//        commands.add(command);
//        return commands;
//    }
//
//    /**
//     * 扩展字段
//     */
//    @Data
//    private class InnerForkLiftExtend {
//
//    }
//}
src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
@@ -56,7 +56,7 @@
    private static final boolean DEBUG = false;//调试模式
    private List<JSONObject> socketReadResults = new ArrayList<>();
    private List<JSONObject> socketResults = new ArrayList<>();
    private List<DeviceMsgModel> socketResults = new ArrayList<>();
    //原始设备数据
    private Object originDeviceData;
@@ -188,54 +188,32 @@
                data.put("originDeviceData", deviceMsg.getDeviceOriginMsg());
                socketReadResults.add(data);
            } else {
                socketResults.add(data);//添加数据
                socketResults.add(deviceMsg);//添加数据
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public JSONObject getRequestBody(String type, String taskId) {
    public JSONObject getRequestBody(String resultKey) {
        try {
            // 获取服务器响应
            JSONObject result = null;
            if (type.equals("readState")) {
                type = "state";
            }
            int idx = -1;
            for (int i = 0; i < socketResults.size(); i++) {
                JSONObject socketResult = socketResults.get(i);
                if (!socketResult.get("msgType").equals("responseMsg")) {//不是响应内容
                    continue;
                }
                JSONObject resultResponse = JSON.parseObject(socketResult.get("response").toString());
                JSONObject resultBody = JSON.parseObject(resultResponse.get("body").toString());
                String responseType = resultBody.get("responseType").toString();
                if (DEBUG) {
                    result = socketResult;
                DeviceMsgModel deviceMsgModel = socketResults.get(i);
                if(deviceMsgModel.getResultKey().equals(resultKey)){
                    idx = i;
                    result = JSON.parseObject(JSON.toJSONString(deviceMsgModel.getDeviceMsg()));
                    break;
                }
                if (!responseType.equals(type)) {
                    continue;//响应类型与请求类型不一致,不在调试模式下
                }
                if (taskId != null) {
                    String responseTaskId = resultBody.get("taskId").toString();
                    if (!responseTaskId.equals(taskId)) {
                        continue;//响应ID与请求ID不一致,不在调试模式下
                    }
                }
                result = socketResult;
                break;
            }
            if (result == null) {
                return null;//无响应结果
            }
            socketResults.remove(idx);
            return filterBodyData(result);//返回Body结果集
        } catch (Exception e) {
            return null;
@@ -359,35 +337,38 @@
            // 获取服务器响应
            JSONObject result = null;
            int removeIdx = -1;
            JSONObject socketResult = null;
            for (int i = 0; i < socketResults.size(); i++) {
                JSONObject socketResult = socketResults.get(i);
                if (socketResult == null) {
                DeviceMsgModel deviceMsgModel = socketResults.get(i);
                if (!deviceMsgModel.getDeviceMsgType().equals("shuttleInit")) {
                    continue;
                }
                if (!socketResult.get("msgType").equals("requestMsg")) {//不是请求内容
                    continue;
                }
                removeIdx = i;
                socketResult = JSON.parseObject(JSON.toJSONString(deviceMsgModel.getDeviceMsg()));
                break;
            }
                JSONObject resultResponse = JSON.parseObject(socketResult.get("request").toString());
                JSONObject resultHeader = JSON.parseObject(resultResponse.get("header").toString());
                JSONObject resultBody = JSON.parseObject(resultResponse.get("body").toString());
                String requestType = resultBody.getString("requestType");
                Integer requestId = resultHeader.getInteger("requestId");
                if (requestType.equals("init")) {
                    removeIdx = i;//此数据已经处理,从结果集中剔除
                    socketResults.remove(removeIdx);
            if (socketResult == null) {
                return;
            }
                    Integer code = resultBody.getInteger("code");
                    //小车复位请求
                    ShuttleCommand initCommand = getInitCommand(requestId, code);
                    //发出请求
                    NyShuttleHttpCommand httpCommand = JSON.parseObject(initCommand.getBody(), NyShuttleHttpCommand.class);
                    requestCommand(httpCommand);
            JSONObject resultResponse = JSON.parseObject(socketResult.get("request").toString());
            JSONObject resultHeader = JSON.parseObject(resultResponse.get("header").toString());
            JSONObject resultBody = JSON.parseObject(resultResponse.get("body").toString());
            String requestType = resultBody.getString("requestType");
            Integer requestId = resultHeader.getInteger("requestId");
            if (requestType.equals("init")) {
                socketResults.remove(removeIdx);
                    log.info(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort()));
                    OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort()));
                    break;
                }
                Integer code = resultBody.getInteger("code");
                //小车复位请求
                ShuttleCommand initCommand = getInitCommand(requestId, code);
                //发出请求
                NyShuttleHttpCommand httpCommand = JSON.parseObject(initCommand.getBody(), NyShuttleHttpCommand.class);
                requestCommand(httpCommand);
                log.info(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort()));
                OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort()));
            }
        } catch (Exception e) {
            e.printStackTrace();
@@ -479,9 +460,9 @@
        try {
            //发出请求
            NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class);
            JSONObject requestToken = requestCommand(httpCommand);
            String resultKey = requestCommand(httpCommand);
            //查询请求结果
            JSONObject result = queryCommandStatus(requestToken.getString("requestType"), requestToken.getString("taskId"));
            JSONObject result = queryCommandStatus(resultKey);
            if (result == null) {
                return response;//请求失败
            }
@@ -502,9 +483,9 @@
        try {
            //发出请求
            NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class);
            JSONObject requestToken = requestCommand(httpCommand);
            String resultKey = requestCommand(httpCommand);
            //查询请求结果
            JSONObject result = queryCommandStatus(requestToken.getString("requestType"), requestToken.getString("taskId"));
            JSONObject result = queryCommandStatus(resultKey);
            if (result == null) {
                return response;//请求失败
            }
@@ -524,9 +505,9 @@
        try {
            //发出请求
            NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class);
            JSONObject requestToken = requestCommand(httpCommand);
            String resultKey = requestCommand(httpCommand);
            //查询请求结果
            JSONObject result = queryCommandStatus(requestToken.getString("requestType"), requestToken.getString("taskId"));
            JSONObject result = queryCommandStatus(resultKey);
            if (result == null) {
                return response;//请求失败
            }
@@ -554,9 +535,9 @@
        try {
            //发出请求
            NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class);
            JSONObject requestToken = requestCommand(httpCommand);
            String resultKey = requestCommand(httpCommand);
            //查询请求结果
            JSONObject result = queryCommandStatus(requestToken.getString("requestType"), requestToken.getString("taskId"));
            JSONObject result = queryCommandStatus(resultKey);
            if (result == null) {
                return response;//请求失败
            }
@@ -1127,7 +1108,7 @@
    }
    //发出请求
    private JSONObject requestCommand(NyShuttleHttpCommand httpCommand) throws IOException {
    private String requestCommand(NyShuttleHttpCommand httpCommand) throws IOException {
        try {
            DeviceMsgUtils deviceMsgUtils = SpringUtils.getBean(DeviceMsgUtils.class);
            if (deviceMsgUtils == null) {
@@ -1143,33 +1124,19 @@
            commandMsgModel.setDeviceType(String.valueOf(SlaveType.Shuttle));
            commandMsgModel.setCommand(data);
            String key = deviceMsgUtils.sendDeviceCommand(SlaveType.Shuttle, deviceConfig.getDeviceNo(), commandMsgModel);
            String requestType = null;
            String taskId = null;
            try {
                requestType = httpCommand.getRequest().getBody().get("requestType").toString();
                taskId = httpCommand.getRequest().getBody().get("taskId").toString();
            } catch (Exception e) {
//            return null;
                //taskId可能取空,不报错,正常情况
            }
            JSONObject result = new JSONObject();
            result.put("requestType", requestType);
            result.put("taskId", taskId);
            return result;
            return key;
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    private JSONObject queryCommandStatus(String requestType, String taskId) {
    private JSONObject queryCommandStatus(String resultKey) {
        // 获取服务器响应
        // 尝试50次
        JSONObject result = null;
        for (int i = 0; i < 50; i++) {
            result = getRequestBody(requestType, taskId);
            result = getRequestBody(resultKey);
            if (result == null) {
                try {
                    Thread.sleep(500);
src/main/java/com/zy/core/thread/impl/ZyForkLiftThread.java
File was deleted
src/main/java/com/zy/core/thread/impl/ZyForkLiftThread2.java
New file
@@ -0,0 +1,451 @@
//package com.zy.core.thread.impl;
//
//import HslCommunication.Core.Types.OperateResult;
//import HslCommunication.Core.Types.OperateResultExOne;
//import HslCommunication.Profinet.Siemens.SiemensPLCS;
//import HslCommunication.Profinet.Siemens.SiemensS7Net;
//import com.alibaba.fastjson.JSON;
//import com.baomidou.mybatisplus.mapper.EntityWrapper;
//import com.core.common.DateUtils;
//import com.core.common.SpringUtils;
//import com.zy.asrs.entity.BasLift;
//import com.zy.asrs.entity.DeviceDataLog;
//import com.zy.asrs.service.BasLiftService;
//import com.zy.asrs.service.DeviceDataLogService;
//import com.zy.asrs.utils.Utils;
//import com.zy.common.ExecuteSupport;
//import com.zy.common.utils.RedisUtil;
//import com.zy.core.News;
//import com.zy.core.action.ForkLiftAction;
//import com.zy.core.cache.OutputQueue;
//import com.zy.core.enums.ForkLiftIoModeType;
//import com.zy.core.enums.ForkLiftProtocolStatusType;
//import com.zy.core.enums.ForkLiftTaskModeType;
//import com.zy.core.enums.RedisKeyType;
//import com.zy.core.model.CommandResponse;
//import com.zy.core.model.ForkLiftSlave;
//import com.zy.core.model.command.ForkLiftCommand;
//import com.zy.core.model.protocol.ForkLiftProtocol;
//import com.zy.core.model.protocol.ForkLiftStaProtocol;
//import com.zy.core.thread.ForkLiftThread;
//import lombok.Data;
//import lombok.extern.slf4j.Slf4j;
//
//import java.text.MessageFormat;
//import java.util.*;
//
//@Slf4j
//@SuppressWarnings("all")
//public class ZyForkLiftThread2 implements ForkLiftThread {
//
//    private ForkLiftSlave slave;
//    private ForkLiftProtocol forkLiftProtocol;
//    private RedisUtil redisUtil;
//    private SiemensS7Net siemensS7Net;
//    private List<ForkLiftStaProtocol> forkLiftStaProtocols = new ArrayList<>();
//
//    public ZyForkLiftThread2(ForkLiftSlave slave, RedisUtil redisUtil) {
//        this.slave = slave;
//        this.redisUtil = redisUtil;
//        //初始化站点
//        for (ForkLiftSlave.Sta sta : this.slave.getSta()) {
//            ForkLiftStaProtocol forkLiftStaProtocol = new ForkLiftStaProtocol();
//            forkLiftStaProtocol.setStaNo(sta.getStaNo());//站点号
//            forkLiftStaProtocol.setLev(sta.getLev());//站点楼层
//            String locNo = Utils.getLocNo(this.slave.getStaRow(), this.slave.getStaBay(), sta.getLev());
//            forkLiftStaProtocol.setLocNo(locNo);//站点库位号
//            forkLiftStaProtocol.setLiftNo(sta.getLiftNo());//提升机号
//            forkLiftStaProtocols.add(forkLiftStaProtocol);
//        }
//    }
//
//    @Override
//    public boolean connect() {
//        boolean result = false;
//        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;
//            OutputQueue.FORKLIFT.offer(MessageFormat.format( "【{0}】货叉提升机连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
//            News.info("货叉提升机连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
//        } else {
//            OutputQueue.FORKLIFT.offer(MessageFormat.format( "【{0}】货叉提升机连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}]  [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
//            News.error("货叉提升机连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
//        }
//        // siemensS7Net.ConnectClose();
//        return result;
//    }
//
//    @Override
//    public void close() {
//
//    }
//
//    @Override
//    public void run() {
//        News.info("{}号货叉提升机线程启动", slave.getId());
//        this.connect();
//        while (true) {
//            try {
//                read();
//                Thread.sleep(200);
//                execute();
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//    private void execute() {
//        ForkLiftAction forkLiftAction = SpringUtils.getBean(ForkLiftAction.class);
//        if (forkLiftAction == null) {
//            return;
//        }
//
//        Object object = redisUtil.get(RedisKeyType.FORK_LIFT_FLAG.key + slave.getId());
//        if (object == null) {
//            return;
//        }
//
//        Integer taskNo = Integer.valueOf(String.valueOf(object));
//        if (taskNo != 0) {
//            //存在任务需要执行
//            boolean result = forkLiftAction.executeWork(slave.getId(), taskNo);
//        }
//    }
//
//    private void read() {
//        try {
//            readStatus();
//
//            //提升机处于运行状态,将标记置为true
//            if (forkLiftProtocol.getProtocolStatusType().equals(ForkLiftProtocolStatusType.PICK_UP)
//                    || forkLiftProtocol.getProtocolStatusType().equals(ForkLiftProtocolStatusType.PUT_DOWN)
//                    || forkLiftProtocol.getProtocolStatusType().equals(ForkLiftProtocolStatusType.WAITING)) {
//                forkLiftProtocol.setPakMk(true);
//            }
//        } catch (Exception e) {
//            OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】读取提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
//        }
//    }
//
//    private void readStatus() {
//        try {
//            //获取提升机数据
//            OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB101.0", (short) 16);
//            if (result1.IsSuccess) {
//                if (null == forkLiftProtocol) {
//                    forkLiftProtocol = new ForkLiftProtocol();
//                    forkLiftProtocol.setLiftNo(slave.getId());
//                    forkLiftProtocol.setProtocolStatus(ForkLiftProtocolStatusType.NONE);
//
//                    InnerForkLiftExtend innerForkLiftExtend = new InnerForkLiftExtend();
//                }
//
//                //----------读取提升机状态-----------
//                //模式
//                forkLiftProtocol.setModel((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 0));
//                //PLC任务号
//                forkLiftProtocol.setWrkNo((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 2));
//                //任务状态
//                forkLiftProtocol.setProtocolStatus((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 4));
//                //任务模式
//                forkLiftProtocol.setTaskMode((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 6));
//                //取货数据
//                forkLiftProtocol.setPick((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 8));
//                //放货数据
//                forkLiftProtocol.setPut((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 10));
//                //出入库模式
//                forkLiftProtocol.setIOMode((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 12));
//                //故障码
//                forkLiftProtocol.setErrorCode((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 14));
//
//                //************补充扩展字段*************
//                InnerForkLiftExtend forkLiftExtend = (InnerForkLiftExtend) forkLiftProtocol.getExtend();
//                forkLiftProtocol.setExtend(forkLiftExtend);
//
//            }else {
//                OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】{1}读取货叉提升机状态信息失败", DateUtils.convert(new Date()), slave.getId()));
//            }
//
//            OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB102.0", (short) 8);
//            if (result2.IsSuccess) {
//                for (int i = 0; i < this.slave.getSta().size(); i++) {
//                    ForkLiftSlave.Sta sta = this.slave.getSta().get(i);
//                    if (forkLiftStaProtocols.isEmpty()) {
//                        continue;
//                    }
//
//                    ForkLiftStaProtocol forkLiftStaProtocol = forkLiftStaProtocols.get(i);
//                    boolean[] status1 = siemensS7Net.getByteTransform().TransBool(result2.Content, i * 2, 2);
//                    forkLiftStaProtocol.setHasTray(status1[0]);
//                    forkLiftStaProtocol.setHasCar(status1[1]);
//                }
//            }
//
//            if (System.currentTimeMillis() - forkLiftProtocol.getDeviceDataLog() > 1000 * 5) {
//                //采集时间超过5s,保存一次数据记录
//                //保存数据记录
//                DeviceDataLogService deviceDataLogService = SpringUtils.getBean(DeviceDataLogService.class);
//                DeviceDataLog deviceDataLog = new DeviceDataLog();
//                deviceDataLog.setOriginData(Base64.getEncoder().encodeToString(result1.Content));
//                deviceDataLog.setWcsData(JSON.toJSONString(forkLiftProtocol));
//                deviceDataLog.setType("forkLift");
//                deviceDataLog.setDeviceNo(forkLiftProtocol.getLiftNo());
//                deviceDataLog.setCreateTime(new Date());
//                deviceDataLogService.insert(deviceDataLog);
//
//                //更新采集时间
//                forkLiftProtocol.setDeviceDataLog(System.currentTimeMillis());
//            }
//
//            //将提升机状态保存至数据库
//            BasLiftService basLiftService = SpringUtils.getBean(BasLiftService.class);
//            BasLift basLift = basLiftService.selectOne(new EntityWrapper<BasLift>()
//                    .eq("lift_no", slave.getId()));
//            if (basLift == null) {
//                basLift = new BasLift();
//                //提升机号
//                basLift.setLiftNo(forkLiftProtocol.getLiftNo());
//                basLift.setStatus(1);
//                basLiftService.insert(basLift);
//            }
//            //任务号
//            basLift.setWrkNo(forkLiftProtocol.getTaskNo());
//            //修改时间
//            basLift.setUpdateTime(new Date());
//            //设备状态
//            basLift.setDeviceStatus(JSON.toJSONString(forkLiftProtocol));
//            if (basLiftService.updateById(basLift)) {
//                OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), forkLiftProtocol.getLiftNo()));
//            }
//
//        } catch (Exception e) {
//            OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】读取货叉提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
//        }
//    }
//
//    @Override
//    public ForkLiftProtocol getStatus(boolean clone) {
//        if (this.forkLiftProtocol == null) {
//            return null;
//        }
//        return clone ? this.forkLiftProtocol.clone() : this.forkLiftProtocol;
//    }
//
//    @Override
//    public List<ForkLiftStaProtocol> getForkLiftStaProtocols() {
//        return this.forkLiftStaProtocols;
//    }
//
//    @Override
//    public ForkLiftProtocol getStatus() {
//        return getStatus(true);
//    }
//
//    @Override
//    public CommandResponse pickAndPut(ForkLiftCommand command) {
//        CommandResponse response = new CommandResponse(false);
//
//        short[] array = new short[4];
//        array[0] = command.getTaskNo();//任务号
//        array[1] = command.getMode();//任务模式
//        array[2] = command.getPick();//取货数据
//        array[3] = command.getPut();//放货数据
//        OperateResult result = siemensS7Net.Write("DB103.0", array);
//        if (result.IsSuccess) {
//            OperateResult result2 = siemensS7Net.Write("DB103.8", command.getConfirm());
//            if (result2.IsSuccess) {
//                response.setResult(true);
//            }
//        }
//        return response;
//    }
//
//    @Override
//    public CommandResponse shuttleSwitch(ForkLiftCommand command) {
//        CommandResponse response = new CommandResponse(false);
//
//        short[] array = new short[4];
//        array[0] = command.getTaskNo();//任务号
//        array[1] = command.getMode();//任务模式
//        array[2] = command.getPick();//取货数据
//        array[3] = command.getPut();//放货数据
//        OperateResult result = siemensS7Net.Write("DB103.0", array);
//        if (result.IsSuccess) {
//            OperateResult result2 = siemensS7Net.Write("DB103.8", command.getConfirm());
//            if (result2.IsSuccess) {
//                response.setResult(true);
//            }
//        }
//        return response;
//    }
//
//    @Override
//    public CommandResponse move(ForkLiftCommand command) {
//        CommandResponse response = new CommandResponse(false);
//
//        short[] array = new short[4];
//        array[0] = command.getTaskNo();//任务号
//        array[1] = command.getMode();//任务模式
//        array[2] = command.getPick();//取货数据
//        array[3] = command.getPut();//放货数据
//        OperateResult result = siemensS7Net.Write("DB103.0", array);
//        if (result.IsSuccess) {
//            OperateResult result2 = siemensS7Net.Write("DB103.8", command.getConfirm());
//            if (result2.IsSuccess) {
//                response.setResult(true);
//            }
//        }
//        return response;
//    }
//
//    @Override
//    public CommandResponse reset() {
//        CommandResponse response = new CommandResponse(false);
//        OperateResult result = siemensS7Net.Write("DB103.10", (short) 1);
//        if (result.IsSuccess) {
//            News.info("货叉提升机确认命令下发成功,提升机号={}", forkLiftProtocol.getLiftNo());
//            response.setResult(true);
//        }
//        return response;
//    }
//
//    @Override
//    public boolean isIdle() {
//        if (this.forkLiftProtocol.getTaskNo() == null
//                || this.forkLiftProtocol.getProtocolStatus() == null
//                || this.forkLiftProtocol.getModel() == null
//                || this.forkLiftProtocol.getErrorCode() == null
//        ) {
//            return false;
//        }
//
//        boolean res = this.forkLiftProtocol.getProtocolStatus() == ForkLiftProtocolStatusType.IDLE.id
//                && this.forkLiftProtocol.getWrkNo() == 0
//                && this.forkLiftProtocol.getTaskNo() == 0
//                && this.forkLiftProtocol.getModel() == 2
//                && this.forkLiftProtocol.getErrorCode() == 0
//                ;
//        return res;
//    }
//
//    @Override
//    public boolean isDeviceIdle() {
//        return isDeviceIdle(null);
//    }
//
//    @Override
//    public boolean isDeviceIdle(ExecuteSupport support) {
//        if (null != support) {
//            Boolean judgement = support.judgement();
//            if (judgement != null && !judgement) {
//                return true;
//            }
//        }
//
//        if (this.forkLiftProtocol.getTaskNo() == null
//                || this.forkLiftProtocol.getProtocolStatus() == null
//                || this.forkLiftProtocol.getModel() == null
//                || this.forkLiftProtocol.getErrorCode() == null
//        ) {
//            return false;
//        }
//
//        boolean res = this.forkLiftProtocol.getProtocolStatus() == ForkLiftProtocolStatusType.IDLE.id
//                && this.forkLiftProtocol.getWrkNo() == 0
//                && this.forkLiftProtocol.getModel() == 2
//                && this.forkLiftProtocol.getErrorCode() == 0
//                ;
//        return res;
//    }
//
//    @Override
//    public boolean setProtocolStatus(ForkLiftProtocolStatusType status) {
//        return false;
//    }
//
//    @Override
//    public boolean setSyncTaskNo(Integer taskNo) {
//        this.forkLiftProtocol.setSyncTaskNo(taskNo);
//        return true;
//    }
//
//    @Override
//    public boolean switchIOMode(ForkLiftIoModeType type) {
//        OperateResult result = siemensS7Net.Write("DB103.12", type.id.shortValue());
//        if (result.IsSuccess) {
//            return true;
//        }
//        return false;
//    }
//
//    @Override
//    public int generateDeviceTaskNo(int taskNo, ForkLiftTaskModeType type) {
//        return taskNo;
//    }
//
//    @Override
//    public List<ForkLiftCommand> getPickAndPutCommand(Integer taskNo, Integer pick, Integer put) {
//        Integer realPick = pick % 1000;
//        Integer realPut = put % 1000;
//
//        List<ForkLiftCommand> commands = new ArrayList<>();
//        ForkLiftCommand command = new ForkLiftCommand();
//        command.setLiftNo(slave.getId());
//        command.setTaskNo(taskNo.shortValue());
//        command.setMode(ForkLiftTaskModeType.PICK_PUT.id.shortValue());
//        command.setPick(realPick.shortValue());
//        command.setPut(realPut.shortValue());
//        command.setConfirm((short) 1);
//
//        commands.add(command);
//        return commands;
//    }
//
//    @Override
//    public List<ForkLiftCommand> getShuttleSwitchCommand(Integer taskNo, Integer pick, Integer put) {
//        Integer realPick = pick % 1000;
//        Integer realPut = put % 1000;
//
//        List<ForkLiftCommand> commands = new ArrayList<>();
//        ForkLiftCommand command = new ForkLiftCommand();
//        command.setLiftNo(slave.getId());
//        command.setTaskNo(taskNo.shortValue());
//        command.setMode(ForkLiftTaskModeType.SHUTTLE_SWITCH.id.shortValue());
//        command.setPick(realPick.shortValue());
//        command.setPut(realPut.shortValue());
//        command.setConfirm((short) 1);
//
//        commands.add(command);
//        return commands;
//    }
//
//    @Override
//    public List<ForkLiftCommand> getMoveCommand(Integer taskNo, Integer pick, Integer put) {
//        Integer realPick = pick % 1000;
//        Integer realPut = put % 1000;
//
//        List<ForkLiftCommand> commands = new ArrayList<>();
//        ForkLiftCommand command = new ForkLiftCommand();
//        command.setLiftNo(slave.getId());
//        command.setTaskNo(taskNo.shortValue());
//        command.setMode(ForkLiftTaskModeType.MOVE.id.shortValue());
//        command.setPick(realPick.shortValue());
//        command.setPut(realPut.shortValue());
//        command.setConfirm((short) 1);
//
//        commands.add(command);
//        return commands;
//    }
//
//    /**
//     * 扩展字段
//     */
//    @Data
//    private class InnerForkLiftExtend {
//
//    }
//}
src/main/java/com/zy/core/utils/DeviceMsgUtils.java
@@ -84,6 +84,7 @@
    public String sendDeviceCommand(SlaveType deviceType, Integer deviceId, DeviceCommandMsgModel command) {
        String key = parseDeviceCommandMsgKey(deviceType, deviceId) + System.currentTimeMillis();
        command.setResultKey(key);
        redisUtil.set(key, command, 60 * 60 * 24);
        return key;
    }
src/main/resources/application.yml
@@ -17,7 +17,7 @@
  mvc:
    static-path-pattern: /**
  redis:
    host: 127.0.0.1
    host: 192.168.4.77
    port: 6379
    database: 0
#    password: 123456
@@ -46,16 +46,16 @@
  # 读取数据后自动删除
  destroyAfterReading: true
# 下位机配置
wcs-slave:
  # 四向穿梭车1
  shuttle[0]:
    id: 1
    ip: 10.10.20.11
    port: 8888
    rack: 0
    slot: 0
    threadImpl: NyShuttleThread
## 下位机配置
#wcs-slave:
#  # 四向穿梭车1
#  shuttle[0]:
#    id: 1
#    ip: 10.10.20.11
#    port: 8888
#    rack: 0
#    slot: 0
#    threadImpl: NyShuttleThread
#  # 四向穿梭车2
#  shuttle[1]:
#    id: 2
src/main/resources/mapper/BasLiftMapper.xml
@@ -11,21 +11,7 @@
        <result column="memo" property="memo" />
        <result column="pak_mk" property="pakMk" />
        <result column="point" property="point" />
        <result column="model" property="model" />
        <result column="busy" property="busy" />
        <result column="front_overrun" property="frontOverrun" />
        <result column="back_overrun" property="backOverrun" />
        <result column="left_overrun" property="leftOverrun" />
        <result column="right_overrun" property="rightOverrun" />
        <result column="over_height" property="overHeight" />
        <result column="over_weight" property="overWeight" />
        <result column="has_tray" property="hasTray" />
        <result column="has_car" property="hasCar" />
        <result column="device_error" property="deviceError" />
        <result column="task_address" property="taskAddress" />
        <result column="dist_address" property="distAddress" />
        <result column="complete_task_no" property="completeTaskNo" />
        <result column="lev" property="lev" />
        <result column="station_list" property="stationList" />
    </resultMap>
src/main/webapp/static/js/basLift/basLift.js
@@ -25,31 +25,12 @@
            ,{field: 'liftNo', align: 'center',title: '提升机号'}
            ,{field: 'status', align: 'center',title: '当前任务状态'}
            ,{field: 'wrkNo', align: 'center',title: '任务号'}
            ,{field: 'point', align: 'center',title: '提升机坐标'}
            ,{field: 'stationList', align: 'center',title: '站点列表'}
            // ,{field: 'updateTime$', align: 'center',title: '修改时间'}
            // ,{field: 'updateBy$', align: 'center',title: '修改人员'}
            ,{field: 'memo', align: 'center',title: '备注'}
            ,{field: 'pakMk$', align: 'center',title: '作业标记'}
            ,{field: 'liftLock$', align: 'center',title: '提升机锁定'}
            ,{field: 'positionArrivalFeedback', align: 'center',title: '位置到达反馈'}
            ,{field: 'ready$', align: 'center',title: '准备就绪'}
            ,{field: 'running', align: 'center',title: '运行中'}
            ,{field: 'mode$', align: 'center',title: '联机/单机'}
            // ,{field: 'lineFrontHasStock', align: 'center',title: '输送线前端光电有货'}
            // ,{field: 'forwardRotationFeedback', align: 'center',title: '输送线正转反馈'}
            // ,{field: 'reverseFeedback', align: 'center',title: '输送线反转反馈'}
            // ,{field: 'motorOverload', align: 'center',title: '输送线电机过载'}
            // ,{field: 'lineEndHasStock', align: 'center',title: '输送线末端光电有货'}
            // ,{field: 'inConveyLineCardTrayAlarm', align: 'center',title: '进输送线卡托盘报警'}
            // ,{field: 'outConveyLineCardTrayAlarm', align: 'center',title: '出输送线卡托盘报警'}
            // ,{field: 'platPositionDeviationAlarm', align: 'center',title: '平台位置偏差报警'}
            // ,{field: 'platTorqueDeviationAlarm', align: 'center',title: '平台扭矩偏差报警'}
            // ,{field: 'platShuttleCheck', align: 'center',title: '平台四向车检测'}
            ,{field: 'notReady$', align: 'center',title: '未就绪状态'}
            // ,{field: 'servoError1', align: 'center',title: '伺服1错误'}
            // ,{field: 'servoError2', align: 'center',title: '伺服2错误'}
            // ,{field: 'servoError3', align: 'center',title: '伺服3错误'}
            // ,{field: 'servoError4', align: 'center',title: '伺服4错误'}
            // ,{field: 'liftActualSpeed', align: 'center',title: '提升机实际速度反馈'}
            // ,{field: 'pakMk', align: 'center',title: '作业标记'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:120}
        ]],
src/main/webapp/views/admin/basLift/basLift.html
@@ -79,174 +79,23 @@
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">当前任务状态: </label>
                    <label class="layui-form-label">提升机坐标: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="status" placeholder="请输入当前任务状态">
                        <input class="layui-input" name="point" placeholder="请输入提升机坐标">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">任务号: </label>
                    <label class="layui-form-label">站点列表: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="wrkNo" placeholder="请输入任务号">
                        <input class="layui-input" name="stationList" placeholder="请输入站点列表">
                    </div>
                </div>
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">修改时间: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="updateTime" id="updateTime$" placeholder="请输入修改时间">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">修改人员: </label>-->
<!--                    <div class="layui-input-block cool-auto-complete">-->
<!--                        <input class="layui-input" name="updateBy" placeholder="请输入修改人员" style="display: none">-->
<!--                        <input id="updateBy$" name="updateBy$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入修改人员" onfocus=this.blur()>-->
<!--                        <div class="cool-auto-complete-window">-->
<!--                            <input class="cool-auto-complete-window-input" data-key="userQueryByupdateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">-->
<!--                            <select class="cool-auto-complete-window-select" data-key="userQueryByupdateBySelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">-->
<!--                            </select>-->
<!--                        </div>-->
<!--                    </div>-->
<!--                </div>-->
                <div class="layui-form-item">
                    <label class="layui-form-label">备注: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="memo" placeholder="请输入备注">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">作业标记: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="pakMk" placeholder="请输入作业标记">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">提升机锁定: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="liftLock" placeholder="请输入提升机锁定">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">位置到达反馈: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="positionArrivalFeedback" placeholder="请输入位置到达反馈">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">准备就绪: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="ready" placeholder="请输入准备就绪">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">运行中: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="running" placeholder="请输入运行中">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">联机/单机: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="mode" placeholder="请输入联机/单机">
                    </div>
                </div>
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">输送线前端光电有货: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="lineFrontHasStock" placeholder="请输入输送线前端光电有货">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">输送线正转反馈: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="forwardRotationFeedback" placeholder="请输入输送线正转反馈">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">输送线反转反馈: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="reverseFeedback" placeholder="请输入输送线反转反馈">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">输送线电机过载: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="motorOverload" placeholder="请输入输送线电机过载">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">输送线末端光电有货: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="lineEndHasStock" placeholder="请输入输送线末端光电有货">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">进输送线卡托盘报警: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="inConveyLineCardTrayAlarm" placeholder="请输入进输送线卡托盘报警">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">出输送线卡托盘报警: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="outConveyLineCardTrayAlarm" placeholder="请输入出输送线卡托盘报警">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">平台位置偏差报警: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="platPositionDeviationAlarm" placeholder="请输入平台位置偏差报警">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">平台扭矩偏差报警: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="platTorqueDeviationAlarm" placeholder="请输入平台扭矩偏差报警">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">平台四向车检测: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="platShuttleCheck" placeholder="请输入平台四向车检测">-->
<!--                    </div>-->
<!--                </div>-->
                <div class="layui-form-item">
                    <label class="layui-form-label">未就绪状态: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="notReady" placeholder="请输入未就绪状态">
                    </div>
                </div>
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">伺服1错误: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="servoError1" placeholder="请输入伺服1错误">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">伺服2错误: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="servoError2" placeholder="请输入伺服2错误">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">伺服3错误: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="servoError3" placeholder="请输入伺服3错误">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">伺服4错误: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="servoError4" placeholder="请输入伺服4错误">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">提升机实际速度反馈: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="liftActualSpeed" placeholder="请输入提升机实际速度反馈">-->
<!--                    </div>-->
<!--                </div>-->
             </div>
        </div>
        <hr class="layui-bg-gray">