Eclipse Milo: lectura y decodificación de un nodo de tipo de datos personalizado desde un Simatic S7-1500

Nov 26 2020

El problema y lo que sospecho que sale mal: estoy tratando de leer un nodo de tipo de datos personalizado de un Siemens Simatic S7-1500 y la decodificación falla con:

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)

Lo que hice hasta ahora: En primer lugar, leí y probé ReadWriteCustomDataTypeNodeExample del módulo de ejemplos de clientes. Básicamente, he copiado este ejemplo y reemplazado CustomStructType por un nuevo tipo personalizado llamado Estado que contiene 10 valores booleanos. Como en la clase CustomStructType, agregué un códec estático a Status que lee los valores booleanos de ByteString usando decoder.readBoolean (). Esto funciona perfectamente. He logrado leer nodos, modificarlos y volver a escribirlos en el servidor OPC UA. Hasta aquí todo bien.

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

A continuación, quiero hacer lo mismo que el anterior, pero con otro TestNode de tipo personalizado que contenga una Cadena y un número entero. Creé la clase con un códec que usa decoder.readString () y decoder.readInt16 (). Cuando intento leer y decodificar el ByteString para este nodo, aparecen dos problemas:

  • readInt16 () lee un valor diferente al valor que veo cuando leo este nodo con UaExpert.
  • readString () lanza la excepción indicada anteriormente.

En este momento, comencé a investigar y encontré lo siguiente:

  • Supongo que readString () usa el nodo ns0 de tipo String OPC UA; i = 12, mientras que, de acuerdo con 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, el servidor Siemens OPC UA usa ns = 3; i = 3014. Probablemente es aquí donde sale mal, pero no estoy seguro.
  • Además, no entiendo por qué readInt16 () lee un valor diferente al valor real. Agregué una captura de pantalla que muestra el nodo en UaExpert con el valor y los tipos de datos. Imagen: TestNode en UaExpert

¿Cuáles son mis opciones en esta situación?

Respuestas

JakubZnamenáček Dec 01 2020 at 13:00

Vengo de este tema

¿Podría proporcionar código para su estructura en java? Tengo el mismo PLC para poder probarlo.

Por cierto, pude leer Int32 y String sin ningún problema. Así es como se ven los tipos en mi cadena lateral , int32 . Verifiqué el enlace que proporcionaste arriba y nuestras entradas son similares, por lo que no veo ningún problema allí, pero mi cadena es diferente.