40e8a23e7c
v2-ci / build (push) Failing after 37s
v2-ci / unit-tests (tests/Core/ZB.MOM.WW.OtOpcUa.Cluster.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.ControlPlane.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Security.Tests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.Host.IntegrationTests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests) (push) Has been skipped
The OPC UA address-space build pipeline was named after a v2-roadmap milestone number rather than its domain. Rename the family to describe what it does (build/diff/apply the OPC UA address space): Phase7Composer -> AddressSpaceComposer Phase7CompositionResult -> AddressSpaceComposition Phase7Planner -> AddressSpacePlanner Phase7Plan -> AddressSpacePlan Phase7Applier -> AddressSpaceApplier Phase7ApplyOutcome -> AddressSpaceApplyOutcome The 9 Phase7*Tests suites follow suit; Phase7ScriptingEntitiesTests -> ScriptingEntitiesTests (it tests the scripting migration, not the pipeline). Log-message prefixes move to the new class names. Pure mechanical rename, no behavioral change. EF migration classes/IDs (AddPhase7ScriptingTables, ExtendComputeGenerationDiffWithPhase7) are immutable and left untouched, as are historical design docs. Build clean; OpcUaServer 261/261, Runtime 272/272, ScriptingEntities 12/12 green.
32 lines
1.9 KiB
C#
32 lines
1.9 KiB
C#
namespace ZB.MOM.WW.OtOpcUa.Commons.OpcUa;
|
|
|
|
/// <summary>
|
|
/// Single source of truth for equipment-namespace OPC UA NodeId strings. The variable NodeId is
|
|
/// FOLDER-SCOPED (<c>{parent}/{Name}</c>), NOT the driver-side FullName — a driver wire ref is not
|
|
/// unique across identical machines, so FullName-as-NodeId would collide in the sink. Used by the
|
|
/// materialiser (AddressSpaceApplier), the VirtualTag publish map, and the driver live-value router so all
|
|
/// three agree on the exact NodeId a variable was placed at.
|
|
/// </summary>
|
|
public static class EquipmentNodeIds
|
|
{
|
|
/// <summary>The sub-folder NodeId under an equipment for a non-empty FolderPath: <c>{equipmentId}/{folderPath}</c>.</summary>
|
|
/// <param name="equipmentId">The owning equipment's NodeId.</param>
|
|
/// <param name="folderPath">The tag/vtag FolderPath (must be non-empty for this to be meaningful).</param>
|
|
/// <returns>The sub-folder NodeId string.</returns>
|
|
public static string SubFolder(string equipmentId, string folderPath) => $"{equipmentId}/{folderPath}";
|
|
|
|
/// <summary>
|
|
/// The folder-scoped variable NodeId: <c>{parent}/{name}</c> where <c>parent = equipmentId</c> when
|
|
/// <paramref name="folderPath"/> is null/empty, else <see cref="SubFolder"/>.
|
|
/// </summary>
|
|
/// <param name="equipmentId">The owning equipment's NodeId.</param>
|
|
/// <param name="folderPath">The tag/vtag FolderPath, or null/empty for "directly under the equipment".</param>
|
|
/// <param name="name">The tag/vtag Name (the leaf browse segment).</param>
|
|
/// <returns>The folder-scoped variable NodeId string.</returns>
|
|
public static string Variable(string equipmentId, string? folderPath, string name)
|
|
{
|
|
var parent = string.IsNullOrWhiteSpace(folderPath) ? equipmentId : SubFolder(equipmentId, folderPath);
|
|
return $"{parent}/{name}";
|
|
}
|
|
}
|