|
@@ -19,6 +19,7 @@ import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.concurrent.ExecutionException;
|
|
|
import java.util.concurrent.ScheduledExecutorService;
|
|
|
+import java.util.concurrent.ScheduledFuture;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
/**
|
|
@@ -48,6 +49,8 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
|
|
|
|
|
|
private HashMap<String, S7PLC> plcToolsMap = new HashMap<>();
|
|
|
|
|
|
+ private HashMap<String, ScheduledFuture<?>> heartbeatThreads = new HashMap<>();
|
|
|
+
|
|
|
private ArrayList<String> reTryPlc = new ArrayList<>();
|
|
|
|
|
|
/**
|
|
@@ -63,6 +66,7 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
|
|
|
if (s7PLC.checkConnected()){
|
|
|
plcToolsMap.put(plcConfig.getName(),s7PLC);
|
|
|
log.info("plc:{},ip:{},The connection was successful",plcConfig.getName(),plcConfig.getIp());
|
|
|
+ plcConnectsTheHeartbeat(plcConfig,s7PLC);
|
|
|
}
|
|
|
}catch (Exception e){
|
|
|
log.info("plc:{},ip:{},Connection failed",plcConfig.getName(),plcConfig.getIp());
|
|
@@ -75,6 +79,10 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
|
|
|
|
|
|
public void retry(PlcConfig plcConfig) {
|
|
|
reTryPlc.add(plcConfig.getName());
|
|
|
+ ScheduledFuture<?> scheduledFuture = heartbeatThreads.get(plcConfig.getName());
|
|
|
+ if (ObjectUtil.isNotNull(scheduledFuture)){
|
|
|
+ scheduledFuture.cancel(true);
|
|
|
+ }
|
|
|
threadPoolTaskExecutor.execute (() -> {
|
|
|
Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
|
|
|
.retryIfResult(Boolean.FALSE::equals)
|
|
@@ -115,17 +123,18 @@ public class PlcConnectServiceRunner implements CommandLineRunner {
|
|
|
private void plcConnectsTheHeartbeat(PlcConfig plcConfig,S7PLC s7PLC){
|
|
|
String heartbeatAdd = plcConfig.getHeartbeat();
|
|
|
if (StringUtils.isNotEmpty(heartbeatAdd)){
|
|
|
- scheduledExecutorService.scheduleWithFixedDelay(()->{
|
|
|
- if (!reTryPlc.contains(plcConfig.getName())){
|
|
|
+ ScheduledFuture<?> scheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> {
|
|
|
+ if (!reTryPlc.contains(plcConfig.getName())) {
|
|
|
try {
|
|
|
byte b = s7PLC.readByte(plcConfig.getHeartbeat());
|
|
|
- s7PLC.writeByte(plcConfig.getConfirmTheStatus(),b);
|
|
|
- }catch (Exception e){
|
|
|
- log.error("device:{},The connection is lost",plcConfig.getName());
|
|
|
+ s7PLC.writeByte(plcConfig.getConfirmTheStatus(), b);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("device:{},The connection is lost", plcConfig.getName());
|
|
|
retry(plcConfig);
|
|
|
}
|
|
|
}
|
|
|
- },0,3,TimeUnit.SECONDS);
|
|
|
+ }, 0, 3, TimeUnit.SECONDS);
|
|
|
+ heartbeatThreads.put(plcConfig.getName(),scheduledFuture);
|
|
|
}
|
|
|
}
|
|
|
|