Auto: abcip-4.1 — per-tag scan rate / scan group bucketing

Closes #238
This commit is contained in:
Joseph Doherty
2026-04-26 02:15:50 -04:00
parent e5c38a5a0e
commit b45713622f
8 changed files with 761 additions and 7 deletions

View File

@@ -269,6 +269,16 @@ public enum AddressingMode
/// in pre-declared config). Surfaces as the OPC UA <c>Description</c> attribute on the
/// produced Variable node so SCADA / engineering clients see the comment from the source
/// project. <c>null</c> leaves Description unset, matching pre-2.3 behaviour.</param>
/// <param name="ScanRateMs">PR abcip-4.1 — optional per-tag publish rate (in milliseconds) that
/// overrides the subscription's default <c>publishingInterval</c> for this tag. Mirrors
/// Kepware's "scan classes" + Siemens / Mitsubishi per-tag scan groups; the driver buckets
/// tags by resolved interval at <see cref="AbCipDriver.SubscribeAsync"/> time + runs one
/// <see cref="Core.Abstractions.PollGroupEngine"/> loop per distinct interval so a fast HMI
/// tag is not delayed behind a slow batch tag's 10 s tick. <c>null</c> = use the subscription
/// default (legacy behaviour). The 100 ms floor enforced by the engine still applies — a
/// <c>ScanRateMs &lt; 100</c> is clamped up. UDT member tags inherit the parent tag's
/// <c>ScanRateMs</c> at member-fan-out time. See
/// <c>docs/drivers/AbCip-Operability.md</c> §"Per-tag scan rate".</param>
public sealed record AbCipTagDefinition(
string Name,
string DeviceHostAddress,
@@ -279,7 +289,8 @@ public sealed record AbCipTagDefinition(
IReadOnlyList<AbCipStructureMember>? Members = null,
bool SafetyTag = false,
int? StringLength = null,
string? Description = null);
string? Description = null,
int? ScanRateMs = null);
/// <summary>
/// One declared member of a UDT tag. Name is the member identifier on the PLC (e.g. <c>Speed</c>,