From 5b440ab96a0c5194654107bc1e29245074bd015e Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 13 三月 2025 15:56:03 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/properties/SlaveProperties.java            |    2 
 src/main/java/com/zy/core/cache/MessageQueue.java                    |   14 +
 src/main/java/com/zy/core/enums/SlaveType.java                       |    1 
 src/main/java/com/zy/core/model/ForkLiftSlave.java                   |    3 
 src/main/java/com/zy/core/thread/impl/LfdZyForkLiftMasterThread.java |  145 +++++++++++++
 src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java  |  407 +++++++++++++++++++++++++++++++++++++
 src/main/resources/application.yml                                   |   11 
 src/main/java/com/zy/core/ServerBootstrap.java                       |   22 +
 8 files changed, 602 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/zy/core/ServerBootstrap.java b/src/main/java/com/zy/core/ServerBootstrap.java
index 5420fbd..c5c91c0 100644
--- a/src/main/java/com/zy/core/ServerBootstrap.java
+++ b/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);
diff --git a/src/main/java/com/zy/core/cache/MessageQueue.java b/src/main/java/com/zy/core/cache/MessageQueue.java
index 9d92365..a7a9efd 100644
--- a/src/main/java/com/zy/core/cache/MessageQueue.java
+++ b/src/main/java/com/zy/core/cache/MessageQueue.java
@@ -20,6 +20,8 @@
     private static final Map<Integer, ConcurrentLinkedQueue<Task>> LIFT_EXCHANGE = new ConcurrentHashMap<>();
     //璐у弶鎻愬崌鏈簃q浜ゆ崲鏈�
     private static final Map<Integer, ConcurrentLinkedQueue<Task>> FORK_LIFT_EXCHANGE = new ConcurrentHashMap<>();
+    //璐у弶鎻愬崌鏈篗aster 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;
diff --git a/src/main/java/com/zy/core/enums/SlaveType.java b/src/main/java/com/zy/core/enums/SlaveType.java
index 95abbb3..4b65625 100644
--- a/src/main/java/com/zy/core/enums/SlaveType.java
+++ b/src/main/java/com/zy/core/enums/SlaveType.java
@@ -5,6 +5,7 @@
     Shuttle,
     Lift,
     ForkLift,
+    ForkLiftMaster,
     ;
 
     public static SlaveType findInstance(String s){
diff --git a/src/main/java/com/zy/core/model/ForkLiftSlave.java b/src/main/java/com/zy/core/model/ForkLiftSlave.java
index cc901ae..4e5e184 100644
--- a/src/main/java/com/zy/core/model/ForkLiftSlave.java
+++ b/src/main/java/com/zy/core/model/ForkLiftSlave.java
@@ -15,6 +15,9 @@
 
     private Integer slot;
 
+    //涓荤嚎绋媔d(鐢ㄤ簬澶氳澶囧叡鐢ㄤ竴鍧梡lc鎯呭喌)
+    private Integer masterId;
+
     //鎻愬崌鏈虹珯鐐�
     private List<Sta> sta = new ArrayList<>();
 
diff --git a/src/main/java/com/zy/core/properties/SlaveProperties.java b/src/main/java/com/zy/core/properties/SlaveProperties.java
index 9de7962..74910e7 100644
--- a/src/main/java/com/zy/core/properties/SlaveProperties.java
+++ b/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<>();
+
 }
diff --git a/src/main/java/com/zy/core/thread/impl/LfdZyForkLiftMasterThread.java b/src/main/java/com/zy/core/thread/impl/LfdZyForkLiftMasterThread.java
new file mode 100644
index 0000000..445b4fd
--- /dev/null
+++ b/src/main/java/com/zy/core/thread/impl/LfdZyForkLiftMasterThread.java
@@ -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;
+        }
+
+    }
+}
diff --git a/src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java b/src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java
new file mode 100644
index 0000000..ac62c22
--- /dev/null
+++ b/src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java
@@ -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();
+
+            //鎻愬崌鏈哄浜庤繍琛岀姸鎬侊紝灏嗘爣璁扮疆涓簍rue
+            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 {
+
+    }
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 2374651..cc24188 100644
--- a/src/main/resources/application.yml
+++ b/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]:

--
Gitblit v1.9.1