#
Junjie
2025-03-13 5b440ab96a0c5194654107bc1e29245074bd015e
#
6个文件已修改
2个文件已添加
605 ■■■■■ 已修改文件
src/main/java/com/zy/core/ServerBootstrap.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/cache/MessageQueue.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/SlaveType.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/ForkLiftSlave.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/properties/SlaveProperties.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/LfdZyForkLiftMasterThread.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java 407 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java
@@ -8,6 +8,8 @@
import com.zy.core.model.*;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.*;
import com.zy.core.thread.impl.LfdZyForkLiftMasterThread;
import com.zy.core.thread.impl.LfdZyForkLiftSlaveThread;
import com.zy.core.thread.impl.NyShuttleThread;
import com.zy.core.thread.impl.ZyForkLiftThread;
import lombok.extern.slf4j.Slf4j;
@@ -60,11 +62,13 @@
    private void initThread(){
        // 初始化货叉提升机
        News.info("初始化货叉提升机........................................................");
        for (ForkLiftSlave forkLiftSlave : slaveProperties.getForkLift()) {
            News.info("初始化货叉提升机........................................................");
            ThreadHandler thread = null;
            if (forkLiftSlave.getThreadImpl().equals("ZyForkLiftThread")) {
                thread = new ZyForkLiftThread(forkLiftSlave, redisUtil);
            } else if (forkLiftSlave.getThreadImpl().equals("LfdZyForkLiftSlaveThread")) {
                thread = new LfdZyForkLiftSlaveThread(forkLiftSlave, redisUtil, forkLiftSlave.getMasterId());
            } else {
                throw new CoolException("未知的线程实现");
            }
@@ -73,9 +77,23 @@
            SlaveConnection.put(SlaveType.ForkLift, forkLiftSlave.getId(), thread);
        }
        // 初始化货叉提升机
        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);
        }
        // 初始化四向穿梭车
        News.info("初始化四向穿梭车......................................................");
        for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) {
            News.info("初始化四向穿梭车......................................................");
            ThreadHandler thread = null;
            if (shuttleSlave.getThreadImpl().equals("NyShuttleThread")) {
                thread = new NyShuttleThread(shuttleSlave, redisUtil);
src/main/java/com/zy/core/cache/MessageQueue.java
@@ -20,6 +20,8 @@
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> LIFT_EXCHANGE = new ConcurrentHashMap<>();
    //货叉提升机mq交换机
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> FORK_LIFT_EXCHANGE = new ConcurrentHashMap<>();
    //货叉提升机Master mq交换机
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> FORK_LIFT_MASTER_EXCHANGE = new ConcurrentHashMap<>();
    /**
     * mq 交换机初始化
@@ -31,6 +33,9 @@
                break;
            case ForkLift:
                FORK_LIFT_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>());
                break;
            case ForkLiftMaster:
                FORK_LIFT_MASTER_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>());
                break;
            case Lift:
                LIFT_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>());
@@ -50,6 +55,8 @@
                return SHUTTLE_EXCHANGE.get(id).offer(task);
            case ForkLift:
                return FORK_LIFT_EXCHANGE.get(id).offer(task);
            case ForkLiftMaster:
                return FORK_LIFT_MASTER_EXCHANGE.get(id).offer(task);
            case Lift:
                return LIFT_EXCHANGE.get(id).offer(task);
            default:
@@ -67,6 +74,8 @@
                return SHUTTLE_EXCHANGE.get(id).poll();
            case ForkLift:
                return FORK_LIFT_EXCHANGE.get(id).poll();
            case ForkLiftMaster:
                return FORK_LIFT_MASTER_EXCHANGE.get(id).poll();
            case Lift:
                return LIFT_EXCHANGE.get(id).poll();
            default:
@@ -83,6 +92,8 @@
                return SHUTTLE_EXCHANGE.get(id).peek();
            case ForkLift:
                return FORK_LIFT_EXCHANGE.get(id).peek();
            case ForkLiftMaster:
                return FORK_LIFT_MASTER_EXCHANGE.get(id).peek();
            case Lift:
                return LIFT_EXCHANGE.get(id).peek();
            default:
@@ -98,6 +109,9 @@
            case ForkLift:
                FORK_LIFT_EXCHANGE.get(id).clear();
                break;
            case ForkLiftMaster:
                FORK_LIFT_MASTER_EXCHANGE.get(id).clear();
                break;
            case Lift:
                LIFT_EXCHANGE.get(id).clear();
                break;
src/main/java/com/zy/core/enums/SlaveType.java
@@ -5,6 +5,7 @@
    Shuttle,
    Lift,
    ForkLift,
    ForkLiftMaster,
    ;
    public static SlaveType findInstance(String s){
src/main/java/com/zy/core/model/ForkLiftSlave.java
@@ -15,6 +15,9 @@
    private Integer slot;
    //主线程id(用于多设备共用一块plc情况)
    private Integer masterId;
    //提升机站点
    private List<Sta> sta = new ArrayList<>();
src/main/java/com/zy/core/properties/SlaveProperties.java
@@ -27,4 +27,6 @@
    private List<ForkLiftSlave> forkLift = new ArrayList<>();
    private List<ForkLiftSlave> forkLiftMaster = new ArrayList<>();
}
src/main/java/com/zy/core/thread/impl/LfdZyForkLiftMasterThread.java
New file
@@ -0,0 +1,145 @@
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) 16));//提升机数据
        lift1.put("staStatus", new DbData("DB102.0", (short) 8));//站点数据
        lift1.put("write", new DbData("DB103.0", null));//写入数据
        lift1.put("writeConfirm", new DbData("DB103.8", null));//写入确认数据
        lift1.put("confirm", new DbData("DB103.10", null));//确认命令
        HashMap<String, Object> lift2 = new HashMap<>();
        lift2.put("status", new DbData("DB104.0", (short) 16));//提升机数据
        lift2.put("staStatus", new DbData("DB105.0", (short) 8));//站点数据
        lift2.put("write", new DbData("DB106.0", null));//写入数据
        lift2.put("writeConfirm", new DbData("DB106.8", null));//写入确认数据
        lift2.put("confirm", new DbData("DB106.10", 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 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 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 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
New file
@@ -0,0 +1,407 @@
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.ArrayList;
import java.util.Base64;
import java.util.Date;
import java.util.List;
@Slf4j
@SuppressWarnings("all")
public class LfdZyForkLiftSlaveThread implements ForkLiftThread {
    private Integer masterId;
    private ForkLiftSlave slave;
    private ForkLiftProtocol forkLiftProtocol;
    private RedisUtil redisUtil;
    private SiemensS7Net siemensS7Net;
    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(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 = this.masterThread.read(this.slave.getId(), "status");
            if (result1 == null) {
                OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】{1}读取货叉提升机状态信息失败", DateUtils.convert(new Date()), slave.getId()));
            }
            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 = this.masterThread.read(this.slave.getId(), "staStatus");
            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 = 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 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
        ) {
            return false;
        }
        boolean res = this.forkLiftProtocol.getProtocolStatus() == ForkLiftProtocolStatusType.IDLE.id
                && this.forkLiftProtocol.getWrkNo() == 0
                && this.forkLiftProtocol.getTaskNo() == 0
                && this.forkLiftProtocol.getModel() == 2;
        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
        ) {
            return false;
        }
        boolean res = this.forkLiftProtocol.getProtocolStatus() == ForkLiftProtocolStatusType.IDLE.id
                && this.forkLiftProtocol.getWrkNo() == 0
                && this.forkLiftProtocol.getModel() == 2;
        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) {
        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(pick.shortValue());
        command.setPut(put.shortValue());
        command.setConfirm((short) 1);
        commands.add(command);
        return commands;
    }
    @Override
    public List<ForkLiftCommand> getShuttleSwitchCommand(Integer taskNo, Integer originLev, Integer targetLev) {
        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(originLev.shortValue());
        command.setPut(targetLev.shortValue());
        command.setConfirm((short) 1);
        commands.add(command);
        return commands;
    }
    /**
     * 扩展字段
     */
    @Data
    private class InnerForkLiftExtend {
    }
}
src/main/resources/application.yml
@@ -60,6 +60,14 @@
    rack: 0
    slot: 0
    threadImpl: NyShuttleThread
  # 货叉提升机主线程
  forkLiftMaster[0]:
    id: 99
    ip: 10.10.20.20
    port: 102
    rack: 0
    slot: 0
    threadImpl: LfdZyForkLiftMasterThread
  # 货叉提升机1
  forkLift[0]:
    id: 1
@@ -67,7 +75,8 @@
    port: 102
    rack: 0
    slot: 0
    threadImpl: ZyForkLiftThread
    threadImpl: LfdZyForkLiftSlaveThread
    masterId: 99
    staRow: 9
    staBay: 6
    sta[0]: