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));
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 包
中的 LoadTypeComplexTypeSystem 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));