a25593a9c6
Group all 69 projects into category subfolders under src/ and tests/ so the Rider Solution Explorer mirrors the module structure. Folders: Core, Server, Drivers (with a nested Driver CLIs subfolder), Client, Tooling. - Move every project folder on disk with git mv (history preserved as renames). - Recompute relative paths in 57 .csproj files: cross-category ProjectReferences, the lib/ HintPath+None refs in Driver.Historian.Wonderware, and the external mxaccessgw refs in Driver.Galaxy and its test project. - Rebuild ZB.MOM.WW.OtOpcUa.slnx with nested solution folders. - Re-prefix project paths in functional scripts (e2e, compliance, smoke SQL, integration, install). Build green (0 errors); unit tests pass. Docs left for a separate pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
51 lines
2.4 KiB
C#
51 lines
2.4 KiB
C#
using ZB.MOM.WW.OtOpcUa.Core.Abstractions;
|
|
|
|
namespace ZB.MOM.WW.OtOpcUa.Core.ScriptedAlarms;
|
|
|
|
/// <summary>
|
|
/// Operator-authored scripted-alarm configuration. Phase 7 Stream E (config DB schema)
|
|
/// materializes these from the <c>ScriptedAlarm</c> + <c>Script</c> tables on publish.
|
|
/// </summary>
|
|
/// <param name="AlarmId">
|
|
/// Stable identity for the alarm — used as the OPC UA ConditionId + the key in the
|
|
/// state store. Should be globally unique within the cluster; convention is
|
|
/// <c>{EquipmentPath}::{AlarmName}</c>.
|
|
/// </param>
|
|
/// <param name="EquipmentPath">
|
|
/// UNS path of the Equipment node the alarm hangs under. Alarm browse lives here;
|
|
/// ACL binding inherits this equipment's scope per Phase 6.2.
|
|
/// </param>
|
|
/// <param name="AlarmName">Human-readable alarm name — used in the browse tree + Admin UI.</param>
|
|
/// <param name="Kind">Concrete OPC UA Part 9 subtype the alarm materializes as.</param>
|
|
/// <param name="Severity">Static severity per Phase 7 plan decision #13; not currently computed by the predicate.</param>
|
|
/// <param name="MessageTemplate">
|
|
/// Message text with <c>{TagPath}</c> tokens resolved at event-emission time per
|
|
/// Phase 7 plan decision #13. Unresolvable tokens emit <c>{?}</c> + a structured
|
|
/// error so operators can spot stale references.
|
|
/// </param>
|
|
/// <param name="PredicateScriptSource">
|
|
/// Roslyn C# script returning <c>bool</c>. <c>true</c> = alarm condition currently holds (active);
|
|
/// <c>false</c> = condition has cleared. Same sandbox rules as virtual tags per Phase 7 decision #6.
|
|
/// </param>
|
|
/// <param name="HistorizeToAveva">
|
|
/// When true, every transition emission of this alarm flows to the Historian alarm
|
|
/// sink (Stream D). Defaults to true — plant alarm history is usually the
|
|
/// operator's primary diagnostic. Galaxy-native alarms default false since Galaxy
|
|
/// historises them directly.
|
|
/// </param>
|
|
/// <param name="Retain">
|
|
/// Part 9 retain flag — when true, the condition node remains visible after the
|
|
/// predicate clears as long as it has un-acknowledged or un-confirmed transitions.
|
|
/// Default true.
|
|
/// </param>
|
|
public sealed record ScriptedAlarmDefinition(
|
|
string AlarmId,
|
|
string EquipmentPath,
|
|
string AlarmName,
|
|
AlarmKind Kind,
|
|
AlarmSeverity Severity,
|
|
string MessageTemplate,
|
|
string PredicateScriptSource,
|
|
bool HistorizeToAveva = true,
|
|
bool Retain = true);
|