fix(modbus): gate array read on isArray:true; 1-element arrays (review C-1)

This commit is contained in:
Joseph Doherty
2026-06-16 22:12:18 -04:00
parent 3e74239532
commit 49ac1392a8
2 changed files with 84 additions and 2 deletions
@@ -35,9 +35,13 @@ public static class ModbusEquipmentTagParser
var bitIndex = (byte)ReadInt(root, "bitIndex");
var stringLength = (ushort)ReadInt(root, "stringLength");
// isArray / arrayLength — optional keys authored by the typed Modbus tag editor.
// When arrayLength > 0 we expose an array tag of that count; otherwise scalar.
// Canonical rule: a tag is an array iff isArray:true AND arrayLength >= 1.
// isArray:false (with any arrayLength) is scalar — the foundation materialises a
// scalar OPC UA node, so returning an array value would cause a shape mismatch.
// A 1-element array (isArray:true, arrayLength:1) IS valid and reads as short[1].
var isArray = ReadBool(root, "isArray");
var arrayLength = ReadInt(root, "arrayLength");
int? arrayCount = arrayLength > 0 ? arrayLength : null;
int? arrayCount = (isArray && arrayLength >= 1) ? arrayLength : null;
def = new ModbusTagDefinition(
Name: reference, Region: region, Address: (ushort)address, DataType: dataType,
Writable: true, ByteOrder: byteOrder, BitIndex: bitIndex, StringLength: stringLength,
@@ -56,4 +60,7 @@ public static class ModbusEquipmentTagParser
private static int ReadInt(JsonElement o, string name)
=> o.TryGetProperty(name, out var e) && e.ValueKind == JsonValueKind.Number
&& e.TryGetInt32(out var v) ? v : 0;
private static bool ReadBool(JsonElement o, string name)
=> o.TryGetProperty(name, out var e) && e.ValueKind == JsonValueKind.True;
}