从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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...