【发布时间】:2021-02-08 12:57:02
【问题描述】:
我正在尝试使用opc-ua-client 库从 OPC UA 服务器读取一些数据。设法连接到服务器并读取一些简单的变量,但在读取结构化值时遇到问题。但是,我可以使用 3rd 方工具(例如,UAExpert)浏览这些结构化值。
这是代码sn-p:
var readRequest = new ReadRequest
{
NodesToRead = new[] { new ReadValueId { NodeId = NodeId.Parse(nodeId), AttributeId = AttributeIds.Value } }
};
var response = channel.ReadAsync(readRequest).Result;
var result = response.Results[0].GetValueOrDefault<ExtensionObject>();
重点是:我应该如何将 ExtensionObject 转换为底层的真实对象?响应的主体被二进制序列化为 System.Byte[] 字段,并且不知道如何反序列化它。我知道结构的字段和类型,所以在代码中定义(甚至用服务器提供的命名空间装饰)如下:
[BinaryEncodingId("nsu=urn:OMRON:NxOpcUaServer:FactoryAutomation;i=5005")]
private class MES_WRITE_STRUCT : Structure
{
uint Message_NUM { get; set; }
//Some other fields
DateTime Time_Stamp { get; set; }
}
到目前为止我尝试过(但失败了)的事情:
-
蛮力演员:
var eObject = (MES_WRITE_STRUCT)result.GetValueOrDefault<ExtensionObject>(); -
将响应读取为预期类型,而不是使用通用对象:
var eObject = result.GetValueOrDefault<MES_WRITE_STRUCT>(); -
使用 Variant 属性而不是 Value(结果与 使用值):
result.Variant.GetValue(); -
创建一个二进制阅读器并尝试将其反序列化为预期的 类。
也许我使用了错误的方法,应该以不同的方式阅读结构化值。甚至该库也不支持结构化变量(可用的文档不多)。或者只是在 .NET 中定义自定义类时使用了不正确的类型,因此强制转换失败。
我完全被卡住了,欢迎提供任何信息或指导。
PS:我没有绑定到这个库,可以切换到另一个库(最好没有许可证,但如果真的值得考虑购买)。
【问题讨论】:
-
如果您找到了解决方案,您能否分享有关此问题的任何更新?