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>
74 lines
3.7 KiB
C#
74 lines
3.7 KiB
C#
namespace ZB.MOM.WW.OtOpcUa.Core.Abstractions;
|
|
|
|
/// <summary>
|
|
/// Driver-agnostic per-attribute (tag) descriptor used by the generic node-manager
|
|
/// to build OPC UA address-space variables. Every driver maps its native attribute
|
|
/// metadata into this DTO during discovery.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Per <c>docs/v2/plan.md</c> §5a (LmxNodeManager reusability) — <c>DriverAttributeInfo</c>
|
|
/// replaces the v1 Galaxy-specific <c>GalaxyAttributeInfo</c> in the generic node-manager
|
|
/// so the same node-manager class works against every driver.
|
|
/// </remarks>
|
|
/// <param name="FullName">
|
|
/// Driver-side full reference for read/write addressing
|
|
/// (e.g. for Galaxy: <c>"DelmiaReceiver_001.DownloadPath"</c>).
|
|
/// </param>
|
|
/// <param name="DriverDataType">Driver-agnostic data type; maps to OPC UA built-in type at build time.</param>
|
|
/// <param name="IsArray">True when this attribute is a 1-D array.</param>
|
|
/// <param name="ArrayDim">Declared array length when <see cref="IsArray"/> is true; null otherwise.</param>
|
|
/// <param name="SecurityClass">Write-authorization tier for this attribute.</param>
|
|
/// <param name="IsHistorized">True when this attribute is expected to feed historian / HistoryRead.</param>
|
|
/// <param name="IsAlarm">
|
|
/// True when this attribute represents an alarm condition (Galaxy: has an
|
|
/// <c>AlarmExtension</c> primitive). The generic node-manager enriches the variable with an
|
|
/// OPC UA <c>AlarmConditionState</c> when true. Defaults to false so existing non-Galaxy
|
|
/// drivers aren't forced to flow a flag they don't produce.
|
|
/// </param>
|
|
/// <param name="WriteIdempotent">
|
|
/// True when a timed-out or failed write to this attribute is safe to replay. Per
|
|
/// <c>docs/v2/plan.md</c> decisions #44, #45, #143 — writes are NOT auto-retried by default
|
|
/// because replaying a pulse / alarm-ack / counter-increment / recipe-step advance can
|
|
/// duplicate field actions. Drivers flag only tags whose semantics make retry safe
|
|
/// (holding registers with level-set values, set-point writes to analog tags) — the
|
|
/// capability invoker respects this flag when deciding whether to apply Polly retry.
|
|
/// </param>
|
|
/// <param name="Source">
|
|
/// Per ADR-002 — discriminates which runtime subsystem owns this node's dispatch.
|
|
/// Defaults to <see cref="NodeSourceKind.Driver"/> so existing callers are unchanged.
|
|
/// </param>
|
|
/// <param name="VirtualTagId">
|
|
/// Set when <paramref name="Source"/> is <see cref="NodeSourceKind.Virtual"/> — stable
|
|
/// logical id the VirtualTagEngine addresses by. Null otherwise.
|
|
/// </param>
|
|
/// <param name="ScriptedAlarmId">
|
|
/// Set when <paramref name="Source"/> is <see cref="NodeSourceKind.ScriptedAlarm"/> —
|
|
/// stable logical id the ScriptedAlarmEngine addresses by. Null otherwise.
|
|
/// </param>
|
|
public sealed record DriverAttributeInfo(
|
|
string FullName,
|
|
DriverDataType DriverDataType,
|
|
bool IsArray,
|
|
uint? ArrayDim,
|
|
SecurityClassification SecurityClass,
|
|
bool IsHistorized,
|
|
bool IsAlarm = false,
|
|
bool WriteIdempotent = false,
|
|
NodeSourceKind Source = NodeSourceKind.Driver,
|
|
string? VirtualTagId = null,
|
|
string? ScriptedAlarmId = null);
|
|
|
|
/// <summary>
|
|
/// Per ADR-002 — discriminates which runtime subsystem owns this node's Read/Write/
|
|
/// Subscribe dispatch. <c>Driver</c> = a real IDriver capability surface;
|
|
/// <c>Virtual</c> = a Phase 7 <see cref="DriverAttributeInfo"/>.VirtualTagId'd tag
|
|
/// computed by the VirtualTagEngine; <c>ScriptedAlarm</c> = a scripted Part 9 alarm
|
|
/// materialized by the ScriptedAlarmEngine.
|
|
/// </summary>
|
|
public enum NodeSourceKind
|
|
{
|
|
Driver = 0,
|
|
Virtual = 1,
|
|
ScriptedAlarm = 2,
|
|
}
|