Eclipse Milo: Odczytywanie i dekodowanie niestandardowego węzła typu danych z Simatic S7-1500

Nov 26 2020

Problem i to, co podejrzewam, idzie nie tak: próbuję odczytać niestandardowy węzeł typu danych z Siemens Simatic S7-1500 i dekodowanie kończy się niepowodzeniem z:

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)

Co zrobiłem do tej pory: przede wszystkim przeczytałem i wypróbowałem ReadWriteCustomDataTypeNodeExample z modułu przykładów klienta. Zasadniczo skopiowałem ten przykład i zastąpiłem CustomStructType nowym typem niestandardowym o nazwie Status, zawierającym 10 wartości logicznych. Podobnie jak w klasie CustomStructType, dodałem statyczny kodek do Status, który odczytuje wartości logiczne z ByteString za pomocą decoder.readBoolean (). To działa doskonale. Udało mi się odczytać węzły, zmodyfikować je i ponownie zapisać na serwerze OPC UA. Jak na razie dobrze.

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

Następnie chcę zrobić to samo, co powyżej, ale z innym niestandardowym typem TestNode zawierającym ciąg i liczbę całkowitą. Stworzyłem klasę z kodekiem, który używa decoder.readString () i decoder.readInt16 (). Kiedy próbuję odczytać i zdekodować ByteString dla tego węzła, pojawiają się dwa problemy:

  • readInt16 () odczytuje inną wartość niż wartość, którą widzę, gdy czytam ten węzeł za pomocą UaExpert.
  • readString () zgłasza wyjątek podany powyżej.

W tym momencie zacząłem zbierać informacje i znalazłem:

  • Zakładam, że readString () używa węzła typu OPC UA String ns0; i = 12, podczas gdy zgodnie z 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, serwer Siemens OPC UA używa ns = 3; i = 3014. Prawdopodobnie dzieje się to źle, ale nie jestem pewien.
  • Nie rozumiem też, dlaczego readInt16 () odczytuje inną wartość niż wartość rzeczywista. Dodałem zrzut ekranu, który pokazuje węzeł w UaExpert z wartościami i typami danych. Obraz: TestNode w UaExpert

Jakie mam możliwości w tej sytuacji?

Odpowiedzi

JakubZnamenáček Dec 01 2020 at 13:00

Przyszedłem z tego tematu

Czy mógłbyś podać kod dla swojej struktury w Javie? Mam ten sam sterownik PLC, więc mogłem go przetestować.

BTW udało mi się bez problemu odczytać Int32 i String. Tak wyglądają typy na moim ciągu bocznym , int32 . Sprawdziłem link, który podałeś powyżej, a nasze int są podobne, więc nie widzę tam żadnego problemu, ale mój ciąg jest inny.