Browse Source

pcl设备连接添加心跳

zhifei 1 year ago
parent
commit
8b4f04a649

+ 4 - 26
warewms-admin/src/main/resources/application.yml

@@ -2,36 +2,14 @@
 spring:
   profiles:
     active: test
-socket:
-  InkjetPrinters:
-
-
-plc:
-  plcList[0]:
-    ip: 172.20.52.21
-    enable: false
-    name: ChengZhongPlc
-    ePlcType: S1200
-    heartbeat: DB11.0.0
-  plcList[1]:
-    ip: 172.20.27.2
-    enable: false
-    name: DaoJiaoJiPlc
-    ePlcType: S200_SMART
-    heartbeat:
-  plcList[2]:
-    ip: 172.20.52.24
-    enable: false
-    name: ZaZhiPlc
-    ePlcType: S1500
-    heartbeat:
 
+# MES对接接口
 MES:
-  address: http://192.20.2.4:9090
+  address: http://172.20.2.2:9090
   #获取批次号
   getBatchNoUrl: /api/SprayCode/SprayBatchNo
   #获取批次号回调
   getBatchNoResultUrl: /api/SprayCode/SprayBatchNoResult
-  #铣面
-  MillingSurfaceUrl: /api/SprayCode/SprayMillingSurface
+  #工艺读码反馈
+  processFeedbackUrl: /api/SprayCode/SprayMillingSurface
 

+ 3 - 0
warewms-system/src/main/java/com/warewms/hailiang/config/PlcConfig.java

@@ -25,8 +25,11 @@ public class PlcConfig {
 
     private EPlcType ePlcType;
 
+    private String heartbeat;
+
     public void setSiemensPLCS(String  ePlcType) {
         this.ePlcType = EPlcType.valueOf(ePlcType);
     }
 
+
 }

+ 54 - 4
warewms-system/src/main/java/com/warewms/hailiang/init/PlcConnectServiceRunner.java

@@ -1,11 +1,17 @@
 package com.warewms.hailiang.init;
 
 
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
 import com.github.rholder.retry.*;
 import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;
 import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
+import com.warewms.common.exception.ServiceException;
+import com.warewms.common.utils.StringUtils;
 import com.warewms.hailiang.config.PlcConfig;
 import com.warewms.hailiang.config.PlcProperties;
+import com.warewms.hailiang.domain.Device;
+import com.warewms.hailiang.service.DeviceService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.core.annotation.Order;
@@ -13,8 +19,11 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -31,9 +40,12 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
     @Resource
     ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
-    private HashMap<String, S7PLC> plcToolsMap = new HashMap<>();
+    @Resource
+    DeviceService deviceService;
 
 
+    @Resource
+    private ScheduledExecutorService scheduledExecutorService;
 
     @Override
     public void run(String... args) throws Exception {
@@ -41,6 +53,10 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
         log.info("plc初始化完成!");
     }
 
+    private HashMap<String, S7PLC> plcToolsMap = new HashMap<>();
+
+    private ArrayList<String> reTryPlc = new ArrayList<>();
+
     /**
      * 初始化
      */
@@ -53,6 +69,7 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
                     s7PLC.connect();
                     if (s7PLC.checkConnected()){
                         plcToolsMap.put(plcConfig.getName(),s7PLC);
+                        SpringUtil.getApplicationContext().publishEvent(new Device(plcConfig.getName(), "1"));
                         log.info("plc:{},ip:{},连接成功",plcConfig.getName(),plcConfig.getIp());
                     }
                 }catch (Exception e){
@@ -65,6 +82,7 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
     }
 
     public void retry(PlcConfig plcConfig) {
+        reTryPlc.add(plcConfig.getName());
         threadPoolTaskExecutor.execute (() -> {
             Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
                     .retryIfResult(Boolean.FALSE::equals)
@@ -80,7 +98,10 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
                         s7PLC.connect();
                         if (s7PLC.checkConnected()){
                             plcToolsMap.put(plcConfig.getName(),s7PLC);
+                            SpringUtil.getApplicationContext().publishEvent(new Device(plcConfig.getName(), "1"));
                             log.info("plc:{},ip:{},重试连接成功",plcConfig.getName(),plcConfig.getIp());
+                            reTryPlc.remove(plcConfig.getName());
+                            plcConnectsTheHeartbeat(plcConfig,s7PLC);
                             return true;
                         }
                     }catch (Exception e){
@@ -95,13 +116,42 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
         });
     }
 
+    /**
+     *  plc连接心跳
+     * @param plcConfig
+     * @param s7PLC
+     */
+    private void plcConnectsTheHeartbeat(PlcConfig plcConfig,S7PLC s7PLC){
+        String heartbeatAdd = plcConfig.getHeartbeat();
+        if (StringUtils.isNotEmpty(heartbeatAdd)){
+            scheduledExecutorService.scheduleWithFixedDelay(()->{
+                if (!reTryPlc.contains(plcConfig.getName())){
+                    try {
+                        s7PLC.readBoolean(plcConfig.getHeartbeat());
+                    }catch (Exception e){
+                        log.error("设备:{},连接中断",plcConfig.getName());
+                        SpringUtil.getApplicationContext().publishEvent(new Device(plcConfig.getName(), "2"));
+                        retry(plcConfig);
+                    }
+                }
+            },0,3,TimeUnit.SECONDS);
+        }
+    }
+
 
     /**
      *
-     * @param key plc设备名
+     * @param pclName plc设备名
      * @return
      */
-    public S7PLC getPlcServer(String key) {
-        return plcToolsMap.get(key);
+    public S7PLC getPlcServer(String pclName) {
+        S7PLC s7PLC = plcToolsMap.get(pclName);
+        if(ObjectUtil.isNull(s7PLC)){
+            throw new ServiceException("设备未连接");
+        }
+        if (!deviceService.IsConnect(pclName)){
+            throw new ServiceException("设备连接中断");
+        }
+        return plcToolsMap.get(pclName);
     }
 }