diff --git a/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Entities/Tag.cs b/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Entities/Tag.cs index 26661534..7a84ae12 100644 --- a/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Entities/Tag.cs +++ b/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Entities/Tag.cs @@ -31,8 +31,7 @@ public sealed class Tag public string? DeviceId { get; set; } /// - /// Set when the tag belongs to an Equipment (driver tag OR Galaxy alias); NULL for - /// SystemPlatform mirror tags. + /// Set when the tag belongs to an Equipment; NULL for FolderPath-scoped (namespace-root) tags. /// public string? EquipmentId { get; set; } @@ -41,7 +40,7 @@ public sealed class Tag /// public required string Name { get; set; } - /// Only used when is NULL (SystemPlatform namespace). + /// Only used when is NULL (FolderPath-scoped namespace tag). public string? FolderPath { get; set; } /// OPC UA built-in type name (Boolean / Int32 / Float / etc.). diff --git a/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Enums/NodeAclScopeKind.cs b/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Enums/NodeAclScopeKind.cs index c30262c6..63c73864 100644 --- a/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Enums/NodeAclScopeKind.cs +++ b/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Enums/NodeAclScopeKind.cs @@ -9,7 +9,7 @@ public enum NodeAclScopeKind UnsLine, Equipment, /// - /// A Galaxy (SystemPlatform-kind) folder segment anchored below a namespace. + /// A folder segment anchored below a namespace (used for FolderPath-scoped tags). /// Distinguishes folder grants from UNS grants in the /// AuthorizationDecision.Provenance audit trail and Admin UI diagnostics. /// diff --git a/src/Core/ZB.MOM.WW.OtOpcUa.Core/OpcUa/EquipmentNodeWalker.cs b/src/Core/ZB.MOM.WW.OtOpcUa.Core/OpcUa/EquipmentNodeWalker.cs index 01da5665..7fdb0126 100644 --- a/src/Core/ZB.MOM.WW.OtOpcUa.Core/OpcUa/EquipmentNodeWalker.cs +++ b/src/Core/ZB.MOM.WW.OtOpcUa.Core/OpcUa/EquipmentNodeWalker.cs @@ -9,7 +9,7 @@ namespace ZB.MOM.WW.OtOpcUa.Core.OpcUa; /// from the Config DB's /// UnsArea / UnsLine / Equipment / Tag rows. Runs during /// address-space build per whose -/// Namespace.Kind = Equipment; SystemPlatform-kind namespaces (Galaxy) are +/// Namespace.Kind = Equipment; non-Equipment namespaces are /// exempt per decision #120 and reach this walker only indirectly through /// . /// @@ -21,7 +21,7 @@ namespace ZB.MOM.WW.OtOpcUa.Core.OpcUa; /// folder node at the UNS level-5 segment; every bound to an /// Equipment (non-null ) becomes a variable node under /// it. Driver-discovered tags that have no Config-DB row are not added by this -/// walker — the ITagDiscovery path continues to exist for the SystemPlatform case + +/// walker — the ITagDiscovery path continues to exist for FolderPath-scoped tags + /// for enrichment, but Equipment-kind composition is fully Tag-row-driven. /// /// diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/ScriptAnalysis/IScriptTagCatalog.cs b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/ScriptAnalysis/IScriptTagCatalog.cs index e5411e87..2652fb9c 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/ScriptAnalysis/IScriptTagCatalog.cs +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/ScriptAnalysis/IScriptTagCatalog.cs @@ -34,8 +34,8 @@ public sealed record ScriptTagInfo(string Path, string Kind, string DataType, st /// /// Default . Returns ONLY the resolvable keys a script may pass to /// ctx.GetTag / ctx.SetVirtualTag — the driver FullName for equipment tags, -/// the MXAccess dot-ref for SystemPlatform tags, and the leaf Name (best-effort) for -/// virtual tags. +/// the MXAccess dot-ref for FolderPath-scoped tags (EquipmentId == null), and the leaf +/// Name (best-effort) for virtual tags. /// /// /// @@ -58,9 +58,9 @@ public sealed record ScriptTagInfo(string Path, string Kind, string DataType, st /// The per-category resolvable key: /// /// Equipment driver tag (EquipmentId != null) → the driver FullName -/// extracted from Tag.TagConfig (the verified DependencyMux key). -/// Galaxy points are ordinary equipment tags now (GalaxyMxGateway is a standard -/// Equipment-kind driver), so they resolve by this same FullName key. +/// extracted from Tag.TagConfig (the verified DependencyMux key). +/// GalaxyMxGateway is a standard Equipment-kind driver, so Galaxy points resolve +/// by this same FullName key. /// VirtualTag → its leaf Name only, as a BEST-EFFORT key (the live resolution /// of virtual-tag cascade/write targets is unconfirmed). /// @@ -137,8 +137,8 @@ public sealed class ScriptTagCatalog(IDbContextFactory d await using var db = await dbFactory.CreateDbContextAsync(ct); // Only the resolvable keys are projected, so no UNS join is needed: the equipment-tag key is - // the FullName from TagConfig, the SystemPlatform key is FolderPath/Name, and the virtual-tag - // key is its own Name. Pull just those columns, untracked. + // the FullName from TagConfig, the FolderPath-scoped tag key is FolderPath/Name, and the + // virtual-tag key is its own Name. Pull just those columns, untracked. var tagRows = await db.Tags .AsNoTracking() .Select(t => new { t.EquipmentId, t.Name, t.FolderPath, t.DataType, t.DriverInstanceId, t.TagConfig }) @@ -154,8 +154,8 @@ public sealed class ScriptTagCatalog(IDbContextFactory d foreach (var t in tagRows) { var path = t.EquipmentId is null - // SystemPlatform tag — the Galaxy driver subscribes by the MXAccess dot-ref, which is - // "FolderPath.Name" when a folder is set, else just "Name". + // FolderPath-scoped tag (EquipmentId null) — subscribes by the MXAccess dot-ref, which + // is "FolderPath.Name" when a folder is set, else just "Name". ? (string.IsNullOrWhiteSpace(t.FolderPath) ? t.Name : $"{t.FolderPath}.{t.Name}") // Equipment driver tag — the runtime GetTag key is the driver FullName from TagConfig. : ExtractFullNameFromTagConfig(t.TagConfig); diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/DriverHostActor.cs b/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/DriverHostActor.cs index c0e587d3..5dd42a03 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/DriverHostActor.cs +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/DriverHostActor.cs @@ -387,8 +387,7 @@ public sealed class DriverHostActor : ReceiveActor, IWithTimers // folder-scoped NodeIds (EquipmentId/FolderPath/Name), while the driver publishes keyed by // FullReference (the tag's FullName). The value therefore only lands on the variable once the // FullName→NodeId routing — the equipment-tag "live values" milestone — is wired; until then - // the variable stays BadWaitingForInitialData. (The retired SystemPlatform mirror matched only - // because its NodeId WAS the FullName.) + // the variable stays BadWaitingForInitialData. _opcUaPublishActor?.Tell(new ZB.MOM.WW.OtOpcUa.Runtime.OpcUa.OpcUaPublishActor.AttributeValueUpdate( msg.FullReference, msg.Value, msg.Quality, msg.TimestampUtc)); } diff --git a/tests/Core/ZB.MOM.WW.OtOpcUa.Configuration.Tests/DraftValidatorTests.cs b/tests/Core/ZB.MOM.WW.OtOpcUa.Configuration.Tests/DraftValidatorTests.cs index 8ca8b1f2..9b37332e 100644 --- a/tests/Core/ZB.MOM.WW.OtOpcUa.Configuration.Tests/DraftValidatorTests.cs +++ b/tests/Core/ZB.MOM.WW.OtOpcUa.Configuration.Tests/DraftValidatorTests.cs @@ -123,9 +123,8 @@ public sealed class DraftValidatorTests } /// Verifies that the canonical Galaxy driver type (GalaxyMxGateway, per PR 7.2 — - /// it was "Galaxy" pre-PR-7.2) is now a standard Equipment-kind driver: binding it to an - /// Equipment namespace produces no kind-mismatch error (the SystemPlatform namespace split - /// is being retired — Galaxy under Equipment is valid). + /// it was "Galaxy" pre-PR-7.2) is a standard Equipment-kind driver: binding it to an + /// Equipment namespace produces no kind-mismatch error. [Fact] public void GalaxyMxGateway_driver_in_Equipment_namespace_is_allowed() { @@ -357,10 +356,10 @@ public sealed class DraftValidatorTests DraftValidator.Validate(draft).ShouldNotContain(e => e.Code == "EquipmentSignalNameCollision"); } - /// Verifies that a SystemPlatform Tag (EquipmentId == null) is excluded from the + /// Verifies that a FolderPath-scoped tag (EquipmentId == null) is excluded from the /// equipment-signal node space and so never collides with an equipment VirtualTag. [Fact] - public void SystemPlatform_tag_sharing_name_with_equipment_vtag_excluded() + public void Unbound_tag_EquipmentId_null_does_not_collide_with_equipment_vtag() { var draft = new DraftSnapshot { diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/ScriptAnalysis/ScriptTagCatalogTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/ScriptAnalysis/ScriptTagCatalogTests.cs index 7b540f01..c47b3323 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/ScriptAnalysis/ScriptTagCatalogTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/ScriptAnalysis/ScriptTagCatalogTests.cs @@ -42,7 +42,7 @@ public sealed class ScriptTagCatalogTests /// /// Seeds an Area → Line → Equipment path with: one equipment driver tag (FullName "Motor.Speed"), - /// one virtual tag, and one SystemPlatform tag (EquipmentId null, FolderPath set). + /// one virtual tag, and one FolderPath-scoped tag (EquipmentId null, FolderPath set). /// private static void Seed(DbContextOptions opts) { @@ -71,7 +71,7 @@ public sealed class ScriptTagCatalogTests TagConfig = "{\"FullName\":\"Motor.Speed\"}", }); - // SystemPlatform tag — EquipmentId null, FolderPath set; Galaxy subscribes by "FolderPath.Name". + // FolderPath-scoped tag — EquipmentId null, FolderPath set; subscribes by "FolderPath.Name". db.Tags.Add(new Tag { TagId = "TAG-SP", @@ -97,7 +97,7 @@ public sealed class ScriptTagCatalogTests } /// A null filter returns only the resolvable keys: the driver FullName for the equipment - /// tag, the MXAccess dot-ref for the SystemPlatform tag, and the virtual tag's leaf Name — and + /// tag, the MXAccess dot-ref for the FolderPath-scoped tag, and the virtual tag's leaf Name — and /// NONE of the UNS browse paths. [Fact] public async Task GetPaths_no_filter_returns_resolvable_keys_only() @@ -110,7 +110,7 @@ public sealed class ScriptTagCatalogTests // Equipment driver tag: the authoritative GetTag key (driver FullName). paths.ShouldContain("Motor.Speed"); - // SystemPlatform tag: MXAccess dot-ref. + // FolderPath-scoped tag: MXAccess dot-ref. paths.ShouldContain("DelmiaReceiver_001.DownloadPath"); // Virtual tag: leaf Name only. @@ -193,10 +193,10 @@ public sealed class ScriptTagCatalogTests paths.ShouldContain("Computed"); } - /// A SystemPlatform tag with a null/empty FolderPath yields just its Name + /// A FolderPath-scoped tag with a null/empty FolderPath yields just its Name /// (no leading dot). [Fact] - public async Task GetPaths_systemplatform_tag_without_folder_yields_name_only() + public async Task GetPaths_unbound_tag_without_folder_yields_name_only() { var (catalog, opts) = Fresh(); @@ -233,10 +233,10 @@ public sealed class ScriptTagCatalogTests paths.ShouldBeEmpty(); } - /// A SystemPlatform tag resolves by its "FolderPath.Name" dot-ref to a Tag-kind info with - /// the configured DataType + DriverInstanceId. + /// A FolderPath-scoped tag resolves by its "FolderPath.Name" dot-ref to a Tag-kind info + /// with the configured DataType + DriverInstanceId. [Fact] - public async Task GetTagInfo_systemplatform_tag_returns_tag_info() + public async Task GetTagInfo_unbound_tag_returns_tag_info() { var (catalog, opts) = Fresh(); Seed(opts); diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests/Phase7ComposerAliasTagTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests/Phase7ComposerAliasTagTests.cs index da7dcee8..f508dbf7 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests/Phase7ComposerAliasTagTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests/Phase7ComposerAliasTagTests.cs @@ -7,19 +7,17 @@ namespace ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests; /// /// Verifies the live-edit compose seam () treats a Galaxy -/// point as an ordinary equipment tag now that GalaxyMxGateway is a standard -/// Equipment-kind driver. An equipment-scoped (non-null -/// ) bound to a GalaxyMxGateway driver living in an -/// Equipment-kind namespace must surface under -/// (carrying its driver-side FullName). The -/// SystemPlatform-mirror GalaxyTags contract is retired entirely. +/// point as an ordinary equipment tag: GalaxyMxGateway is a standard Equipment-kind driver. +/// An equipment-scoped (non-null ) bound to a +/// GalaxyMxGateway driver living in an Equipment-kind namespace must surface under +/// (carrying its driver-side FullName). /// public sealed class Phase7ComposerAliasTagTests { /// A GalaxyMxGateway driver in an Equipment-kind namespace carries an /// equipment-scoped Galaxy tag (EquipmentId set, FolderPath null, TagConfig FullName = the Galaxy /// ref). Compose must put it in EquipmentTags with its FullName, coalescing the null FolderPath to - /// string.Empty (the SystemPlatform mirror producer is gone entirely). + /// string.Empty. [Fact] public void Compose_admits_galaxy_equipment_tag_in_equipment_tags() {