Why am I getting the error: "Opc.Ua.Variant[]System.InvalidCastException: Object cannot be stored in an array of this type"?

Why am I getting the error: "Opc.Ua.Variant[]System.InvalidCastException: Object cannot be stored in an array of this type"?

Opc.Ua调用方法错误

我对使用 Opc.Ua 和 Opc.Ua.Client 还很陌生,我正在尝试使用 Call 方法在我的 OPC UA 服务器上调用 Scan 方法。我一直在尝试使用 Call 方法来 return 响应(IList<object> 根据 Visual Studio)。但是,当我 运行 我的程序出现此错误时:

如果我尝试更改列表类型或尝试使用其他类型,我什至在编译之前就会收到类型错误。

Scan 方法采用以下输入参数:

C# 的调用方法定义:

我使用这些变量并调用所述方法:

NodeId scanMethodNode = new NodeId(7010, 4);
NodeId readPoint1Object = new NodeId(5002, 4);

List<object> inputArgs2 = new List<object>();
inputArgs2.Add(0);
inputArgs2.Add(1);
inputArgs2.Add(false);

IList<object> result  = session.Call(readPoint1Object, scanMethodNode, inputArgs2);

我发现 C# 认为正确的语法与在线文档所说的有些不一致。由于这种反复无常,我可能错过了一些东西。任何帮助将不胜感激:)

您的 OPC UA 客户端需要创建一个 ScanSetting 对象并将其作为 ExtensionObject 传递给函数。 您首先需要从服务器加载 ScanSetting 类型定义并使用它来创建 ScanSettings 对象。

为此,最简单的方法是使用 OPCFoundation.NetStandard.Opc.Ua.Client.ComplexTypes Nuget 包

中的 LoadType
ComplexTypeSystem complexTypeSystem = new ComplexTypeSystem(this.Session);

NodeId nid = new NodeId((uint)3010, (ushort)3);
ExpandedNodeId eni = new ExpandedNodeId(nid); 

Type scanSettingsType = await complexTypeSystem.LoadType(eni).ConfigureAwait(false);
dynamic scanSettings = Activator.CreateInstance(scanSettingsType);
scanSettings.Duration = (Duration)0;
scanSettings.Cycles = (Int32)0;
scanSettings.DataAvailable = (Boolean)false;
scanSettings.LocationType = (Int32)0; //optional

那么你应该可以这样调用 Call:

IList<object> result  = session.Call(readPoint1Object, scanMethodNode, new ExtensionObject(scanSettings));