如何解决从OPC UA服务器读取结构化数据
我正在尝试使用opc-ua-client库从OPC UA服务器读取一些数据。设法连接到服务器并读取一些简单的变量,但是在读取结构化值时遇到问题。但是,我可以使用UAExpert等第三方工具浏览这些结构化值。
这是代码段:
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:我不受此库的束缚,可以切换到另一个库(最好是没有许可证,但如果确实值得,可以考虑购买)。
解决方法
一种方法是使用您希望使用的信息模型的XML描述(所谓的nodesets),并使用OPC Foundation中的model compiler从中生成C#类。这些类可以集成到您的解决方案中,并用于反序列化。
可以找到示例(使用OPC Foundation库)here
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。