Online Forums
Technical support is provided through Support Forums below. Anybody can view them; you need to Register/Login to our site (see links in upper right corner) in order to Post questions. You do not have to be a licensed user of our product.
Please read Rules for forum posts before reporting your issue or asking a question. OPC Labs team is actively monitoring the forums, and replies as soon as possible. Various technical information can also be found in our Knowledge Base. For your convenience, we have also assembled a Frequently Asked Questions page.
Do not use the Contact page for technical issues.
- Forum
- Discussions
- QuickOPC-UA in .NET
- Reading, Writing, Subscriptions
- Writing Boolean value results in ArgumentNullException
Writing Boolean value results in ArgumentNullException
Can you try disabling the code optimizations for the process? I have never done that, but it seems that for .NET 6, setting the environment variable COMPlus_JITMinOpts=1 before running the process should do it:
- stackoverflow.com/questions/63959038/how-to-suppress-jit-optimization-in-net-core
- stackoverflow.com/questions/73864832/disable-jit-optimizations-for-specific-net-core-assembly
The idea is that you will end up with the same exception, but better stack trace.
Besides this, I actually know how to work around the issue (but I would prefer finding the cause). The problem is in the area where QuickOPC attempts to obtain the data type of the variable that is being written to. This is only done if the data type is *not* specified in the Write call. Specifying the data type should "resolve" it.
So just use a different overload of WriteValue, and add TypeCode.Boolean as the last parameter -
static public (bool Clamped, bool CompletesAsynchronously) WriteValue(
[NotNull] this IEasyUAClient client,
[NotNull] UAEndpointDescriptor endpointDescriptor,
[NotNull] UANodeDescriptor nodeDescriptor,
[CanBeNull] object value,
TypeCode typeCode)
Regards
Please Log in or Create an account to join the conversation.
Thank you
Please Log in or Create an account to join the conversation.
But it does not help. The code is optimized and the really important stack frames are not listed.
Regards
Please Log in or Create an account to join the conversation.
I'm unlikely to reproduce the issue without providing you access to the customer OPC UA server. Could you please examine the attached call stack and determine what might be causing this error?
Please Log in or Create an account to join the conversation.
I do not think this is directly related to the fact that the value is Boolean. In my tests, I can write Boolean values successfully.
Can you put together a test scenario which reliable reproduces the problem?
Best regards
Please Log in or Create an account to join the conversation.
QuickOPC library 5.63.246, .Net Core 6
Writing a boolean value results in an ArgumentNullException: Value cannot be null. (Parameter 'key')
Can you assist me with this?
System.ArgumentNullException: Value cannot be null. (Parameter 'key')
at System.Collections.Generic.Dictionary`2.FindValue(TKey key)
at OpcLabs.EasyOpc.UA.Toolkit.Client.UAClientSession.BrowseNodesPreprocess(UABrowseEntry[] browseEntryArray, Exception[]& exceptionArray, List`1[]& sdkNodesToBrowseArray, List`1[]& warningsArray)
at OpcLabs.EasyOpc.UA.Toolkit.Client.UAClientSession.InternalBrowseNodes(UABrowseEntry[] browseEntryArray, Exception[]& exceptionArray, UANodeElementCollection[]& nodeElementCollectionArray, List`1[]& warningsArray)
at OpcLabs.EasyOpc.UA.Toolkit.Client.UAClientSession.BrowseNodes(UABrowseEntry[] browseEntryArray, Exception[]& exceptionArray, UANodeElementCollection[]& nodeElementCollectionArray, List`1[]& warningsArray)
at OpcLabs.EasyOpc.UA.Implementation.NetSdk.Client.EasyUAClientSession.DetermineDataTypeInternal(UANodeId dataTypeId, Type& dataType)
at OpcLabs.EasyOpc.UA.Implementation.NetSdk.Client.EasyUAClientSession.DetermineDataType(UANodeId dataTypeId, Type& dataType)
at OpcLabs.EasyOpc.UA.Implementation.NetSdk.Client.EasyUAClientSession.DetermineValueType(UAAttributeDataResult dataTypeResult, UAAttributeDataResult valueRankResult, UANodeId& dataTypeId, Int32& valueRank, Type& elementType)
at OpcLabs.EasyOpc.UA.Implementation.NetSdk.Client.EasyUAClientSession.ReadTypeInformation(IEnumerable`1 nodeDescriptorArgumentsEnumerable)+MoveNext()
at OpcLabs.EasyOpc.UA.Implementation.NetSdk.Client.EasyUAClientSession.ObtainTypeInformationInternal(ValueArguments`1[] nodeDescriptorArgumentsArray, ValueResult`1[] typeInformationResultArray)
at OpcLabs.EasyOpc.UA.Implementation.NetSdk.Client.EasyUAClientSession.ObtainTypeInformation(IEnumerable`1 nodeDescriptorArgumentsEnumerable)
at OpcLabs.EasyOpc.UA.Implementation.NetSdk.Client.EasyUAClientSession.ResolveWriteList(List`1 resolveWriteList, ICollection`1 internalWriteList, UAWriteResult[] writeResultArray)
at OpcLabs.EasyOpc.UA.Implementation.NetSdk.Client.EasyUAClientSession.WriteList(List`1 writeList, UAWriteResult[] writeResultArray)
at OpcLabs.EasyOpc.UA.Implementation.NetSdk.Client.EasyUAClientEngine.Write(ICollection`1 writeListDictionary, UAWriteResult[] writeResultArray)
at OpcLabs.EasyOpc.UA.Implementation.NetSdk.Client.EasyUAClientEngine.InnerWriteAttributes(UAWriteArguments[] writeArgumentsArray, EasyUAAdaptableParameters easyUAAdaptableParameters)
at OpcLabs.EasyOpc.UA.Implementation.NetSdk.Client.EasyUAClientEngine.WriteAttributes(UAWriteArguments[] writeArgumentsArray, EasyUAAdaptableParameters easyUAAdaptableParameters)
at OpcLabs.EasyOpc.UA.Implementation.NetSdk.Client.NetSdkEasyUAClient.<>c__DisplayClass56_0.<WriteMultiple>b__0()
at OpcLabs.BaseLib.Internal.DisposableObject.DisposeGuard[TResult](Func`1 func, Boolean throwOnDisposed)
at OpcLabs.EasyOpc.UA.Implementation.NetSdk.Client.NetSdkEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.Implementation.ForwardingEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.Implementation.DelegatingEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.Implementation.ErrorTransformingEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.Implementation.ForwardingEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.Implementation.DelegatingEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.Implementation.DataConvertingEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.Implementation.ForwardingEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.Optimization.Implementation.RequestMergingEasyUAClient.<WriteMultiple>b__3_0(UAWriteArguments[] array)
at OpcLabs.BaseLib.OperationModel.Extensions.IReadOnlyListOfOperationArgumentsExtension.MergingPerform[TArguments,TResult](IReadOnlyList`1 argumentsList, Func`2 arrayOperationFunction)
at OpcLabs.EasyOpc.UA.Optimization.Implementation.RequestMergingEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.Implementation.ForwardingEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.Implementation.DelegatingEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.Implementation.LicensingEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.Implementation.MultiplexingEasyUAClient.<>c.<WriteMultiple>b__22_0(IEasyUAClient client, IReadOnlyList`1 list)
at OpcLabs.BaseLib.Collections.Generic.Extensions.IReadOnlyListExtension.SwitchCase[TInput,TOutput,TKey](IReadOnlyList`1 readOnlyList, Func`2 keySelector, IEqualityComparer`1 keyComparer, Func`3 outputSelector)
at OpcLabs.EasyOpc.UA.Implementation.MultiplexingEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.Implementation.ForwardingEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.Implementation.ForwardingEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.Implementation.DelegatingEasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.EasyUAClient.WriteMultiple(UAWriteArguments[] writeArgumentsArray)
at OpcLabs.EasyOpc.UA.IEasyUAClientExtension.WriteMultipleValues(IEasyUAClient client, UAWriteValueArguments[] writeValueArgumentsArray)
at OpcLabs.EasyOpc.UA.IEasyUAClientExtension.WriteValue(IEasyUAClient client, UAWriteValueArguments writeValueArguments)
at OpcLabs.EasyOpc.UA.IEasyUAClientExtension.WriteValue(IEasyUAClient client, UAEndpointDescriptor endpointDescriptor, UANodeDescriptor nodeDescriptor, Object value, Type valueType)
at OpcLabs.EasyOpc.UA.IEasyUAClientExtension.WriteValue(IEasyUAClient client, UAEndpointDescriptor endpointDescriptor, UANodeDescriptor nodeDescriptor, Object value)
Please Log in or Create an account to join the conversation.
- Forum
- Discussions
- QuickOPC-UA in .NET
- Reading, Writing, Subscriptions
- Writing Boolean value results in ArgumentNullException