Eclipse Milo: Lesen und Dekodieren eines benutzerdefinierten Datentypknotens von einer Simatic S7-1500
Das Problem und das, was ich vermute, gehen schief: Ich versuche, einen benutzerdefinierten Datentypknoten von einem Siemens Simatic S7-1500 zu lesen, und die Dekodierung schlägt fehl mit:
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)
Was ich bisher gemacht habe: Zunächst habe ich das ReadWriteCustomDataTypeNodeExample aus dem Client-Beispielmodul gelesen und ausprobiert. Ich habe dieses Beispiel im Grunde genommen kopiert und CustomStructType durch einen neuen benutzerdefinierten Typ namens Status ersetzt, der 10 Boolesche Werte enthält. Wie in der CustomStructType-Klasse habe ich Status einen statischen Codec hinzugefügt, der die booleschen Werte aus dem ByteString mithilfe von decoder.readBoolean () liest. Das funktioniert perfekt. Ich habe es geschafft, Knoten zu lesen, zu ändern und auf den OPC UA-Server zurückzuschreiben. So weit, ist es gut.
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);
Als nächstes möchte ich dasselbe wie oben tun, jedoch mit einem anderen benutzerdefinierten Typ TestNode, der einen String und eine Ganzzahl enthält. Ich habe die Klasse mit einem Codec erstellt, der decoder.readString () und decoder.readInt16 () verwendet. Wenn ich versuche, den ByteString für diesen Knoten zu lesen und zu dekodieren, treten zwei Probleme auf:
- readInt16 () liest einen anderen Wert als den Wert, den ich sehe, wenn ich diesen Knoten mit UaExpert lese.
- readString () löst die oben angegebene Ausnahme aus.
In diesem Moment begann ich zu recherchieren und fand Folgendes:
- Ich gehe davon aus, dass readString () den Knoten ns0 vom Typ OPC UA String verwendet; i = 12, während gemäß 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-GBverwendet der OPC UA-Server von Siemens ns = 3; i = 3014. Hier geht es wahrscheinlich schief, aber ich bin mir nicht sicher.
- Ich verstehe auch nicht, warum readInt16 () einen anderen Wert als den tatsächlichen Wert liest. Ich habe einen Screenshot hinzugefügt, der den Knoten in UaExpert mit dem Wert und den Datentypen zeigt. Bild: TestNode in UaExpert
Welche Möglichkeiten habe ich in dieser Situation?
Antworten
Ich kam von diesem Thema
Könnten Sie Code für Ihre Struktur in Java bereitstellen? Ich habe dieselbe SPS, damit ich sie testen kann.
Übrigens konnte ich Int32 und String problemlos lesen. Dies ist , wie die Typen Blicke auf meiner Seite Zeichenfolge , int32 . Ich habe den oben angegebenen Link überprüft und unsere Ints sind ähnlich, sodass ich dort kein Problem sehe, aber mein String ist anders.