namespace ZB.MOM.WW.OtOpcUa.Driver.AbLegacy; /// /// Wire-layer abstraction over a single PCCC tag. Mirrors IAbCipTagRuntime's shape so /// the same test-fake pattern applies; the only meaningful difference is the protocol layer /// underneath (ab_pccc vs ab_eip). /// public interface IAbLegacyTagRuntime : IDisposable { Task InitializeAsync(CancellationToken cancellationToken); Task ReadAsync(CancellationToken cancellationToken); Task WriteAsync(CancellationToken cancellationToken); int GetStatus(); object? DecodeValue(AbLegacyDataType type, int? bitIndex); void EncodeValue(AbLegacyDataType type, int? bitIndex, object? value); /// /// PR 7 — decode element of an N-element contiguous /// block read. Implementations call the same per-element accessors used by /// at offset elementIndex × elementBytes. Default /// implementation throws so existing fakes that don't override remain explicit. /// object? DecodeArrayElement(AbLegacyDataType type, int elementIndex) => throw new NotSupportedException( "Array decoding requires an IAbLegacyTagRuntime that overrides DecodeArrayElement."); } public interface IAbLegacyTagFactory { IAbLegacyTagRuntime Create(AbLegacyTagCreateParams createParams); } public sealed record AbLegacyTagCreateParams( string Gateway, int Port, string CipPath, string LibplctagPlcAttribute, string TagName, TimeSpan Timeout, int ElementCount = 1);