From b78572fb09a2c63398e8d87bd19d5d3f92f5aa58 Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期五, 10 四月 2026 15:17:26 +0800
Subject: [PATCH] 1

---
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/StaProtocol.java                             |   11 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/listen/DevpTaskDataSubscriber.java                 |   56 +
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/SiteController.java                          |   45 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/Slave.java                              |   18 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/PlcConstant.java                          |    1 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/OutputQueue.java                        |   15 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/DeviceField.java                          |    7 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/ClearSingleOperationHandler.java |   35 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/service/DevpS7Service.java                         |   78 ++
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/AppleLocOperationHandler.java    |   40 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/listen/DevpPlcDataSubscriber.java                  |   56 +
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/service/StationService.java                        |   83 ++
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/RedisConveyorConstant.java                |    6 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/StationStatusField.java                   |    2 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/DevpSlave.java                          |    8 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/service/Snap7Service.java                          |  111 +++
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/SendTaskOperationHandler.java    |   20 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/WmsController.java                           |   17 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/enums/SlaveType.java                               |    5 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/PlcAlarmDefinition.java                   |   44 +
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/FakeUserOperationHandler.java    |   39 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/service/impl/DevpServiceImpl.java                       |    1 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/SiemensDevpThread.java                      |  431 ++++++-------
 /dev/null                                                                                                 |  180 ------
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/SlaveProperties.java                    |    8 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/CtuController.java                           |   14 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/OutOperationHandler.java         |   30 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/S7DevpThread.java                           |  364 +++++------
 zy-asc-conveyor/src/main/resources/application.yml                                                        |   26 
 29 files changed, 1,005 insertions(+), 746 deletions(-)

diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/CtuController.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/CtuController.java
index 2f201f2..9f98232 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/CtuController.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/CtuController.java
@@ -3,11 +3,9 @@
 import com.zy.acs.conveyor.common.web.BaseController;
 import com.zy.acs.conveyor.controller.requestParam.StationRequestParam;
 import com.zy.acs.conveyor.controller.responseParam.StationResponseParam;
-import com.zy.acs.conveyor.core.DevpThread;
-import com.zy.acs.conveyor.core.cache.SlaveConnection;
-import com.zy.acs.conveyor.core.enums.SlaveType;
-import com.zy.acs.conveyor.core.model.protocol.StaProtocol;
+import com.zy.acs.conveyor.core.model.StaProtocol;
 import com.zy.acs.conveyor.core.properties.SlaveProperties;
+import com.zy.acs.conveyor.core.service.StationService;
 import com.zy.acs.framework.common.Cools;
 import com.zy.acs.framework.common.R;
 import lombok.extern.slf4j.Slf4j;
@@ -32,6 +30,11 @@
     @Autowired
     private SlaveProperties slaveProperties;
 
+
+    @Autowired
+    private StationService stationService;
+
+
     /**
      * 绔欑偣鏌ヨ
      */
@@ -40,9 +43,8 @@
     public R query(@RequestBody StationRequestParam param) {
         log.info("绔欑偣鏌ヨ锛歿}", param);
         List<String> staNos = param.getStaNos();
-        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, param.getDevpId());
+        Map<Integer, StaProtocol> station = stationService.getStationMap(param.getDevpId());
         List<StationResponseParam> list = new ArrayList<>();
-        Map<Integer, StaProtocol> station = devpThread.getStation();
         if (Cools.isEmpty(staNos)) {
             for (Map.Entry<Integer, StaProtocol> entry : station.entrySet()) {
                 staNos.add(entry.getKey() + "");
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/SiteController.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/SiteController.java
index c609673..e6a9c8b 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/SiteController.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/SiteController.java
@@ -1,17 +1,14 @@
 package com.zy.acs.conveyor.controller;
 
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.conveyor.controller.vo.SiteTableVo;
-import com.zy.acs.conveyor.core.DevpThread;
-import com.zy.acs.conveyor.core.cache.MessageQueue;
-import com.zy.acs.conveyor.core.cache.OutputQueue;
-import com.zy.acs.conveyor.core.cache.SlaveConnection;
-import com.zy.acs.conveyor.core.enums.SlaveType;
-import com.zy.acs.conveyor.core.enums.TaskType;
-import com.zy.acs.conveyor.core.model.Task;
-import com.zy.acs.conveyor.core.model.protocol.StaProtocol;
+import com.zy.acs.conveyor.core.constant.RedisConveyorConstant;
+import com.zy.acs.conveyor.core.model.StaProtocol;
 import com.zy.acs.conveyor.core.properties.DevpSlave;
+import com.zy.acs.conveyor.core.properties.OutputQueue;
 import com.zy.acs.conveyor.core.properties.SlaveProperties;
+import com.zy.acs.conveyor.core.service.StationService;
 import com.zy.acs.conveyor.entity.Devp;
 import com.zy.acs.conveyor.service.DevpService;
 import com.zy.acs.framework.annotations.ManagerAuth;
@@ -34,8 +31,16 @@
 
     @Autowired
     private SlaveProperties slaveProperties;
+
+
     @Autowired
     private DevpService devpService;
+
+    @Autowired
+    private StationService stationService;
+
+
+    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
 
 
     @PostMapping("/table/site")
@@ -45,8 +50,8 @@
         // 鍐呭瓨鏁版嵁
         Map<Integer, StaProtocol> station = new HashMap<>();
         for (DevpSlave devp : slaveProperties.getDevp()) {
-            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-            station.putAll(devpThread.getStation());
+            Map<Integer, StaProtocol> stationMap = stationService.getStationMap(devp.getId());
+            station.putAll(stationMap);
         }
         // 鎸佷箙鏁版嵁
         List<Devp> devps = devpService.selectList(new EntityWrapper<Devp>().orderBy("dev_no"));
@@ -64,7 +69,6 @@
             vo.setLoading(staProtocol.isLoading() ? "Y" : "N");     // 鏈夌墿
             vo.setInEnable(staProtocol.isInEnable() ? "Y" : "N");   // 鍙叆
             vo.setOutEnable(staProtocol.isOutEnable() ? "Y" : "N"); // 鍙嚭
-            vo.setPakMk(staProtocol.isPakMk() ? "Y" : "N");       // 鍏ュ簱鏍囪
             vo.setEmptyMk(staProtocol.isEmptyMk() ? "Y" : "N");     // 绌烘澘淇″彿
             vo.setStaNo(staProtocol.getStaNo());                // 鐩爣绔�
 //            vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "浣�" : "楂�");     //楂樹綆搴撲綅
@@ -96,8 +100,7 @@
     public R siteDetl(@PathVariable("siteId") Integer siteId) {
         SiteTableVo vo = new SiteTableVo();
         for (DevpSlave devp : slaveProperties.getDevp()) {
-            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-            Map<Integer, StaProtocol> station = devpThread.getStation();
+            Map<Integer, StaProtocol> station = stationService.getStationMap(devp.getId());
             for (Map.Entry<Integer, StaProtocol> entry : station.entrySet()) {
                 if (siteId.equals(entry.getKey())) {
                     StaProtocol staProtocol = entry.getValue();
@@ -107,7 +110,6 @@
                     vo.setLoading(staProtocol.isLoading() ? "Y" : "N");     // 鏈夌墿
                     vo.setInEnable(staProtocol.isInEnable() ? "Y" : "N");   // 鍙叆
                     vo.setOutEnable(staProtocol.isOutEnable() ? "Y" : "N"); // 鍙嚭
-                    vo.setPakMk(staProtocol.isPakMk() ? "Y" : "N");       // 闇�姹�1
                     vo.setEmptyMk(staProtocol.isEmptyMk() ? "Y" : "N");     // 绌烘澘淇″彿
                     vo.setStaNo(staProtocol.getStaNo());                // 鐩爣绔�
                     vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "浣�" : "楂�");     //楂樹綆搴撲綅
@@ -125,8 +127,7 @@
                             @RequestParam Integer staNo,
                             @RequestParam String pakMk) {
         for (DevpSlave devp : slaveProperties.getDevp()) {
-            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-            Map<Integer, StaProtocol> station = devpThread.getStation();
+            Map<Integer, StaProtocol> station = stationService.getStationMap(devp.getId());
             for (Map.Entry<Integer, StaProtocol> entry : station.entrySet()) {
                 if (siteId.equals(entry.getKey())) {
                     StaProtocol staProtocol = entry.getValue();
@@ -141,15 +142,9 @@
                     if (staNo != null) {
                         staProtocol.setStaNo(staNo);
                     }
-                    if (pakMk != null) {
-                        staProtocol.setPakMk(pakMk.equals("Y"));
-                    }
-                    boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(TaskType.WRITE, staProtocol));
-                    if (result) {
-                        return R.ok();
-                    } else {
-                        return R.error("涓嬪彂鍛戒护澶辫触");
-                    }
+                    redis.push(RedisConveyorConstant.CONVEYOR_TASK_FLAG, staProtocol);
+                    return R.ok();
+
                 }
             }
         }
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/WmsController.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/WmsController.java
index 6a4b32d..47b55e5 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/WmsController.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/WmsController.java
@@ -2,12 +2,9 @@
 
 import com.zy.acs.conveyor.common.web.BaseController;
 import com.zy.acs.conveyor.controller.requestParam.StaParam;
-import com.zy.acs.conveyor.controller.responseParam.StationResponseParam;
 import com.zy.acs.conveyor.controller.vo.PlcErrorTableVo;
-import com.zy.acs.conveyor.core.DevpThread;
-import com.zy.acs.conveyor.core.cache.SlaveConnection;
-import com.zy.acs.conveyor.core.enums.SlaveType;
-import com.zy.acs.conveyor.core.model.protocol.StaProtocol;
+import com.zy.acs.conveyor.core.model.StaProtocol;
+import com.zy.acs.conveyor.core.service.StationService;
 import com.zy.acs.conveyor.entity.Job;
 import com.zy.acs.conveyor.service.JobService;
 import com.zy.acs.framework.common.R;
@@ -33,6 +30,9 @@
     @Autowired
     private JobService jobService;
 
+    @Autowired
+    private StationService stationService;
+
     /**
      * 绔欑偣鏌ヨ
      */
@@ -41,9 +41,7 @@
     public R query(@RequestBody StaParam param) {
         log.info("鏍规嵁绔欑偣鏌ヨstaNo锛歿}", param);
         String staNo = param.getStaNo();
-        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, param.getDevpId());
-        List<StationResponseParam> list = new ArrayList<>();
-        Map<Integer, StaProtocol> station = devpThread.getStation();
+        Map<Integer, StaProtocol> station = stationService.getStationMap(param.getDevpId());
         StaProtocol staProtocol = station.get(Integer.parseInt(staNo));
         Integer workNo = staProtocol.getWorkNo();
         if (workNo != null) {
@@ -64,8 +62,7 @@
     public R getError(@RequestBody StaParam param) {
         log.info("鏍规嵁绔欑偣鏌ヨstaNo锛歿}", param);
         String staNo = param.getStaNo();
-        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, param.getDevpId());
-        Map<Integer, StaProtocol> station = devpThread.getStation();
+        Map<Integer, StaProtocol> station = stationService.getStationMap(param.getDevpId());
         StaProtocol staProtocol = station.get(Integer.parseInt(staNo));
         return R.ok(staPlcErr(staProtocol));
     }
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/DevpThread.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/DevpThread.java
deleted file mode 100644
index 479698b..0000000
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/DevpThread.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.zy.acs.conveyor.core;
-
-import com.zy.acs.conveyor.core.model.protocol.StaProtocol;
-
-import java.util.Map;
-
-public interface DevpThread extends ThreadHandler {
-
-    Map<Integer, StaProtocol> getStation();
-
-
-}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/ServerBootstrap.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/ServerBootstrap.java
deleted file mode 100644
index a04a7b1..0000000
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/ServerBootstrap.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.zy.acs.conveyor.core;
-
-import com.zy.acs.common.utils.News;
-import com.zy.acs.conveyor.core.cache.MessageQueue;
-import com.zy.acs.conveyor.core.cache.SlaveConnection;
-import com.zy.acs.conveyor.core.enums.SlaveType;
-import com.zy.acs.conveyor.core.properties.DevpSlave;
-import com.zy.acs.conveyor.core.properties.SlaveProperties;
-import com.zy.acs.conveyor.core.thread.BarcodeThread;
-import com.zy.acs.conveyor.core.thread.SiemensDevpThread;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.DependsOn;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-
-/**
- * Created by vincent on 2020/8/4
- */
-@Slf4j
-@Component
-@DependsOn("springContextUtil")
-public class ServerBootstrap {
-
-    @Autowired
-    private SlaveProperties slaveProperties;
-
-    /**
-     * PostConstruct浼氬湪鍔犺浇servlet鐨勬椂鍊欒繍琛屼竴娆�
-     *
-     * @throws InterruptedException
-     */
-    @PostConstruct
-    @Async
-    @DependsOn("basDevpService")
-    public void init() throws InterruptedException {
-        News.info("鏍稿績鎺у埗灞傚紑濮嬪垵濮嬪寲...............................................");
-        Thread.sleep(2000);
-        // 鍒濆鍖栨秷鎭槦鍒�
-        initMq();
-        // 鍒濆鍖栦笅浣嶆満绾跨▼
-        initThread();
-
-        News.info("鏍稿績鎺у埗灞傚凡鍚姩...............................................");
-    }
-
-    private void initMq() {
-        // 鍒濆鍖栬緭閫佺嚎mq
-        for (Slave devp : slaveProperties.getDevp()) {
-            MessageQueue.init(SlaveType.Devp, devp);
-        }
-        // 鍒濆鍖栨潯鐮佹壂鎻忎华mq
-        for (Slave barcode : slaveProperties.getBarcode()) {
-            MessageQueue.init(SlaveType.Barcode, barcode);
-        }
-    }
-
-    private void initThread() {
-
-        // 鍒濆鍖栬緭閫佺嚎绾跨▼
-        News.info("鍒濆鍖栬緭閫佺嚎绾跨▼...................................................");
-        for (DevpSlave devp : slaveProperties.getDevp()) {
-            DevpThread devpThread = new SiemensDevpThread(devp);
-            new Thread((Runnable) devpThread).start();
-            SlaveConnection.put(SlaveType.Devp, devp.getId(), devpThread);
-        }
-        // 鍒濆鍖栨潯鐮佹壂鎻忎华绾跨▼
-        News.info("鍒濆鍖栨潯鐮佹壂鎻忎华绾跨▼...................................................");
-        for (Slave barcode : slaveProperties.getBarcode()) {
-            BarcodeThread barcodeThread = new BarcodeThread(barcode);
-            new Thread(barcodeThread).start();
-            SlaveConnection.put(SlaveType.Barcode, barcode.getId(), barcodeThread);
-        }
-    }
-
-
-    @PreDestroy
-    public void destroy() {
-    }
-
-}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/Slave.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/Slave.java
deleted file mode 100644
index e2d95fa..0000000
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/Slave.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.zy.acs.conveyor.core;
-
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * Created by vincent on 2020/8/4
- */
-@Data
-public class Slave {
-
-    private Integer id;
-
-    private String ip;
-
-    private Integer port;
-
-    private List<Integer> barcodeNumber;
-
-    private List<Integer> staNos;
-
-}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/ThreadHandler.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/ThreadHandler.java
deleted file mode 100644
index b9a4ba4..0000000
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/ThreadHandler.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.zy.acs.conveyor.core;
-
-public interface ThreadHandler {
-
-    boolean connect();
-
-    void close();
-
-}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/cache/MessageQueue.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/cache/MessageQueue.java
deleted file mode 100644
index 7b8e992..0000000
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/cache/MessageQueue.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.zy.acs.conveyor.core.cache;
-
-import com.zy.acs.conveyor.core.Slave;
-import com.zy.acs.conveyor.core.enums.SlaveType;
-import com.zy.acs.conveyor.core.model.Task;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentLinkedQueue;
-
-/**
- * 娑堟伅闃熷垪
- * Created by vincent on 2020/8/5
- */
-public class MessageQueue {
-
-
-    // 杈撻�佺嚎mq浜ゆ崲鏈�
-    private static final Map<Integer, ConcurrentLinkedQueue<Task>> DEVP_EXCHANGE = new ConcurrentHashMap<>();
-
-
-    /**
-     * mq 浜ゆ崲鏈哄垵濮嬪寲
-     */
-    public static void init(SlaveType type, Slave slave) {
-        switch (type) {
-            case Devp:
-                DEVP_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>());
-                break;
-            default:
-                break;
-        }
-    }
-
-    /**
-     * 娣诲姞鍏冪礌
-     * 濡傛灉鍙戠幇闃熷垪宸叉弧鏃犳硶娣诲姞鐨勮瘽锛屼細鐩存帴杩斿洖false銆�
-     */
-    public static boolean offer(SlaveType type, Integer id, Task task) {
-        switch (type) {
-            case Devp:
-                return DEVP_EXCHANGE.get(id).offer(task);
-            default:
-                return false;
-        }
-    }
-
-    /**
-     * 绉婚櫎鍏冪礌
-     * 鑻ラ槦鍒椾负绌猴紝杩斿洖null銆�
-     */
-    public static Task poll(SlaveType type, Integer id) {
-        switch (type) {
-            case Devp:
-                return DEVP_EXCHANGE.get(id).poll();
-            default:
-                return null;
-        }
-    }
-
-    /**
-     * 鍙栧嚭鍏冪礌锛屽苟涓嶅垹闄�.
-     */
-    public static Task peek(SlaveType type, Integer id) {
-        switch (type) {
-            case Devp:
-                return DEVP_EXCHANGE.get(id).peek();
-            default:
-                return null;
-        }
-    }
-
-    public static void clear(SlaveType type, Integer id) {
-        switch (type) {
-            case Devp:
-                DEVP_EXCHANGE.get(id).clear();
-                break;
-            default:
-                break;
-        }
-    }
-
-}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/cache/OutputQueue.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/cache/OutputQueue.java
deleted file mode 100644
index 5cae4d2..0000000
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/cache/OutputQueue.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.zy.acs.conveyor.core.cache;
-
-import com.alibaba.fastjson.JSONObject;
-
-import java.util.concurrent.ArrayBlockingQueue;
-
-/**
- * Created by vincent on 2020/8/17
- */
-public class OutputQueue {
-
-
-    // 杈撻�佺嚎杈撳嚭鏃ュ織
-    public static ArrayBlockingQueue<String> DEVP = new ArrayBlockingQueue<>(32);
-    // 鏉$爜鍣ㄨ緭鍑烘棩蹇�
-    public static ArrayBlockingQueue<JSONObject> BARCODE = new ArrayBlockingQueue<>(32);
-
-}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/cache/SlaveConnection.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/cache/SlaveConnection.java
deleted file mode 100644
index a326b74..0000000
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/cache/SlaveConnection.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.zy.acs.conveyor.core.cache;
-
-import com.zy.acs.conveyor.core.ThreadHandler;
-import com.zy.acs.conveyor.core.enums.SlaveType;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * 绾跨▼缂撳瓨瀹瑰櫒
- * Created by vincent on 2020/8/4
- */
-public class SlaveConnection {
-
-    private static final String _LINK = "_";
-
-    private static final Map<String, ThreadHandler> conContain = new ConcurrentHashMap<>();
-
-    public static void put(SlaveType type, Integer id, ThreadHandler threadHandler) {
-        String key = toKey(type, id);
-        remove(type, id);
-        conContain.put(key, threadHandler);
-    }
-
-    public static ThreadHandler get(SlaveType type, Integer id) {
-        return conContain.get(toKey(type, id));
-    }
-
-    public static void remove(SlaveType type, Integer id) {
-        ThreadHandler threadHandler = get(type, id);
-        if (null == threadHandler) {
-            return;
-        }
-        conContain.remove(toKey(type, id));
-        threadHandler.close();
-    }
-
-    public static Integer remove(ThreadHandler threadHandler) {
-        if (null == threadHandler) {
-            return null;
-        }
-        String key = null;
-        for (Map.Entry<String, ThreadHandler> entry : conContain.entrySet()) {
-            if (entry.getValue() == threadHandler) {
-                key = entry.getKey();
-                break;
-            }
-        }
-        if (null != key) {
-            SlaveType type = SlaveType.findInstance(key);
-            Integer id = Integer.parseInt(key.split(_LINK)[1]);
-            remove(type, id);
-            return id;
-        } else {
-            return null;
-        }
-    }
-
-    private static String toKey(SlaveType type, Integer id) {
-        return type.toString() + _LINK + id;
-    }
-
-}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/DeviceField.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/DeviceField.java
index c63c92e..85791dd 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/DeviceField.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/DeviceField.java
@@ -37,12 +37,9 @@
     /**
      * 鏍规嵁 DB 鍧楃紪鍙峰拰绔欑偣鍋忕Щ鐢熸垚鍏蜂綋鍦板潃
      *
-     * @param dbBlock           DB鍧楃紪鍙�
-     * @param stationBaseOffset 绔欑偣鍩哄潃鍋忕Щ锛堢珯鐐瑰彿*绔欑偣闀垮害锛�
      * @return PLC4X 鍦板潃瀛楃涓诧紝濡� "DB100.DBD0"
      */
-    public String buildAddress(int dbBlock, int stationBaseOffset) {
-        int finalOffset = stationBaseOffset + offset;
-        return String.format(addressPattern, dbBlock, finalOffset);
+    public String buildAddress() {
+        return addressPattern + PlcConstant.ADDRESS_CONCATENATION + offset;
     }
 }
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/PlcAlarmDefinition.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/PlcAlarmDefinition.java
index 74c0ae8..2817e65 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/PlcAlarmDefinition.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/PlcAlarmDefinition.java
@@ -4,23 +4,47 @@
  * PLC 鎶ヨ瀹氫箟锛堝搴� 搂2.3锛�
  */
 public enum PlcAlarmDefinition {
-    EMERGENCY_STOP("DB25", 1, "鎬ュ仠"),
-    LOWER_BREAKER_TRIP("DB25", 2, "浣庝綅鏂矾鍣ㄦ柇寮�"),
-    LOWER_INVERTER_FAULT("DB25", 3, "浣庝綅鍙橀鍣ㄦ晠闅�"),
-    CONVEYOR_TIMEOUT("DB25", 4, "杈撻�佽繍琛岃秴鏃�"),
-    LIFT_TIMEOUT("DB25", 5, "椤跺崌杩愯瓒呮椂"),
-    TASK_REQUEST_TIMEOUT("DB25", 6, "鐢宠浠诲姟瓒呮椂"),
-    PALLET_PROTRUSION("DB25", 7, "鎵樼洏绐佸嚭鎶ヨ"),
-    TASK_DUPLICATE("DB25", 8, "浠诲姟閲嶅鎶ヨ"),
-    PRECONDITION_ERROR("DB25", 9, "鍏ョ珯杩囩▼涓墠缃潯浠跺紓甯�");
+    ALL("DB25", 0, 4, "鎵�鏈夋姤璀�"),
+    EMERGENCY_STOP("DB25", 1, 4, "鎬ュ仠"),
+    LOWER_BREAKER_TRIP("DB25", 2, 4, "浣庝綅鏂矾鍣ㄦ柇寮�"),
+    LOWER_INVERTER_FAULT("DB25", 3, 4, "浣庝綅鍙橀鍣ㄦ晠闅�"),
+    CONVEYOR_TIMEOUT("DB25", 4, 4, "杈撻�佽繍琛岃秴鏃�"),
+    LIFT_TIMEOUT("DB25", 5, 4, "椤跺崌杩愯瓒呮椂"),
+    TASK_REQUEST_TIMEOUT("DB25", 6, 4, "鐢宠浠诲姟瓒呮椂"),
+    PALLET_PROTRUSION("DB25", 7, 4, "鎵樼洏绐佸嚭鎶ヨ"),
+    TASK_DUPLICATE("DB25", 8, 4, "浠诲姟閲嶅鎶ヨ"),
+    PRECONDITION_ERROR("DB25", 9, 4, "鍏ョ珯杩囩▼涓墠缃潯浠跺紓甯�");
 
     private final String addressPattern;
     private final int index;          // 鎶ヨ搴忓彿锛�1-based锛�
+    private final int byteLength;
     private final String description;
 
-    PlcAlarmDefinition(String addressPattern, int index, String description) {
+    PlcAlarmDefinition(String addressPattern, int index, int byteLength, String description) {
         this.addressPattern = addressPattern;
         this.index = index;
+        this.byteLength = byteLength;
         this.description = description;
     }
+
+
+    public String buildAddress() {
+        return addressPattern + PlcConstant.ADDRESS_CONCATENATION + index;
+    }
+
+    public String getAddressPattern() {
+        return addressPattern;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+
+    public int getByteLength() {
+        return byteLength;
+    }
+
+    public String getDescription() {
+        return description;
+    }
 }
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/PlcConstant.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/PlcConstant.java
index a906bcc..c6a1b80 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/PlcConstant.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/PlcConstant.java
@@ -7,5 +7,4 @@
     public static final String ADDRESS_CONCATENATION = ".";
 
 
-
 }
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/RedisConveyorConstant.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/RedisConveyorConstant.java
new file mode 100644
index 0000000..0340f0a
--- /dev/null
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/RedisConveyorConstant.java
@@ -0,0 +1,6 @@
+package com.zy.acs.conveyor.core.constant;
+
+public class RedisConveyorConstant {
+
+    public static final String CONVEYOR_TASK_FLAG = "CONVEYOR_TASK_FLAG";
+}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/StationStatusField.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/StationStatusField.java
index a4180fe..2bf07fa 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/StationStatusField.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/StationStatusField.java
@@ -27,7 +27,7 @@
      * @return PLC4X 鍦板潃瀛楃涓诧紝濡� "DB100.D0"
      */
     public String buildAddress() {
-        return addressPattern+PlcConstant.ADDRESS_CONCATENATION+ offset;
+        return addressPattern + PlcConstant.ADDRESS_CONCATENATION + offset;
     }
 
 
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/enums/SlaveType.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/enums/SlaveType.java
index 91c70dd..58e0d8c 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/enums/SlaveType.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/enums/SlaveType.java
@@ -2,13 +2,10 @@
 
 public enum SlaveType {
 
-    Crn,
     Devp,
     Barcode,
-    Led,
     Scale,
-    Car,
-    Rgv;
+    ;
 
     public static SlaveType findInstance(String s) {
         for (SlaveType type : SlaveType.values()) {
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/enums/TaskType.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/enums/TaskType.java
deleted file mode 100644
index 45fcbc5..0000000
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/enums/TaskType.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.zy.acs.conveyor.core.enums;
-
-public enum TaskType {
-
-    READ,
-    WRITE,
-    ;
-
-
-}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/listen/DevpPlcDataSubscriber.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/listen/DevpPlcDataSubscriber.java
new file mode 100644
index 0000000..380dc63
--- /dev/null
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/listen/DevpPlcDataSubscriber.java
@@ -0,0 +1,56 @@
+package com.zy.acs.conveyor.core.listen;
+
+import com.zy.acs.conveyor.core.properties.DevpSlave;
+import com.zy.acs.conveyor.core.properties.SlaveProperties;
+import com.zy.acs.conveyor.core.service.DevpS7Service;
+import com.zy.acs.conveyor.core.service.StationService;
+import com.zy.acs.conveyor.core.thread.SiemensDevpThread;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PreDestroy;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 璇诲彇plc鏁版嵁
+ */
+@Slf4j
+@Component
+public class DevpPlcDataSubscriber {
+
+    @Autowired
+    private SlaveProperties slaveProperties;
+
+    @Autowired
+    private DevpS7Service devpS7Service;
+
+    @Autowired
+    private StationService stationService;
+
+
+    private static final Map<String, Thread> conContain = new ConcurrentHashMap<>();
+
+
+    @EventListener(ApplicationReadyEvent.class)
+    private void start() {
+        for (DevpSlave devp : slaveProperties.getDevp()) {
+            Thread thread = new Thread(new SiemensDevpThread(devp, devpS7Service.get(devp.getId()), stationService.getStationMap(devp.getId())));
+            conContain.put(devp.getId().toString(), thread);
+            thread.start();
+        }
+
+    }
+
+    @PreDestroy
+    public void shutDown() {
+        for (Map.Entry<String, Thread> entry : conContain.entrySet()) {
+            if (entry.getValue() != null) entry.getValue().interrupt();
+        }
+    }
+
+
+}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/listen/DevpTaskDataSubscriber.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/listen/DevpTaskDataSubscriber.java
new file mode 100644
index 0000000..f97fae7
--- /dev/null
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/listen/DevpTaskDataSubscriber.java
@@ -0,0 +1,56 @@
+package com.zy.acs.conveyor.core.listen;
+
+import com.zy.acs.common.utils.RedisSupport;
+import com.zy.acs.conveyor.core.constant.RedisConveyorConstant;
+import com.zy.acs.conveyor.core.model.StaProtocol;
+import com.zy.acs.conveyor.core.service.Snap7Service;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PreDestroy;
+
+/**
+ * 璇诲彇redis鍐欏叆plc
+ */
+@Slf4j
+@Component
+public class DevpTaskDataSubscriber {
+
+    private Thread thread;
+
+    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
+
+    @Autowired
+    private Snap7Service snap7Service;
+
+    @EventListener(ApplicationReadyEvent.class)
+    private void start() {
+        thread = new Thread(() -> {
+            while (!Thread.currentThread().isInterrupted()) {
+                try {
+                    // 闂撮殧
+                    Thread.sleep(20);
+
+                    StaProtocol protocol = redis.pop(RedisConveyorConstant.CONVEYOR_TASK_FLAG);
+                    if (null != protocol) {
+
+                        snap7Service.write(protocol);
+                    }
+
+                } catch (Exception ignore) {
+                }
+            }
+        });
+        thread.start();
+    }
+
+    @PreDestroy
+    public void shutDown() {
+        if (thread != null) thread.interrupt();
+    }
+
+
+}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/protocol/StaProtocol.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/StaProtocol.java
similarity index 94%
rename from zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/protocol/StaProtocol.java
rename to zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/StaProtocol.java
index 3914674..6510156 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/protocol/StaProtocol.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/StaProtocol.java
@@ -1,4 +1,4 @@
-package com.zy.acs.conveyor.core.model.protocol;
+package com.zy.acs.conveyor.core.model;
 
 import com.zy.acs.conveyor.entity.Devp;
 import lombok.Data;
@@ -9,6 +9,8 @@
  */
 @Data
 public class StaProtocol implements Cloneable {
+
+    private Integer plcId;
 
     // 绔欑偣缂栧彿
     private Integer siteId;
@@ -46,8 +48,11 @@
     // 浣�
     private boolean low;
 
-    // 閿佸畾鏍囪
-    private boolean pakMk = true;
+    //鏉$爜
+    private String barcode;
+
+    //閲嶉噺
+    private Double weight;
 
 
     // 澶栧舰妫�娴� ------------------------------------------------------------------------
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/Task.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/Task.java
deleted file mode 100644
index 688ea72..0000000
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/Task.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.zy.acs.conveyor.core.model;
-
-import com.zy.acs.conveyor.core.enums.TaskType;
-import lombok.Data;
-
-/**
- * Created by vincent on 2020/8/5
- */
-@Data
-public class Task {
-
-    private TaskType step;
-
-    private Object data;
-
-    public Task() {
-    }
-
-    public Task(TaskType step, Object data) {
-        this.step = step;
-        this.data = data;
-    }
-}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/AppleLocOperationHandler.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/AppleLocOperationHandler.java
index 973dc7a..3f3eb9c 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/AppleLocOperationHandler.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/AppleLocOperationHandler.java
@@ -1,27 +1,22 @@
 package com.zy.acs.conveyor.core.operation.handler;
 
+import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.conveyor.controller.vo.ApplyInDto;
 import com.zy.acs.conveyor.controller.vo.ApplyInRepsonseDto;
-import com.zy.acs.conveyor.core.cache.MessageQueue;
-import com.zy.acs.conveyor.core.cache.SlaveConnection;
+import com.zy.acs.conveyor.core.constant.RedisConveyorConstant;
 import com.zy.acs.conveyor.core.enums.ConveyorStateType;
-import com.zy.acs.conveyor.core.enums.SlaveType;
-import com.zy.acs.conveyor.core.enums.TaskType;
-import com.zy.acs.conveyor.core.model.Task;
-import com.zy.acs.conveyor.core.model.protocol.StaProtocol;
+import com.zy.acs.conveyor.core.model.StaProtocol;
 import com.zy.acs.conveyor.core.operation.OperationHandler;
 import com.zy.acs.conveyor.core.properties.CtuOperationConfig;
 import com.zy.acs.conveyor.core.properties.DevpSlave;
 import com.zy.acs.conveyor.core.properties.SlaveProperties;
-import com.zy.acs.conveyor.core.thread.BarcodeThread;
-import com.zy.acs.conveyor.core.thread.SiemensDevpThread;
+import com.zy.acs.conveyor.core.service.StationService;
 import com.zy.acs.conveyor.entity.Job;
 import com.zy.acs.conveyor.enums.WorkNoTypeType;
 import com.zy.acs.conveyor.service.JobService;
 import com.zy.acs.conveyor.service.WmsMainService;
 import com.zy.acs.conveyor.service.WrkLastnoService;
 import com.zy.acs.framework.common.Cools;
-import com.zy.acs.framework.exception.CoolException;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -29,6 +24,7 @@
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import java.util.Date;
+import java.util.Map;
 
 /**
  * 鍏ュ簱
@@ -51,6 +47,13 @@
     private JobService jobService;
 
 
+    @Autowired
+    private StationService stationService;
+
+
+    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
+
+
     @Override
     public ConveyorStateType getType() {
         return ConveyorStateType.APPLYLOC;
@@ -65,9 +68,8 @@
                 // 閬嶅巻鍏ュ簱鍙�
                 for (DevpSlave.Sta inSta : devp.getInSta()) {
                     // 鏍规嵁杈撻�佺嚎plc閬嶅巻
-                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-                    StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
-                    BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, devp.getId());
+                    Map<Integer, StaProtocol> stationMap = stationService.getStationMap(devp.getId());
+                    StaProtocol staProtocol = stationMap.get(inSta.getStaNo());
                     if (staProtocol == null) {
                         continue;
                     } else {
@@ -78,8 +80,8 @@
                         continue;
                     }
                     if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) {
-                        String barcode = barcodeThread.getBarcode();
-                        if (barcodeThread == null || Cools.isEmpty(barcode)) {
+                        String barcode = staProtocol.getBarcode();
+                        if (Cools.isEmpty(barcode)) {
                             log.error("绔欑偣锛歿}锛屾湭鎵埌鐮佸�硷細{}", staProtocol.getSiteId(), barcode);
                             return;
                         }
@@ -93,13 +95,9 @@
                                     Integer workNo = getWorkNo();
                                     staProtocol.setWorkNo(workNo);
                                     staProtocol.setStaNo(inSta.getTargetSta());
-                                    if (MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(TaskType.WRITE, staProtocol))) {
-                                        if (!jobService.insert(initJob(locOfWms, barcode, workNo, inSta.getTargetSta() + ""))) {
-                                            throw new CoolException("鏇存柊杈撻�佺嚎浠诲姟澶辫触," + " - " + staProtocol.getWorkNo());
-                                        }
-                                        log.info("鍏ュ簱鍓嶈繘锛歿},{}", staProtocol.getWorkNo(), inSta.getTargetSta());
-                                    } else {
-                                        log.info("涓嬪彂澶辫触锛歿},{}", staProtocol.getWorkNo(), inSta.getTargetSta());
+                                    redis.push(RedisConveyorConstant.CONVEYOR_TASK_FLAG, staProtocol);
+                                    if (jobService.insert(initJob(locOfWms, barcode, workNo, inSta.getTargetSta() + ""))) {
+                                        log.info("鐢宠鍏ュ簱鎴愬姛锛屾潯鐮侊細{},绔欑偣锛歿}", barcode, inSta.getStaNo());
                                     }
                                 } else {
                                     log.info("WMS鏈繑鍥炲簱浣嶄俊鎭紝鏉$爜锛歿},绔欑偣锛歿}", barcode, inSta.getStaNo());
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/ClearSingleOperationHandler.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/ClearSingleOperationHandler.java
index 1d60fa3..179651b 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/ClearSingleOperationHandler.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/ClearSingleOperationHandler.java
@@ -1,23 +1,22 @@
 package com.zy.acs.conveyor.core.operation.handler;
 
-import com.zy.acs.conveyor.core.cache.MessageQueue;
-import com.zy.acs.conveyor.core.cache.SlaveConnection;
+import com.zy.acs.common.utils.RedisSupport;
+import com.zy.acs.conveyor.core.constant.RedisConveyorConstant;
 import com.zy.acs.conveyor.core.enums.ConveyorStateType;
-import com.zy.acs.conveyor.core.enums.SlaveType;
-import com.zy.acs.conveyor.core.enums.TaskType;
-import com.zy.acs.conveyor.core.model.Task;
-import com.zy.acs.conveyor.core.model.protocol.StaProtocol;
+import com.zy.acs.conveyor.core.model.StaProtocol;
 import com.zy.acs.conveyor.core.operation.OperationHandler;
 import com.zy.acs.conveyor.core.properties.CtuOperationConfig;
 import com.zy.acs.conveyor.core.properties.DevpSlave;
 import com.zy.acs.conveyor.core.properties.SlaveProperties;
-import com.zy.acs.conveyor.core.thread.SiemensDevpThread;
+import com.zy.acs.conveyor.core.service.StationService;
 import com.zy.acs.conveyor.entity.Job;
 import com.zy.acs.conveyor.service.JobService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import java.util.Map;
 
 
 /**
@@ -35,6 +34,12 @@
     private JobService jobService;
 
 
+    @Autowired
+    private StationService stationService;
+
+    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
+
+
     @Override
     public ConveyorStateType getType() {
         return ConveyorStateType.CLEARSIGNAL;
@@ -48,8 +53,8 @@
                 // 閬嶅巻绛夊緟ctu鍙栬揣绔�
                 for (DevpSlave.Sta takeSta : devp.getTakeSta()) {
                     // 鏍规嵁杈撻�佺嚎plc閬嶅巻
-                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-                    StaProtocol staProtocol = devpThread.getStation().get(takeSta.getStaNo());
+                    Map<Integer, StaProtocol> stationMap = stationService.getStationMap(devp.getId());
+                    StaProtocol staProtocol = stationMap.get(takeSta.getStaNo());
                     if (staProtocol == null) {
                         continue;
                     } else {
@@ -65,12 +70,12 @@
                             //String s = ctuMainService.checkStationStatus(takeSta.getStaNo());
                             staProtocol.setWorkNo(0);
                             staProtocol.setStaNo(0);
-                            boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(TaskType.WRITE, staProtocol));
-                            if (result) {
-                                log.info("" + config.getMark() + "绔欑偣娓呯┖澶辫触锛歿},{}", takeSta.getStaNo(), staProtocol.getWorkNo());
-                                job.setJobSts(ConveyorStateType.CLEARSIGNAL.getStatus());
-                                jobService.updateById(job);
-                            }
+                            redis.push(RedisConveyorConstant.CONVEYOR_TASK_FLAG, staProtocol);
+
+                            log.info("" + config.getMark() + "绔欑偣娓呯┖澶辫触锛歿},{}", takeSta.getStaNo(), staProtocol.getWorkNo());
+                            job.setJobSts(ConveyorStateType.CLEARSIGNAL.getStatus());
+                            jobService.updateById(job);
+
                         }
                     }
                 }
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/FakeUserOperationHandler.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/FakeUserOperationHandler.java
index eea0d48..e6f65b4 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/FakeUserOperationHandler.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/FakeUserOperationHandler.java
@@ -1,22 +1,21 @@
 package com.zy.acs.conveyor.core.operation.handler;
 
-import com.zy.acs.conveyor.core.cache.MessageQueue;
-import com.zy.acs.conveyor.core.cache.SlaveConnection;
+import com.zy.acs.common.utils.RedisSupport;
+import com.zy.acs.conveyor.core.constant.RedisConveyorConstant;
 import com.zy.acs.conveyor.core.enums.ConveyorStateType;
-import com.zy.acs.conveyor.core.enums.SlaveType;
-import com.zy.acs.conveyor.core.enums.TaskType;
-import com.zy.acs.conveyor.core.model.Task;
-import com.zy.acs.conveyor.core.model.protocol.StaProtocol;
+import com.zy.acs.conveyor.core.model.StaProtocol;
 import com.zy.acs.conveyor.core.operation.OperationHandler;
 import com.zy.acs.conveyor.core.properties.CtuOperationConfig;
 import com.zy.acs.conveyor.core.properties.SlaveProperties;
-import com.zy.acs.conveyor.core.thread.SiemensDevpThread;
+import com.zy.acs.conveyor.core.service.StationService;
 import com.zy.acs.conveyor.entity.Job;
 import com.zy.acs.conveyor.service.JobService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import java.util.Map;
 
 /**
  * 妯℃嫙鐢ㄦ埛鎸夋寜閽�
@@ -33,6 +32,12 @@
     private JobService jobService;
 
 
+    @Autowired
+    private StationService stationService;
+
+    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
+
+
     @Override
     public ConveyorStateType getType() {
         return ConveyorStateType.FAKEUSER;
@@ -43,8 +48,8 @@
 
         try {
             // 鏍规嵁杈撻�佺嚎plc閬嶅巻
-            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
-            StaProtocol staProtocol = devpThread.getStation().get(1004);
+            Map<Integer, StaProtocol> stationMap = stationService.getStationMap(1);
+            StaProtocol staProtocol = stationMap.get(1004);
             if (staProtocol == null) {
                 return;
             } else {
@@ -54,7 +59,7 @@
             if (!staProtocol.isLoading()) {
                 return;
             }
-            StaProtocol staProtocol5 = devpThread.getStation().get(1005);
+            StaProtocol staProtocol5 = stationMap.get(1005);
             if (staProtocol5.isLoading()) {
                 log.info("1005鏈夌墿锛岀瓑鏃犵墿涔嬪悗鎵嶅叆搴�");
                 return;
@@ -64,13 +69,13 @@
                 if (jobByWorkNo != null && jobByWorkNo.getJobSts() == ConveyorStateType.OUTBOUND.getStatus()) {
                     staProtocol.setWorkNo(9992);
                     staProtocol.setStaNo(1005);
-                    boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(TaskType.WRITE, staProtocol));
-                    if (result) {
-                        jobByWorkNo.setJobSts(3);
-                        jobByWorkNo.setMemo("妯℃嫙鎸夋寜閽�");
-                        jobService.updateById(jobByWorkNo);
-                        log.info("鍏ュ簱杈撻�佺嚎涓嬪彂锛歿},{}", staProtocol.getWorkNo(), 1006);
-                    }
+                    redis.push(RedisConveyorConstant.CONVEYOR_TASK_FLAG, staProtocol);
+
+                    jobByWorkNo.setJobSts(3);
+                    jobByWorkNo.setMemo("妯℃嫙鎸夋寜閽�");
+                    jobService.updateById(jobByWorkNo);
+                    log.info("鍏ュ簱杈撻�佺嚎涓嬪彂锛歿},{}", staProtocol.getWorkNo(), 1006);
+
                 }
             }
         } catch (Exception e) {
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/OutOperationHandler.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/OutOperationHandler.java
index bfe57af..b3dcb83 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/OutOperationHandler.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/OutOperationHandler.java
@@ -1,17 +1,14 @@
 package com.zy.acs.conveyor.core.operation.handler;
 
-import com.zy.acs.conveyor.core.cache.MessageQueue;
-import com.zy.acs.conveyor.core.cache.SlaveConnection;
+import com.zy.acs.common.utils.RedisSupport;
+import com.zy.acs.conveyor.core.constant.RedisConveyorConstant;
 import com.zy.acs.conveyor.core.enums.ConveyorStateType;
-import com.zy.acs.conveyor.core.enums.SlaveType;
-import com.zy.acs.conveyor.core.enums.TaskType;
-import com.zy.acs.conveyor.core.model.Task;
-import com.zy.acs.conveyor.core.model.protocol.StaProtocol;
+import com.zy.acs.conveyor.core.model.StaProtocol;
 import com.zy.acs.conveyor.core.operation.OperationHandler;
 import com.zy.acs.conveyor.core.properties.CtuOperationConfig;
 import com.zy.acs.conveyor.core.properties.DevpSlave;
 import com.zy.acs.conveyor.core.properties.SlaveProperties;
-import com.zy.acs.conveyor.core.thread.SiemensDevpThread;
+import com.zy.acs.conveyor.core.service.StationService;
 import com.zy.acs.conveyor.entity.Job;
 import com.zy.acs.conveyor.enums.WorkNoTypeType;
 import com.zy.acs.conveyor.service.CtuMainService;
@@ -23,6 +20,8 @@
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import java.util.Map;
 
 @Slf4j
 @Component
@@ -41,6 +40,11 @@
     @Autowired
     private JobService jobService;
 
+    @Autowired
+    private StationService stationService;
+
+    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
+
 
     @Override
     public ConveyorStateType getType() {
@@ -56,8 +60,8 @@
                 // 閬嶅巻鍑哄簱鍙�
                 for (DevpSlave.Sta releaseSta : devp.getReleaseSta()) {
                     // 鑾峰彇鍏ュ簱绔欎俊鎭�
-                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-                    StaProtocol staProtocol = devpThread.getStation().get(releaseSta.getStaNo());
+                    Map<Integer, StaProtocol> stationMap = stationService.getStationMap(devp.getId());
+                    StaProtocol staProtocol = stationMap.get(releaseSta.getStaNo());
                     if (staProtocol == null) {
                         continue;
                     } else {
@@ -91,12 +95,8 @@
                                 if (!jobService.insert(job)) {
                                     throw new CoolException("鎻掑叆杈撻�佺嚎浠诲姟澶辫触," + jobBySeqNum + " - " + workNo);
                                 }
-                                boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(TaskType.WRITE, staProtocol));
-                                if (result) {
-                                    log.info("杈撻�佺嚎涓嬪彂锛歿},{}", staProtocol.getWorkNo(), releaseSta.getTargetSta());
-                                } else {
-                                    log.error("鍙戝竷鍛戒护鑷宠緭閫佺嚎闃熷垪澶辫触锛侊紒锛� [plc缂栧彿锛歿}]", devp.getId());
-                                }
+                                redis.push(RedisConveyorConstant.CONVEYOR_TASK_FLAG, staProtocol);
+                                log.info("杈撻�佺嚎涓嬪彂锛歿},{}", staProtocol.getWorkNo(), releaseSta.getTargetSta());
                             }
                         } else {
                             log.info("绔欑偣淇℃伅涓嶇鍚堝叆搴撴潯浠讹紒锛侊紒" + " 璋冪敤RCS妫�楠屾湭閫氳繃,绔欑偣锛歿}", staProtocol.getSiteId());
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/SendTaskOperationHandler.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/SendTaskOperationHandler.java
index 9d494df..29117c0 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/SendTaskOperationHandler.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/SendTaskOperationHandler.java
@@ -1,17 +1,16 @@
 package com.zy.acs.conveyor.core.operation.handler;
 
 
+import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.conveyor.controller.vo.OpenBusSubmitParam;
 import com.zy.acs.conveyor.controller.vo.TaskDto;
-import com.zy.acs.conveyor.core.cache.SlaveConnection;
 import com.zy.acs.conveyor.core.enums.ConveyorStateType;
-import com.zy.acs.conveyor.core.enums.SlaveType;
-import com.zy.acs.conveyor.core.model.protocol.StaProtocol;
+import com.zy.acs.conveyor.core.model.StaProtocol;
 import com.zy.acs.conveyor.core.operation.OperationHandler;
 import com.zy.acs.conveyor.core.properties.CtuOperationConfig;
 import com.zy.acs.conveyor.core.properties.DevpSlave;
 import com.zy.acs.conveyor.core.properties.SlaveProperties;
-import com.zy.acs.conveyor.core.thread.SiemensDevpThread;
+import com.zy.acs.conveyor.core.service.StationService;
 import com.zy.acs.conveyor.entity.Job;
 import com.zy.acs.conveyor.service.CtuMainService;
 import com.zy.acs.conveyor.service.JobService;
@@ -23,6 +22,7 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 鍙戦�佷换鍔$粰RCS
@@ -42,6 +42,14 @@
     @Autowired
     private CtuMainService ctuMainService;
 
+
+    @Autowired
+    private StationService stationService;
+
+
+    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
+
+
     @Override
     public ConveyorStateType getType() {
         return ConveyorStateType.SENDTASK;
@@ -55,8 +63,8 @@
                 // 閬嶅巻鍏ュ簱鍙�
                 for (DevpSlave.Sta inSta : devp.getInSta()) {
                     // 鏍规嵁杈撻�佺嚎plc閬嶅巻
-                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
-                    StaProtocol staProtocol = devpThread.getStation().get(inSta.getTargetSta());
+                    Map<Integer, StaProtocol> stationMap = stationService.getStationMap(devp.getId());
+                    StaProtocol staProtocol = stationMap.get(inSta.getTargetSta());
                     if (staProtocol == null) {
                         continue;
                     } else {
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/DevpSlave.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/DevpSlave.java
index 30df409..c1a30cc 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/DevpSlave.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/DevpSlave.java
@@ -1,6 +1,5 @@
 package com.zy.acs.conveyor.core.properties;
 
-import com.zy.acs.conveyor.core.Slave;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -19,12 +18,19 @@
 
     private Integer slot;
 
+
     private List<Sta> releaseSta = new ArrayList<>();
 
     private List<Sta> takeSta = new ArrayList<>();
 
     private List<Sta> inSta = new ArrayList<>();
 
+    private List<Integer> barcodeArr = new ArrayList<>();
+
+    private List<Integer> staNos = new ArrayList<>();
+
+    private List<Integer> staNosError = new ArrayList<>();
+
     @Data
     public static class Sta {
 
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/OutputQueue.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/OutputQueue.java
new file mode 100644
index 0000000..1379736
--- /dev/null
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/OutputQueue.java
@@ -0,0 +1,15 @@
+package com.zy.acs.conveyor.core.properties;
+
+import java.util.concurrent.ArrayBlockingQueue;
+
+/**
+ * Created by vincent on 2020/8/17
+ */
+public class OutputQueue {
+
+
+    // 杈撻�佺嚎杈撳嚭鏃ュ織
+    public static ArrayBlockingQueue<String> DEVP = new ArrayBlockingQueue<>(32);
+
+
+}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/Slave.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/Slave.java
new file mode 100644
index 0000000..fe21412
--- /dev/null
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/Slave.java
@@ -0,0 +1,18 @@
+package com.zy.acs.conveyor.core.properties;
+
+import lombok.Data;
+
+/**
+ * Created by vincent on 2020/8/4
+ */
+@Data
+public class Slave {
+
+    private Integer id;
+
+    private String ip;
+
+    private Integer port;
+
+
+}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/SlaveProperties.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/SlaveProperties.java
index 4954e8c..cd9f4e0 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/SlaveProperties.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/SlaveProperties.java
@@ -1,6 +1,5 @@
 package com.zy.acs.conveyor.core.properties;
 
-import com.zy.acs.conveyor.core.Slave;
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
@@ -20,15 +19,8 @@
 @ConfigurationProperties(prefix = "cv-slave")
 public class SlaveProperties {
 
-    private boolean doubleDeep;
-
-    private List<Integer> doubleLocs = new ArrayList<>();
-
-    private int groupCount;
 
     private List<DevpSlave> devp = new ArrayList<>();
-
-    private List<Slave> barcode = new ArrayList<>();
 
 
 }
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/service/DevpS7Service.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/service/DevpS7Service.java
new file mode 100644
index 0000000..25795ca
--- /dev/null
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/service/DevpS7Service.java
@@ -0,0 +1,78 @@
+package com.zy.acs.conveyor.core.service;
+
+import HslCommunication.Core.Types.OperateResult;
+import HslCommunication.Profinet.Siemens.SiemensPLCS;
+import HslCommunication.Profinet.Siemens.SiemensS7Net;
+import com.zy.acs.common.utils.News;
+import com.zy.acs.conveyor.core.properties.DevpSlave;
+import com.zy.acs.conveyor.core.properties.OutputQueue;
+import com.zy.acs.conveyor.core.properties.SlaveProperties;
+import com.zy.acs.framework.common.DateUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+
+@Slf4j
+@Service
+public class DevpS7Service {
+
+    @Autowired
+    private SlaveProperties slaveProperties;
+
+    private final Map<Integer, SiemensS7Net> DEVP_CACHE = new ConcurrentHashMap<>();
+
+
+    @PostConstruct
+    public void init() {
+        News.info("鍒濆鍖栬緭閫佺嚎绾跨▼...................................................");
+        List<DevpSlave> devpSlaves = slaveProperties.getDevp();
+        for (DevpSlave devp : devpSlaves) {
+            add(devp, connect(devp));
+        }
+    }
+
+
+    public void add(DevpSlave devp, SiemensS7Net siemensS7Net) {
+        DEVP_CACHE.put(devp.getId(), siemensS7Net);
+    }
+
+    public void remove(Integer id) {
+        DEVP_CACHE.remove(id);
+    }
+
+    public SiemensS7Net get(Integer id) {
+        SiemensS7Net siemensS7Net = DEVP_CACHE.get(id);
+        if (siemensS7Net != null) {
+            return siemensS7Net;
+        }
+        slaveProperties.getDevp().stream().filter(devp -> devp.getId().equals(id)).findFirst().ifPresent(devp -> {
+            add(devp, connect(devp));
+        });
+        return DEVP_CACHE.get(id);
+    }
+
+
+    private SiemensS7Net connect(DevpSlave devp) {
+        SiemensS7Net siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200, devp.getIp());
+        siemensS7Net.setRack(devp.getRack().byteValue());
+        siemensS7Net.setSlot(devp.getSlot().byteValue());
+        OperateResult connect = siemensS7Net.ConnectServer();
+        if (connect.IsSuccess) {
+            News.info("SiemensDevp" + " - 1" + " - 杈撻�佺嚎plc杩炴帴鎴愬姛 ===>> [id:{}] [ip:{}] [port:{}]", devp.getId(), devp.getIp(), devp.getPort());
+        } else {
+            OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戣緭閫佺嚎plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]",
+                    DateUtils.convert(new Date()), devp.getId(), devp.getIp(), devp.getPort(), devp.getRack(), devp.getSlot()));
+            News.error("SiemensDevp" + " - 2" + " - 杈撻�佺嚎plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", devp.getId(), devp.getIp(), devp.getPort());
+        }
+        return siemensS7Net;
+    }
+
+}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/service/Snap7Service.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/service/Snap7Service.java
new file mode 100644
index 0000000..5252eb7
--- /dev/null
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/service/Snap7Service.java
@@ -0,0 +1,111 @@
+package com.zy.acs.conveyor.core.service;
+
+import HslCommunication.Core.Types.OperateResult;
+import HslCommunication.Profinet.Siemens.SiemensS7Net;
+import com.alibaba.fastjson.JSON;
+import com.zy.acs.common.utils.News;
+import com.zy.acs.conveyor.core.constant.PlcConstant;
+import com.zy.acs.conveyor.core.constant.TaskField;
+import com.zy.acs.conveyor.core.model.StaProtocol;
+import com.zy.acs.conveyor.core.properties.DevpSlave;
+import com.zy.acs.conveyor.core.properties.OutputQueue;
+import com.zy.acs.conveyor.core.properties.SlaveProperties;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.MessageFormat;
+import java.util.List;
+
+
+@Slf4j
+@Service
+public class Snap7Service {
+
+    @Autowired
+    private SlaveProperties slaveProperties;
+
+    @Autowired
+    private DevpS7Service devpS7Service;
+
+
+    private static final int WRITE_RETRY_MAX = 5;
+
+    private static final int WRITE_RETRY_INTERVAL_MS = 200;
+
+    public void read(StaProtocol staProtocol, SiemensS7Net siemensS7Net) {
+
+    }
+
+
+    public void write(StaProtocol staProtocol) throws InterruptedException {
+        if (staProtocol == null) {
+            log.warn("鍐欏叆鏁版嵁涓虹┖锛岃烦杩� [id:{}]", JSON.toJSONString(staProtocol));
+            return;
+        }
+
+        SiemensS7Net siemensS7Net = devpS7Service.get(staProtocol.getPlcId());
+        if (siemensS7Net == null) {
+            log.error("PLC鏈繛鎺ワ紝鏃犳硶鍐欏叆 [id:{}]", JSON.toJSONString(staProtocol));
+            return;
+        }
+
+        List<DevpSlave> devp = slaveProperties.getDevp();
+        DevpSlave devpSlave = devp.stream().filter(slave -> slave.getId().equals(staProtocol.getPlcId())).findFirst().orElse(null);
+        if (devpSlave == null) {
+            log.error("PLC鏈厤缃紝鏃犳硶鍐欏叆 [id:{}]", JSON.toJSONString(staProtocol));
+            return;
+        }
+        int index = devpSlave.getStaNos().indexOf(staProtocol.getSiteId());
+        if (index < 0) {
+            log.error("绔欑偣缂栧彿涓嶅瓨鍦ㄤ簬閰嶇疆涓� [id:{}] [siteId:{}]", staProtocol.getPlcId(), staProtocol.getSiteId());
+            return;
+        }
+
+        int baseOffset = index * TaskField.ALL.getByteLength();
+        String workNoAddr = TaskField.TASK_NUMBER.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION
+                + (baseOffset + TaskField.TASK_NUMBER.getOffset());
+        String destStaAddr = TaskField.DEST_STATION.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION
+                + (baseOffset + TaskField.DEST_STATION.getOffset());
+
+        // 浠诲姟涓嬪彂閲嶈瘯鏈哄埗
+        int writeCount = 0;
+        boolean success = false;
+
+        while (writeCount < WRITE_RETRY_MAX) {
+            OperateResult writeResult = siemensS7Net.Write(workNoAddr, staProtocol.getWorkNo().shortValue());
+            Thread.sleep(WRITE_RETRY_INTERVAL_MS);
+
+            OperateResult writeResult1 = siemensS7Net.Write(destStaAddr, staProtocol.getStaNo().shortValue());
+
+            if (writeResult.IsSuccess && writeResult1.IsSuccess) {
+                log.info("鍐欏叆杈撻�佺嚎鍛戒护鎴愬姛 [id:{}] [siteId:{}] [workNo:{}] [destSta:{}] [retry:{}]",
+                        staProtocol.getPlcId(), staProtocol.getSiteId(), staProtocol.getWorkNo(),
+                        staProtocol.getStaNo(), writeCount);
+                OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎鍛戒护鎴愬姛銆傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2}",
+                        staProtocol.getPlcId(), JSON.toJSON(staProtocol)));
+                success = true;
+                break;
+            }
+
+            writeCount++;
+            log.error("鍐欏叆杈撻�佺嚎鍛戒护澶辫触 [id:{}] [siteId:{}] [retry:{}] [workErr:{}] [destErr:{}]",
+                    staProtocol.getPlcId(), staProtocol.getSiteId(), writeCount,
+                    writeResult.Message, writeResult1.Message);
+
+            if (writeCount < WRITE_RETRY_MAX) {
+                Thread.sleep(WRITE_RETRY_INTERVAL_MS);
+            }
+        }
+
+        if (!success) {
+            String errorMsg = MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎绔欑偣鏁版嵁澶辫触銆傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2}",
+                    staProtocol.getPlcId(), JSON.toJSON(staProtocol));
+            OutputQueue.DEVP.offer(errorMsg);
+            News.error("SiemensDevp - 4 - 鍐欏叆杈撻�佺嚎绔欑偣鏁版嵁澶辫触銆傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={}",
+                    staProtocol.getPlcId(), JSON.toJSON(staProtocol));
+            log.error(errorMsg);
+        }
+
+    }
+}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/service/StationService.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/service/StationService.java
new file mode 100644
index 0000000..a85185b
--- /dev/null
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/service/StationService.java
@@ -0,0 +1,83 @@
+package com.zy.acs.conveyor.core.service;
+
+import com.zy.acs.common.utils.News;
+import com.zy.acs.conveyor.core.model.StaProtocol;
+import com.zy.acs.conveyor.core.properties.DevpSlave;
+import com.zy.acs.conveyor.core.properties.SlaveProperties;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+
+@Slf4j
+@Service
+public class StationService {
+
+    @Autowired
+    private SlaveProperties slaveProperties;
+
+
+    private Map<Integer, Map<Integer, StaProtocol>> STATION_CACHE = new ConcurrentHashMap<>();
+
+
+    @PostConstruct
+    public void init() {
+        News.info("鍒濆鍖栫珯鐐圭紦瀛�...................................................");
+        List<DevpSlave> devpSlaves = slaveProperties.getDevp();
+        for (DevpSlave devp : devpSlaves) {
+            List<Integer> staNos = devp.getStaNos();
+            for (Integer staNo : staNos) {
+                STATION_CACHE.computeIfAbsent(devp.getId(), k -> new ConcurrentHashMap<>());
+                Map<Integer, StaProtocol> stationMap = STATION_CACHE.get(devp.getId());
+                StaProtocol staProtocol = new StaProtocol();
+                staProtocol.setPlcId(devp.getId());
+                staProtocol.setSiteId(staNo);
+                staProtocol.setWorkNo(0);
+                stationMap.put(staNo, staProtocol);
+            }
+        }
+    }
+
+
+    public void remove(Integer plcId) {
+        STATION_CACHE.remove(plcId);
+    }
+
+    public void remove(Integer plcId, Integer staNo) {
+        Map<Integer, StaProtocol> stationMap = STATION_CACHE.get(plcId);
+        if (stationMap != null) {
+            stationMap.remove(staNo);
+        }
+    }
+
+    public StaProtocol get(Integer plcId, Integer staNo) {
+        Map<Integer, StaProtocol> stationMap = STATION_CACHE.get(plcId);
+        if (stationMap != null) {
+            return stationMap.get(staNo);
+        }
+        return null;
+    }
+
+    public Map<Integer, StaProtocol> getStationMap(Integer plcId) {
+        return STATION_CACHE.get(plcId);
+    }
+
+    public Map<Integer, Map<Integer, StaProtocol>> getAllStations(Integer devpId) {
+        return STATION_CACHE;
+    }
+
+
+    public void updateStaProtocol(StaProtocol staProtocol) {
+        Map<Integer, StaProtocol> stationMap = STATION_CACHE.get(staProtocol.getPlcId());
+        if (stationMap != null) {
+            stationMap.put(staProtocol.getSiteId(), staProtocol);
+        }
+    }
+
+
+}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/BarcodeThread.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/BarcodeThread.java
deleted file mode 100644
index f05431a..0000000
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/BarcodeThread.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.zy.acs.conveyor.core.thread;
-
-import com.alibaba.fastjson.JSONObject;
-import com.zy.acs.common.utils.News;
-import com.zy.acs.conveyor.core.Slave;
-import com.zy.acs.conveyor.core.ThreadHandler;
-import com.zy.acs.conveyor.core.cache.OutputQueue;
-import com.zy.acs.framework.common.Cools;
-import com.zy.acs.framework.common.DateUtils;
-import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.Date;
-
-/**
- * 鏉$爜鎵弿浠嚎绋�
- * Created by vincent on 2020/8/4
- */
-@Data
-@Slf4j
-public class BarcodeThread implements Runnable, ThreadHandler {
-
-    private Slave slave;
-    private StringBuffer barcode = new StringBuffer();
-
-    public BarcodeThread(Slave slave) {
-        this.slave = slave;
-    }
-
-    public String getBarcode() {
-        return barcode.toString();
-    }
-
-    public void setBarcode(String barcode) {
-        this.barcode.delete(0, this.barcode.length());
-        this.barcode.append(barcode);
-        if (!Cools.isEmpty(barcode)) {
-            News.info("Barcode" + " - 1" + " - {}鍙锋潯鐮佸櫒锛屾绱㈡暟鎹細{}", slave.getId(), this.barcode);
-            JSONObject jsonObject = new JSONObject();
-            jsonObject.put("time", DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F));
-            jsonObject.put("barcode", barcode);
-            if (OutputQueue.BARCODE.size() >= 32) {
-                OutputQueue.BARCODE.poll();
-            }
-            OutputQueue.BARCODE.offer(jsonObject);
-        }
-    }
-
-    public void clearBarcode() {
-        this.barcode = new StringBuffer();
-    }
-
-    @Override
-    public boolean connect() {
-        return false;
-    }
-
-    @Override
-    public void close() {
-
-    }
-
-    @Override
-    public void run() {
-
-    }
-
-}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/S7DevpThread.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/S7DevpThread.java
index 6c44feb..3aed2d0 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/S7DevpThread.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/S7DevpThread.java
@@ -1,185 +1,179 @@
-package com.zy.acs.conveyor.core.thread;
-
-import com.alibaba.fastjson.JSON;
-import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;
-import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
-import com.zy.acs.common.utils.ByteUtils;
-import com.zy.acs.common.utils.News;
-import com.zy.acs.conveyor.core.DevpThread;
-import com.zy.acs.conveyor.core.cache.MessageQueue;
-import com.zy.acs.conveyor.core.cache.OutputQueue;
-import com.zy.acs.conveyor.core.cache.SlaveConnection;
-import com.zy.acs.conveyor.core.constant.DeviceField;
-import com.zy.acs.conveyor.core.constant.PlcConstant;
-import com.zy.acs.conveyor.core.constant.StationStatusField;
-import com.zy.acs.conveyor.core.constant.TaskField;
-import com.zy.acs.conveyor.core.enums.SlaveType;
-import com.zy.acs.conveyor.core.enums.TaskType;
-import com.zy.acs.conveyor.core.model.Task;
-import com.zy.acs.conveyor.core.model.protocol.StaProtocol;
-import com.zy.acs.conveyor.core.properties.DevpSlave;
-import com.zy.acs.conveyor.entity.Devp;
-import com.zy.acs.conveyor.service.DevpService;
-import com.zy.acs.conveyor.utils.SpringContextUtil;
-import com.zy.acs.framework.common.Cools;
-import com.zy.acs.framework.common.DateUtils;
-import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * 杈撻�佺嚎绾跨▼
- * Created by vincent on 2020/8/4
- */
-@Data
-@Slf4j
-public class S7DevpThread implements Runnable, DevpThread {
-
-    private DevpSlave slave;
-
-    private S7PLC s7PLC;
-
-    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
-
-
-    @Override
-    @SuppressWarnings("InfiniteLoopStatement")
-    public void run() {
-        connect();
-        while (true) {
-            try {
-                TaskType step = TaskType.READ;
-                Task task = MessageQueue.poll(SlaveType.Devp, slave.getId());
-                if (task != null) {
-                    step = task.getStep();
-                }
-                switch (step) {
-                    // 璇绘暟鎹�
-                    case READ:
-                        read();
-                        break;
-                    // 鍐欐暟鎹� ID+鐩爣绔�
-                    case WRITE:
-                        write((StaProtocol) task.getData());
-                        break;
-                    default:
-                        break;
-                }
-                Thread.sleep(100);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-
-        }
-    }
-
-
-    @Override
-    public boolean connect() {
-        s7PLC = new S7PLC(EPlcType.S1200, slave.getIp());
-        s7PLC.connect();
-        return true;
-    }
-
-    /**
-     * 璇诲彇鐘舵�� ====> 鏁村潡plc
-     */
-    private void read() throws InterruptedException {
-        List<Integer> staNos = slave.getStaNos();
-        int staNoSize = staNos.size();
-        byte[] stationStatus = s7PLC.readByte(StationStatusField.TASK_NUMBER.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + StationStatusField.TASK_NUMBER.getOffset(), StationStatusField.TASK_NUMBER.getOffset() + staNoSize * StationStatusField.ALL.getByteLength());
-        for (int i = 0; i < staNoSize; i++) {
-            // 绔欑偣缂栧彿
-            Integer siteId = staNos.get(i);
-            StaProtocol staProtocol = station.get(siteId);
-            if (null == staProtocol) {
-                staProtocol = new StaProtocol();
-                staProtocol.setSiteId(siteId);
-                station.put(siteId, staProtocol);
-            }
-            staProtocol.setWorkNo((int) ByteUtils.getLong(stationStatus, StationStatusField.TASK_NUMBER.getOffset() + i * StationStatusField.ALL.getByteLength()));
-            staProtocol.setStaNo((int) ByteUtils.getShort(stationStatus, StationStatusField.FINAL_TARGET.getOffset() + i * StationStatusField.ALL.getByteLength()));
-            boolean[] status = ByteUtils.getBooleans(stationStatus, StationStatusField.STATUS_WORD.getOffset() + i * StationStatusField.ALL.getByteLength(), StationStatusField.STATUS_WORD.getByteLength());
-            staProtocol.setAutoing(status[0]);  // 鑷姩
-            staProtocol.setLoading(status[1]);  // 鏈夌墿
-            staProtocol.setInEnable(status[2]); // 鍙叆
-            staProtocol.setOutEnable(status[3]);// 鍙嚭
-            staProtocol.setEmptyMk(status[4]);  // 绌烘澘淇″彿
-            staProtocol.setFullPlt(status[5]);  // 婊℃墭鐩�
-            staProtocol.setHigh(status[6]);     // 楂樺簱浣�
-            staProtocol.setLow(status[7]);      // 浣庡簱浣�
-            if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
-                staProtocol.setPakMk(true);
-            }
-        }
-        List<Integer> barcodeNumber = slave.getBarcodeNumber();
-        byte[] deviceField = s7PLC.readByte(DeviceField.BARCODE.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + DeviceField.BARCODE.getOffset(), DeviceField.BARCODE.getOffset() + DeviceField.BARCODE.getByteLength() * barcodeNumber.size());
-        for (int i = 0; i < barcodeNumber.size(); i++) {
-            String barcode = ByteUtils.getString(deviceField, i * DeviceField.BARCODE.getByteLength(), DeviceField.BARCODE.getByteLength());
-            BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeNumber.get(i));
-            if (Cools.isEmpty(barcode)) {
-                barcodeThread.clearBarcode();
-            } else {
-                if (!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
-                    barcodeThread.setBarcode(barcode);
-                    log.info("鏂欑鐮侊細{}", barcode);
-                }
-            }
-        }
-
-        OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛", DateUtils.convert(new Date()), slave.getId()));
-
-        // 鏍规嵁瀹炴椂淇℃伅鏇存柊鏁版嵁搴�
-        try {
-            List<Devp> devps = new ArrayList<>();
-            for (Integer siteId : staNos) {
-                StaProtocol staProtocol = station.get(siteId);
-                devps.add(staProtocol.toSqlModel());
-            }
-            DevpService devpService = SpringContextUtil.getBean(DevpService.class);
-            if (null != devpService) {
-                devpService.updateBatchByDevpNo(devps);
-            } else {
-                throw new Exception("鏇存柊鏁版嵁搴撴暟鎹け璐�");
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            OutputQueue.DEVP.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("SiemensDevp" + " - 3" + " - 鏇存柊鏁版嵁搴撴暟鎹け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
-        }
-
-
-    }
-
-    /**
-     * 鍐欏叆 ID+鐩爣绔� =====> 鍗曠珯鐐瑰啓鍏�
-     */
-    private void write(StaProtocol staProtocol) throws InterruptedException {
-        if (null == staProtocol) {
-            return;
-        }
-        List<Integer> staNos = slave.getStaNos();
-        int index = staNos.indexOf(staProtocol.getSiteId());
-
-        s7PLC.writeInt32(TaskField.TASK_NUMBER.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + (TaskField.DEST_STATION.getOffset() + index * TaskField.ALL.getByteLength()), staProtocol.getWorkNo());    // 宸ヤ綔鍙�
-        Thread.sleep(100);
-        s7PLC.writeInt16(TaskField.DEST_STATION.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + (index * TaskField.ALL.getByteLength() + TaskField.DEST_STATION.getOffset() + TaskField.DEST_STATION.getAddressPattern()), staProtocol.getStaNo().shortValue());    // 鐩爣绔�
-
-        OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎绔欑偣鏁版嵁澶辫触銆傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2}", slave.getId(), JSON.toJSON(staProtocol)));
-        News.error("SiemensDevp" + " - 4" + " - 鍐欏叆杈撻�佺嚎绔欑偣鏁版嵁澶辫触銆傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={}", slave.getId(), JSON.toJSON(staProtocol));
-    }
-
-
-    @Override
-    public void close() {
-        s7PLC.close();
-    }
-
-
-}
+//package com.zy.acs.conveyor.core.thread;
+//
+//import com.alibaba.fastjson.JSON;
+//import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;
+//import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
+//import com.zy.acs.common.utils.ByteUtils;
+//import com.zy.acs.common.utils.News;
+//import com.zy.acs.conveyor.core.DevpThread;
+//import com.zy.acs.conveyor.core.cache.SlaveConnection;
+//import com.zy.acs.conveyor.core.constant.DeviceField;
+//import com.zy.acs.conveyor.core.constant.PlcConstant;
+//import com.zy.acs.conveyor.core.constant.StationStatusField;
+//import com.zy.acs.conveyor.core.constant.TaskField;
+//import com.zy.acs.conveyor.core.enums.SlaveType;
+//import com.zy.acs.conveyor.core.model.StaProtocol;
+//import com.zy.acs.conveyor.core.properties.DevpSlave;
+//import com.zy.acs.conveyor.entity.Devp;
+//import com.zy.acs.conveyor.service.DevpService;
+//import com.zy.acs.conveyor.utils.SpringContextUtil;
+//import com.zy.acs.framework.common.Cools;
+//import com.zy.acs.framework.common.DateUtils;
+//import lombok.Data;
+//import lombok.extern.slf4j.Slf4j;
+//
+//import java.text.MessageFormat;
+//import java.util.ArrayList;
+//import java.util.Date;
+//import java.util.List;
+//import java.util.Map;
+//import java.util.concurrent.ConcurrentHashMap;
+//
+/// **
+// * 杈撻�佺嚎绾跨▼
+// * Created by vincent on 2020/8/4
+// */
+//@Data
+//@Slf4j
+//public class S7DevpThread implements Runnable, DevpThread {
+//
+//    private DevpSlave slave;
+//
+//    private S7PLC s7PLC;
+//
+//    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
+//
+//
+//    @Override
+//    @SuppressWarnings("InfiniteLoopStatement")
+//    public void run() {
+//        connect();
+//        while (true) {
+//            try {
+//                TaskType step = TaskType.READ;
+//                Task task = MessageQueue.poll(SlaveType.Devp, slave.getId());
+//                if (task != null) {
+//                    step = task.getStep();
+//                }
+//                switch (step) {
+//                    // 璇绘暟鎹�
+//                    case READ:
+//                        read();
+//                        break;
+//                    // 鍐欐暟鎹� ID+鐩爣绔�
+//                    case WRITE:
+//                        write((StaProtocol) task.getData());
+//                        break;
+//                    default:
+//                        break;
+//                }
+//                Thread.sleep(100);
+//            } catch (Exception e) {
+//                e.printStackTrace();
+//            }
+//
+//        }
+//    }
+//
+//
+//    @Override
+//    public boolean connect() {
+//        s7PLC = new S7PLC(EPlcType.S1200, slave.getIp());
+//        s7PLC.connect();
+//        return true;
+//    }
+//
+//    /**
+//     * 璇诲彇鐘舵�� ====> 鏁村潡plc
+//     */
+//    private void read() throws InterruptedException {
+//        List<Integer> staNos = slave.getStaNos();
+//        int staNoSize = staNos.size();
+//        byte[] stationStatus = s7PLC.readByte(StationStatusField.TASK_NUMBER.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + StationStatusField.TASK_NUMBER.getOffset(), StationStatusField.TASK_NUMBER.getOffset() + staNoSize * StationStatusField.ALL.getByteLength());
+//        for (int i = 0; i < staNoSize; i++) {
+//            // 绔欑偣缂栧彿
+//            Integer siteId = staNos.get(i);
+//            StaProtocol staProtocol = station.get(siteId);
+//            if (null == staProtocol) {
+//                staProtocol = new StaProtocol();
+//                staProtocol.setSiteId(siteId);
+//                station.put(siteId, staProtocol);
+//            }
+//            staProtocol.setWorkNo((int) ByteUtils.getLong(stationStatus, StationStatusField.TASK_NUMBER.getOffset() + i * StationStatusField.ALL.getByteLength()));
+//            staProtocol.setStaNo((int) ByteUtils.getShort(stationStatus, StationStatusField.FINAL_TARGET.getOffset() + i * StationStatusField.ALL.getByteLength()));
+//            boolean[] status = ByteUtils.getBooleans(stationStatus, StationStatusField.STATUS_WORD.getOffset() + i * StationStatusField.ALL.getByteLength(), StationStatusField.STATUS_WORD.getByteLength());
+//            staProtocol.setAutoing(status[0]);  // 鑷姩
+//            staProtocol.setLoading(status[1]);  // 鏈夌墿
+//            staProtocol.setInEnable(status[2]); // 鍙叆
+//            staProtocol.setOutEnable(status[3]);// 鍙嚭
+//            staProtocol.setEmptyMk(status[4]);  // 绌烘澘淇″彿
+//            staProtocol.setFullPlt(status[5]);  // 婊℃墭鐩�
+//            staProtocol.setHigh(status[6]);     // 楂樺簱浣�
+//            staProtocol.setLow(status[7]);      // 浣庡簱浣�
+//            if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
+//                staProtocol.setPakMk(true);
+//            }
+//        }
+//        List<Integer> barcodeNumber = slave.getBarcodeArr();
+//        byte[] deviceField = s7PLC.readByte(DeviceField.BARCODE.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + DeviceField.BARCODE.getOffset(), DeviceField.BARCODE.getOffset() + DeviceField.BARCODE.getByteLength() * barcodeNumber.size());
+//        for (int i = 0; i < barcodeNumber.size(); i++) {
+//            String barcode = ByteUtils.getString(deviceField, i * DeviceField.BARCODE.getByteLength(), DeviceField.BARCODE.getByteLength());
+//            BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeNumber.get(i));
+//            if (Cools.isEmpty(barcode)) {
+//                barcodeThread.clearBarcode();
+//            } else {
+//                if (!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
+//                    barcodeThread.setBarcode(barcode);
+//                    log.info("鏂欑鐮侊細{}", barcode);
+//                }
+//            }
+//        }
+//
+//
+//        // 鏍规嵁瀹炴椂淇℃伅鏇存柊鏁版嵁搴�
+//        try {
+//            List<Devp> devps = new ArrayList<>();
+//            for (Integer siteId : staNos) {
+//                StaProtocol staProtocol = station.get(siteId);
+//                devps.add(staProtocol.toSqlModel());
+//            }
+//            DevpService devpService = SpringContextUtil.getBean(DevpService.class);
+//            if (null != devpService) {
+//                devpService.updateBatchByDevpNo(devps);
+//            } else {
+//                throw new Exception("鏇存柊鏁版嵁搴撴暟鎹け璐�");
+//            }
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//            News.error("SiemensDevp" + " - 3" + " - 鏇存柊鏁版嵁搴撴暟鎹け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
+//        }
+//
+//
+//    }
+//
+//    /**
+//     * 鍐欏叆 ID+鐩爣绔� =====> 鍗曠珯鐐瑰啓鍏�
+//     */
+//    private void write(StaProtocol staProtocol) throws InterruptedException {
+//        if (null == staProtocol) {
+//            return;
+//        }
+//        List<Integer> staNos = slave.getStaNos();
+//        int index = staNos.indexOf(staProtocol.getSiteId());
+//
+//        s7PLC.writeInt32(TaskField.TASK_NUMBER.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + (TaskField.DEST_STATION.getOffset() + index * TaskField.ALL.getByteLength()), staProtocol.getWorkNo());    // 宸ヤ綔鍙�
+//        Thread.sleep(100);
+//        s7PLC.writeInt16(TaskField.DEST_STATION.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION + (index * TaskField.ALL.getByteLength() + TaskField.DEST_STATION.getOffset() + TaskField.DEST_STATION.getAddressPattern()), staProtocol.getStaNo().shortValue());    // 鐩爣绔�
+//
+//        OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎绔欑偣鏁版嵁澶辫触銆傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2}", slave.getId(), JSON.toJSON(staProtocol)));
+//        News.error("SiemensDevp" + " - 4" + " - 鍐欏叆杈撻�佺嚎绔欑偣鏁版嵁澶辫触銆傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={}", slave.getId(), JSON.toJSON(staProtocol));
+//    }
+//
+//
+//    @Override
+//    public void close() {
+//        s7PLC.close();
+//    }
+//
+//
+//}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/SiemensDevpThread.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/SiemensDevpThread.java
index 090619e..dbc7d9a 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/SiemensDevpThread.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/SiemensDevpThread.java
@@ -1,36 +1,23 @@
 package com.zy.acs.conveyor.core.thread;
 
-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.zy.acs.common.utils.News;
-import com.zy.acs.conveyor.core.DevpThread;
-import com.zy.acs.conveyor.core.cache.MessageQueue;
-import com.zy.acs.conveyor.core.cache.OutputQueue;
-import com.zy.acs.conveyor.core.cache.SlaveConnection;
+import com.zy.acs.conveyor.core.constant.DeviceField;
+import com.zy.acs.conveyor.core.constant.PlcAlarmDefinition;
 import com.zy.acs.conveyor.core.constant.StationStatusField;
-import com.zy.acs.conveyor.core.enums.SlaveType;
-import com.zy.acs.conveyor.core.enums.TaskType;
-import com.zy.acs.conveyor.core.model.Task;
-import com.zy.acs.conveyor.core.model.protocol.StaProtocol;
+import com.zy.acs.conveyor.core.model.StaProtocol;
 import com.zy.acs.conveyor.core.properties.DevpSlave;
 import com.zy.acs.conveyor.entity.Devp;
 import com.zy.acs.conveyor.service.DevpService;
 import com.zy.acs.conveyor.utils.SpringContextUtil;
 import com.zy.acs.framework.common.Cools;
-import com.zy.acs.framework.common.DateUtils;
-import com.zy.acs.framework.exception.CoolException;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
-import java.text.MessageFormat;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * 杈撻�佺嚎绾跨▼
@@ -38,268 +25,258 @@
  */
 @Data
 @Slf4j
-public class SiemensDevpThread implements Runnable, DevpThread {
+public class SiemensDevpThread implements Runnable {
 
     private DevpSlave slave;
 
     private SiemensS7Net siemensS7Net;
 
-    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
+    private Map<Integer, StaProtocol> station;
+
+    private volatile boolean connected = false;
+
+    private static final int WRITE_RETRY_MAX = 5;
+
+    private static final int WRITE_RETRY_INTERVAL_MS = 200;
+
+    private static final int READ_INTERVAL_MS = 100;
+
+    private static final int DB_UPDATE_INTERVAL_MS = 2000; // 鏁版嵁搴撴洿鏂伴棿闅�
+
+    private long lastDbUpdateTime = 0;
 
 
-    public SiemensDevpThread(DevpSlave slave) {
+    public SiemensDevpThread(DevpSlave slave, SiemensS7Net siemensS7Net, Map<Integer, StaProtocol> station) {
         this.slave = slave;
+        this.siemensS7Net = siemensS7Net;
+        this.station = station;
     }
 
 
     @Override
     @SuppressWarnings("InfiniteLoopStatement")
     public void run() {
-        connect();
-        while (true) {
+        while (!Thread.currentThread().isInterrupted()) {
             try {
-                TaskType step = TaskType.READ;
-                Task task = MessageQueue.poll(SlaveType.Devp, slave.getId());
-                if (task != null) {
-                    step = task.getStep();
-                }
-                switch (step) {
-                    // 璇绘暟鎹�
-                    case READ:
-                        read();
-                        break;
-                    // 鍐欐暟鎹� ID+鐩爣绔�
-                    case WRITE:
-                        write((StaProtocol) task.getData());
-                        break;
-                    default:
-                        break;
-                }
-                Thread.sleep(100);
+                read();
+                Thread.sleep(READ_INTERVAL_MS);
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                log.warn("SiemensDevp绾跨▼琚腑鏂� [id:{}]", slave.getId());
+                break;
             } catch (Exception e) {
-                e.printStackTrace();
-            }
-
-        }
-    }
-
-    /**
-     * 鍒濆鍖栫珯鐐圭姸鎬�
-     */
-    private void initSite() {
-        List<Integer> staNos = slave.getStaNos();
-        // 绔欑偣缂栧彿
-        for (Integer siteId : staNos) {
-            StaProtocol staProtocol = station.get(siteId);
-            if (null == staProtocol) {
-                staProtocol = new StaProtocol();
-                staProtocol.setSiteId(siteId);
-                station.put(siteId, staProtocol);
-            }
-            staProtocol.setWorkNo(0);    // ID
-            staProtocol.setAutoing(false);      // 鑷姩
-            staProtocol.setLoading(false);      // 鏈夌墿
-            staProtocol.setInEnable(false);     // 鍙叆
-            staProtocol.setOutEnable(false);    // 鍙嚭
-            staProtocol.setEmptyMk(false);      // 绌烘澘淇″彿
-            staProtocol.setStaNo(0);     // 鐩爣绔�
-
-            if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
-                staProtocol.setPakMk(true);
+                log.error("SiemensDevp绾跨▼杩愯寮傚父 [id:{}]", slave.getId(), e);
             }
         }
-    }
-
-    @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.DEVP.offer(MessageFormat.format("銆恵0}銆戣緭閫佺嚎plc杩炴帴鎴愬姛 ===>> [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("SiemensDevp" + " - 1" + " - 杈撻�佺嚎plc杩炴帴鎴愬姛 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
-        } else {
-            OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戣緭閫佺嚎plc杩炴帴澶辫触锛侊紒锛� ===>> [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("SiemensDevp" + " - 2" + " - 杈撻�佺嚎plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
-        }
-        siemensS7Net.ConnectClose();
-        initSite();
-        return result;
+        log.info("SiemensDevp璇荤嚎绋嬪凡閫�鍑� [id:{}]", slave.getId());
     }
 
     /**
      * 璇诲彇鐘舵�� ====> 鏁村潡plc
      */
     private void read() throws InterruptedException {
+        if (!connected || siemensS7Net == null) {
+            log.warn("PLC鏈繛鎺ワ紝璺宠繃璇诲彇 [id:{}]", slave.getId());
+            return;
+        }
+
         List<Integer> staNos = slave.getStaNos();
         int staNoSize = staNos.size();
-        OperateResultExOne<byte[]> result = siemensS7Net.Read(StationStatusField.ALL.buildAddress(), (short) (staNoSize * StationStatusField.ALL.getByteLength()));
-        if (result.IsSuccess) {
-            for (int i = 0; i < staNoSize; i++) {
-                Integer siteId = staNos.get(i); // 绔欑偣缂栧彿
-                StaProtocol staProtocol = station.get(siteId);
-                if (null == staProtocol) {
-                    staProtocol = new StaProtocol();
-                    staProtocol.setSiteId(siteId);
-                    station.put(siteId, staProtocol);
-                }
-                    staProtocol.setWorkNo((int) siemensS7Net.getByteTransform().TransUInt32(result.Content, i * StationStatusField.ALL.getByteLength()));
-                    staProtocol.setStaNo((int) siemensS7Net.getByteTransform().TransInt16(result.Content, i * StationStatusField.ALL.getByteLength() + 4));
-                boolean[]   status = siemensS7Net.getByteTransform().TransBool(result.Content, i * StationStatusField.ALL.getByteLength()+6, 2);
-                staProtocol.setAutoing(status[0]);  // 鑷姩
-                staProtocol.setLoading(status[1]);  // 鏈夌墿
-                staProtocol.setInEnable(status[2]); // 鍙叆
-                staProtocol.setOutEnable(status[3]);// 鍙嚭
-                staProtocol.setEmptyMk(status[4]);  // 绌烘澘淇″彿
-                staProtocol.setFullPlt(status[5]);  // 婊℃墭鐩�
-                staProtocol.setHigh(status[6]);     // 楂樺簱浣�
-                staProtocol.setLow(status[7]);      // 浣庡簱浣�
 
-                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
-                    staProtocol.setPakMk(true);
-                }
-            }
+        // 璇诲彇绔欑偣鐘舵��
+        OperateResultExOne<byte[]> result = siemensS7Net.Read(
+                StationStatusField.ALL.buildAddress(),
+                (short) (staNoSize * StationStatusField.ALL.getByteLength()));
+
+        if (!result.IsSuccess) {
+            log.error("璇诲彇绔欑偣鐘舵�佸け璐� [id:{}] [error:{}]", slave.getId(), result.Message);
+            connected = false;
+            return;
         }
 
-
-        //鏉$爜鎵弿鍣�
-        List<Integer> barcodeList = slave.getBarcodeNumber();
-        OperateResultExOne<byte[]> result5 = siemensS7Net.Read("DB101.102", (short) (barcodeList.size() * 8));
-        if (result5.IsSuccess) {
-            for (int i = 0; i < barcodeList.size(); i++) {
-                Integer barcodeId = barcodeList.get(i);
-                String barcode = siemensS7Net.getByteTransform().TransString(result5.Content, i * 8, 8, "UTF-8");
-                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId);
-                if (Cools.isEmpty(barcode)) {
-                    barcodeThread.clearBarcode();
-                } else {
-                    if (!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
-                        barcodeThread.setBarcode(barcode);
-                        log.info("鏂欑鐮侊細{}", barcode);
-                    }
-                }
-            }
+        byte[] content = result.Content;
+        for (int i = 0; i < staNoSize; i++) {
+            StaProtocol staProtocol = station.get(staNos.get(staNoSize));
+            parseStationStatus(content, i, staProtocol);
         }
 
+        // 璇诲彇鏉$爜
+        readBarcodes();
 
-        OperateResultExOne<byte[]> resultError = siemensS7Net.Read("DB103.0", (short) (staNoSize * 2));
-        if (resultError.IsSuccess) {
-            ArrayList<Integer> staNoError = new ArrayList<Integer>() {{
-                add(102);
-                add(201);
-                add(211);
-            }};
-            for (int i = 0; i < staNoError.size(); i++) {
-                Integer siteId = staNoError.get(i); // 绔欑偣缂栧彿
-                StaProtocol staProtocol = station.get(siteId);
-                if (null == staProtocol) {
-                    staProtocol = new StaProtocol();
-                    staProtocol.setSiteId(siteId);
-                    station.put(siteId, staProtocol);
-                }
-                boolean[] status = siemensS7Net.getByteTransform().TransBool(resultError.Content, i * 2, 1);
-                staProtocol.setFrontErr(status[0]);// 鍓嶈秴闄�
-                staProtocol.setBackErr(status[1]);// 鍚庤秴闄�
-                staProtocol.setHighErr(status[2]);// 楂樿秴闄�
-                staProtocol.setLeftErr(status[3]);// 宸﹁秴闄�
-                staProtocol.setRightErr(status[4]);// 鍙宠秴闄�
-                staProtocol.setWeightErr(status[5]); // 瓒呴噸
-                staProtocol.setBarcodeErr(status[6]);// 鎵爜澶辫触
-            }
+        // 璇诲彇澶栧舰妫�娴嬮敊璇�
+        readDimensionErrors();
+
+        // 璇诲彇PLC鏁呴殰
+        readPlcAlarms(staNos, staNoSize);
+
+        // 瀹氭湡鏇存柊鏁版嵁搴擄紙闄嶄綆棰戠巼锛�
+        updateDatabaseIfNeeded();
+    }
+
+    /**
+     * 瑙f瀽鍗曚釜绔欑偣鐘舵��
+     */
+    private void parseStationStatus(byte[] content, int index, StaProtocol staProtocol) {
+        int offset = index * StationStatusField.ALL.getByteLength();
+        staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(content, offset));
+        staProtocol.setStaNo((int) siemensS7Net.getByteTransform().TransInt16(
+                content, offset + StationStatusField.FINAL_TARGET.getOffset()));
+
+        boolean[] status = siemensS7Net.getByteTransform().TransBool(
+                content, offset + StationStatusField.STATUS_WORD.getOffset(),
+                StationStatusField.STATUS_WORD.getByteLength());
+
+        staProtocol.setAutoing(status[0]);
+        staProtocol.setLoading(status[1]);
+        staProtocol.setInEnable(status[2]);
+        staProtocol.setOutEnable(status[3]);
+        staProtocol.setEmptyMk(status[4]);
+        staProtocol.setFullPlt(status[5]);
+        staProtocol.setHigh(status[6]);
+        staProtocol.setLow(status[7]);
+
+
+    }
+
+    /**
+     * 璇诲彇鏉$爜淇℃伅
+     */
+    private void readBarcodes() {
+        List<Integer> barcodeArr = slave.getBarcodeArr();
+        if (barcodeArr == null || barcodeArr.isEmpty()) {
+            return;
         }
 
-        //plc鏁呴殰
-        OperateResultExOne<byte[]> resultErr2 = siemensS7Net.Read("DB25.0", (short) (staNoSize * 4));
-        if (resultErr2.IsSuccess) {
-            for (int i = 0; i < staNoSize; i++) {
-                Integer siteId = staNos.get(i); // 绔欑偣缂栧彿
-                boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr2.Content, i * 4, 2);
-                StaProtocol staProtocol = station.get(siteId);
-                if (staProtocol != null) {
-                    staProtocol.setBreakerErr(status[0]);
-                    staProtocol.setInfraredErr(status[1]);
-                    staProtocol.setOutTimeErr(status[2]);
-                    staProtocol.setSeizeSeatErr(status[3]);
-                    staProtocol.setWrkYgoodsN(status[4]);
-                    staProtocol.setInverterErr(status[5]);
-                    staProtocol.setContactErr(status[6]);
-                    staProtocol.setUpcontactErr(status[7]);
-                }
-            }
+        OperateResultExOne<byte[]> result = siemensS7Net.Read(
+                DeviceField.BARCODE.buildAddress(),
+                (short) (barcodeArr.size() * DeviceField.BARCODE.getByteLength()));
+
+        if (!result.IsSuccess) {
+            log.warn("璇诲彇鏉$爜澶辫触 [id:{}]", slave.getId());
+            return;
         }
 
-        if (result.IsSuccess) {
-            OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛", DateUtils.convert(new Date()), slave.getId()));
+        byte[] content = result.Content;
+        for (int i = 0; i < barcodeArr.size(); i++) {
+            String barcode = siemensS7Net.getByteTransform().TransString(
+                    content, i * DeviceField.BARCODE.getByteLength(),
+                    DeviceField.BARCODE.getByteLength(), "UTF-8");
 
-            // 鏍规嵁瀹炴椂淇℃伅鏇存柊鏁版嵁搴�
-            try {
-                List<Devp> devps = new ArrayList<>();
-                for (Integer siteId : staNos) {
-                    StaProtocol staProtocol = station.get(siteId);
-                    devps.add(staProtocol.toSqlModel());
-                }
-                DevpService devpService = SpringContextUtil.getBean(DevpService.class);
-                if (null != devpService) {
-                    devpService.updateBatchByDevpNo(devps);
-                } else {
-                    throw new Exception("鏇存柊鏁版嵁搴撴暟鎹け璐�");
-                }
-            } catch (Exception e) {
-                initSite();
-                e.printStackTrace();
-                OutputQueue.DEVP.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("SiemensDevp" + " - 3" + " - 鏇存柊鏁版嵁搴撴暟鎹け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
+            if (!Cools.isEmpty(barcode)) {
+                StaProtocol staProtocol = station.get(barcodeArr.get(i));
+                staProtocol.setBarcode(barcode);
+                log.info("鏂欑鐮侊細{}", barcode);
             }
-
-        } else {
-            OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戣鍙栬緭閫佺嚎plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
         }
     }
 
     /**
-     * 鍐欏叆 ID+鐩爣绔� =====> 鍗曠珯鐐瑰啓鍏�
+     * 璇诲彇澶栧舰妫�娴嬮敊璇�
      */
-    private void write(StaProtocol staProtocol) throws InterruptedException {
-        if (null == staProtocol) {
+    private void readDimensionErrors() {
+        List<Integer> staNosError = slave.getStaNosError();
+        if (staNosError == null || staNosError.isEmpty()) {
             return;
         }
-        List<Integer> staNos = slave.getStaNos();
-        int index = staNos.indexOf(staProtocol.getSiteId());
 
-        OperateResult write = null;
-        OperateResult write1 = null;
-        //浠诲姟涓嬪彂娆℃暟
-        int writeCount = 0;
-        do {
-            write = siemensS7Net.Write("DB100." + index * 4, staProtocol.getWorkNo().shortValue());    // 宸ヤ綔鍙�
-            Thread.sleep(200);
-            write1 = siemensS7Net.Write("DB100." + (index * 4 + 2), staProtocol.getStaNo().shortValue());    // 鐩爣绔�
-            if (write.IsSuccess && write1.IsSuccess) {
-                log.info("鍐欏叆杈撻�佺嚎鍛戒护鎴愬姛銆傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={},鍐欏叆娆℃暟={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
-                break;
-            } else {
-                writeCount++;
-                log.error("鍐欏叆杈撻�佺嚎鍛戒护澶辫触銆傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={},鍐欏叆娆℃暟={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
-            }
-        } while (writeCount < 5);
+        OperateResultExOne<byte[]> result = siemensS7Net.Read(
+                DeviceField.DIMENSION_WORD.buildAddress(),
+                (short) (staNosError.size() * DeviceField.DIMENSION_WORD.getByteLength()));
 
-        if (!write.IsSuccess) {
-            staProtocol = station.get(staProtocol.getSiteId());
-            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() == 0) {
-                staProtocol.setPakMk(true);
-            }
-            OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎绔欑偣鏁版嵁澶辫触銆傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2}", slave.getId(), JSON.toJSON(staProtocol)));
-            News.error("SiemensDevp" + " - 4" + " - 鍐欏叆杈撻�佺嚎绔欑偣鏁版嵁澶辫触銆傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={}", slave.getId(), JSON.toJSON(staProtocol));
+        if (!result.IsSuccess) {
+            log.warn("璇诲彇澶栧舰妫�娴嬮敊璇け璐� [id:{}]", slave.getId());
+            return;
+        }
+
+        byte[] content = result.Content;
+        for (int i = 0; i < staNosError.size(); i++) {
+            Integer siteId = staNosError.get(i);
+            StaProtocol staProtocol = station.get(siteId);
+
+            boolean[] status = siemensS7Net.getByteTransform().TransBool(
+                    content, i * DeviceField.DIMENSION_WORD.getByteLength(),
+                    DeviceField.DIMENSION_WORD.getByteLength());
+
+            staProtocol.setFrontErr(status[0]);
+            staProtocol.setBackErr(status[1]);
+            staProtocol.setHighErr(status[2]);
+            staProtocol.setLeftErr(status[3]);
+            staProtocol.setRightErr(status[4]);
+            staProtocol.setWeightErr(status[5]);
+            staProtocol.setBarcodeErr(status[6]);
         }
     }
 
+    /**
+     * 璇诲彇PLC鏁呴殰淇℃伅
+     */
+    private void readPlcAlarms(List<Integer> staNos, int staNoSize) {
+        OperateResultExOne<byte[]> result = siemensS7Net.Read(
+                PlcAlarmDefinition.ALL.buildAddress(),
+                (short) (staNoSize * PlcAlarmDefinition.ALL.getByteLength()));
 
-    @Override
-    public void close() {
-        siemensS7Net.ConnectClose();
+        if (!result.IsSuccess) {
+            log.warn("璇诲彇PLC鏁呴殰淇℃伅澶辫触 [id:{}]", slave.getId());
+            return;
+        }
+
+        byte[] content = result.Content;
+        for (int i = 0; i < staNoSize; i++) {
+            Integer siteId = staNos.get(i);
+            StaProtocol staProtocol = station.get(siteId);
+            if (staProtocol == null) {
+                continue;
+            }
+
+            boolean[] status = siemensS7Net.getByteTransform().TransBool(
+                    content, i * PlcAlarmDefinition.ALL.getByteLength(), 1);
+
+            staProtocol.setBreakerErr(status[0]);
+            staProtocol.setInfraredErr(status[1]);
+            staProtocol.setOutTimeErr(status[2]);
+            staProtocol.setSeizeSeatErr(status[3]);
+            staProtocol.setWrkYgoodsN(status[4]);
+            staProtocol.setInverterErr(status[5]);
+            staProtocol.setContactErr(status[6]);
+            staProtocol.setUpcontactErr(status[7]);
+        }
+    }
+
+    /**
+     * 鎸夐渶鏇存柊鏁版嵁搴擄紙闄嶄綆鏇存柊棰戠巼锛�
+     */
+    private void updateDatabaseIfNeeded() {
+        long currentTime = System.currentTimeMillis();
+        if (currentTime - lastDbUpdateTime < DB_UPDATE_INTERVAL_MS) {
+            return;
+        }
+
+        try {
+            List<Integer> staNos = slave.getStaNos();
+            List<Devp> devps = new ArrayList<>(staNos.size());
+            for (Integer siteId : staNos) {
+                StaProtocol staProtocol = station.get(siteId);
+                if (staProtocol != null) {
+                    devps.add(staProtocol.toSqlModel());
+                }
+            }
+
+            if (devps.isEmpty()) {
+                return;
+            }
+
+            DevpService devpService = SpringContextUtil.getBean(DevpService.class);
+            if (devpService != null) {
+                devpService.updateBatchByDevpNo(devps);
+                lastDbUpdateTime = currentTime;
+                log.debug("鎵归噺鏇存柊鏁版嵁搴撴垚鍔� [id:{}] [count:{}]", slave.getId(), devps.size());
+            } else {
+                log.error("DevpService鏈壘鍒帮紝鏃犳硶鏇存柊鏁版嵁搴� [id:{}]", slave.getId());
+            }
+        } catch (Exception e) {
+            log.error("鏇存柊鏁版嵁搴撴暟鎹け璐� [id:{}]", slave.getId(), e);
+            News.error("SiemensDevp - 3 - 鏇存柊鏁版嵁搴撴暟鎹け璐� ===>> [id:{}]", slave.getId());
+        }
     }
 
 
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/service/impl/DevpServiceImpl.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/service/impl/DevpServiceImpl.java
index d2a8e03..976d0dc 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/service/impl/DevpServiceImpl.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/service/impl/DevpServiceImpl.java
@@ -12,6 +12,7 @@
 @Service("basDevpService")
 public class DevpServiceImpl extends ServiceImpl<DevpMapper, Devp> implements DevpService {
 
+
     @Override
     public void updateBatchByDevpNo(List<Devp> devps) {
         for (Devp devp : devps) {
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/utils/Utils.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/utils/Utils.java
deleted file mode 100644
index de11923..0000000
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/utils/Utils.java
+++ /dev/null
@@ -1,180 +0,0 @@
-package com.zy.acs.conveyor.utils;
-
-import com.zy.acs.conveyor.core.properties.SlaveProperties;
-import com.zy.acs.framework.common.Arith;
-import com.zy.acs.framework.common.Cools;
-
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by vincent on 2020/8/27
- */
-public class Utils {
-
-    private static final DecimalFormat fmt = new DecimalFormat("##0.00");
-
-    public static float scale(Float f) {
-        if (f == null || f == 0f || Float.isNaN(f)) {
-            return 0f;
-        }
-        return (float) Arith.multiplys(2, f, 1);
-    }
-
-    public static String zerofill(String msg, Integer count) {
-        if (msg.length() == count) {
-            return msg;
-        } else if (msg.length() > count) {
-            return msg.substring(0, 16);
-        } else {
-            StringBuilder msgBuilder = new StringBuilder(msg);
-            for (int i = 0; i < count - msg.length(); i++) {
-                msgBuilder.insert(0, "0");
-            }
-            return msgBuilder.toString();
-        }
-    }
-
-    /**
-     * 鍒ゆ柇鏄惁涓烘繁搴撲綅
-     */
-    public static boolean isDeepLoc(SlaveProperties slaveProperties, String locNo) {
-        if (slaveProperties.isDoubleDeep()) {
-            int row = getRow(locNo);
-            return slaveProperties.getDoubleLocs().contains(row);
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * 鍒ゆ柇鏄惁涓烘繁搴撲綅
-     */
-    public static boolean isDeepLoc(SlaveProperties slaveProperties, Integer row) {
-        if (slaveProperties.isDoubleDeep()) {
-            return slaveProperties.getDoubleLocs().contains(row);
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * 鍒ゆ柇鏄惁涓烘祬搴撲綅
-     */
-    public static boolean isShallowLoc(SlaveProperties slaveProperties, String locNo) {
-        if (slaveProperties.isDoubleDeep()) {
-            int row = getRow(locNo);
-            return !slaveProperties.getDoubleLocs().contains(row);
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * 鍒ゆ柇鏄惁涓烘祬搴撲綅
-     */
-    public static boolean isShallowLoc(SlaveProperties slaveProperties, Integer row) {
-        if (slaveProperties.isDoubleDeep()) {
-            return !slaveProperties.getDoubleLocs().contains(row);
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * 鑾峰彇 娣卞簱浣嶅搴旂殑娴呭簱浣嶅彿
-     */
-    public static String getShallowLoc(SlaveProperties slaveProperties, String deepLoc) {
-        int row = getRow(deepLoc);
-        int remainder = (int) Arith.remainder(row, slaveProperties.getGroupCount());
-        int shallowRow = remainder == 1 ? (row + 1) : (row - 1);
-        return zerofill(String.valueOf(shallowRow), 2) + deepLoc.substring(2);
-    }
-
-    /**
-     * 鑾峰彇 娣卞簱浣嶆帓瀵瑰簲鐨勬祬搴撲綅鎺�
-     */
-    public static Integer getShallowRow(SlaveProperties slaveProperties, Integer deepRow) {
-        int remainder = (int) Arith.remainder(deepRow, slaveProperties.getGroupCount());
-        return remainder == 1 ? (deepRow + 1) : (deepRow - 1);
-    }
-
-    /**
-     * 鑾峰彇 娴呭簱浣嶅搴旂殑娣卞簱浣嶅彿
-     */
-    public static String getDeepLoc(SlaveProperties slaveProperties, String shallowLoc) {
-        int row = getRow(shallowLoc);
-        int remainder = (int) Arith.remainder(row, slaveProperties.getGroupCount());
-        int targetRow;
-        if (remainder == 2) {
-            targetRow = row - 1;
-        } else if (remainder == 3) {
-            targetRow = row + 1;
-        } else {
-            throw new RuntimeException(shallowLoc + "涓嶆槸娴呭簱浣嶏紝绯荤粺绻佸繖");
-        }
-        return zerofill(String.valueOf(targetRow), 2) + shallowLoc.substring(2);
-    }
-
-    /**
-     * 鑾峰彇 娴呭簱浣嶆帓瀵瑰簲鐨勬繁搴撲綅鎺�
-     */
-    public static Integer getDeepRow(SlaveProperties slaveProperties, Integer shallowRow) {
-        int remainder = (int) Arith.remainder(shallowRow, slaveProperties.getGroupCount());
-        int targetRow;
-        if (remainder == 2) {
-            targetRow = shallowRow - 1;
-        } else if (remainder == 3) {
-            targetRow = shallowRow + 1;
-        } else {
-            throw new RuntimeException(shallowRow + "涓嶆槸娴呭簱浣嶆帓锛岀郴缁熺箒蹇�");
-        }
-        return targetRow;
-    }
-
-    /**
-     * 閫氳繃搴撲綅鍙疯幏鍙� 鎺�
-     */
-    public static int getRow(String locNo) {
-        if (!Cools.isEmpty(locNo)) {
-            return Integer.parseInt(locNo.substring(0, 2));
-        }
-        throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
-    }
-
-    /**
-     * 褰撴绱㈠埌鍙屾繁搴撲綅鐨勬祬搴撲綅鏃讹紝濡傛灉娣卞簱浣嶆棤璐э紝鍒欐斁鍏ュ搴旂殑娣卞簱浣�
-     */
-    public static void toDeepIfEmptyByShallow(String shallowLoc) {
-        int row = getRow(shallowLoc);
-        int remainder = (int) Arith.remainder(row, 4);
-        int targetRow = 0;
-        if (remainder == 2) {
-            targetRow = row - 1;
-        } else if (remainder == 3) {
-            targetRow = row + 1;
-        } else {
-            throw new RuntimeException(shallowLoc + "涓嶆槸娴呭簱浣嶏紝绯荤粺绻佸繖");
-        }
-        String targetLoc = zerofill(String.valueOf(targetRow), 2) + shallowLoc.substring(2);
-
-    }
-
-    public static void main(String[] args) {
-        SlaveProperties slaveProperties = new SlaveProperties();
-        slaveProperties.setDoubleDeep(true);
-        List<Integer> list = new ArrayList<>();
-        list.add(1);
-        list.add(4);
-        list.add(5);
-        list.add(8);
-        list.add(9);
-        list.add(12);
-        slaveProperties.setDoubleLocs(list);
-        slaveProperties.setGroupCount(4);
-        Integer deepRow = getDeepRow(slaveProperties, 6);
-        System.out.println(deepRow);
-
-    }
-}
diff --git a/zy-asc-conveyor/src/main/resources/application.yml b/zy-asc-conveyor/src/main/resources/application.yml
index e39cc61..38fb42b 100644
--- a/zy-asc-conveyor/src/main/resources/application.yml
+++ b/zy-asc-conveyor/src/main/resources/application.yml
@@ -16,6 +16,15 @@
   mvc:
     static-path-pattern: /**
 
+redis:
+  host: localhost
+  password: xltys1995
+  port: 6379
+  max: 30
+  min: 10
+  timeout: 5000
+  index: 6
+
 logging:
   file:
     path: /stock/out/cv/logs
@@ -79,8 +88,6 @@
     port: 102
     rack: 0
     slot: 0
-    barcodeNumber:
-      - 1
     staNos:
       - 1001
       - 1002
@@ -88,6 +95,16 @@
       - 1004
       - 1005
       - 1006
+      - 1007
+      - 1008
+      - 1009
+      - 1010
+      - 1011
+      - 1012
+      - 1013
+    staNosError:
+      - 1006
+    barcodeArr:
       - 1007
     # ctu鏀捐揣绔欑偣
     releaseSta[0]:
@@ -106,9 +123,6 @@
       # 鏈珯鐐�
       staNo: 1007
   # 鏉$爜鎵弿浠�1
-  barcode[0]:
-    id: 1
-    ip: 10.10.10.194
-    port: 51236
+
 
 

--
Gitblit v1.9.1