From 16d8d76552c4e42a2322984b6c62363926003f98 Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期二, 14 四月 2026 10:18:42 +0800
Subject: [PATCH] 1

---
 zy-asc-conveyor/src/main/java/com/zy/acs/conveyor/core/service/Snap7Service.java |  106 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 93 insertions(+), 13 deletions(-)

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..fb3e8f5 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,13 +5,16 @@
 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;
 import com.zy.acs.conveyor.core.properties.SlaveProperties;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.text.MessageFormat;
@@ -28,8 +31,8 @@
     @Autowired
     private DevpS7Service devpS7Service;
 
-
-    private static final int WRITE_RETRY_MAX = 5;
+    @Value("${plc-write.retry}")
+    private int WRITE_RETRY;
 
     private static final int WRITE_RETRY_INTERVAL_MS = 200;
 
@@ -37,28 +40,106 @@
 
     }
 
-
-    public void write(StaProtocol staProtocol) throws InterruptedException {
+    public void writeSafe(StaProtocol staProtocol) throws InterruptedException {
         if (staProtocol == null) {
-            log.warn("鍐欏叆鏁版嵁涓虹┖锛岃烦杩� [id:{}]", JSON.toJSONString(staProtocol));
+            News.warn("鍐欏叆鏁版嵁涓虹┖锛岃烦杩� [id:{}]", JSON.toJSONString(staProtocol));
             return;
         }
 
         SiemensS7Net siemensS7Net = devpS7Service.get(staProtocol.getPlcId());
         if (siemensS7Net == null) {
-            log.error("PLC鏈繛鎺ワ紝鏃犳硶鍐欏叆 [id:{}]", JSON.toJSONString(staProtocol));
+            News.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));
+            News.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());
+            News.error("绔欑偣缂栧彿涓嶅瓨鍦ㄤ簬閰嶇疆涓� [id:{}] [siteId:{}]", staProtocol.getPlcId(), staProtocol.getSiteId());
+            return;
+        }
+        SafeSignal safeSignal = staProtocol.getSafeSignal();
+
+        int baseOffset = 0;
+        short[] array = new short[6];
+        array[0] = (short) 1;
+        array[1] = (short) 0;
+        array[2] = (short) 0;
+        array[5] = (short) 0;
+        if (safeSignal.getFlag()) {
+            array[3] = (short) 0;
+            array[4] = safeSignal.getValue();
+            baseOffset = SafeSignalField.SAFE_SIGNAL_TO_CONVEYOR.getOffset() + safeSignal.getIndex() * SafeSignalField.SAFE_SIGNAL_TO_CONVEYOR.getByteLength();
+        } else {
+            array[3] = safeSignal.getValue();
+            array[4] = (short) 0;
+            baseOffset = SafeSignalField.SAFE_SIGNAL_TO_CONVEYOR.getOffset() + 2 + safeSignal.getIndex() * SafeSignalField.SAFE_SIGNAL_TO_CONVEYOR.getByteLength();
+        }
+        String flagAddr = SafeSignalField.SAFE_SIGNAL_TO_CONVEYOR.getAddressPattern() + PlcConstant.ADDRESS_CONCATENATION
+                + baseOffset;
+
+        // 浠诲姟涓嬪彂閲嶈瘯鏈哄埗
+        int writeCount = 0;
+        boolean success = false;
+
+        while (writeCount <= WRITE_RETRY) {
+            OperateResult writeResult = siemensS7Net.Write(flagAddr, array);
+
+            if (writeResult.IsSuccess) {
+                News.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++;
+            News.error("鍐欏叆瀹夊叏淇″彿杈撻�佺嚎鍛戒护澶辫触 [id:{}] [siteId:{}] [retry:{}] [workErr:{}] ",
+                    staProtocol.getPlcId(), staProtocol.getSiteId(), writeCount,
+                    writeResult.Message);
+            if (writeCount <= WRITE_RETRY) {
+                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));
+        }
+
+    }
+
+    public void write(StaProtocol staProtocol) throws InterruptedException {
+        if (staProtocol == null) {
+            News.warn("鍐欏叆鏁版嵁涓虹┖锛岃烦杩� [id:{}]", JSON.toJSONString(staProtocol));
+            return;
+        }
+
+        SiemensS7Net siemensS7Net = devpS7Service.get(staProtocol.getPlcId());
+        if (siemensS7Net == null) {
+            News.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) {
+            News.error("PLC鏈厤缃紝鏃犳硶鍐欏叆 [id:{}]", JSON.toJSONString(staProtocol));
+            return;
+        }
+        int index = devpSlave.getStaNos().indexOf(staProtocol.getSiteId());
+        if (index < 0) {
+            News.error("绔欑偣缂栧彿涓嶅瓨鍦ㄤ簬閰嶇疆涓� [id:{}] [siteId:{}]", staProtocol.getPlcId(), staProtocol.getSiteId());
             return;
         }
 
@@ -72,14 +153,14 @@
         int writeCount = 0;
         boolean success = false;
 
-        while (writeCount < WRITE_RETRY_MAX) {
+        while (writeCount <= WRITE_RETRY) {
             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:{}]",
+                News.info("鍐欏叆杈撻�佺嚎鍛戒护鎴愬姛 [id:{}] [siteId:{}] [workNo:{}] [destSta:{}] [retry:{}]",
                         staProtocol.getPlcId(), staProtocol.getSiteId(), staProtocol.getWorkNo(),
                         staProtocol.getStaNo(), writeCount);
                 OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎鍛戒护鎴愬姛銆傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2}",
@@ -89,11 +170,11 @@
             }
 
             writeCount++;
-            log.error("鍐欏叆杈撻�佺嚎鍛戒护澶辫触 [id:{}] [siteId:{}] [retry:{}] [workErr:{}] [destErr:{}]",
+            News.error("鍐欏叆杈撻�佺嚎鍛戒护澶辫触 [id:{}] [siteId:{}] [retry:{}] [workErr:{}] [destErr:{}]",
                     staProtocol.getPlcId(), staProtocol.getSiteId(), writeCount,
                     writeResult.Message, writeResult1.Message);
 
-            if (writeCount < WRITE_RETRY_MAX) {
+            if (writeCount <= WRITE_RETRY) {
                 Thread.sleep(WRITE_RETRY_INTERVAL_MS);
             }
         }
@@ -104,7 +185,6 @@
             OutputQueue.DEVP.offer(errorMsg);
             News.error("SiemensDevp - 4 - 鍐欏叆杈撻�佺嚎绔欑偣鏁版嵁澶辫触銆傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={}",
                     staProtocol.getPlcId(), JSON.toJSON(staProtocol));
-            log.error(errorMsg);
         }
 
     }

--
Gitblit v1.9.1