From 038634540d95d4a5787b80a1fbab131df4d99823 Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期一, 13 四月 2026 17:11:09 +0800
Subject: [PATCH] 1

---
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/RedisConveyorConstant.java                |    4 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/DevpSlave.java                          |    4 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/StaProtocol.java                             |   53 +++
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/service/Snap7Service.java                          |   72 +++++
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/SendTaskOperationHandler.java    |   52 ++-
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/CtuOperationConfig.java                 |    2 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/enums/ConveyorStateType.java                       |    4 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/thread/SiemensDevpThread.java                      |   64 ++++
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/SafeSignal.java                              |   18 +
 /dev/null                                                                                                 |   86 ------
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/controller/CtuController.java                           |    4 
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/TaskField.java                            |   10 
 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/operation/handler/OutOperationHandler.java         |   60 ++--
 zy-asc-conveyor/src/main/resources/application.yml                                                        |   28 +
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/AppleLocOperationHandler.java    |   61 ++-
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/SafeSignalField.java                      |   46 +++
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/StartUpOperationHandler.java     |  107 +++++++
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/scheduler/JobLogScheduler.java                          |   20 -
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/listen/DevpSafeDataSubscriber.java                 |   56 ++++
 20 files changed, 568 insertions(+), 218 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 9f98232..4727f24 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
@@ -56,8 +56,8 @@
             stationResponseParam = new StationResponseParam();
             stationResponseParam.setStaNo(staNo);
             stationResponseParam.setOccupied(staProtocol.isLoading());
-            stationResponseParam.setInEnable((staProtocol.isInEnable() && staProtocol.getWorkNo() == 0 ? true : false));
-            stationResponseParam.setOutEnable((staProtocol.isOutEnable() ? true : false));
+            stationResponseParam.setInEnable((staProtocol.getAllowPut()));
+            stationResponseParam.setOutEnable((staProtocol.getAllowTake()));
             stationResponseParam.setOnline(staProtocol.isAutoing());
             list.add(stationResponseParam);
         }
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
index 0340f0a..9bdc336 100644
--- 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
@@ -1,6 +1,8 @@
 package com.zy.acs.conveyor.core.constant;
 
 public class RedisConveyorConstant {
-
+    //杈撻�佺嚎浠诲姟鏍囪瘑
     public static final String CONVEYOR_TASK_FLAG = "CONVEYOR_TASK_FLAG";
+    //杈撻�佺嚎瀹夊叏浜や簰鏍囪瘑
+    public static final String CONVEYOR_SAFE_FLAG = "CONVEYOR_SAFE_FLAG";
 }
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/SafeSignalField.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/SafeSignalField.java
new file mode 100644
index 0000000..b8c5c9e
--- /dev/null
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/SafeSignalField.java
@@ -0,0 +1,46 @@
+package com.zy.acs.conveyor.core.constant;
+
+public enum SafeSignalField {
+
+    SAFE_SIGNAL_TO_CONVEYOR("DB7", 4, 4, 8),
+    SAFE_SIGNAL_FROM_CONVEYOR("DB7", 40, 4, 8),
+
+    ;
+
+    private final String addressPattern;
+    private final int offset;
+    private final int byteLength;
+    private final int arrLength;
+
+    SafeSignalField(String addressPattern, int offset, int byteLength, int arrLength) {
+        this.addressPattern = addressPattern;
+        this.offset = offset;
+        this.byteLength = byteLength;
+        this.arrLength = arrLength;
+    }
+
+    public String getAddressPattern() {
+        return addressPattern;
+    }
+
+    public int getOffset() {
+        return offset;
+    }
+
+    public int getByteLength() {
+        return byteLength;
+    }
+
+    public int getArrLength() {
+        return arrLength;
+    }
+
+    /**
+     * 鏍规嵁 DB 鍧楃紪鍙峰拰绔欑偣鍋忕Щ鐢熸垚鍏蜂綋鍦板潃
+     *
+     * @return PLC4X 鍦板潃瀛楃涓诧紝濡� "DB100.DBD0"
+     */
+    public String buildAddress() {
+        return addressPattern + PlcConstant.ADDRESS_CONCATENATION + offset;
+    }
+}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/TaskField.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/TaskField.java
index 44f104f..bf5a8b9 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/TaskField.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/constant/TaskField.java
@@ -6,11 +6,11 @@
  */
 public enum TaskField {
     ALL("DB13", 48, 48),
-    TASK_NUMBER("DB13", 0, 4),
-    START_STATION("DB13", 4, 2),
-    DEST_STATION("DB13", 6, 2),
-    DIRECTION("DB13", 8, 2),
-    ROUTE_NUMBER("DB13", 10, 2);
+    TASK_NUMBER("DB13", 12, 4),
+    START_STATION("DB13", 16, 2),
+    DEST_STATION("DB13", 18, 2),
+    DIRECTION("DB13", 20, 2),
+    ROUTE_NUMBER("DB13", 22, 2);
 
     private final String addressPattern;
     private final int offset;
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/enums/ConveyorStateType.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/enums/ConveyorStateType.java
index dd4d68b..af80bc7 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/enums/ConveyorStateType.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/enums/ConveyorStateType.java
@@ -3,8 +3,8 @@
 public enum ConveyorStateType {
     //鍑哄簱璁惧涓婅蛋
     OUTBOUND(2),
-    //妯℃嫙鐢ㄦ埛
-    FAKEUSER(3),
+    //鍚姩鍏ュ簱
+    STARTUP(3),
     //鍏ュ簱鐢宠
     APPLYLOC(4),
     //鍏ュ簱璁惧涓婅蛋
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/listen/DevpSafeDataSubscriber.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/listen/DevpSafeDataSubscriber.java
new file mode 100644
index 0000000..d5733a4
--- /dev/null
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/listen/DevpSafeDataSubscriber.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 DevpSafeDataSubscriber {
+
+    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_SAFE_FLAG);
+                    if (null != protocol) {
+
+                        snap7Service.writeSafe(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/SafeSignal.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/SafeSignal.java
new file mode 100644
index 0000000..db95fcf
--- /dev/null
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/SafeSignal.java
@@ -0,0 +1,18 @@
+package com.zy.acs.conveyor.core.model;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class SafeSignal implements Serializable {
+
+    private Integer index;
+
+    private Boolean flag;
+
+    public SafeSignal(Integer index, Boolean flag) {
+        this.index = index;
+        this.flag = flag;
+    }
+}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/StaProtocol.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/StaProtocol.java
index 8a0ead1..666098b 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/StaProtocol.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/model/StaProtocol.java
@@ -32,10 +32,10 @@
     // 鏈夌墿
     private boolean loading;
 
-    // 鍙叆
+    // 闇�姹傚叆
     private boolean inEnable;
 
-    // 鍙嚭
+    // 闇�姹傚嚭
     private boolean outEnable;
 
     // 绌烘澘淇″彿
@@ -49,6 +49,18 @@
 
     // 浣�
     private boolean low;
+
+    // 涓�
+    private boolean mid;
+
+    // 鍚姩鍏ュ簱
+    private boolean startup;
+
+    // 涓�斾换鍔$敵璇�
+    private boolean segApply;
+
+    // 鍏ュ簱寮傚父
+    private boolean applyErr;
 
     //鏉$爜
     private String barcode;
@@ -100,6 +112,43 @@
 
     private Boolean upcontactErr = false; //椤跺崌鐢垫満鎺ヨЕ鍣ㄦ晠闅�
 
+    // 瀹夊叏浜や簰 ------------------------------------------------------------------------
+    // ctu鎴朼gv鍐欑粰杈撻�佺嚎鐨�
+    // ctu鐢宠鏀�
+    private Boolean applyPut = false;
+
+    // ctu鐢宠鍙�
+    private Boolean applyTake = false;
+
+    // ctu鍙栧畬鎴�
+    private Boolean putComplete = false;
+
+    // ctu鏀惧畬鎴�
+    private Boolean takeComplete = false;
+
+    // 绂佹杩愯
+    private Boolean stop = false;
+
+
+    // 杈撻�佺嚎鍐欑粰ctu鎴朼gv
+    // 蹇冭烦
+    private Boolean heartbeat = false;
+
+    // 鍏佽鍙�
+    private Boolean allowTake = false;
+
+    // 鍏佽鏀�
+    private Boolean allowPut = false;
+
+    // 鎺ヨ揣瀹屾垚
+    private Boolean inComplete = false;
+
+    // 鍑鸿揣瀹屾垚
+    private Boolean outComplete = false;
+
+    private SafeSignal safeSignal;
+
+
     public Boolean isErr() {
         if (frontErr || backErr || highErr || leftErr || rightErr || weightErr || barcodeErr) {
             return true;
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 cbaa48a..6fafd4f 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,5 +1,6 @@
 package com.zy.acs.conveyor.core.operation.handler;
 
+import com.alibaba.fastjson.JSON;
 import com.zy.acs.common.utils.News;
 import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.conveyor.controller.vo.ApplyInDto;
@@ -77,34 +78,46 @@
                         staProtocol = staProtocol.clone();
                     }
                     // 鍒ゆ柇鏄惁婊¤冻鏉′欢
-                    if (!staProtocol.isLoading()) {
+                    if (staProtocol.isInEnable()) {
                         continue;
                     }
-                    if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) {
-                        String barcode = staProtocol.getBarcode();
-                        if (Cools.isEmpty(barcode)) {
-                            News.error("绔欑偣锛歿}锛屾湭鎵埌鐮佸�硷細{}", staProtocol.getSiteId(), barcode);
-                            return;
+                    if (!staProtocol.isLoading()) {
+                        News.error("{}锛氱珯鐐癸細{}锛屾棤鐗�", config.getMark(), staProtocol.getSiteId());
+                        continue;
+                    }
+                    if (!staProtocol.isAutoing()) {
+                        News.error("{}锛氱珯鐐癸細{}锛岄潪鑷姩", config.getMark(), staProtocol.getSiteId());
+                        continue;
+                    }
+                    String barcode = staProtocol.getBarcode();
+                    if (Cools.isEmpty(barcode)) {
+                        News.error("绔欑偣锛歿}锛屾湭鎵埌鐮佸�硷細{}", staProtocol.getSiteId(), barcode);
+                        continue;
+                    }
+                    Job job = jobService.getJobByBarcode(barcode);
+                    if (job == null) {
+                        News.error("{}锛氱珯鐐癸細{}锛屾壘涓嶅埌浠诲姟", config.getMark(), staProtocol.getSiteId());
+                        continue;
+                    }
+                    if (job.getJobSts() != ConveyorStateType.STARTUP.getStatus()) {
+                        if (job.getJobSts() == ConveyorStateType.INBOUND.getStatus()){
+                            continue;
                         }
-                        // 9991鏄┖鏉匡紝9992鏄弧鏉�
-                        if (staProtocol.getWorkNo() >= 9991 && staProtocol.getWorkNo() <= 9992) {
-                            Job job = jobService.getJobByBarcode(barcode);
-                            // 鐢宠鍏ュ簱
-                            if (job == null || (job != null && job.getJobSts() == ConveyorStateType.CLEARSIGNAL.getStatus())) {
-                                ApplyInRepsonseDto locOfWms = wmsMainService.getLocOfWms(applyIn(barcode, inSta.getStaNo() + "", staProtocol));
-                                if (locOfWms != null) {
-                                    Integer workNo = getWorkNo();
-                                    staProtocol.setWorkNo(workNo);
-                                    staProtocol.setStaNo(inSta.getTargetSta());
-                                    redis.push(RedisConveyorConstant.CONVEYOR_TASK_FLAG, staProtocol);
-                                    if (jobService.insert(initJob(locOfWms, barcode, workNo, inSta.getTargetSta() + ""))) {
-                                        News.info("鐢宠鍏ュ簱鎴愬姛锛屾潯鐮侊細{},绔欑偣锛歿}", barcode, inSta.getStaNo());
-                                    }
-                                } else {
-                                    News.error("WMS鏈繑鍥炲簱浣嶄俊鎭紝鏉$爜锛歿},绔欑偣锛歿}", barcode, inSta.getStaNo());
-                                }
-                            }
+                        News.error("{}锛氱珯鐐癸細{}锛屼换鍔$姸鎬佷笉瀵癸紝{}", config.getMark(), staProtocol.getSiteId(), JSON.toJSON(job));
+                        continue;
+                    }
+
+                    ApplyInRepsonseDto locOfWms = wmsMainService.getLocOfWms(applyIn(barcode, inSta.getStaNo() + "", staProtocol));
+                    if (locOfWms != null) {
+                        Integer workNo = getWorkNo();
+                        staProtocol.setWorkNo(workNo);
+                        staProtocol.setStaNo(inSta.getTargetSta());
+                        redis.push(RedisConveyorConstant.CONVEYOR_TASK_FLAG, staProtocol);
+                        if (jobService.insert(initJob(locOfWms, barcode, workNo, inSta.getTargetSta() + ""))) {
+                            News.info("鐢宠鍏ュ簱鎴愬姛锛屾潯鐮侊細{},绔欑偣锛歿}", barcode, inSta.getStaNo());
                         }
+                    } else {
+                        News.error("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 a03a113..960e0af 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,5 +1,6 @@
 package com.zy.acs.conveyor.core.operation.handler;
 
+import com.alibaba.fastjson.JSON;
 import com.zy.acs.common.utils.News;
 import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.conveyor.core.constant.RedisConveyorConstant;
@@ -63,19 +64,35 @@
                     }
                     // 鍒ゆ柇鏄惁婊¤冻鏉′欢
                     if (staProtocol.isLoading()) {
+                        //News.error("{}锛氱珯鐐癸細{}锛屾湁鐗�", config.getMark(), staProtocol.getSiteId());
                         continue;
                     }
-                    if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) {
+                    if (!staProtocol.isAutoing()) {
+                        News.error("{}锛氱珯鐐癸細{}锛岄潪鑷姩", config.getMark(), staProtocol.getSiteId());
+                        continue;
+                    }
+                    if (staProtocol.getWorkNo() > 0) {
                         Job job = jobService.getJobByJobNo(staProtocol.getWorkNo());
-                        if (job != null && job.getJobSts() == ConveyorStateType.SENDTASK.getStatus()) {
-                            //String s = ctuMainService.checkStationStatus(takeSta.getStaNo());
-                            staProtocol.setWorkNo(0);
-                            staProtocol.setStaNo(0);
-                            redis.push(RedisConveyorConstant.CONVEYOR_TASK_FLAG, staProtocol);
+                        if (job == null) {
+                            News.error("{}锛氱珯鐐癸細{}锛屾壘涓嶅埌浠诲姟", config.getMark(), staProtocol.getSiteId());
+                            continue;
+                        }
+                        if (job.getJobSts() != ConveyorStateType.SENDTASK.getStatus()) {
+                            if (job.getJobSts() == ConveyorStateType.CLEARSIGNAL.getStatus()){
+                                continue;
+                            }
+                            News.error("{}锛氱珯鐐癸細{}锛屼换鍔$姸鎬佷笉瀵癸紝{}", config.getMark(), staProtocol.getSiteId(), JSON.toJSON(job));
+                            continue;
+                        }
+                        //String s = ctuMainService.checkStationStatus(takeSta.getStaNo());
+                        staProtocol.setWorkNo(0);
+                        staProtocol.setStaNo(0);
+                        redis.push(RedisConveyorConstant.CONVEYOR_TASK_FLAG, staProtocol);
 
-                            job.setJobSts(ConveyorStateType.CLEARSIGNAL.getStatus());
-                            jobService.updateById(job);
-                            //log.info("" + config.getMark() + "绔欑偣娓呯┖锛歿},{}", takeSta.getStaNo(), staProtocol.getWorkNo());
+                        job.setJobSts(ConveyorStateType.CLEARSIGNAL.getStatus());
+                        if (!jobService.updateById(job)){
+                            log.info("" + config.getMark() + "绔欑偣娓呯┖澶辫触锛歿},{}", takeSta.getStaNo(), staProtocol.getWorkNo());
+                        }else {
                             News.info("" + config.getMark() + "绔欑偣娓呯┖锛歿},{}", takeSta.getStaNo(), staProtocol.getWorkNo());
                         }
                     }
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
deleted file mode 100644
index e6f65b4..0000000
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/FakeUserOperationHandler.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package com.zy.acs.conveyor.core.operation.handler;
-
-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.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.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;
-
-/**
- * 妯℃嫙鐢ㄦ埛鎸夋寜閽�
- */
-@Slf4j
-@Component
-public class FakeUserOperationHandler implements OperationHandler {
-
-    @Autowired
-    private SlaveProperties slaveProperties;
-
-
-    @Autowired
-    private JobService jobService;
-
-
-    @Autowired
-    private StationService stationService;
-
-    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
-
-
-    @Override
-    public ConveyorStateType getType() {
-        return ConveyorStateType.FAKEUSER;
-    }
-
-    @Override
-    public synchronized void execute(CtuOperationConfig config) {
-
-        try {
-            // 鏍规嵁杈撻�佺嚎plc閬嶅巻
-            Map<Integer, StaProtocol> stationMap = stationService.getStationMap(1);
-            StaProtocol staProtocol = stationMap.get(1004);
-            if (staProtocol == null) {
-                return;
-            } else {
-                staProtocol = staProtocol.clone();
-            }
-            // 鍒ゆ柇鏄惁婊¤冻鏉′欢
-            if (!staProtocol.isLoading()) {
-                return;
-            }
-            StaProtocol staProtocol5 = stationMap.get(1005);
-            if (staProtocol5.isLoading()) {
-                log.info("1005鏈夌墿锛岀瓑鏃犵墿涔嬪悗鎵嶅叆搴�");
-                return;
-            }
-            if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) {
-                Job jobByWorkNo = jobService.getJobByJobNoAndJobSts(staProtocol.getWorkNo(), ConveyorStateType.OUTBOUND.getStatus());
-                if (jobByWorkNo != null && jobByWorkNo.getJobSts() == ConveyorStateType.OUTBOUND.getStatus()) {
-                    staProtocol.setWorkNo(9992);
-                    staProtocol.setStaNo(1005);
-                    redis.push(RedisConveyorConstant.CONVEYOR_TASK_FLAG, staProtocol);
-
-                    jobByWorkNo.setJobSts(3);
-                    jobByWorkNo.setMemo("妯℃嫙鎸夋寜閽�");
-                    jobService.updateById(jobByWorkNo);
-                    log.info("鍏ュ簱杈撻�佺嚎涓嬪彂锛歿},{}", staProtocol.getWorkNo(), 1006);
-
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-        }
-    }
-}
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 aad1ac7..58cffdc 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,9 +1,11 @@
 package com.zy.acs.conveyor.core.operation.handler;
 
+import com.alibaba.fastjson.JSON;
 import com.zy.acs.common.utils.News;
 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.model.SafeSignal;
 import com.zy.acs.conveyor.core.model.StaProtocol;
 import com.zy.acs.conveyor.core.operation.OperationHandler;
 import com.zy.acs.conveyor.core.properties.CtuOperationConfig;
@@ -59,51 +61,49 @@
             // 鏍规嵁杈撻�佺嚎plc閬嶅巻
             for (DevpSlave devp : slaveProperties.getDevp()) {
                 // 閬嶅巻鍑哄簱鍙�
-                for (DevpSlave.Sta releaseSta : devp.getReleaseSta()) {
+                for (DevpSlave.Sta putSta : devp.getPutSta()) {
                     // 鑾峰彇鍏ュ簱绔欎俊鎭�
                     Map<Integer, StaProtocol> stationMap = stationService.getStationMap(devp.getId());
-                    StaProtocol staProtocol = stationMap.get(releaseSta.getStaNo());
+                    StaProtocol staProtocol = stationMap.get(putSta.getStaNo());
                     if (staProtocol == null) {
                         continue;
                     } else {
                         staProtocol = staProtocol.clone();
                     }
                     // 鍒ゆ柇鏄惁婊¤冻鏉′欢
-                    if (!staProtocol.isLoading()) {
-                        if (staProtocol.getWorkNo() > 0) {
-                            News.error("杈撻�佺嚎涓婃湁浠诲姟鍙锋棤璐э紝闇�瑕佷汉宸ュ鐞嗭細{}", staProtocol.getSiteId());
-                            //log.error("杈撻�佺嚎涓婃湁浠诲姟鍙锋棤璐э紝闇�瑕佷汉宸ュ鐞嗭細{}", staProtocol.getSiteId());
-                        }
+                    if (!staProtocol.isAutoing()) {
+                        News.error("{},杈撻�佺嚎鏈嚜鍔紝闇�瑕佸紑鍚細{}", config.getMark(), staProtocol.getSiteId());
                         continue;
                     }
 
-                    if (staProtocol.isAutoing() && staProtocol.getWorkNo() == 0) {
-                        if (staProtocol.isInEnable()) {
-                            News.error("娌℃湁鍙叆淇″彿锛歿}", staProtocol.getSiteId());
-                            //log.error("娌℃湁鍙叆淇″彿锛歿}", staProtocol.getSiteId());
-                            continue;
-                        }
-                        String seqNum = ctuMainService.checkStationStatus(releaseSta.getStaNo());
+                    if (staProtocol.getWorkNo() == 0 && staProtocol.isLoading()) {
+                        String seqNum = ctuMainService.checkStationStatus(putSta.getStaNo());
                         if (seqNum != null) {
-                            if (jobService.getJobByTaskNo(seqNum) == null) {
-                                int workNo = wrkLastnoService.nextWorkNo(WorkNoTypeType.WORK_NO_TYPE.type);
-                                // 涓嬪彂绉诲姩 涓� 涓嬪彂plc鍛戒护
-                                staProtocol.setWorkNo(workNo);
-                                staProtocol.setStaNo(releaseSta.getTargetSta());
-                                Job job = new Job();
-                                job.setTaskNo(seqNum);
-                                job.setJobNo(workNo);
-                                job.setJobSts(ConveyorStateType.OUTBOUND.getStatus());
-                                if (!jobService.insert(job)) {
-                                    throw new CoolException("鎻掑叆杈撻�佺嚎浠诲姟澶辫触," + seqNum + " - " + workNo);
-                                }
-                                redis.push(RedisConveyorConstant.CONVEYOR_TASK_FLAG, staProtocol);
-                                log.info("杈撻�佺嚎涓嬪彂锛歿},{}", staProtocol.getWorkNo(), releaseSta.getTargetSta());
+                            staProtocol.setSafeSignal(new SafeSignal( devp.getPutSta().indexOf(putSta) ,true));
+                            redis.push(RedisConveyorConstant.CONVEYOR_SAFE_FLAG,staProtocol );
+
+                            Job job = jobService.getJobByTaskNo(seqNum);
+                            if (job != null) {
+                                News.error("{}锛氱珯鐐癸細{}锛屽瓨鍦ㄤ换鍔�,{}", config.getMark(), staProtocol.getSiteId(), JSON.toJSON(job));
+                                continue;
                             }
+                            int workNo = wrkLastnoService.nextWorkNo(WorkNoTypeType.WORK_NO_TYPE.type);
+                            staProtocol.setWorkNo(workNo);
+                            staProtocol.setStaNo(putSta.getTargetSta());
+                            job = new Job();
+                            job.setTaskNo(seqNum);
+                            job.setJobNo(workNo);
+                            job.setJobSts(ConveyorStateType.OUTBOUND.getStatus());
+                            if (!jobService.insert(job)) {
+                                throw new CoolException("鎻掑叆杈撻�佺嚎浠诲姟澶辫触," + seqNum + " - " + workNo);
+                            }
+                            redis.push(RedisConveyorConstant.CONVEYOR_TASK_FLAG, staProtocol);
+                            News.info("{},杈撻�佺嚎涓嬪彂锛歿},{}", config.getMark(), staProtocol.getWorkNo(), putSta.getTargetSta());
                         } else {
-                            News.error("绔欑偣淇℃伅涓嶇鍚堝叆搴撴潯浠讹紒锛侊紒" + " 璋冪敤RCS妫�楠屾湭閫氳繃,绔欑偣锛歿}", staProtocol.getSiteId());
-                            //log.info("绔欑偣淇℃伅涓嶇鍚堝叆搴撴潯浠讹紒锛侊紒" + " 璋冪敤RCS妫�楠屾湭閫氳繃,绔欑偣锛歿}", staProtocol.getSiteId());
+                            News.error("{},绔欑偣淇℃伅涓嶇鍚堝叆搴撴潯浠讹紒锛侊紒" + " 璋冪敤RCS妫�楠屾湭閫氳繃,绔欑偣锛歿}", config.getMark(), staProtocol.getSiteId());
                         }
+                    } else {
+                        News.error("{},绔欑偣锛歿},寮傚父鐘舵�侊紝璇疯ˉ鍏�", config.getMark(), 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 1f487d9..7a2e31d 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,6 +1,7 @@
 package com.zy.acs.conveyor.core.operation.handler;
 
 
+import com.alibaba.fastjson.JSON;
 import com.zy.acs.common.utils.News;
 import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.conveyor.controller.vo.OpenBusSubmitParam;
@@ -72,33 +73,44 @@
                         staProtocol = staProtocol.clone();
                     }
                     // 鍒ゆ柇鏄惁婊¤冻鏉′欢
-                    if (!staProtocol.isLoading()) {
-                        if (staProtocol.getWorkNo() > 0) {
-                            News.error("杈撻�佺嚎涓婃湁璐ф棤浠诲姟鍙凤紝闇�瑕佷汉宸ュ鐞嗭細{}", staProtocol.getSiteId());
-                            //log.error("杈撻�佺嚎涓婃湁浠诲姟鍙锋棤璐э紝闇�瑕佷汉宸ュ鐞嗭細{}", staProtocol.getSiteId());
-                        }
+                    if (staProtocol.getWorkNo() == 0 && staProtocol.isLoading()) {
+                        News.error("{},杈撻�佺嚎涓婃湁璐ф棤浠诲姟鍙凤紝闇�瑕佷汉宸ュ鐞嗙珯鐐癸細{}", config.getMark(), staProtocol.getSiteId());
                         continue;
                     }
-                    if (staProtocol.getWorkNo() == 0) {
-                        News.error("杈撻�佺嚎涓婃湁璐ф棤浠诲姟鍙凤紝闇�瑕佷汉宸ュ鐞嗭細{}", staProtocol.getSiteId());
-                        //log.error("杈撻�佺嚎涓婃湁璐ф棤浠诲姟鍙凤紝闇�瑕佷汉宸ュ鐞嗭細{}", staProtocol.getSiteId());
+                    if (staProtocol.getWorkNo() > 0 && !staProtocol.isLoading()) {
+                        News.error("{},杈撻�佺嚎涓婃棤璐ф湁浠诲姟鍙凤紝闇�瑕佷汉宸ュ鐞嗙珯鐐癸細{}", config.getMark(), staProtocol.getSiteId());
                         continue;
                     }
-                    if (staProtocol.isAutoing()) {
-                        Job job = jobService.getJobByJobNoAndJobSts(staProtocol.getWorkNo(), ConveyorStateType.INBOUND.getStatus());
-                        if (job != null) {
-                            if (ctuMainService.sendTask(process(job))) {
-                                job.setJobSts(ConveyorStateType.SENDTASK.getStatus());
-                                job.setRcsTime(new Date());
-                                jobService.updateById(job);
-                                log.info("浠诲姟鍙戦�佺粰RCS鎴愬姛,WMS浠诲姟鍙凤細{},杈撻�佺嚎宸ヤ綔鍙凤細{}", job.getTaskNo(), job.getJobNo());
-                            } else {
-                                log.info("浠诲姟鍙戦�佺粰RCS澶辫触,WMS浠诲姟鍙凤細{},杈撻�佺嚎宸ヤ綔鍙凤細{}", job.getTaskNo(), job.getJobNo());
-                            }
+                    if (!staProtocol.isAutoing()) {
+                        News.error("{}锛氱珯鐐癸細{}锛岄潪鑷姩", config.getMark(), staProtocol.getSiteId());
+                        continue;
+                    }
+                    if (staProtocol.isInEnable()) {
+                        News.error("{},绔欑偣锛歿},娌℃湁鍙叆淇″彿", config.getMark(), staProtocol.getSiteId());
+                        continue;
+                    }
+                    Job jobByJobNo = jobService.getJobByJobNo(staProtocol.getWorkNo());
+                    if (jobByJobNo == null) {
+                        News.error("{}锛氱珯鐐癸細{}锛屾壘涓嶅埌浠诲姟", config.getMark(), staProtocol.getSiteId());
+                        continue;
+                    }
+                    if (jobByJobNo.getJobSts() != ConveyorStateType.INBOUND.getStatus()) {
+                        if (jobByJobNo.getJobSts() == ConveyorStateType.SENDTASK.getStatus()){
+                            continue;
                         }
+                        News.error("{}锛氱珯鐐癸細{}锛屼换鍔$姸鎬佷笉瀵癸紝{}", config.getMark(), staProtocol.getSiteId(), JSON.toJSON(jobByJobNo));
+                        continue;
+                    }
+
+                    if (ctuMainService.sendTask(process(jobByJobNo))) {
+                        jobByJobNo.setJobSts(ConveyorStateType.SENDTASK.getStatus());
+                        jobByJobNo.setRcsTime(new Date());
+                        jobService.updateById(jobByJobNo);
+                        News.error("{},浠诲姟鍙戦�佺粰RCS鎴愬姛,WMS浠诲姟鍙凤細{},杈撻�佺嚎宸ヤ綔鍙凤細{}", config.getMark(), jobByJobNo.getTaskNo(), jobByJobNo.getJobNo());
                     } else {
-                        log.error("杈撻�佺嚎鏈嚜鍔紝闇�瑕佸紑鍚細{}", staProtocol.getSiteId());
+                        News.error("{},浠诲姟鍙戦�佺粰RCS澶辫触,WMS浠诲姟鍙凤細{},杈撻�佺嚎宸ヤ綔鍙凤細{}", config.getMark(), jobByJobNo.getTaskNo(), jobByJobNo.getJobNo());
                     }
+
                 }
             }
         } catch (Exception e) {
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/StartUpOperationHandler.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/StartUpOperationHandler.java
new file mode 100644
index 0000000..e4ff50b
--- /dev/null
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/operation/handler/StartUpOperationHandler.java
@@ -0,0 +1,107 @@
+package com.zy.acs.conveyor.core.operation.handler;
+
+import com.alibaba.fastjson.JSON;
+import com.zy.acs.common.utils.News;
+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.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.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;
+
+/**
+ * 妯℃嫙鐢ㄦ埛鎸夋寜閽�
+ */
+@Slf4j
+@Component
+public class StartUpOperationHandler implements OperationHandler {
+
+    @Autowired
+    private SlaveProperties slaveProperties;
+
+
+    @Autowired
+    private JobService jobService;
+
+
+    @Autowired
+    private StationService stationService;
+
+    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
+
+
+    @Override
+    public ConveyorStateType getType() {
+        return ConveyorStateType.STARTUP;
+    }
+
+    @Override
+    public synchronized void execute(CtuOperationConfig config) {
+
+        try {
+            // 鏍规嵁杈撻�佺嚎plc閬嶅巻
+            for (DevpSlave devp : slaveProperties.getDevp()) {
+                // 閬嶅巻鍏ュ簱鍙�
+                for (DevpSlave.Sta inSta : devp.getInSta()) {
+                    // 鏍规嵁杈撻�佺嚎plc閬嶅巻
+                    Map<Integer, StaProtocol> stationMap = stationService.getStationMap(devp.getId());
+                    StaProtocol staProtocol = stationMap.get(inSta.getSourceStaNo());
+                    if (staProtocol == null) {
+                        continue;
+                    } else {
+                        staProtocol = staProtocol.clone();
+                    }
+                    // 鍒ゆ柇鏄惁婊¤冻鏉′欢
+                    if (!staProtocol.isStartup() || !staProtocol.isAutoing() || !staProtocol.isLoading()) {
+                        if (!staProtocol.isStartup()) {
+                            News.error("{}锛氱珯鐐癸細{}锛屾湭鍚姩鍏ュ簱", config.getMark(), staProtocol.getSiteId());
+                            continue;
+                        }
+                        if (!staProtocol.isAutoing()) {
+                            News.error("{}锛氱珯鐐癸細{}锛岄潪鑷姩", config.getMark(), staProtocol.getSiteId());
+                            continue;
+                        }
+                        if (!staProtocol.isLoading()) {
+                            News.error("{}锛氱珯鐐癸細{}锛屾棤鐗�", config.getMark(), staProtocol.getSiteId());
+                            continue;
+                        }
+
+                    }
+                    Job jobByJobNo = jobService.getJobByJobNo(staProtocol.getWorkNo());
+                    if (jobByJobNo == null) {
+                        News.error("{}锛氱珯鐐癸細{}锛屾壘涓嶅埌浠诲姟", config.getMark(), staProtocol.getSiteId());
+                        continue;
+                    }
+                    if (jobByJobNo.getJobSts() != ConveyorStateType.OUTBOUND.getStatus()) {
+                        if (jobByJobNo.getJobSts() == ConveyorStateType.STARTUP.getStatus()){
+                            continue;
+                        }
+                        News.error("{}锛氱珯鐐癸細{}锛屼换鍔$姸鎬佷笉瀵癸紝{}", config.getMark(), staProtocol.getSiteId(), JSON.toJSON(jobByJobNo));
+                        continue;
+                    }
+                    staProtocol.setStaNo(inSta.getStaNo());
+                    redis.push(RedisConveyorConstant.CONVEYOR_TASK_FLAG, staProtocol);
+
+                    jobByJobNo.setJobSts(ConveyorStateType.STARTUP.getStatus());
+                    if (!jobService.updateById(jobByJobNo)) {
+                        News.info("{},鍚姩鍏ュ簱锛歿},{}", config.getMark(), staProtocol.getWorkNo(), staProtocol.getStaNo());
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+        }
+    }
+}
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/CtuOperationConfig.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/CtuOperationConfig.java
index 3f88a5d..67b866f 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/CtuOperationConfig.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/properties/CtuOperationConfig.java
@@ -9,7 +9,7 @@
 @Data
 public class CtuOperationConfig {
     private ConveyorStateType type;
-    private int mark;
+    private String mark;
     private int maxRetries = 3;
     private long retryDelay = 500;
     private Map<String, Object> params = new HashMap<>();
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 8e14c64..35b604a 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
@@ -24,7 +24,7 @@
 
     private Boolean staNosError;
 
-    private List<Sta> releaseSta = new ArrayList<>();
+    private List<Sta> putSta = new ArrayList<>();
 
     private List<Sta> takeSta = new ArrayList<>();
 
@@ -36,6 +36,8 @@
     @Data
     public static class Sta {
 
+        private Integer sourceStaNo;
+
         private Integer staNo;
 
 
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
index a677866..1db417c 100644
--- 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
@@ -5,7 +5,9 @@
 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.SafeSignalField;
 import com.zy.acs.conveyor.core.constant.TaskField;
+import com.zy.acs.conveyor.core.model.SafeSignal;
 import com.zy.acs.conveyor.core.model.StaProtocol;
 import com.zy.acs.conveyor.core.properties.DevpSlave;
 import com.zy.acs.conveyor.core.properties.OutputQueue;
@@ -36,7 +38,77 @@
     public void read(StaProtocol staProtocol, SiemensS7Net siemensS7Net) {
 
     }
+    public void writeSafe(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;
+        }
+        SafeSignal safeSignal = staProtocol.getSafeSignal();
+
+        int baseOffset = SafeSignalField.SAFE_SIGNAL_FROM_CONVEYOR.getOffset() + safeSignal.getIndex() * SafeSignalField.SAFE_SIGNAL_FROM_CONVEYOR.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());
+            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);
+        }
+
+    }
 
     public void write(StaProtocol staProtocol) throws InterruptedException {
         if (staProtocol == null) {
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 d4004da..14cba8a 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
@@ -5,6 +5,7 @@
 import com.zy.acs.common.utils.News;
 import com.zy.acs.conveyor.core.constant.DeviceField;
 import com.zy.acs.conveyor.core.constant.PlcAlarmDefinition;
+import com.zy.acs.conveyor.core.constant.SafeSignalField;
 import com.zy.acs.conveyor.core.constant.StationStatusField;
 import com.zy.acs.conveyor.core.model.StaProtocol;
 import com.zy.acs.conveyor.core.properties.DevpSlave;
@@ -125,6 +126,10 @@
         // 璇诲彇PLC鏁呴殰
         readPlcAlarms(staNos, staNoSize);
 
+        // 璇诲彇瀹夊叏浜や簰淇″彿
+        readSaleSingle(slave.getPutSta(), slave.getTakeSta());
+
+
         // 瀹氭湡鏇存柊鏁版嵁搴擄紙闄嶄綆棰戠巼锛�
         updateDatabaseIfNeeded();
     }
@@ -138,9 +143,13 @@
         staProtocol.setStaNo((int) siemensS7Net.getByteTransform().TransInt16(
                 content, offset + StationStatusField.FINAL_TARGET.getOffset()));
 
-        boolean[] status = siemensS7Net.getByteTransform().TransBool(
+        boolean[] status0 = siemensS7Net.getByteTransform().TransBool(
                 content, offset + StationStatusField.STATUS_WORD.getOffset(),
                 StationStatusField.STATUS_WORD.getByteLength());
+
+        boolean[] status = siemensS7Net.getByteTransform().TransBool(
+                content, offset + StationStatusField.STATUS_WORD.getOffset(),
+                1);
 
         staProtocol.setAutoing(status[0]);
         staProtocol.setLoading(status[1]);
@@ -150,7 +159,13 @@
         staProtocol.setFullPlt(status[5]);
         staProtocol.setHigh(status[6]);
         staProtocol.setLow(status[7]);
-
+        boolean[] status2 = siemensS7Net.getByteTransform().TransBool(
+                content, offset + StationStatusField.STATUS_WORD.getOffset() + 1,
+                1);
+        staProtocol.setMid(status2[0]);
+        staProtocol.setStartup(status2[1]);
+        staProtocol.setSegApply(status2[2]);
+        staProtocol.setApplyErr(status2[3]);
 
     }
 
@@ -313,6 +328,51 @@
     }
 
     /**
+     * 璇诲彇瀹夊叏浜や簰淇″彿
+     */
+    private void readSaleSingle(List<DevpSlave.Sta> putSta, List<DevpSlave.Sta> takeSta) {
+        int staNoSize = putSta.size();
+        OperateResultExOne<byte[]> result = siemensS7Net.Read(
+                SafeSignalField.SAFE_SIGNAL_FROM_CONVEYOR.buildAddress(),
+                (short) (staNoSize * SafeSignalField.SAFE_SIGNAL_FROM_CONVEYOR.getByteLength()));
+
+        if (!result.IsSuccess) {
+            log.warn("璇诲彇PLC瀹夊叏浜や簰淇℃伅寮傚父 [id:{}]", slave.getId());
+            return;
+        }
+
+        byte[] content = result.Content;
+        for (int i = 0; i < staNoSize; i++) {
+            Integer put = putSta.get(i).getStaNo();
+            Integer take = takeSta.get(i).getStaNo();
+            StaProtocol staProtocolPut = station.get(put);
+            StaProtocol staProtocolTake = station.get(take);
+            if (staProtocolPut == null || staProtocolTake == null) {
+                log.warn("绔欑偣涓嶅瓨鍦� [id:{}] [staNo:{},{}]", slave.getId(), put, take);
+                continue;
+            }
+
+            boolean[] status = siemensS7Net.getByteTransform().TransBool(
+                    content, i * SafeSignalField.SAFE_SIGNAL_FROM_CONVEYOR.getByteLength(), 1);
+
+            boolean[] status2 = siemensS7Net.getByteTransform().TransBool(
+                    content, i * SafeSignalField.SAFE_SIGNAL_FROM_CONVEYOR.getByteLength() + 2, 1);
+
+            staProtocolPut.setHeartbeat(status[0]);
+            staProtocolPut.setAllowTake(status[1]);
+            staProtocolPut.setAllowPut(status[2]);
+            staProtocolPut.setInComplete(status[3]);
+            staProtocolPut.setOutComplete(status[4]);
+
+            staProtocolTake.setHeartbeat(status2[0]);
+            staProtocolTake.setAllowTake(status2[1]);
+            staProtocolTake.setAllowPut(status2[2]);
+            staProtocolTake.setInComplete(status2[3]);
+            staProtocolTake.setOutComplete(status2[4]);
+        }
+    }
+
+    /**
      * 鎸夐渶鏇存柊鏁版嵁搴擄紙闄嶄綆鏇存柊棰戠巼锛�
      */
     private void updateDatabaseIfNeeded() {
diff --git a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/scheduler/JobLogScheduler.java b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/scheduler/JobLogScheduler.java
index 1616d31..1f37aa8 100644
--- a/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/scheduler/JobLogScheduler.java
+++ b/zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/scheduler/JobLogScheduler.java
@@ -1,7 +1,6 @@
 package com.zy.acs.conveyor.scheduler;
 
 import com.zy.acs.conveyor.core.enums.ConveyorStateType;
-import com.zy.acs.conveyor.core.properties.CtuOperationConfig;
 import com.zy.acs.conveyor.core.properties.CtuServiceProperties;
 import com.zy.acs.conveyor.entity.Job;
 import com.zy.acs.conveyor.mapper.JobMapper;
@@ -37,25 +36,6 @@
         for (Job job : jobs) {
             jobService.saveJobLog(job);
         }
-        Boolean flag = true;
-        List<CtuOperationConfig> operations = properties.getOperations();
-        for (CtuOperationConfig config : operations) {
-            if (config.getType().equals(ConveyorStateType.FAKEUSER)) {
-                flag = false;
-            }
-        }
-        if (flag) {
-            jobs = jobMapper.listJobToLog(ConveyorStateType.OUTBOUND.getStatus(), 1);
-            for (Job job : jobs) {
-                jobService.saveJobLog(job);
-            }
-        } else {
-            jobs = jobMapper.listJobToLog(ConveyorStateType.FAKEUSER.getStatus(), 1);
-            for (Job job : jobs) {
-                jobService.saveJobLog(job);
-            }
-        }
     }
-
 
 }
diff --git a/zy-asc-conveyor/src/main/resources/application.yml b/zy-asc-conveyor/src/main/resources/application.yml
index adcbd4c..d8a9f0e 100644
--- a/zy-asc-conveyor/src/main/resources/application.yml
+++ b/zy-asc-conveyor/src/main/resources/application.yml
@@ -41,27 +41,23 @@
     interval: 1000
     operations:
       - type: OUTBOUND
-        mark: 10
+        mark: 鍑哄簱娴佺▼
         max-retries: 3
         retry-delay: 800
-      #      - type: FAKEUSER
-      #        mark: 20
-      #        max-retries: 2
-      #        retry-delay: 800
+      - type: STARTUP
+        mark: 鍚姩鍏ュ簱娴佺▼
+        max-retries: 2
+        retry-delay: 800
       - type: APPLYLOC
-        mark: 30
+        mark: 鐢宠鍏ュ簱娴佺▼
         max-retries: 2
         retry-delay: 2000
-      #      - type: INBOUND
-      #        mark: 40
-      #        max-retries: 3
-      #        retry-delay: 500
       - type: CLEARSIGNAL
-        mark: 50
+        mark: 娓呯悊淇″彿娴佺▼
         max-retries: 2
         retry-delay: 800
       - type: SENDTASK
-        mark: 60
+        mark: 鍙戦�佷换鍔CS娴佺▼
         max-retries: 2
         retry-delay: 800
 
@@ -102,17 +98,23 @@
       - 1011
       - 1012
       - 1013
+    # 绔欑偣寮傚父妯″潡鏄惁寮�鍚�
     staNosError: true
+    # 鎵爜妯″潡鏄惁寮�鍚�
     barcode: true
+    # 绉伴噸妯″潡鏄惁寮�鍚�
     weight: true
+    # 鍙栫珯鐐逛氦浜掍俊鍙�
     # ctu鏀捐揣绔欑偣
-    releaseSta[0]:
+    putSta[0]:
       # 鏈珯鐐�
       staNo: 1001
       # 鐩爣绔欑偣
       targetSta: 1007
     # ctu鍏ュ簱绔欑偣
     inSta[0]:
+      # 婧愮珯鐐�
+      sourceStaNo: 1007
       # 鏈珯鐐�
       staNo: 1010
       # 鐩爣绔欑偣

--
Gitblit v1.9.1