using CliFx.Attributes; using ZB.MOM.WW.OtOpcUa.Driver.Cli.Common; namespace ZB.MOM.WW.OtOpcUa.Driver.TwinCAT.Cli; /// /// Base for every TwinCAT CLI command. Carries the AMS target options /// (--ams-net-id + --ams-port) + the notification-mode toggle that the /// driver itself takes. Exposes so each command can build a /// single-device / single-tag from flag input. /// public abstract class TwinCATCommandBase : DriverCommandBase { [CommandOption("ams-net-id", 'n', Description = "AMS Net ID of the target runtime (e.g. '192.168.1.40.1.1' or '127.0.0.1.1.1' for local).", IsRequired = true)] public string AmsNetId { get; init; } = default!; [CommandOption("ams-port", 'p', Description = "AMS port. TwinCAT 3 PLC runtime defaults to 851; TwinCAT 2 uses 801.")] public int AmsPort { get; init; } = 851; [CommandOption("timeout-ms", Description = "Per-operation timeout in ms (default 5000).")] public int TimeoutMs { get; init; } = 5000; [CommandOption("poll-only", Description = "Disable native ADS notifications and fall through to the shared PollGroupEngine " + "(same as setting UseNativeNotifications=false in a real driver config).")] public bool PollOnly { get; init; } /// public override TimeSpan Timeout { get => TimeSpan.FromMilliseconds(TimeoutMs); init { /* driven by TimeoutMs */ } } /// /// Canonical TwinCAT gateway string the driver's TwinCATAmsAddress.TryParse /// consumes — shape ads://{AmsNetId}:{AmsPort}. /// protected string Gateway => $"ads://{AmsNetId}:{AmsPort}"; /// /// Build a with the AMS target this base collected + /// the tag list a subclass supplies. Probe disabled, controller-browse disabled, /// native notifications toggled by . /// protected TwinCATDriverOptions BuildOptions(IReadOnlyList tags) => new() { Devices = [new TwinCATDeviceOptions( HostAddress: Gateway, DeviceName: $"cli-{AmsNetId}:{AmsPort}")], Tags = tags, Timeout = Timeout, Probe = new TwinCATProbeOptions { Enabled = false }, UseNativeNotifications = !PollOnly, EnableControllerBrowse = false, }; protected string DriverInstanceId => $"twincat-cli-{AmsNetId}:{AmsPort}"; }