fix(s7): treat ArrayCount>=1 as array so 1-element arrays read as arrays (review I-2)
This commit is contained in:
@@ -216,9 +216,11 @@ public sealed class S7ArrayReadTests
|
||||
arr.ArrayDim.ShouldBe(8u);
|
||||
}
|
||||
|
||||
/// <summary>Verifies a tag with ArrayCount of 1 is treated as a scalar (no array node).</summary>
|
||||
/// <summary>Verifies a tag with ArrayCount of 1 is treated as a 1-element array (not scalar).
|
||||
/// The foundation materialises a [1] OPC UA array node when IsArray=true, so the driver must
|
||||
/// honour isArray:true + arrayLength:1 — a 1-element array IS a valid array.</summary>
|
||||
[Fact]
|
||||
public async Task DiscoverAsync_count_of_one_is_scalar()
|
||||
public async Task DiscoverAsync_count_of_one_is_array()
|
||||
{
|
||||
var opts = new S7DriverOptions
|
||||
{
|
||||
@@ -231,8 +233,40 @@ public sealed class S7ArrayReadTests
|
||||
await drv.DiscoverAsync(builder, TestContext.Current.CancellationToken);
|
||||
|
||||
var one = builder.Variables.Single().Attr;
|
||||
one.IsArray.ShouldBeFalse("count<=1 is scalar");
|
||||
one.ArrayDim.ShouldBeNull();
|
||||
one.IsArray.ShouldBeTrue("ArrayCount=1 is a 1-element array, not scalar");
|
||||
one.ArrayDim.ShouldBe(1u);
|
||||
}
|
||||
|
||||
/// <summary>Verifies that a tag with a null ArrayCount (scalar) is still discovered as scalar.</summary>
|
||||
[Fact]
|
||||
public async Task DiscoverAsync_null_ArrayCount_is_scalar()
|
||||
{
|
||||
var opts = new S7DriverOptions
|
||||
{
|
||||
Host = "192.0.2.1",
|
||||
Tags = [new("Scalar", "DB1.DBW0", S7DataType.Int16, ArrayCount: null)],
|
||||
};
|
||||
using var drv = new S7Driver(opts, "s7-arr-null");
|
||||
|
||||
var builder = new RecordingBuilder();
|
||||
await drv.DiscoverAsync(builder, TestContext.Current.CancellationToken);
|
||||
|
||||
var scalar = builder.Variables.Single().Attr;
|
||||
scalar.IsArray.ShouldBeFalse("null ArrayCount is scalar");
|
||||
scalar.ArrayDim.ShouldBeNull();
|
||||
}
|
||||
|
||||
/// <summary>Verifies a read of an isArray:true arrayLength:1 equipment tag returns a 1-element typed array.</summary>
|
||||
[Fact]
|
||||
public void DecodeArrayBlock_count_of_one_returns_single_element_array()
|
||||
{
|
||||
// A 1-element Int16 array: one big-endian word.
|
||||
var block = BeWords(0x0064); // 100
|
||||
var result = S7Driver.DecodeArrayBlock(ArrTag(S7DataType.Int16, 1), Addr(S7Size.Word), block);
|
||||
|
||||
var arr = result.ShouldBeOfType<short[]>();
|
||||
arr.Length.ShouldBe(1);
|
||||
arr[0].ShouldBe((short)100);
|
||||
}
|
||||
|
||||
// ── Equipment-tag resolver threads arrayLength → ArrayCount ───────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user