0

问题和我怀疑的问题: 我正在尝试从 Siemens Simatic S7-1500 读取自定义数据类型节点,但解码失败:

Error running client example: max string length exceeded (length=1819042152, max=2097152)
org.eclipse.milo.opcua.stack.core.UaSerializationException: max string length exceeded (length=1819042152, max=2097152)

到目前为止我所做 的:首先,我已经阅读并尝试了客户端示例模块中的 ReadWriteCustomDataTypeNodeExample。我基本上复制了这个示例并将 CustomStructType 替换为一个名为 Status 的新自定义类型,其中包含 10 个布尔值。就像在 CustomStructType 类中一样,我向 Status 添加了一个静态编解码器,它通过使用 decoder.readBoolean() 从 ByteString 读取布尔值。这完美地工作。我已经设法读取节点、修改它们并将它们写回 OPC UA 服务器。到目前为止,一切都很好。

    NodeId binaryEncodingId = new NodeId(3, "TE_\"DB_FUNCTION_STATUS\".\"TEST\"");
// Register codec with the client DataTypeManager instance
client.getDataTypeManager().registerCodec(
        binaryEncodingId,
        new TestNode.Codec().asBinaryCodec()
);

// synchronous read request via VariableNode
NodeId nodeId = new NodeId(3, "\"DB_FUNCTION_STATUS\".\"TEST\"");
UaVariableNode node = client.getAddressSpace().getVariableNode(nodeId);
DataValue value = node.readValue();

logger.info("====== Reading value from OPC UA Server =======");
logger.info("Value={}", value);

Variant variant = value.getValue();
ExtensionObject xo = (ExtensionObject) variant.getValue();

TestNode decoded = (TestNode) xo.decode(
        client.getSerializationContext()
);
logger.info("Decoded={}", decoded);

接下来,我想做与上面相同的操作,但使用另一个包含字符串和整数的自定义类型 TestNode。我用一个使用decoder.readString() 和decoder.readInt16() 的编解码器创建了这个类。当我尝试读取和解码此节点的 ByteString 时,出现两个问题:

  • readInt16() 读取的值与我使用 UaExpert 读取此节点时看到的值不同。
  • readString() 抛出上述异常。

这时,我开始做研究,发现如下:

在这种情况下我有什么选择?

4

1 回答 1

0

我遇到了完全相同的问题,我花了两天时间才弄清楚原因。事实上,我偶然发现了 milo-dev 邮件列表中的线程https://www.eclipse.org/lists/milo-dev/msg00890.html,这最终给了我所需的提示。

在您的解码函数中,读取函数调用的顺序很重要。这有点不直观,因为字段已经用它们的名称寻址。

所以,如果你的函数看起来像这样:

@Override
public TestNode decode(SerializationContext context, UaDecoder reader) {
    String str = reader.readString("String");
    short integer = reader.readInt16("Integer");
    return TestNode(str, integer);
}

然后,关于读取函数调用的顺序,您必须遵守 UaExpert 中显示的顺序(在左侧图片中,在 Value -> Value 下)。

我希望这能解决你的问题。

于 2021-04-28T18:33:16.417 回答