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);
}