You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by hu...@apache.org on 2020/11/25 12:18:15 UTC

[plc4x] 01/01: Starting to update OPCUA server

This is an automated email from the ASF dual-hosted git repository.

hutcheb pushed a commit to branch update/opcua-server
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 8b0524d52f4f2b4bc0022f5974b607c7c280129c
Author: hutcheb <be...@gmail.com>
AuthorDate: Wed Nov 25 07:15:01 2020 -0500

    Starting to update OPCUA server
    
    - Need to add timeout when polling data
    - Take a look at issues when adding invalid nodes, other nodes stop or
    not all nodes get updated.
    - Add option to disable non encrypted endpoint.
    - Add Documentation
---
 .../opcuaserver/backend/Plc4xCommunication.java    | 51 +++++++++++++++++-----
 .../java/opcuaserver/backend/Plc4xNamespace.java   | 16 ++++++-
 2 files changed, 55 insertions(+), 12 deletions(-)

diff --git a/sandbox/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java b/sandbox/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java
index 0b0dd03..4f00ccd 100644
--- a/sandbox/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java
+++ b/sandbox/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java
@@ -39,6 +39,7 @@ import org.eclipse.milo.opcua.sdk.server.api.MonitoredItem;
 import org.eclipse.milo.opcua.sdk.server.model.nodes.objects.BaseEventTypeNode;
 import org.eclipse.milo.opcua.sdk.server.model.nodes.objects.ServerTypeNode;
 import org.eclipse.milo.opcua.sdk.server.model.nodes.variables.AnalogItemTypeNode;
+import org.eclipse.milo.opcua.sdk.server.nodes.filters.AttributeFilterContext;
 import org.eclipse.milo.opcua.sdk.server.nodes.UaFolderNode;
 import org.eclipse.milo.opcua.sdk.server.nodes.UaMethodNode;
 import org.eclipse.milo.opcua.sdk.server.nodes.UaNode;
@@ -70,6 +71,7 @@ import org.eclipse.milo.opcua.stack.core.types.structured.Range;
 import org.eclipse.milo.opcua.stack.core.types.structured.StructureDefinition;
 import org.eclipse.milo.opcua.stack.core.types.structured.StructureDescription;
 import org.eclipse.milo.opcua.stack.core.types.structured.StructureField;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -84,11 +86,15 @@ import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.utils.connectionpool.*;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
+import org.apache.plc4x.java.api.model.PlcField;
 
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
-import org.apache.plc4x.java.api.model.PlcField;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.TimeUnit;
+import java.util.Map;
+import java.util.HashMap;
+
 
 import static org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned.ubyte;
 import static org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned.uint;
@@ -100,6 +106,8 @@ public class Plc4xCommunication {
     private PlcDriverManager driverManager;
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
+    Map<NodeId, DataItem> monitoredList = new HashMap<>();
+
     public Plc4xCommunication () {
         driverManager = new PooledPlcDriverManager();
     }
@@ -108,6 +116,16 @@ public class Plc4xCommunication {
         return driverManager.getDriver(connectionString).prepareField(tag);
     }
 
+    public void addField(DataItem item) {
+        logger.info("Adding item to monitored list " + item.getReadValueId());
+        monitoredList.put(item.getReadValueId().getNodeId(), item);
+    }
+
+    public void removeField(DataItem item) {
+        logger.info("Removing item from monitored list " + item.getReadValueId());
+        monitoredList.remove(item.getReadValueId().getNodeId());
+    }
+
     public static NodeId getNodeId(String plcValue) {
         switch (plcValue) {
             case "BOOL":
@@ -170,12 +188,18 @@ public class Plc4xCommunication {
         }
     }
 
-    public Variant getValue(String tag, String connectionString) {
+    public Variant getValue(AttributeFilterContext.GetAttributeContext ctx, String tag, String connectionString) {
         PlcConnection connection = null;
         try {
           connection = driverManager.getConnection(connectionString);
         } catch (PlcConnectionException e) {
-          System.out.println("Failed" + e);
+          logger.warn("Failed" + e);
+        }
+        logger.info(ctx.getNode().getNodeId().toString());
+
+        long timeout = 1000000;
+        if (monitoredList.containsKey(ctx.getNode().getNodeId())) {
+            timeout = (long) monitoredList.get(ctx.getNode().getNodeId()).getSamplingInterval()*1000;
         }
 
         // Create a new read request:
@@ -186,9 +210,14 @@ public class Plc4xCommunication {
 
         PlcReadResponse response = null;
         try {
-          response = readRequest.execute().get();
-        } catch (InterruptedException | ExecutionException e) {
-          System.out.println("Failed" + e);
+          response = readRequest.execute().get(timeout, TimeUnit.MICROSECONDS);
+      } catch (InterruptedException | ExecutionException | TimeoutException e) {
+          logger.warn("Failed" + e);
+          try {
+            connection.close();
+        } catch (Exception exception) {
+            logger.warn("Close Failed" + exception);
+          }
         }
 
         Variant resp = null;
@@ -210,7 +239,7 @@ public class Plc4xCommunication {
         try {
           connection.close();
         } catch (Exception e) {
-          System.out.println("Close Failed" + e);
+          logger.warn("Close Failed" + e);
         }
         return resp;
     }
@@ -220,7 +249,7 @@ public class Plc4xCommunication {
         try {
           connection = driverManager.getConnection(connectionString);
         } catch (PlcConnectionException e) {
-          System.out.println("Failed" + e);
+          logger.warn("Failed" + e);
         }
 
         // Create a new read request:
@@ -241,13 +270,13 @@ public class Plc4xCommunication {
         try {
           writeRequest.execute().get();
         } catch (InterruptedException | ExecutionException e) {
-          System.out.println("Failed" + e);
+          logger.warn("Failed" + e);
         }
 
         try {
           connection.close();
         } catch (Exception e) {
-          System.out.println("Close Failed" + e);
+          logger.warn("Close Failed" + e);
         }
         return;
     }
diff --git a/sandbox/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java b/sandbox/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java
index 403421a..31fc5cc 100644
--- a/sandbox/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java
+++ b/sandbox/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java
@@ -206,7 +206,7 @@ public class Plc4xNamespace extends ManagedNamespaceWithLifecycle {
                     filter,
                     AttributeFilters.getValue(
                         ctx ->
-                            new DataValue(plc4xServer.getValue(tag, connectionString))
+                            new DataValue(plc4xServer.getValue(ctx, tag, connectionString))
                     )
                 );
 
@@ -237,21 +237,35 @@ public class Plc4xNamespace extends ManagedNamespaceWithLifecycle {
 
     @Override
     public void onDataItemsCreated(List<DataItem> dataItems) {
+        for (DataItem item : dataItems) {
+            plc4xServer.addField(item);
+        }
+
         subscriptionModel.onDataItemsCreated(dataItems);
     }
 
     @Override
     public void onDataItemsModified(List<DataItem> dataItems) {
+        for (DataItem item : dataItems) {
+            plc4xServer.addField(item);
+        }
         subscriptionModel.onDataItemsModified(dataItems);
     }
 
     @Override
     public void onDataItemsDeleted(List<DataItem> dataItems) {
+        for (DataItem item : dataItems) {
+            plc4xServer.removeField(item);
+        }
         subscriptionModel.onDataItemsDeleted(dataItems);
     }
 
     @Override
     public void onMonitoringModeChanged(List<MonitoredItem> monitoredItems) {
+        logger.info(" 4 - " + monitoredItems.toString());
+        for (MonitoredItem item : monitoredItems) {
+            logger.info(" 4 - " + item.toString());
+        }
         subscriptionModel.onMonitoringModeChanged(monitoredItems);
     }