【问题标题】:Decode binary ExtensionObject解码二进制 ExtensionObject
【发布时间】:2017-11-16 14:34:18
【问题描述】:

我正在测试 Eclipse Milo(版本 0.1.5)作为客户端与 TwinCAT PLC 的 OPC UA 服务器通信。我的 java 程序充当一种中间件。它从 TwinCAT OPC UA 服务器读取结构,将它们的值放入 JSON 并将其发送到其他服务器。

为了进行测试,我在 PLC 中创建了一个包含两个变量的示例结构:
stSimpleStruct (PLC 中的结构定义)
- bVar1(布尔值)
- fVar2(浮点数)
Picture of Struct in TwinCAT

如果我读取节点,该值是一个 ExtensionObject,编码为 ByteString。应该读取结构变量(bVar1 和 fVar2)的值并将其放入 JSON 对象中。所以结果是这样的:

{
    “bVar1” : false,
    “fVar2” : 0
}

上面的结构只是一个例子。要读取的结构仅在运行时已知。如何解码二进制 ExtensionObject 以访问结构变量的值?

这是我的代码:

 // Get endpoints
 String endpointURL = "opc.tcp://172.20.1.1:4840";
 EndpointDescription[] endpoints = UaTcpStackClient.getEndpoints(endpointURL).get();
 logger.info("Available endpoint:");
 for (EndpointDescription endpoint : endpoints)
 {
     logger.info("{} Security: {}", endpoint.getEndpointUrl(), endpoint.getSecurityPolicyUri());
 }
 // Chose endpoint
 SecurityPolicy securityPolicy = SecurityPolicy.None;
 EndpointDescription endpoint = Arrays.stream(endpoints)
     .filter(e -> e.getSecurityPolicyUri().equals(securityPolicy.getSecurityPolicyUri()))
     .findFirst()
     .orElseThrow(() -> new Exception("No desired endpoints returned"));
 logger.info("Using endpoint: {} [{}]", endpoint.getEndpointUrl(), SecurityPolicy.None);
 // Create client config
 OpcUaClientConfig config = OpcUaClientConfig.builder()
     .setApplicationName(LocalizedText.english("TestApplication"))
     .setEndpoint(endpoint)
     .setRequestTimeout(uint(5000))
     .build();
 OpcUaClient client = new OpcUaClient(config);
 // Synchronous connect
 client.connect().get();
 // Read struct
 NodeId nodeId = new NodeId(4, "MAIN.stSimpleStruct");
 VariableNode node = client.getAddressSpace().createVariableNode(nodeId);
 DataValue value = node.readValue().get();
 ExtensionObject extensionObject = (ExtensionObject) value.getValue().getValue();

【问题讨论】:

  • 欢迎来到 Stack Overflow!寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建 minimal reproducible example。使用“编辑”链接改进您的问题 - 不要通过 cmets 添加更多信息。谢谢!
  • 不要链接到带有屏幕截图或其他内容的外部站点。在问题中包含您的源代码以及格式化文本!
  • 您也可以直接将屏幕截图添加到您的问题中
  • 感谢您的建议,我试图改进问题。

标签: java decode opc-ua milo


【解决方案1】:

Milo 目前不支持自定义数据类型。

我的工作代码可以读取服务器中的 DataTypeDictionary 节点,并在运行时构建自定义编解码器,这些编解码器注册到 DataTypeManager,但是是否、何时以及如何发布此代码仍未确定。无论如何,它是针对 Milo 的开发 0.2.0 分支编写的,该分支已更改以适应自定义数据类型,因此至少在那时它才可用。

如果你想进一步讨论这个问题,你可以给我发邮件,列表,或者在 gitter.im 频道停下来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-02
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2012-07-25
    • 2013-04-07
    相关资源
    最近更新 更多