You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jf...@apache.org on 2020/01/29 12:57:42 UTC

[plc4x] 05/06: [fix] changed write of opc variant and included cast from BigInteger

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

jfeinauer pushed a commit to branch fixes-mathi
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 46f0075640a85195095448a82f2190191f7e6c0b
Author: Matthias Milan Strljic <Ma...@googlemail.com>
AuthorDate: Wed Jan 29 00:04:57 2020 +0100

    [fix] changed write of opc variant and included cast from BigInteger
    
                                                                           Signed-off-by: Matthias Milan Strljic <Ma...@googlemail.com>
    
    Signed-off-by: Matthias Milan Strljic <Ma...@googlemail.com>
---
 .../plc4x/java/opcua/connection/OpcuaTcpPlcConnection.java     | 10 ++++++++--
 .../java/org/apache/plc4x/java/opcua/ManualPLC4XOpcua.java     |  9 ++++-----
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/connection/OpcuaTcpPlcConnection.java b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/connection/OpcuaTcpPlcConnection.java
index ada500c..90ed00c 100644
--- a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/connection/OpcuaTcpPlcConnection.java
+++ b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/connection/OpcuaTcpPlcConnection.java
@@ -65,6 +65,7 @@ import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 import static org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned.uint;
+import static org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned.ulong;
 
 /**
  * Corresponding implementaion for a TCP-based connection for an OPC UA server.
@@ -433,8 +434,11 @@ public class OpcuaTcpPlcConnection extends BaseOpcuaPlcConnection {
             for (String fieldName : writeRequest.getFieldNames()) {
                 OpcuaField uaField = (OpcuaField) writeRequest.getField(fieldName);
                 NodeId idNode = generateNodeId(uaField);
-                Variant var = new Variant(internalPlcWriteRequest.getPlcValue(fieldName).getObject());
-                DataValue value = new DataValue(var, null, null);
+                Object valueObject = internalPlcWriteRequest.getPlcValue(fieldName).getObject();
+                // Added small work around for handling BigIntegers as input type for UInt64
+                if (valueObject instanceof BigInteger) valueObject = ulong((BigInteger) valueObject);
+                Variant var = new Variant(valueObject);
+                DataValue value = new DataValue(var, null, null, null);
                 ids.add(idNode);
                 names.add(fieldName);
                 values.add(value);
@@ -458,6 +462,8 @@ public class OpcuaTcpPlcConnection extends BaseOpcuaPlcConnection {
                         resultCode = PlcResponseCode.OK;
                     } else if (statusCodes.get(counter).isUncertain()) {
                         resultCode = PlcResponseCode.NOT_FOUND;
+                    } else if (statusCodes.get(counter).isBad() && statusCodes.get(counter).getValue() == 2155085824L) {
+                        resultCode = PlcResponseCode.INVALID_DATATYPE;
                     } else {
                         resultCode = PlcResponseCode.ACCESS_DENIED;
                     }
diff --git a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/ManualPLC4XOpcua.java b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/ManualPLC4XOpcua.java
index 57bf76a..d8ed820 100644
--- a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/ManualPLC4XOpcua.java
+++ b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/ManualPLC4XOpcua.java
@@ -34,7 +34,6 @@ import org.eclipse.milo.examples.server.ExampleServer;
 import java.math.BigInteger;
 import java.time.Duration;
 import java.time.temporal.ChronoUnit;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.function.Consumer;
@@ -110,21 +109,21 @@ public class ManualPLC4XOpcua {
             builder.addItem("DoesNotExists", DOES_NOT_EXIST_IDENTIFIER);
 
             PlcReadRequest request = builder.build();
-            PlcReadResponse response = opcuaConnection.read(request).get();
+            //PlcReadResponse response = opcuaConnection.read(request).get();
 
-            Collection coll = response.getAllStrings("String");
+            //Collection coll = response.getAllStrings("String");
 
             PlcWriteRequest.Builder wBuilder = opcuaConnection.writeRequestBuilder();
             wBuilder.addItem("w-Bool", BOOL_IDENTIFIER, true);
             //wBuilder.addItem("w-ByteString", BYTE_STRING_IDENTIFIER, "TEST".getBytes());
-            wBuilder.addItem("w-Byte", BYTE_IDENTIFIER, (byte) 1);
+            wBuilder.addItem("w-Byte", BYTE_IDENTIFIER, (byte) 0x00);
             wBuilder.addItem("w-Double", DOUBLE_IDENTIFIER, (double) 0.25);
             wBuilder.addItem("w-Float", FLOAT_IDENTIFIER, (float) 0.25);
             wBuilder.addItem("w-INT16", INT16_IDENTIFIER, (short) 12);
             wBuilder.addItem("w-Int32", INT32_IDENTIFIER, (int) 314);
             wBuilder.addItem("w-Int64", INT64_IDENTIFIER, (long) 123125);
             wBuilder.addItem("w-Integer", INTEGER_IDENTIFIER, (int) 314);
-            wBuilder.addItem("w-SByte", SBYTE_IDENTIFIER, (short) 23);
+            wBuilder.addItem("w-SByte", SBYTE_IDENTIFIER, (byte) 23);
             wBuilder.addItem("w-String", STRING_IDENTIFIER, "TEST");
             wBuilder.addItem("w-UInt16", UINT16_IDENTIFIER, (int) 222);
             wBuilder.addItem("w-UInt32", UINT32_IDENTIFIER, (long) 21412);