Eclipse Milo: lectura y decodificación de un nodo de tipo de datos personalizado desde un Simatic S7-1500
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
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.