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
}
}