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

cdutz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new 232888d623 [feat] improved s7 opcua support (#2463)
232888d623 is described below

commit 232888d6233c47ede11cda949aa78d745b3e7ed4
Author: Christofer Dutz <[email protected]>
AuthorDate: Mon Feb 23 19:49:59 2026 +0100

    [feat] improved s7 opcua support (#2463)
    
    * chore: Added a test for my S7-1500 opcua setup and did some minor tweaks 
to support reading and writing most types on this PLC.
    
    * chore: Fixed the build
    
    * chore: Ported the initial fix for the reading of arrays.
---
 .../testing/protocols/opcua/DriverTestsuite.xml    |   4 +-
 plc4j/drivers/opcua/pom.xml                        |   1 +
 .../apache/plc4x/java/opcua/readwrite/Variant.java |  16 +-
 .../plc4x/java/opcua/readwrite/VariantBoolean.java |   4 +-
 .../plc4x/java/opcua/readwrite/VariantByte.java    |   4 +-
 .../java/opcua/readwrite/VariantByteString.java    |   4 +-
 .../java/opcua/readwrite/VariantDataValue.java     |   4 +-
 .../java/opcua/readwrite/VariantDateTime.java      |   4 +-
 .../opcua/readwrite/VariantDiagnosticInfo.java     |   4 +-
 .../plc4x/java/opcua/readwrite/VariantDouble.java  |   4 +-
 .../opcua/readwrite/VariantExpandedNodeId.java     |   4 +-
 .../opcua/readwrite/VariantExtensionObject.java    |   4 +-
 .../plc4x/java/opcua/readwrite/VariantFloat.java   |   4 +-
 .../plc4x/java/opcua/readwrite/VariantGuid.java    |   4 +-
 .../plc4x/java/opcua/readwrite/VariantInt16.java   |   4 +-
 .../plc4x/java/opcua/readwrite/VariantInt32.java   |   4 +-
 .../plc4x/java/opcua/readwrite/VariantInt64.java   |   4 +-
 .../java/opcua/readwrite/VariantLocalizedText.java |   4 +-
 .../plc4x/java/opcua/readwrite/VariantNodeId.java  |   4 +-
 .../plc4x/java/opcua/readwrite/VariantNull.java    |   4 +-
 .../java/opcua/readwrite/VariantQualifiedName.java |   4 +-
 .../plc4x/java/opcua/readwrite/VariantSByte.java   |   4 +-
 .../java/opcua/readwrite/VariantStatusCode.java    |   4 +-
 .../plc4x/java/opcua/readwrite/VariantString.java  |   4 +-
 .../plc4x/java/opcua/readwrite/VariantUInt16.java  |   4 +-
 .../plc4x/java/opcua/readwrite/VariantUInt32.java  |   4 +-
 .../plc4x/java/opcua/readwrite/VariantUInt64.java  |   4 +-
 .../plc4x/java/opcua/readwrite/VariantVariant.java |   4 +-
 .../java/opcua/readwrite/VariantXmlElement.java    |   4 +-
 .../apache/plc4x/java/opcua/OpcuaPlcDriver.java    |   7 -
 .../java/opcua/protocol/OpcuaProtocolLogic.java    | 300 ++++++++++++++-------
 .../opcua/ManualOpcUaS71500NewFWDriverTest.java    | 149 ++++++++++
 .../java/spi/values/DefaultPlcValueHandler.java    |  18 +-
 .../java/spi/values/LegacyPlcValueHandler.java     | 264 ------------------
 .../generated/protocols/opcua/opc-manual.mspec     |   4 +-
 protocols/opcua/src/main/xslt/opc-manual.xsl       |   4 +-
 .../resources/protocols/opcua/DriverTestsuite.xml  |   4 +-
 37 files changed, 441 insertions(+), 434 deletions(-)

diff --git a/plc4go/assets/testing/protocols/opcua/DriverTestsuite.xml 
b/plc4go/assets/testing/protocols/opcua/DriverTestsuite.xml
index 84fd77de48..8427357d44 100644
--- a/plc4go/assets/testing/protocols/opcua/DriverTestsuite.xml
+++ b/plc4go/assets/testing/protocols/opcua/DriverTestsuite.xml
@@ -1338,7 +1338,7 @@
           <tags isList="true">
             <tag className="org.apache.plc4x.test.driver.internal.api.TestTag">
               <name>time</name>
-              <address>ns=0;i=2258</address>
+              <address>ns=0;i=2258;DATE_AND_TIME</address>
             </tag>
           </tags>
         </TestReadRequest>
@@ -1681,7 +1681,7 @@
                         <OpcuaTag>
                           <nodeId dataType="string" bitLength="88" 
encoding="UTF-8">ns=0;i=2258</nodeId>
                           <attributeId dataType="string" bitLength="40" 
encoding="UTF-8">Value</attributeId>
-                          <dataType dataType="string" bitLength="32" 
encoding="UTF-8">NULL</dataType>
+                          <dataType dataType="string" bitLength="104" 
encoding="UTF-8">DATE_AND_TIME</dataType>
                         </OpcuaTag>
                       </tag>
                     </PlcTagItem>
diff --git a/plc4j/drivers/opcua/pom.xml b/plc4j/drivers/opcua/pom.xml
index df242d86b4..1369766cf2 100644
--- a/plc4j/drivers/opcua/pom.xml
+++ b/plc4j/drivers/opcua/pom.xml
@@ -110,6 +110,7 @@
         <groupId>org.jacoco</groupId>
         <artifactId>jacoco-maven-plugin</artifactId>
         <configuration>
+          <haltOnFailure>false</haltOnFailure>
           <excludes>
             <exclude>org/eclipse/**/*</exclude>
           </excludes>
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Variant.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Variant.java
index 14397b3060..58e4669943 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Variant.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Variant.java
@@ -44,13 +44,13 @@ public abstract class Variant implements Message {
   protected final boolean arrayLengthSpecified;
   protected final boolean arrayDimensionsSpecified;
   protected final Integer noOfArrayDimensions;
-  protected final List<Boolean> arrayDimensions;
+  protected final List<Integer> arrayDimensions;
 
   public Variant(
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions) {
+      List<Integer> arrayDimensions) {
     super();
     this.arrayLengthSpecified = arrayLengthSpecified;
     this.arrayDimensionsSpecified = arrayDimensionsSpecified;
@@ -70,7 +70,7 @@ public abstract class Variant implements Message {
     return noOfArrayDimensions;
   }
 
-  public List<Boolean> getArrayDimensions() {
+  public List<Integer> getArrayDimensions() {
     return arrayDimensions;
   }
 
@@ -99,7 +99,7 @@ public abstract class Variant implements Message {
     writeOptionalField("noOfArrayDimensions", noOfArrayDimensions, 
writeSignedInt(writeBuffer, 32));
 
     // Array Field (arrayDimensions)
-    writeSimpleTypeArrayField("arrayDimensions", arrayDimensions, 
writeBoolean(writeBuffer));
+    writeSimpleTypeArrayField("arrayDimensions", arrayDimensions, 
writeSignedInt(writeBuffer, 32));
 
     writeBuffer.popContext("Variant");
   }
@@ -133,7 +133,7 @@ public abstract class Variant implements Message {
 
     // Array field
     if (arrayDimensions != null) {
-      lengthInBits += 1 * arrayDimensions.size();
+      lengthInBits += 32 * arrayDimensions.size();
     }
 
     return lengthInBits;
@@ -222,10 +222,10 @@ public abstract class Variant implements Message {
         readOptionalField(
             "noOfArrayDimensions", readSignedInt(readBuffer, 32), 
arrayDimensionsSpecified);
 
-    List<Boolean> arrayDimensions =
+    List<Integer> arrayDimensions =
         readCountArrayField(
             "arrayDimensions",
-            readBoolean(readBuffer),
+            readSignedInt(readBuffer, 32),
             (((noOfArrayDimensions) == (null)) ? 0 : noOfArrayDimensions));
 
     readBuffer.closeContext("Variant");
@@ -241,7 +241,7 @@ public abstract class Variant implements Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions);
+        List<Integer> arrayDimensions);
   }
 
   @Override
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantBoolean.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantBoolean.java
index 452894bc4d..a89d643968 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantBoolean.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantBoolean.java
@@ -50,7 +50,7 @@ public class VariantBoolean extends Variant implements 
Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       byte[] value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -136,7 +136,7 @@ public class VariantBoolean extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantBoolean variantBoolean =
           new VariantBoolean(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantByte.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantByte.java
index d4bb68dfe9..0d488d2aa3 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantByte.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantByte.java
@@ -50,7 +50,7 @@ public class VariantByte extends Variant implements Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<Short> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -138,7 +138,7 @@ public class VariantByte extends Variant implements Message 
{
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantByte variantByte =
           new VariantByte(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantByteString.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantByteString.java
index 7c5478e068..f9b2af6a1b 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantByteString.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantByteString.java
@@ -50,7 +50,7 @@ public class VariantByteString extends Variant implements 
Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<ByteStringArray> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -142,7 +142,7 @@ public class VariantByteString extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantByteString variantByteString =
           new VariantByteString(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDataValue.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDataValue.java
index 424128db2a..7ee036082a 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDataValue.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDataValue.java
@@ -50,7 +50,7 @@ public class VariantDataValue extends Variant implements 
Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<DataValue> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -142,7 +142,7 @@ public class VariantDataValue extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantDataValue variantDataValue =
           new VariantDataValue(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDateTime.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDateTime.java
index 68feac1370..603b8da10f 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDateTime.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDateTime.java
@@ -50,7 +50,7 @@ public class VariantDateTime extends Variant implements 
Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<Long> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -136,7 +136,7 @@ public class VariantDateTime extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantDateTime variantDateTime =
           new VariantDateTime(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDiagnosticInfo.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDiagnosticInfo.java
index 3d4cc55c09..eeebd81b3b 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDiagnosticInfo.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDiagnosticInfo.java
@@ -50,7 +50,7 @@ public class VariantDiagnosticInfo extends Variant implements 
Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<DiagnosticInfo> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -142,7 +142,7 @@ public class VariantDiagnosticInfo extends Variant 
implements Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantDiagnosticInfo variantDiagnosticInfo =
           new VariantDiagnosticInfo(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDouble.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDouble.java
index 6c7f9f33a2..1acb34c938 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDouble.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantDouble.java
@@ -50,7 +50,7 @@ public class VariantDouble extends Variant implements Message 
{
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<Double> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -136,7 +136,7 @@ public class VariantDouble extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantDouble variantDouble =
           new VariantDouble(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantExpandedNodeId.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantExpandedNodeId.java
index 5b4db90d26..0ac9caaa76 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantExpandedNodeId.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantExpandedNodeId.java
@@ -50,7 +50,7 @@ public class VariantExpandedNodeId extends Variant implements 
Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<ExpandedNodeId> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -142,7 +142,7 @@ public class VariantExpandedNodeId extends Variant 
implements Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantExpandedNodeId variantExpandedNodeId =
           new VariantExpandedNodeId(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantExtensionObject.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantExtensionObject.java
index b30622ff80..b914e79d5b 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantExtensionObject.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantExtensionObject.java
@@ -50,7 +50,7 @@ public class VariantExtensionObject extends Variant 
implements Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<ExtensionObject> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -143,7 +143,7 @@ public class VariantExtensionObject extends Variant 
implements Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantExtensionObject variantExtensionObject =
           new VariantExtensionObject(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantFloat.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantFloat.java
index 186aaed2a0..4f8b1b7694 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantFloat.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantFloat.java
@@ -50,7 +50,7 @@ public class VariantFloat extends Variant implements Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<Float> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -136,7 +136,7 @@ public class VariantFloat extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantFloat variantFloat =
           new VariantFloat(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantGuid.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantGuid.java
index fc85b24505..7011f02a82 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantGuid.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantGuid.java
@@ -50,7 +50,7 @@ public class VariantGuid extends Variant implements Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<GuidValue> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -142,7 +142,7 @@ public class VariantGuid extends Variant implements Message 
{
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantGuid variantGuid =
           new VariantGuid(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantInt16.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantInt16.java
index ce6f2cd30c..8950ea2277 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantInt16.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantInt16.java
@@ -50,7 +50,7 @@ public class VariantInt16 extends Variant implements Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<Short> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -138,7 +138,7 @@ public class VariantInt16 extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantInt16 variantInt16 =
           new VariantInt16(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantInt32.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantInt32.java
index 8cc8a9051f..ace173c9fc 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantInt32.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantInt32.java
@@ -50,7 +50,7 @@ public class VariantInt32 extends Variant implements Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<Integer> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -136,7 +136,7 @@ public class VariantInt32 extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantInt32 variantInt32 =
           new VariantInt32(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantInt64.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantInt64.java
index f5bf1d9025..b11d03c2f7 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantInt64.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantInt64.java
@@ -50,7 +50,7 @@ public class VariantInt64 extends Variant implements Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<Long> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -136,7 +136,7 @@ public class VariantInt64 extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantInt64 variantInt64 =
           new VariantInt64(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantLocalizedText.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantLocalizedText.java
index e7ac52373f..7a3706b867 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantLocalizedText.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantLocalizedText.java
@@ -50,7 +50,7 @@ public class VariantLocalizedText extends Variant implements 
Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<LocalizedText> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -142,7 +142,7 @@ public class VariantLocalizedText extends Variant 
implements Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantLocalizedText variantLocalizedText =
           new VariantLocalizedText(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantNodeId.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantNodeId.java
index 215174c888..e91da66e74 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantNodeId.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantNodeId.java
@@ -50,7 +50,7 @@ public class VariantNodeId extends Variant implements Message 
{
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<NodeId> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -142,7 +142,7 @@ public class VariantNodeId extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantNodeId variantNodeId =
           new VariantNodeId(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantNull.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantNull.java
index cfc5715b59..d6d77484a8 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantNull.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantNull.java
@@ -46,7 +46,7 @@ public class VariantNull extends Variant implements Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions) {
+      List<Integer> arrayDimensions) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
   }
 
@@ -92,7 +92,7 @@ public class VariantNull extends Variant implements Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantNull variantNull =
           new VariantNull(
               arrayLengthSpecified, arrayDimensionsSpecified, 
noOfArrayDimensions, arrayDimensions);
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantQualifiedName.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantQualifiedName.java
index 550e91622e..9ff7e799b7 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantQualifiedName.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantQualifiedName.java
@@ -50,7 +50,7 @@ public class VariantQualifiedName extends Variant implements 
Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<QualifiedName> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -142,7 +142,7 @@ public class VariantQualifiedName extends Variant 
implements Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantQualifiedName variantQualifiedName =
           new VariantQualifiedName(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantSByte.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantSByte.java
index 9a5cdb3fa6..921899ecd3 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantSByte.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantSByte.java
@@ -50,7 +50,7 @@ public class VariantSByte extends Variant implements Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       byte[] value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -136,7 +136,7 @@ public class VariantSByte extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantSByte variantSByte =
           new VariantSByte(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantStatusCode.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantStatusCode.java
index 55ae3cca88..538849d02e 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantStatusCode.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantStatusCode.java
@@ -50,7 +50,7 @@ public class VariantStatusCode extends Variant implements 
Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<StatusCode> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -142,7 +142,7 @@ public class VariantStatusCode extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantStatusCode variantStatusCode =
           new VariantStatusCode(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantString.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantString.java
index 31cc206039..5a52922e82 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantString.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantString.java
@@ -50,7 +50,7 @@ public class VariantString extends Variant implements Message 
{
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<PascalString> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -142,7 +142,7 @@ public class VariantString extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantString variantString =
           new VariantString(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantUInt16.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantUInt16.java
index 04bbc933d7..93428581f4 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantUInt16.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantUInt16.java
@@ -50,7 +50,7 @@ public class VariantUInt16 extends Variant implements Message 
{
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<Integer> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -138,7 +138,7 @@ public class VariantUInt16 extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantUInt16 variantUInt16 =
           new VariantUInt16(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantUInt32.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantUInt32.java
index c42a0c7acc..4fd3a59060 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantUInt32.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantUInt32.java
@@ -50,7 +50,7 @@ public class VariantUInt32 extends Variant implements Message 
{
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<Long> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -138,7 +138,7 @@ public class VariantUInt32 extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantUInt32 variantUInt32 =
           new VariantUInt32(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantUInt64.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantUInt64.java
index 054473830c..29e5b7c1d1 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantUInt64.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantUInt64.java
@@ -51,7 +51,7 @@ public class VariantUInt64 extends Variant implements Message 
{
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<BigInteger> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -139,7 +139,7 @@ public class VariantUInt64 extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantUInt64 variantUInt64 =
           new VariantUInt64(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantVariant.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantVariant.java
index dd10e407d9..f5f552ca24 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantVariant.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantVariant.java
@@ -50,7 +50,7 @@ public class VariantVariant extends Variant implements 
Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<Variant> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -142,7 +142,7 @@ public class VariantVariant extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantVariant variantVariant =
           new VariantVariant(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantXmlElement.java
 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantXmlElement.java
index 4da3834ac9..7b93a5d04c 100644
--- 
a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantXmlElement.java
+++ 
b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/VariantXmlElement.java
@@ -50,7 +50,7 @@ public class VariantXmlElement extends Variant implements 
Message {
       boolean arrayLengthSpecified,
       boolean arrayDimensionsSpecified,
       Integer noOfArrayDimensions,
-      List<Boolean> arrayDimensions,
+      List<Integer> arrayDimensions,
       Integer arrayLength,
       List<PascalString> value) {
     super(arrayLengthSpecified, arrayDimensionsSpecified, noOfArrayDimensions, 
arrayDimensions);
@@ -142,7 +142,7 @@ public class VariantXmlElement extends Variant implements 
Message {
         boolean arrayLengthSpecified,
         boolean arrayDimensionsSpecified,
         Integer noOfArrayDimensions,
-        List<Boolean> arrayDimensions) {
+        List<Integer> arrayDimensions) {
       VariantXmlElement variantXmlElement =
           new VariantXmlElement(
               arrayLengthSpecified,
diff --git 
a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java
 
b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java
index a1200481b7..6043a3ba0f 100644
--- 
a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java
+++ 
b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java
@@ -29,8 +29,6 @@ import org.apache.plc4x.java.opcua.tag.OpcuaTag;
 import org.apache.plc4x.java.spi.connection.GeneratedDriverBase;
 import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer;
 import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer;
-import org.apache.plc4x.java.spi.values.LegacyPlcValueHandler;
-import org.apache.plc4x.java.spi.values.PlcValueHandler;
 
 import java.util.Collections;
 import java.util.List;
@@ -64,11 +62,6 @@ public class OpcuaPlcDriver extends 
GeneratedDriverBase<OpcuaAPU> {
         return Collections.singletonList("tcp");
     }
 
-    @Override
-    protected PlcValueHandler getValueHandler() {
-        return new LegacyPlcValueHandler();
-    }
-
     @Override
     protected boolean canRead() {
         return true;
diff --git 
a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/protocol/OpcuaProtocolLogic.java
 
b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/protocol/OpcuaProtocolLogic.java
index 41d8c94cd7..8957e1e40f 100644
--- 
a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/protocol/OpcuaProtocolLogic.java
+++ 
b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/protocol/OpcuaProtocolLogic.java
@@ -22,6 +22,7 @@ import static 
org.apache.plc4x.java.opcua.context.SecureChannel.getX509Certifica
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
+import java.time.*;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 import org.apache.plc4x.java.api.authentication.PlcAuthentication;
@@ -50,7 +51,6 @@ import org.apache.plc4x.java.spi.Plc4xProtocolBase;
 import org.apache.plc4x.java.spi.configuration.HasConfiguration;
 import org.apache.plc4x.java.spi.connection.PlcTagHandler;
 import org.apache.plc4x.java.spi.context.DriverContext;
-import org.apache.plc4x.java.spi.generation.Message;
 import org.apache.plc4x.java.spi.messages.*;
 import org.apache.plc4x.java.spi.messages.utils.DefaultPlcResponseItem;
 import org.apache.plc4x.java.spi.messages.utils.PlcResponseItem;
@@ -59,17 +59,11 @@ import 
org.apache.plc4x.java.spi.model.DefaultPlcConsumerRegistration;
 import org.apache.plc4x.java.spi.model.DefaultPlcSubscriptionTag;
 import org.apache.plc4x.java.spi.transaction.RequestTransactionManager;
 import 
org.apache.plc4x.java.spi.transaction.RequestTransactionManager.RequestTransaction;
-import org.apache.plc4x.java.spi.values.LegacyPlcValueHandler;
-import org.apache.plc4x.java.spi.values.PlcList;
-import org.apache.plc4x.java.spi.values.PlcSTRING;
+import org.apache.plc4x.java.spi.values.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.math.BigInteger;
-import java.time.Duration;
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Consumer;
@@ -90,6 +84,8 @@ public class OpcuaProtocolLogic extends 
Plc4xProtocolBase<OpcuaAPU> implements H
         new ExtensionObjectEncodingMask(false, false, false));
 
     private static final long EPOCH_OFFSET = 116444736000000000L;         
//Offset between OPC UA epoch time and linux epoch time.
+    // IEC 61131-3 date types use 1990-01-01 as epoch, PlcDATE etc. use Unix 
epoch (1970-01-01).
+    private static final long IEC_DATE_EPOCH_OFFSET_DAYS = LocalDate.of(1990, 
1, 1).toEpochDay();
     private final Map<Long, OpcuaSubscriptionHandle> subscriptions = new 
ConcurrentHashMap<>();
     private final RequestTransactionManager tm = new 
RequestTransactionManager();
 
@@ -314,150 +310,270 @@ public class OpcuaProtocolLogic extends 
Plc4xProtocolBase<OpcuaAPU> implements H
         PlcValue value = null;
         if (variant instanceof VariantBoolean) {
             byte[] array = ((VariantBoolean) variant).getValue();
-            int length = array.length;
-            Boolean[] tmpValue = new Boolean[length];
-            for (int i = 0; i < length; i++) {
-                tmpValue[i] = array[i] != 0;
+            List<PlcValue> values = new ArrayList<>(array.length);
+            for (byte b : array) {
+                values.add(new PlcBOOL(b != 0));
             }
-            value = LegacyPlcValueHandler.of(tmpValue);
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantSByte) {
             byte[] array = ((VariantSByte) variant).getValue();
-            value = LegacyPlcValueHandler.of(tag, array);
+            List<PlcValue> values = new ArrayList<>(array.length);
+            for (byte b : array) {
+                values.add(new PlcSINT(b));
+            }
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantByte) {
             List<Short> array = ((VariantByte) variant).getValue();
-            Short[] tmpValue = array.toArray(new Short[0]);
-            value = LegacyPlcValueHandler.of(tmpValue);
+            List<PlcValue> values = new ArrayList<>(array.size());
+            for (Short s : array) {
+                values.add(new PlcUSINT(s));
+            }
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantInt16) {
             List<Short> array = ((VariantInt16) variant).getValue();
-            Short[] tmpValue = array.toArray(new Short[0]);
-            value = LegacyPlcValueHandler.of(tmpValue);
+            List<PlcValue> values = new ArrayList<>(array.size());
+            for (Short s : array) {
+                values.add(new PlcINT(s));
+            }
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantUInt16) {
             List<Integer> array = ((VariantUInt16) variant).getValue();
-            Integer[] tmpValue = array.toArray(new Integer[0]);
-            value = LegacyPlcValueHandler.of(tmpValue);
+            List<PlcValue> values = new ArrayList<>(array.size());
+            for (Integer i : array) {
+                values.add(new PlcUINT(i));
+            }
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantInt32) {
             List<Integer> array = ((VariantInt32) variant).getValue();
-            Integer[] tmpValue = array.toArray(new Integer[0]);
-            value = LegacyPlcValueHandler.of(tmpValue);
+            List<PlcValue> values = new ArrayList<>(array.size());
+            for (Integer i : array) {
+                values.add(new PlcDINT(i));
+            }
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantUInt32) {
             List<Long> array = ((VariantUInt32) variant).getValue();
-            Long[] tmpValue = array.toArray(new Long[0]);
-            value = LegacyPlcValueHandler.of(tmpValue);
+            List<PlcValue> values = new ArrayList<>(array.size());
+            for (Long l : array) {
+                values.add(new PlcUDINT(l));
+            }
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantInt64) {
             List<Long> array = ((VariantInt64) variant).getValue();
-            Long[] tmpValue = array.toArray(new Long[0]);
-            value = LegacyPlcValueHandler.of(tmpValue);
+            List<PlcValue> values = new ArrayList<>(array.size());
+            for (Long l : array) {
+                values.add(new PlcLINT(l));
+            }
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantUInt64) {
-            value = LegacyPlcValueHandler.of(((VariantUInt64) 
variant).getValue());
+            List<BigInteger> array = ((VariantUInt64) variant).getValue();
+            List<PlcValue> values = new ArrayList<>(array.size());
+            for (BigInteger bi : array) {
+                values.add(new PlcULINT(bi));
+            }
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantFloat) {
             List<Float> array = ((VariantFloat) variant).getValue();
-            Float[] tmpValue = array.toArray(new Float[0]);
-            value = LegacyPlcValueHandler.of(tmpValue);
+            List<PlcValue> values = new ArrayList<>(array.size());
+            for (Float f : array) {
+                values.add(new PlcREAL(f));
+            }
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantDouble) {
             List<Double> array = ((VariantDouble) variant).getValue();
-            Double[] tmpValue = array.toArray(new Double[0]);
-            value = LegacyPlcValueHandler.of(tmpValue);
+            List<PlcValue> values = new ArrayList<>(array.size());
+            for (Double d : array) {
+                values.add(new PlcLREAL(d));
+            }
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantString) {
-            int length = ((VariantString) variant).getValue().size();
             List<PascalString> stringArray = ((VariantString) 
variant).getValue();
-            String[] tmpValue = new String[length];
-            for (int i = 0; i < length; i++) {
-                tmpValue[i] = stringArray.get(i).getStringValue();
+            List<PlcValue> values = new ArrayList<>(stringArray.size());
+            for (PascalString ps : stringArray) {
+                values.add(new PlcSTRING(ps.getStringValue()));
             }
-            value = LegacyPlcValueHandler.of(tmpValue);
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantDateTime) {
             List<Long> array = ((VariantDateTime) variant).getValue();
-            int length = array.size();
-            LocalDateTime[] tmpValue = new LocalDateTime[length];
-            for (int i = 0; i < length; i++) {
-                tmpValue[i] = 
LocalDateTime.ofInstant(Instant.ofEpochMilli(getDateTime(array.get(i))), 
ZoneOffset.UTC);
+            List<PlcValue> values = new ArrayList<>(array.size());
+            for (Long l : array) {
+                values.add(DefaultPlcValueHandler.of(tag, 
LocalDateTime.ofInstant(Instant.ofEpochMilli(getDateTime(l)), ZoneOffset.UTC)));
             }
-            value = LegacyPlcValueHandler.of(tmpValue);
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantGuid) {
             List<GuidValue> array = ((VariantGuid) variant).getValue();
-            int length = array.size();
-            String[] tmpValue = new String[length];
-            for (int i = 0; i < length; i++) {
-                //These two data section aren't little endian like the rest.
-                byte[] data4Bytes = array.get(i).getData4();
+            List<PlcValue> values = new ArrayList<>(array.size());
+            for (GuidValue guidValue : array) {
+                //These two data sections aren't little endian like the rest.
+                byte[] data4Bytes = guidValue.getData4();
                 int data4 = 0;
                 for (byte data4Byte : data4Bytes) {
                     data4 = (data4 << 8) + (data4Byte & 0xff);
                 }
-                byte[] data5Bytes = array.get(i).getData5();
+                byte[] data5Bytes = guidValue.getData5();
                 long data5 = 0;
                 for (byte data5Byte : data5Bytes) {
                     data5 = (data5 << 8) + (data5Byte & 0xff);
                 }
-                tmpValue[i] = Long.toHexString(array.get(i).getData1()) + "-" 
+ Integer.toHexString(array.get(i).getData2()) + "-" + 
Integer.toHexString(array.get(i).getData3()) + "-" + Integer.toHexString(data4) 
+ "-" + Long.toHexString(data5);
+                values.add(new 
PlcSTRING(Long.toHexString(guidValue.getData1()) + "-" + 
Integer.toHexString(guidValue.getData2()) + "-" + 
Integer.toHexString(guidValue.getData3()) + "-" + Integer.toHexString(data4) + 
"-" + Long.toHexString(data5)));
             }
-            value = LegacyPlcValueHandler.of(tmpValue);
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantXmlElement) {
-            int length = ((VariantXmlElement) variant).getValue().size();
             List<PascalString> strings = ((VariantXmlElement) 
variant).getValue();
-            String[] tmpValue = new String[length];
-            for (int i = 0; i < length; i++) {
-                tmpValue[i] = strings.get(i).getStringValue();
+            List<PlcValue> values = new ArrayList<>(strings.size());
+            for (PascalString ps : strings) {
+                values.add(new PlcSTRING(ps.getStringValue()));
             }
-            value = LegacyPlcValueHandler.of(tmpValue);
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantLocalizedText) {
-            int length = ((VariantLocalizedText) variant).getValue().size();
             List<LocalizedText> strings = ((VariantLocalizedText) 
variant).getValue();
-            String[] tmpValue = new String[length];
-            for (int i = 0; i < length; i++) {
-                tmpValue[i] = "";
-                tmpValue[i] += strings.get(i).getLocaleSpecified() ? 
strings.get(i).getLocale().getStringValue() + "|" : "";
-                tmpValue[i] += strings.get(i).getTextSpecified() ? 
strings.get(i).getText().getStringValue() : "";
+            List<PlcValue> values = new ArrayList<>(strings.size());
+            for (LocalizedText lt : strings) {
+                String s = "";
+                s += lt.getLocaleSpecified() ? lt.getLocale().getStringValue() 
+ "|" : "";
+                s += lt.getTextSpecified() ? lt.getText().getStringValue() : 
"";
+                values.add(new PlcSTRING(s));
             }
-            value = LegacyPlcValueHandler.of(tmpValue);
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantQualifiedName) {
-            int length = ((VariantQualifiedName) variant).getValue().size();
             List<QualifiedName> strings = ((VariantQualifiedName) 
variant).getValue();
-            String[] tmpValue = new String[length];
-            for (int i = 0; i < length; i++) {
-                tmpValue[i] = "ns=" + strings.get(i).getNamespaceIndex() + 
";s=" + strings.get(i).getName().getStringValue();
+            List<PlcValue> values = new ArrayList<>(strings.size());
+            for (QualifiedName qn : strings) {
+                values.add(new PlcSTRING("ns=" + qn.getNamespaceIndex() + 
";s=" + qn.getName().getStringValue()));
             }
-            value = LegacyPlcValueHandler.of(tmpValue);
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantExtensionObject) {
-            int length = ((VariantExtensionObject) variant).getValue().size();
-            List<ExtensionObject> strings = ((VariantExtensionObject) 
variant).getValue();
-            String[] tmpValue = new String[length];
-            for (int i = 0; i < length; i++) {
-                tmpValue[i] = strings.get(i).toString();
+            List<ExtensionObject> objects = ((VariantExtensionObject) 
variant).getValue();
+            List<PlcValue> values = new ArrayList<>(objects.size());
+            for (ExtensionObject eo : objects) {
+                values.add(new PlcSTRING(eo.toString()));
             }
-            value = LegacyPlcValueHandler.of(tmpValue);
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantNodeId) {
-            int length = ((VariantNodeId) variant).getValue().size();
-            List<NodeId> strings = ((VariantNodeId) variant).getValue();
-            String[] tmpValue = new String[length];
-            for (int i = 0; i < length; i++) {
-                tmpValue[i] = strings.get(i).toString();
+            List<NodeId> nodeIds = ((VariantNodeId) variant).getValue();
+            List<PlcValue> values = new ArrayList<>(nodeIds.size());
+            for (NodeId nid : nodeIds) {
+                values.add(new PlcSTRING(nid.toString()));
             }
-            value = LegacyPlcValueHandler.of(tmpValue);
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantStatusCode) {
-            int length = ((VariantStatusCode) variant).getValue().size();
-            List<StatusCode> strings = ((VariantStatusCode) 
variant).getValue();
-            String[] tmpValue = new String[length];
-            for (int i = 0; i < length; i++) {
-                tmpValue[i] = strings.get(i).toString();
+            List<StatusCode> statusCodes = ((VariantStatusCode) 
variant).getValue();
+            List<PlcValue> values = new ArrayList<>(statusCodes.size());
+            for (StatusCode sc : statusCodes) {
+                values.add(new PlcSTRING(sc.toString()));
             }
-            value = LegacyPlcValueHandler.of(tmpValue);
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantByteString) {
-            PlcList plcList = new PlcList();
             List<ByteStringArray> array = ((VariantByteString) 
variant).getValue();
+            List<PlcValue> values = new ArrayList<>(array.size());
             for (ByteStringArray byteStringArray : array) {
-                int length = byteStringArray.getValue().size();
-                Short[] tmpValue = new Short[length];
-                for (int i = 0; i < length; i++) {
-                    tmpValue[i] = byteStringArray.getValue().get(i);
-                }
-                plcList.add(LegacyPlcValueHandler.of(tmpValue));
+                Short[] tmpValue = byteStringArray.getValue().toArray(new 
Short[0]);
+                values.add(DefaultPlcValueHandler.of(tag, tmpValue));
             }
-            value = plcList;
+            value = structurePlcValues(values, variant);
         }
+
+        // If the tag declares a specific type (via suffix like :TIME, :DATE, 
etc.),
+        // re-interpret the raw numeric value as the correct IEC 61131-3 type.
+        if (value != null && tag != null) {
+            PlcValueType targetType = tag.getPlcValueType();
+            if (targetType != PlcValueType.NULL) {
+                value = applyTypeOverride(value, targetType);
+            }
+        }
+
         return value;
     }
 
+    /**
+     * Recursively applies a type override to a PlcValue.
+     * For PlcList values, each element is converted individually.
+     * For scalar values, the raw numeric is re-interpreted as the target type.
+     */
+    private static PlcValue applyTypeOverride(PlcValue value, PlcValueType 
targetType) {
+        // If the value is already a properly typed temporal value (e.g., from 
DTL
+        // conversion), skip the override to avoid corrupting it.
+        PlcValueType currentType = value.getPlcValueType();
+        if (currentType == targetType || isTemporalType(currentType)) {
+            return value;
+        }
+        if (value instanceof PlcList list) {
+            List<PlcValue> converted = new ArrayList<>(list.getLength());
+            for (PlcValue item : list.getList()) {
+                converted.add(applyTypeOverride(item, targetType));
+            }
+            return new PlcList(converted);
+        }
+        long raw = value.getLong();
+        return switch (targetType) {
+            case TIME -> new PlcTIME(raw);
+            case LTIME -> new PlcLTIME(raw);
+            case DATE ->
+                // S7/IEC value is days since 1990-01-01, PlcDATE expects days 
since 1970-01-01
+                new PlcDATE(raw + IEC_DATE_EPOCH_OFFSET_DAYS);
+            case LDATE ->
+                // PlcLDATE expects seconds since 1970-01-01
+                new PlcLDATE(raw + IEC_DATE_EPOCH_OFFSET_DAYS * 86400L);
+            case TIME_OF_DAY ->
+                // S7/IEC value is milliseconds since midnight
+                new PlcTIME_OF_DAY(LocalTime.ofNanoOfDay(raw * 1_000_000L));
+            case LTIME_OF_DAY -> new PlcLTIME_OF_DAY(raw);
+            case DATE_AND_TIME ->
+                // PlcDATE_AND_TIME expects seconds since 1970-01-01
+                new PlcDATE_AND_TIME(raw + IEC_DATE_EPOCH_OFFSET_DAYS * 
86400L);
+            case DATE_AND_LTIME ->
+                // PlcDATE_AND_LTIME expects nanoseconds since 1970-01-01
+                new PlcDATE_AND_LTIME(raw + IEC_DATE_EPOCH_OFFSET_DAYS * 
86400L * 1_000_000_000L);
+            case LDATE_AND_TIME ->
+                // PlcLDATE_AND_TIME expects milliseconds since 1970-01-01
+                new PlcLDATE_AND_TIME(raw + IEC_DATE_EPOCH_OFFSET_DAYS * 
86400L * 1000L);
+            default -> value;
+        };
+    }
+
+    private static boolean isTemporalType(PlcValueType type) {
+        return switch (type) {
+            case TIME, LTIME, DATE, LDATE, TIME_OF_DAY, LTIME_OF_DAY, 
DATE_AND_TIME, DATE_AND_LTIME, LDATE_AND_TIME ->
+                true;
+            default -> false;
+        };
+    }
+
+    /**
+     * Structures a flat list of PlcValues according to the variant's 
dimensionality:
+     * - Single value: returns the scalar PlcValue directly
+     * - 1D array (no array dimensions specified): returns a flat PlcList
+     * - Multi-dimensional array: returns nested PlcLists matching the 
declared dimensions
+     */
+    private static PlcValue structurePlcValues(List<PlcValue> values, Variant 
variant) {
+        if (values.size() == 1) {
+            return values.getFirst();
+        }
+        List<Integer> dimensions = variant.getArrayDimensions();
+        if (dimensions == null || dimensions.isEmpty()) {
+            return new PlcList(values);
+        }
+        return buildMultiDimensionalList(values, dimensions);
+    }
+
+    /**
+     * Recursively partitions a flat list of PlcValues into nested PlcLists
+     * according to the given dimensions.
+     * E.g., 6 values with dimensions [3, 2] produces a PlcList of 3 PlcLists 
of 2 values each.
+     */
+    private static PlcValue buildMultiDimensionalList(List<PlcValue> 
flatValues, List<Integer> dimensions) {
+        if (dimensions.size() <= 1) {
+            return new PlcList(flatValues);
+        }
+        int currentDim = dimensions.getFirst();
+        List<Integer> remainingDims = dimensions.subList(1, dimensions.size());
+        int chunkSize = flatValues.size() / currentDim;
+        List<PlcValue> result = new ArrayList<>(currentDim);
+        for (int i = 0; i < currentDim; i++) {
+            result.add(buildMultiDimensionalList(flatValues.subList(i * 
chunkSize, (i + 1) * chunkSize), remainingDims));
+        }
+        return new PlcList(result);
+    }
+
     private static PlcResponseCode mapOpcStatusCode(long opcStatusCode, 
PlcResponseCode fallback) {
         if (!OpcuaStatusCode.isDefined(opcStatusCode)) {
             return PlcResponseCode.INTERNAL_ERROR;
diff --git 
a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/ManualOpcUaS71500NewFWDriverTest.java
 
b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/ManualOpcUaS71500NewFWDriverTest.java
new file mode 100644
index 0000000000..cf4d99230f
--- /dev/null
+++ 
b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/ManualOpcUaS71500NewFWDriverTest.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.opcua;
+
+import org.apache.plc4x.java.spi.values.*;
+import org.apache.plc4x.test.manual.ManualTest;
+
+import java.math.BigDecimal;
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.List;
+
+public class ManualOpcUaS71500NewFWDriverTest extends ManualTest {
+
+    public ManualOpcUaS71500NewFWDriverTest(String connectionString) {
+        super(connectionString, true, true, true, true, 100);
+    }
+
+    public static void main(String[] args) throws Exception {
+        boolean testArrays = true;
+        ManualOpcUaS71500NewFWDriverTest test = new 
ManualOpcUaS71500NewFWDriverTest("opcua://192.168.24.66:4840");
+        test.addTestCase(/*"g_b1",*/            "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_b1\";BOOL",                   new PlcBOOL(true));
+        test.addTestCase(/*"g_b8",*/            "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_b8\";BYTE",                     new PlcBYTE(0xAB));
+        test.addTestCase(/*"g_s8",*/            "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_s8\";SINT",                     new PlcSINT(-12));
+        test.addTestCase(/*"g_u8",*/            "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_u8\";USINT",                    new PlcUSINT(250));
+        // TODO: Getting "INVALID_ADDRESS", as WORD is not part of 
OpcuaDataType
+//        test.addTestCase(/*"g_b16",*/           "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_b16\";WORD",                  new PlcWORD(0xBEEF));
+        test.addTestCase(/*"g_s16",*/           "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_s16\";INT",                  new PlcINT(-1234));
+        test.addTestCase(/*"g_u16",*/           "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_u16\";UINT",                  new PlcUINT(54321));
+        // TODO: Getting "INVALID_ADDRESS", as DWORD is not part of 
OpcuaDataType
+//        test.addTestCase(/*"g_b32",*/           "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_b32\";DWORD",                  new PlcDWORD(0xDEADBEEFL));
+        test.addTestCase(/*"g_s32",*/           "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_s32\";DINT",                  new PlcDINT(-12345678));
+        test.addTestCase(/*"g_u32",*/           "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_u32\";UDINT",                  new PlcUDINT(305419896));
+        // TODO: Getting "INVALID_ADDRESS", as LWORD is not part of 
OpcuaDataType
+//        test.addTestCase(/*"g_b64",*/           "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_b64\";LWORD",                  new PlcLWORD(0x0123_4567_89AB_CDEFL));
+        test.addTestCase(/*"g_s64",*/           "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_s64\";LINT",                  new PlcLINT(-9223372036854770000L));
+        // TODO: This seems to write different values to the plc.
+//        test.addTestCase(/*"g_u64",*/           "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_u64\";ULINT",                  new PlcULINT(new 
BigDecimal("18446744073709551000")));
+        test.addTestCase(/*"g_r32",*/           "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_r32\";REAL",                  new PlcREAL(3.14159));
+        test.addTestCase(/*"g_r64",*/           "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_r64\";LREAL",                  new PlcLREAL(2.71828182845905));
+        // TODO: Writing of TIME doesn't seem to be supported.
+//        test.addTestCase(/*"g_tim",*/           "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_tim\";TIME",             new PlcTIME(2500)); // Is returned as Int32
+        // TODO: IEC 61131-3 date types use 1990-01-01 as epoch, PlcDATE etc. 
use Unix epoch (1970-01-01).
+//        test.addTestCase(/*"g_dat",*/           "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_dat\";DATE",             new PlcDATE(LocalDate.of(2025, 11, 12))); 
// Is returned as UInt16
+        // TODO: S7/IEC value is milliseconds since midnight
+//        test.addTestCase(/*"g_timoday",*/       "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_timoday\";TIME_OF_DAY",  new PlcTIME_OF_DAY(LocalTime.of(14, 33, 21, 
250000000))); // Is returned as UInt32
+        // TODO: Getting a class cast exception here
+//        test.addTestCase(/*"g_dattim",*/        "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_dattim\";DATE_AND_TIME",               new 
PlcDATE_AND_LTIME(LocalDateTime.of(2025, 11, 12, 14, 33, 21, 500_000_000)));
+
+        test.addTestCase(/*"g_str",*/           "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_str\";STRING",                  new PlcSTRING("Hello PLC4X"));
+        // TODO: Getting "INVALID_ADDRESS", as WSTRING is not part of 
OpcuaDataType
+//        test.addTestCase(/*"g_wstr",*/          "ns=3;s=\"OPC_UA_DB\".\"OPC 
Data\".\"g_wstr\";WSTRING",                 new PlcWSTRING("Grüße von PLC4X"));
+        if(testArrays) {
+            test.addTestCase(/*"g_arrBool",*/       
"ns=3;s=\"OPC_UA_DB\".\"OPC Data\".\"g_arrBool\"", new PlcList(List.of(
+                new PlcBOOL(true), new PlcBOOL(false), new PlcBOOL(true), new 
PlcBOOL(true),
+                new PlcBOOL(false), new PlcBOOL(false), new PlcBOOL(true), new 
PlcBOOL(false))
+            ));
+            test.addTestCase(/*"g_arrByte",*/       
"ns=3;s=\"OPC_UA_DB\".\"OPC Data\".\"g_arrByte\"", new PlcList(List.of(
+                new PlcBYTE(0xDE), new PlcBYTE(0xAD), new PlcBYTE(0xBE), new 
PlcBYTE(0xEF),
+                new PlcBYTE(0x12), new PlcBYTE(0x34), new PlcBYTE(0x56), new 
PlcBYTE(0x78))
+            ));
+            test.addTestCase(/*"g_arrInt",*/        
"ns=3;s=\"OPC_UA_DB\".\"OPC Data\".\"g_arrInt\"", new PlcList(List.of(
+                new PlcINT(-3), new PlcINT(-1), new PlcINT(0), new PlcINT(1), 
new PlcINT(3))
+            ));
+            test.addTestCase(/*"g_arrUInt",*/       
"ns=3;s=\"OPC_UA_DB\".\"OPC Data\".\"g_arrUInt\"", new PlcList(List.of(
+                new PlcUINT(1), new PlcUINT(10), new PlcUINT(100), new 
PlcUINT(1000), new PlcUINT(10000))
+            ));
+            test.addTestCase(/*"g_arrDInt",*/       
"ns=3;s=\"OPC_UA_DB\".\"OPC Data\".\"g_arrDInt\"", new PlcList(List.of(
+                new PlcDINT(-1000), new PlcDINT(0), new PlcDINT(1000), new 
PlcDINT(2000000))
+            ));
+            test.addTestCase(/*"g_arrUDInt",*/       
"ns=3;s=\"OPC_UA_DB\".\"OPC Data\".\"g_arrUDInt\"", new PlcList(List.of(
+                new PlcUDINT(0), new PlcUDINT(1), new PlcUDINT(0xFFFF), new 
PlcUDINT(0x12345678))
+            ));
+            test.addTestCase(/*"g_arrLReal",*/      
"ns=3;s=\"OPC_UA_DB\".\"OPC Data\".\"g_arrLReal\"", new PlcList(List.of(
+                new PlcLREAL(1.5), new PlcLREAL(-2.0), new PlcLREAL(0.125))
+            ));
+            test.addTestCase(/*"g_arrTime",*/       
"ns=3;s=\"OPC_UA_DB\".\"OPC Data\".\"g_arrTime\";TIME", new PlcList(List.of(
+                new PlcTIME(Duration.ofMillis(10)), new 
PlcTIME(Duration.ofSeconds(1)), new PlcTIME(Duration.ofSeconds(10)))
+            ));
+            test.addTestCase(/*"g_arrString",*/     
"ns=3;s=\"OPC_UA_DB\".\"OPC Data\".\"g_arrString\"", new PlcList(List.of(
+                new PlcSTRING("alpha"), new PlcSTRING("beta"), new 
PlcSTRING("gamma"))
+            ));
+            test.addTestCase(/*"g_arrWString",*/     
"ns=3;s=\"OPC_UA_DB\".\"OPC Data\".\"g_arrWString\"", new PlcList(List.of(
+                new PlcWSTRING("Äpfel"), new PlcWSTRING("Öl"))
+            ));
+            test.addTestCase(/*"g_matI16_2x3",*/    
"ns=3;s=\"OPC_UA_DB\".\"OPC Data\".\"g_matI16_2x3\"", new PlcList(List.of(
+                new PlcList(List.of(
+                    new PlcINT(10), new PlcINT(11), new PlcINT(12)
+                )),
+                new PlcList(List.of(
+                    new PlcINT(-10), new PlcINT(-11), new PlcINT(-12)
+                )))
+            ));
+            test.addTestCase(/*"g_matR32_3x2",*/    
"ns=3;s=\"OPC_UA_DB\".\"OPC Data\".\"g_matR32_3x2\"", new PlcList(List.of(
+                new PlcList(List.of(
+                    new PlcREAL(1.0), new PlcREAL(1.5)
+                )),
+                new PlcList(List.of(
+                    new PlcREAL(2.0), new PlcREAL(2.5)
+                )),
+                new PlcList(List.of(
+                    new PlcREAL(3.0), new PlcREAL(3.5)
+                )))
+            ));
+            test.addTestCase(/*"g_cubeU16_2x2x2",*/ 
"ns=3;s=\"OPC_UA_DB\".\"OPC Data\".\"g_cubeU16_2x2x2\"", new PlcList(List.of(
+                new PlcList(List.of(
+                    new PlcList(List.of(
+                        new PlcUINT(1), new PlcUINT(2)
+                    )),
+                    new PlcList(List.of(
+                        new PlcUINT(3), new PlcUINT(4)
+                    ))
+                )),
+                new PlcList(List.of(
+                    new PlcList(List.of(
+                        new PlcUINT(5), new PlcUINT(6)
+                    )),
+                    new PlcList(List.of(
+                        new PlcUINT(7), new PlcUINT(8)
+                    ))
+                )))
+            ));
+        }
+
+        long start = System.currentTimeMillis();
+        test.run();
+        long end = System.currentTimeMillis();
+        System.out.printf("Finished in %d ms", end - start);
+    }
+
+}
diff --git 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/DefaultPlcValueHandler.java
 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/DefaultPlcValueHandler.java
index 1cd73fdbc6..125cb18c9d 100644
--- 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/DefaultPlcValueHandler.java
+++ 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/DefaultPlcValueHandler.java
@@ -26,6 +26,7 @@ import org.apache.plc4x.java.api.model.PlcTag;
 import org.apache.plc4x.java.api.types.PlcValueType;
 import org.apache.plc4x.java.api.value.PlcValue;
 
+import java.lang.reflect.Array;
 import java.math.BigInteger;
 import java.time.Duration;
 import java.time.LocalDate;
@@ -82,7 +83,7 @@ public class DefaultPlcValueHandler implements 
PlcValueHandler {
     }
 
     private static PlcValue ofElements(PlcValueType type, List<ArrayInfo> 
arrayInfos, Object[] values) {
-        ArrayInfo arrayInfo = arrayInfos.get(0);
+        ArrayInfo arrayInfo = arrayInfos.getFirst();
 
         if(values.length == 1) {
             if(values[0] instanceof Object[]) {
@@ -91,8 +92,7 @@ public class DefaultPlcValueHandler implements 
PlcValueHandler {
                 values = ((Collection<?>) values[0]).toArray();
             } else if(values[0] instanceof PlcList) {
                 values = ((PlcList) values[0]).getList().toArray();
-            } else if(values[0] instanceof PlcRawByteArray) {
-                PlcRawByteArray plcRawByteArray = (PlcRawByteArray) values[0];
+            } else if(values[0] instanceof PlcRawByteArray plcRawByteArray) {
                 if(plcRawByteArray.getRaw().length != arrayInfo.getSize()) {
                     throw new PlcRuntimeException(String.format("Expecting %d 
items, but got %d", arrayInfo.getSize(), plcRawByteArray.getRaw().length));
                 }
@@ -126,6 +126,18 @@ public class DefaultPlcValueHandler implements 
PlcValueHandler {
         if(type == null) {
             return of(value);
         }
+
+        // If this is not a List type, and we're passing in an array or a 
collection with exactly one element,
+        // get that element instead.
+        if (type != PlcValueType.List) {
+            if(value.getClass().isArray() && (Array.getLength(value) == 1)) {
+                value = Array.get(value, 0);
+            }
+            else if((value instanceof Collection<?> col) && (col.size() == 1)) 
{
+                value = col.iterator().next();
+            }
+        }
+
         switch (type) {
             case BOOL:
                 return PlcBOOL.of(value);
diff --git 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/LegacyPlcValueHandler.java
 
b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/LegacyPlcValueHandler.java
deleted file mode 100644
index 0343bc4434..0000000000
--- 
a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/LegacyPlcValueHandler.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.plc4x.java.spi.values;
-
-import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
-import org.apache.plc4x.java.api.exceptions.PlcUnsupportedDataTypeException;
-import org.apache.plc4x.java.api.model.PlcTag;
-import org.apache.plc4x.java.api.value.PlcValue;
-
-import java.math.BigInteger;
-import java.time.Duration;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.util.List;
-
-public class LegacyPlcValueHandler implements PlcValueHandler {
-
-    public PlcValue newPlcValue(Object value) {
-        return of(new Object[]{value});
-    }
-
-    public PlcValue newPlcValue(Object[] values) {
-        return of(values);
-    }
-
-    public PlcValue newPlcValue(PlcTag tag, Object value) {
-        return of(tag, new Object[]{value});
-    }
-
-    public PlcValue newPlcValue(PlcTag tag, Object[] values) {
-        return of(tag, values);
-    }
-
-    public static PlcValue of(Object value) {
-        return of(new Object[]{value});
-    }
-
-    public static PlcValue of(List<?> value) {
-        return of(value.toArray());
-    }
-
-    public static PlcValue of(Object[] values) {
-        if (values.length != 1) {
-            PlcList list = new PlcList();
-            for (Object value : values) {
-                list.add(of(new Object[]{value}));
-            }
-            return list;
-        }
-        Object value = values[0];
-        if (value instanceof Boolean) {
-            return PlcBOOL.of(value);
-        }
-        if (value instanceof Byte) {
-            return PlcSINT.of(value);
-        }
-        if (value instanceof byte[]) {
-            return PlcRawByteArray.of(value);
-        }
-        if (value instanceof Short) {
-            return PlcINT.of(value);
-        }
-        if (value instanceof Integer) {
-            return PlcDINT.of(value);
-        }
-        if (value instanceof Long) {
-            return PlcLINT.of(value);
-        }
-        if (value instanceof BigInteger) {
-            return PlcLINT.of(value);
-        }
-        if (value instanceof Float) {
-            return PlcREAL.of(value);
-        }
-        if (value instanceof Double) {
-            return PlcLREAL.of(value);
-        }
-        if (value instanceof Duration) {
-            return new PlcTIME((Duration) value);
-        }
-        if (value instanceof LocalTime) {
-            return new PlcTIME_OF_DAY((LocalTime) value);
-        }
-        if (value instanceof LocalDate) {
-            return new PlcDATE((LocalDate) value);
-        }
-        if (value instanceof LocalDateTime) {
-            return new PlcDATE_AND_TIME((LocalDateTime) value);
-        }
-        if (value instanceof String) {
-            return new PlcSTRING((String) value);
-        }
-        if (value instanceof PlcValue) {
-            return (PlcValue) value;
-        }
-        throw new PlcUnsupportedDataTypeException("Data Type " + 
value.getClass()
-            + " Is not supported");
-    }
-
-
-    public static PlcValue of(PlcTag tag, Object value) {
-        return of(tag, new Object[]{value});
-    }
-
-
-    public static PlcValue of(PlcTag tag, Object[] values) {
-        if (values.length == 1) {
-            Object value = values[0];
-            if(tag.getPlcValueType() == null) {
-                // TODO: This is a hacky shortcut ..
-                if(value instanceof PlcValue) {
-                    return (PlcValue) value;
-                }
-                return new PlcNull();
-            }
-            if (value instanceof PlcValue) {
-                PlcValue plcValue = (PlcValue) value;
-                if (plcValue.getPlcValueType() == tag.getPlcValueType()) {
-                    return (PlcValue) value;
-                } else {
-                    throw new PlcRuntimeException("Expected PlcValue of type " 
+ tag.getPlcValueType().name() + " but got " + 
plcValue.getPlcValueType().name());
-                }
-            }
-            switch (tag.getPlcValueType()) {
-                case BOOL:
-                    return PlcBOOL.of(value);
-                case BYTE:
-                    if(value instanceof Short) {
-                        return new PlcBYTE((short) value);
-                    } else if(value instanceof Integer) {
-                        return new PlcBYTE(((Integer) value).shortValue());
-                    } else if(value instanceof Long) {
-                        return new PlcBYTE(((Long) value).shortValue());
-                    } else if(value instanceof BigInteger) {
-                        return new PlcBYTE(((BigInteger) value).shortValue());
-                    } else if(value instanceof String) {
-                        try {
-                            return new PlcBYTE(Short.valueOf((String) value));
-                        } catch (NumberFormatException e) {
-                            throw new PlcRuntimeException("Value of " + value 
+ " not parseable as Byte");
-                        }
-                    }
-                    throw new PlcRuntimeException("BYTE requires short");
-                case SINT:
-                    return PlcSINT.of(value);
-                case USINT:
-                    return PlcUSINT.of(value);
-                case INT:
-                    return PlcINT.of(value);
-                case UINT:
-                    return PlcUINT.of(value);
-                case WORD:
-                    if(value instanceof Short) {
-                        return new PlcWORD((int) value);
-                    } else if(value instanceof Integer) {
-                        return new PlcWORD((int) value);
-                    } else if(value instanceof Long) {
-                        return new PlcWORD(((Long) value).intValue());
-                    } else if(value instanceof BigInteger) {
-                        return new PlcWORD(((BigInteger) value).intValue());
-                    } else if(value instanceof String) {
-                        try {
-                            return new PlcWORD(Integer.valueOf((String) 
value));
-                        } catch (NumberFormatException e) {
-                            throw new PlcRuntimeException("Value of " + value 
+ " not parseable as Integer");
-                        }
-                    }
-                    throw new PlcRuntimeException("WORD requires int");
-                case DINT:
-                    return PlcDINT.of(value);
-                case UDINT:
-                    return PlcUDINT.of(value);
-                case DWORD:
-                    if(value instanceof Short) {
-                        return new PlcDWORD((long) value);
-                    } else if(value instanceof Integer) {
-                        return new PlcDWORD((long) value);
-                    } else if(value instanceof Long) {
-                        return new PlcDWORD((long) value);
-                    } else if(value instanceof BigInteger) {
-                        return new PlcDWORD(((BigInteger) value).longValue());
-                    } else if(value instanceof String) {
-                        try {
-                            return new PlcDWORD(Long.valueOf((String) value));
-                        } catch (NumberFormatException e) {
-                            throw new PlcRuntimeException("Value of " + value 
+ " not parseable as Long");
-                        }
-                    }
-                    throw new PlcRuntimeException("DWORD requires long");
-                case LINT:
-                    return PlcLINT.of(value);
-                case ULINT:
-                    return PlcULINT.of(value);
-                case LWORD:
-                    if(value instanceof Short) {
-                        return new PlcLWORD(BigInteger.valueOf((long) value));
-                    } else if(value instanceof Integer) {
-                        return new PlcLWORD(BigInteger.valueOf((long) value));
-                    } else if(value instanceof Long) {
-                        return new PlcLWORD(BigInteger.valueOf((long) value));
-                    } else if(value instanceof BigInteger) {
-                        return new PlcLWORD((BigInteger) value);
-                    } else if(value instanceof String) {
-                        try {
-                            return new PlcLWORD(new BigInteger((String) 
value));
-                        } catch (NumberFormatException e) {
-                            throw new PlcRuntimeException("Value of " + value 
+ " not parseable as BigInteger");
-                        }
-                    }
-                    throw new PlcRuntimeException("LWORD requires BigInteger");
-                case REAL:
-                    return PlcREAL.of(value);
-                case LREAL:
-                    return PlcLREAL.of(value);
-                case CHAR:
-                    return PlcCHAR.of(value);
-                case WCHAR:
-                    return PlcWCHAR.of(value);
-                case STRING:
-                    return PlcSTRING.of(value);
-                case WSTRING:
-                    return PlcWSTRING.of(value);
-                case TIME:
-                    return PlcTIME.of(value);
-                case DATE:
-                    return PlcDATE.of(value);
-                case TIME_OF_DAY:
-                    return PlcTIME_OF_DAY.of(value);
-                case DATE_AND_TIME:
-                    return PlcDATE_AND_TIME.of(value);
-                default:
-                    return customDataType(new Object[]{value});
-            }
-        } else {
-            PlcList list = new PlcList();
-            for (Object value : values) {
-                list.add(of(tag, new Object[]{value}));
-            }
-            return list;
-        }
-    }
-
-    public static PlcValue customDataType(Object[] values) {
-        return of(values);
-    }
-}
diff --git 
a/protocols/opcua/src/main/generated/protocols/opcua/opc-manual.mspec 
b/protocols/opcua/src/main/generated/protocols/opcua/opc-manual.mspec
index 380da9f2b8..30a38514c8 100644
--- a/protocols/opcua/src/main/generated/protocols/opcua/opc-manual.mspec
+++ b/protocols/opcua/src/main/generated/protocols/opcua/opc-manual.mspec
@@ -2735,8 +2735,8 @@
             [array DiagnosticInfo value count 'arrayLength == null ? 1 : 
arrayLength']
         ]
     ]
-    [optional int 32 noOfArrayDimensions 'arrayDimensionsSpecified']
-    [array bit arrayDimensions count 'noOfArrayDimensions == null ? 0 : 
noOfArrayDimensions']
+    [optional int 32 noOfArrayDimensions 'arrayDimensionsSpecified'            
                                            ]
+    [array    int 32 arrayDimensions     count                      
'noOfArrayDimensions == null ? 0 : noOfArrayDimensions']
 ]
 
 // node type, with two leading reserved bytes
diff --git a/protocols/opcua/src/main/xslt/opc-manual.xsl 
b/protocols/opcua/src/main/xslt/opc-manual.xsl
index c0fd1267b8..baea248bc3 100644
--- a/protocols/opcua/src/main/xslt/opc-manual.xsl
+++ b/protocols/opcua/src/main/xslt/opc-manual.xsl
@@ -354,8 +354,8 @@
             [array DiagnosticInfo value count 'arrayLength == null ? 1 : 
arrayLength']
         ]
     ]
-    [optional int 32 noOfArrayDimensions 'arrayDimensionsSpecified']
-    [array bit arrayDimensions count 'noOfArrayDimensions == null ? 0 : 
noOfArrayDimensions']
+    [optional int 32 noOfArrayDimensions 'arrayDimensionsSpecified'            
                                            ]
+    [array    int 32 arrayDimensions     count                      
'noOfArrayDimensions == null ? 0 : noOfArrayDimensions']
 ]
 
 // node type, with two leading reserved bytes
diff --git 
a/protocols/opcua/src/test/resources/protocols/opcua/DriverTestsuite.xml 
b/protocols/opcua/src/test/resources/protocols/opcua/DriverTestsuite.xml
index 84fd77de48..8427357d44 100644
--- a/protocols/opcua/src/test/resources/protocols/opcua/DriverTestsuite.xml
+++ b/protocols/opcua/src/test/resources/protocols/opcua/DriverTestsuite.xml
@@ -1338,7 +1338,7 @@
           <tags isList="true">
             <tag className="org.apache.plc4x.test.driver.internal.api.TestTag">
               <name>time</name>
-              <address>ns=0;i=2258</address>
+              <address>ns=0;i=2258;DATE_AND_TIME</address>
             </tag>
           </tags>
         </TestReadRequest>
@@ -1681,7 +1681,7 @@
                         <OpcuaTag>
                           <nodeId dataType="string" bitLength="88" 
encoding="UTF-8">ns=0;i=2258</nodeId>
                           <attributeId dataType="string" bitLength="40" 
encoding="UTF-8">Value</attributeId>
-                          <dataType dataType="string" bitLength="32" 
encoding="UTF-8">NULL</dataType>
+                          <dataType dataType="string" bitLength="104" 
encoding="UTF-8">DATE_AND_TIME</dataType>
                         </OpcuaTag>
                       </tag>
                     </PlcTagItem>


Reply via email to