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