diff --git a/src/ZB.MOM.WW.OtOpcUa.Driver.TwinCAT/AdsTwinCATClient.cs b/src/ZB.MOM.WW.OtOpcUa.Driver.TwinCAT/AdsTwinCATClient.cs
index b6a0e8d..5104cde 100644
--- a/src/ZB.MOM.WW.OtOpcUa.Driver.TwinCAT/AdsTwinCATClient.cs
+++ b/src/ZB.MOM.WW.OtOpcUa.Driver.TwinCAT/AdsTwinCATClient.cs
@@ -49,18 +49,27 @@ internal sealed class AdsTwinCATClient : ITwinCATClient
string symbolPath,
TwinCATDataType type,
int? bitIndex,
+ int[]? arrayDimensions,
CancellationToken cancellationToken)
{
try
{
var clrType = MapToClrType(type);
- var result = await _client.ReadValueAsync(symbolPath, clrType, cancellationToken)
+ var readType = IsWholeArray(arrayDimensions) ? clrType.MakeArrayType() : clrType;
+
+ var result = await _client.ReadValueAsync(symbolPath, readType, cancellationToken)
.ConfigureAwait(false);
if (result.ErrorCode != AdsErrorCode.NoError)
return (null, TwinCATStatusMapper.MapAdsError((uint)result.ErrorCode));
var value = result.Value;
+ if (IsWholeArray(arrayDimensions))
+ {
+ value = PostProcessArray(type, value);
+ return (value, TwinCATStatusMapper.Good);
+ }
+
if (bitIndex is int bit && type == TwinCATDataType.Bool && value is not bool)
value = ExtractBit(value, bit);
value = PostProcessIecTime(type, value);
@@ -73,13 +82,40 @@ internal sealed class AdsTwinCATClient : ITwinCATClient
}
}
+ private static bool IsWholeArray(int[]? arrayDimensions) =>
+ arrayDimensions is { Length: > 0 } && arrayDimensions.All(d => d > 0);
+
+ /// Apply per-element IEC TIME/DATE post-processing to a flat array result.
+ private static object? PostProcessArray(TwinCATDataType type, object? value)
+ {
+ if (value is not Array arr) return value;
+ var elementProjector = type switch
+ {
+ TwinCATDataType.Time or TwinCATDataType.TimeOfDay
+ or TwinCATDataType.Date or TwinCATDataType.DateTime
+ => (Func