namespace ZB.MOM.WW.MxGateway.Server.Configuration; /// /// Configuration for the gateway's always-on central alarm monitor /// (). When /// is true the gateway opens one gateway-owned worker session dedicated to /// alarms, caches the active-alarm set, and fans it out to every client /// through the StreamAlarms RPC — no client opens its own session /// to see alarms. /// /// /// Defaults preserve current behaviour (alarm monitoring disabled). /// Operators opt in by setting MxGateway:Alarms:Enabled = true and /// supplying a canonical \\<machine>\Galaxy!<area> /// subscription expression. The literal "Galaxy" provider is correct /// regardless of the configured Galaxy database name (the wnwrap consumer /// does not accept the database name as the provider). /// public sealed class AlarmsOptions { /// Gate the gateway's always-on central alarm monitor. Default false. public bool Enabled { get; init; } /// /// AVEVA alarm-subscription expression the monitor subscribes on /// startup. When empty and is true, the gateway /// falls back to \\$(MachineName)\Galaxy!$(DefaultArea) if /// is set; otherwise the monitor faults with /// a configuration diagnostic. /// public string SubscriptionExpression { get; init; } = string.Empty; /// /// Optional area name used to compose a default subscription when /// is empty. Combined with /// Environment.MachineName as /// \\<MachineName>\Galaxy!<DefaultArea>. /// public string DefaultArea { get; init; } = string.Empty; /// /// How often the monitor reconciles its in-process alarm cache against /// the worker's authoritative active-alarm snapshot, catching any /// transitions the live poll-and-diff feed missed. Default 30 seconds; /// the monitor floors it at 5 seconds. /// public int ReconcileIntervalSeconds { get; init; } = 30; /// /// Cadence at which the worker's STA polls the AVEVA alarm consumer /// (GetXmlCurrentAlarms2) for the current active-alarm snapshot. /// Default 500 ms; must be between 100 ms and 3,600,000 ms (one hour). /// Every poll is a COM call plus an XML parse on the STA that also /// serves reads and writes, so driving it below 100 ms starves the /// command path; above an hour the cadence stops being a cadence and /// silently disables alarm polling. Conveyed to the worker through the /// MXGATEWAY_ALARM_POLL_INTERVAL_MS environment variable. /// public int PollIntervalMilliseconds { get; init; } = 500; /// /// Cap the worker passes to GetXmlCurrentAlarms2's /// maxAlmCnt argument. Default 1024; must be between 64 and /// 65,536 — the worker is a 32-bit process that materializes each /// fetch as one BSTR plus a full XmlDocument, so an unbounded cap /// faults the STA rather than merely slowing it. A fetch that comes /// back holding exactly this many records is treated as truncated: the /// worker keeps the alarms the capped fetch could not mention in its /// snapshot rather than letting their absence read as a clear. Raise it /// on galaxies whose steady-state active-alarm count approaches the /// cap. Conveyed to the worker through the /// MXGATEWAY_ALARM_MAX_ALARMS_PER_FETCH environment variable. /// public int MaxAlarmsPerFetch { get; init; } = 1024; /// /// Configuration for the alarm-manager ↔ subtag fallback mechanism: /// operating mode, failure-detection thresholds, discovery, and subtag /// names. Defaults (Mode = "Auto") preserve behaviour when the section is /// omitted from configuration. /// public AlarmFallbackOptions Fallback { get; init; } = new(); }