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

cdutz pushed a commit to branch feat/improved-s7-opcua-support
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/feat/improved-s7-opcua-support 
by this push:
     new 44a9064c66 chore: Ported the initial fix for the reading of arrays.
44a9064c66 is described below

commit 44a9064c66af72581c88b0afcf0244cb2077602a
Author: Christofer Dutz <[email protected]>
AuthorDate: Mon Feb 23 08:51:08 2026 +0100

    chore: Ported the initial fix for the reading of arrays.
---
 .../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 +-
 .../java/opcua/protocol/OpcuaProtocolLogic.java    | 293 +++++++++++++++------
 .../opcua/ManualOpcUaS71500NewFWDriverTest.java    |   2 +-
 .../generated/protocols/opcua/opc-manual.mspec     |   4 +-
 protocols/opcua/src/main/xslt/opc-manual.xsl       |   4 +-
 31 files changed, 272 insertions(+), 151 deletions(-)

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/protocol/OpcuaProtocolLogic.java
 
b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/protocol/OpcuaProtocolLogic.java
index 6b804959db..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
@@ -59,8 +59,7 @@ 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.DefaultPlcValueHandler;
-import org.apache.plc4x.java.spi.values.PlcList;
+import org.apache.plc4x.java.spi.values.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -85,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();
 
@@ -309,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 = DefaultPlcValueHandler.of(tag, tmpValue);
+            value = structurePlcValues(values, variant);
         } else if (variant instanceof VariantSByte) {
             byte[] array = ((VariantSByte) variant).getValue();
-            value = DefaultPlcValueHandler.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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, ((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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, 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 = DefaultPlcValueHandler.of(tag, 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(DefaultPlcValueHandler.of(tag, 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
index 9b7050b038..cf4d99230f 100644
--- 
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
@@ -35,7 +35,7 @@ public class ManualOpcUaS71500NewFWDriverTest extends 
ManualTest {
     }
 
     public static void main(String[] args) throws Exception {
-        boolean testArrays = false;
+        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));
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

Reply via email to