Eclipse Milo: Lendo e decodificando um nó de tipo de dados personalizado de um Simatic S7-1500

Nov 26 2020

O problema e o que eu suspeito que está errado: estou tentando ler um nó de tipo de dados personalizado de um Siemens Simatic S7-1500 e a decodificação falha com:

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)

O que fiz até agora: em primeiro lugar, li e experimentei o ReadWriteCustomDataTypeNodeExample do módulo de exemplos do cliente. Basicamente, copiei este exemplo e substituí CustomStructType por um novo tipo personalizado chamado Status contendo 10 booleanos. Como na classe CustomStructType, adicionei um codec estático ao Status que lê os valores booleanos de ByteString usando decoder.readBoolean (). Isso funciona perfeitamente. Consegui ler os nós, modificá-los e gravá-los de volta no servidor OPC UA. Por enquanto, tudo bem.

    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);

Em seguida, quero fazer o mesmo que acima, mas com outro tipo personalizado TestNode contendo uma String e um inteiro. Criei a classe com um codec que usa decoder.readString () e decoder.readInt16 (). Quando tento ler e decodificar o ByteString para este nó, aparecem dois problemas:

  • readInt16 () lê um valor diferente do valor que vejo quando leio este nó com UaExpert.
  • readString () lança a exceção declarada acima.

Nesse momento, comecei a pesquisar e descobri o seguinte:

  • Presumo que readString () use o nó do tipo String OPC UA ns0; i = 12, enquanto, de acordo com https://support.industry.siemens.com/cs/document/109780313/under-which-node-ids-do-you-find-the-type-descriptions-of-the-simatic-data-types-in-the-opc-ua-server-of-a-simatic-s7-1200-s7-1500-?dti=0&lc=en-GB, o servidor Siemens OPC UA usa ns = 3; i = 3014. Provavelmente é aí que dá errado, mas não tenho certeza.
  • Além disso, não entendo por que readInt16 () lê um valor diferente do valor real. Eu adicionei uma captura de tela que mostra o nó em UaExpert com o valor e os tipos de dados. Imagem: TestNode em UaExpert

Quais são minhas opções nesta situação?

Respostas

JakubZnamenáček Dec 01 2020 at 13:00

Eu vim deste tópico

Você poderia fornecer código para sua estrutura em java? Tenho o mesmo PLC para poder testá-lo.

BTW eu era capaz de ler Int32 e String sem nenhum problema. É assim que os tipos aparecem na minha string lateral , int32 . Eu verifiquei o link que você forneceu acima e nossos ints são semelhantes, então não vejo nenhum problema aí, mas meu String é diferente.