From ab364b9e98c42955f9a8ab03b3012aea590361b3 Mon Sep 17 00:00:00 2001 From: Archie Miller <62433534+Archie-Miller@users.noreply.github.com> Date: Tue, 3 Dec 2024 02:03:29 -0700 Subject: [PATCH 1/2] Update CauseMappings to reflect issue (#2877) SyspendedToRead caused by Reset remains as per Part 10 Table 7 --- Stack/Opc.Ua.Core/Stack/State/ProgramStateMachineState.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Stack/Opc.Ua.Core/Stack/State/ProgramStateMachineState.cs b/Stack/Opc.Ua.Core/Stack/State/ProgramStateMachineState.cs index 460a735069..20668bc4e7 100644 --- a/Stack/Opc.Ua.Core/Stack/State/ProgramStateMachineState.cs +++ b/Stack/Opc.Ua.Core/Stack/State/ProgramStateMachineState.cs @@ -118,11 +118,11 @@ namespace Opc.Ua { Methods.ProgramStateMachineType_Reset, Objects.ProgramStateMachineType_Halted, Objects.ProgramStateMachineType_HaltedToReady }, { Methods.ProgramStateMachineType_Start, Objects.ProgramStateMachineType_Ready, Objects.ProgramStateMachineType_ReadyToRunning }, { Methods.ProgramStateMachineType_Suspend,Objects.ProgramStateMachineType_Running, Objects.ProgramStateMachineType_RunningToSuspended }, - { Methods.ProgramStateMachineType_Reset, Objects.ProgramStateMachineType_Running, Objects.ProgramStateMachineType_RunningToReady }, { Methods.ProgramStateMachineType_Halt, Objects.ProgramStateMachineType_Running, Objects.ProgramStateMachineType_RunningToHalted }, { Methods.ProgramStateMachineType_Resume, Objects.ProgramStateMachineType_Suspended, Objects.ProgramStateMachineType_SuspendedToRunning }, { Methods.ProgramStateMachineType_Reset, Objects.ProgramStateMachineType_Suspended, Objects.ProgramStateMachineType_SuspendedToReady }, - { Methods.ProgramStateMachineType_Halt, Objects.ProgramStateMachineType_Suspended, Objects.ProgramStateMachineType_SuspendedToHalted } + { Methods.ProgramStateMachineType_Halt, Objects.ProgramStateMachineType_Suspended, Objects.ProgramStateMachineType_SuspendedToHalted }, + { Methods.ProgramStateMachineType_Halt, Objects.ProgramStateMachineType_Ready, Objects.ProgramStateMachineType_ReadyToHalted } }; From f98c8a9e23a07e6d8f50624dd7ff664b764872e8 Mon Sep 17 00:00:00 2001 From: Archie Miller <62433534+Archie-Miller@users.noreply.github.com> Date: Tue, 3 Dec 2024 02:11:23 -0700 Subject: [PATCH 2/2] Client fix for ConditionRefreshAsync always returns NodIdUnknown, add ConditionRefresh2Async support(#2876) Fixes #2854 --- .../Subscription/Subscription.cs | 27 +++++++++++++++++++ .../Subscription/SubscriptionAsync.cs | 24 +++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/Libraries/Opc.Ua.Client/Subscription/Subscription.cs b/Libraries/Opc.Ua.Client/Subscription/Subscription.cs index b90b4dd2ca..fb7db1108c 100644 --- a/Libraries/Opc.Ua.Client/Subscription/Subscription.cs +++ b/Libraries/Opc.Ua.Client/Subscription/Subscription.cs @@ -1663,6 +1663,33 @@ namespace Opc.Ua.Client return false; } + /// + /// Tells the server to refresh all conditions being monitored by the subscription for a specific + /// monitoredItem for events. + /// + public bool ConditionRefresh2(uint monitoredItemId) + { + VerifySubscriptionState(true); + + try + { + object[] inputArguments = new object[] { m_id, monitoredItemId }; + + m_session.Call( + ObjectTypeIds.ConditionType, + MethodIds.ConditionType_ConditionRefresh2, + inputArguments); + + return true; + } + catch (ServiceResultException sre) + { + Utils.LogError(sre, "SubscriptionId {0}: Item {1} Failed to call ConditionRefresh2 on server", + m_id, monitoredItemId); + } + return false; + } + /// /// Call the ResendData method on the server for this subscription. /// diff --git a/Libraries/Opc.Ua.Client/Subscription/SubscriptionAsync.cs b/Libraries/Opc.Ua.Client/Subscription/SubscriptionAsync.cs index 7b54124af0..c8381e34f2 100644 --- a/Libraries/Opc.Ua.Client/Subscription/SubscriptionAsync.cs +++ b/Libraries/Opc.Ua.Client/Subscription/SubscriptionAsync.cs @@ -454,6 +454,7 @@ namespace Opc.Ua.Client var methodsToCall = new CallMethodRequestCollection(); methodsToCall.Add(new CallMethodRequest() { + ObjectId = ObjectTypeIds.ConditionType, MethodId = MethodIds.ConditionType_ConditionRefresh, InputArguments = new VariantCollection() { new Variant(m_id) } }); @@ -464,6 +465,29 @@ namespace Opc.Ua.Client ct).ConfigureAwait(false); } + /// + /// Tells the server to refresh all conditions being monitored by the subscription for a specific + /// monitoredItem for events. + /// + public async Task ConditionRefresh2Async(uint monitoredItemId, CancellationToken ct = default) + { + VerifySubscriptionState(true); + + var methodsToCall = new CallMethodRequestCollection(); + methodsToCall.Add(new CallMethodRequest() { + ObjectId = ObjectTypeIds.ConditionType, + MethodId = MethodIds.ConditionType_ConditionRefresh2, + InputArguments = new VariantCollection() { + new Variant(m_id), + new Variant( monitoredItemId ) } + }); + + var response = await m_session.CallAsync( + null, + methodsToCall, + ct).ConfigureAwait(false); + } + #endregion } }