Beispiel zum automatischen Konvertieren von Strukturen in eine JSON-Nachricht

alb

Level-2
Beiträge
75
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Ich möchte die Aktualwerte von SPS-Datenstrukturen zu Json-Nachrichten serialisieren, bzw. die Werte aus Json-Nachrichten in passendes Structs schreiben. Ziel ist Datensicherung von Rezepten, Einstellungen, etc.
Bei Beckhoff gibt es eine Json Bibliothek und ein Beispielprojekt, welches genau das tut:

Beispiel in knowledgebase

Git Sample code

Es werden Json-Strings erzeugt, die sehen gut aus und beinhalten die aktellen Daten. In Zeile 13 wird mit der Methode "SetSymbolFromJson" die erzeugte Nachricht ausgewertet und in in die Struktur "stValuessRcv" geschrieben (zumindest verstehe ich das so).
Das funktioniert bei mir leider nicht :-(
"stValuessRcv" wird nicht beschrieben, sondern bleibt auf Initialisierungswerten stehen. Durch die gleichen Ini-Werte, sieht es esstmal gut aus, aber wenn mann Werte ändert, merkt mann das es nicht klappt.

Verstehe ich das Beispiel nicht richtig, ist das Beispiel kaputt oder Benutze ich es falsch?
Habe Zeile 13 dann etwas erweitert, um die Rückgabewerte zu erhalten:
bSuccess = fbJsonDataType.SetSymbolFromJson( ... hrErrorCode => Error)
Das ergibt Success = False und Fehler -1743714560
Leider finde ich die Fehlercodes der Json-Lib irgendwie nicht.

Was mache ich falsch, hat jemand nen Tip für mich?

Grüße und Danke im Vorraus!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
98110700 - allgemeiner Gerätefehler. Hilft mir leider nicht weiter.

ps: Ach Mist, die Fehlerliste war garnicht so gut versteckt. Manchmal ist man echt blind 🙈
 
Habe das Beispiel mal in soweit angepasst, dass alle HRESULT eingesammelt werden. Der erste Fehler tritt schon beim Erzeugendes Strings auf (obwohl der Json-String gut aussieht). Zeile 6:
fbJsonDataTyp.AddJsonKeyValueFromSymbol(..., HRESULT = 9811070c
bedeutet DSERR_DEVICE_NOTFOUND | Nicht gefunden (Dateien,...)




 
Bei "Geräte-Fehler" würde ich auch nach einem Gerät suchen, z.B. AMS-NetId / ADS-Adresse falsch oder nicht leer gelassen für lokalen Zugriff, Laufwerk falsch nicht bereit, falsche Pfadangabe, Sender-/Empfänger nicht bereit o.ä.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also Probleme mit ADS-Adressen etc. kann ich nirgenwo finden. Glaube langsam das mit dem Beispielcode oder der Library irgendwas nicht stimmt, und werde es mal an den Support reichen.

Trotzdem Danke
 
Ich arbeite schon sehr lange und intensiv mit diesen JSON Funktionen. Grundsätzlich funktionieren sie wunderbar. Ich schaue mal kurz, ob ich etwas herausfinde...
 
Das Beispiel funktioniert tatsächlich nicht. Ich habe auch schon herausgefunden wieso: Sie versuchen einen JSON String der eine andere Struktur hat als "ST_Values" in eine Struktur vom Typ ST_Values zu wandeln. Das geht natürlich nicht. Damit das Bsp. funktioniert, muss der entsprechende Datentyp angelegt werden:
Code:
TYPE ST_ValuesWithTimeStamp :
STRUCT
  Timestamp     : DATE_AND_TIME;
  Values        : ST_Values;
END_STRUCT
END_TYPE

und das Programm muss dann so aussehen:
Code:
PROGRAM MAIN
VAR
    bStart            : BOOL := TRUE;
    
    
    dtTimestamp : DATE_AND_TIME := DT#2017-04-04-12:42:42;
      (* JSON document *)
      fbJson            : FB_JsonSaxWriter;
    fbJsonDataType    : FB_JsonReadWriteDataType;
    sJsonDoc        : STRING(255); // Small JSON document, can be generated via GetDocument() for up to 255 characters
    sJsonDoc2        : STRING(2000); // Large JSON document, can be generated via CopyDocument()
    stValues        : ST_Values;
    stValuesRcv        : ST_Values:= (Sensor1:= 0, Sensor2:= 0, Sensor3:= 0);
  stValuesWithTimeRcv: ST_ValuesWithTimeStamp:= (Sensor1:= 0, Sensor2:= 0, Sensor3:= 0);
END_VAR

IF bStart THEN
    bStart := FALSE;
    fbJson.ResetDocument();
    fbJson.StartObject();
    fbjson.AddKeyDateTime('Timestamp', dtTimestamp);
    fbJsonDataType.AddJsonKeyValueFromSymbol(fbJson, 'Values', 'ST_Values', SIZEOF(stValues), ADR(stValues));
//    fbJsonDataType.AddJsonKeyPropertiesFromSymbol(fbJson, 'MetaData', 'ST_Values', 'Unit|DisplayName');
    fbJson.EndObject();

    sJsonDoc := fbJson.GetDocument();
    fbJson.CopyDocument(sJsonDoc2, SIZEOF(sJsonDoc2));
    
    fbJsonDataType.SetSymbolFromJson(sJsonDoc,'ST_ValuesWithTimeStamp',SIZEOF(stValuesWithTimeRcv), ADR(stValuesWithTimeRcv));
END_IF

Ich musste auch noch die Zeile mit den Metadaten auskommentieren, da die SetSymbolFromJson Methode damit schenbar auch Mühe hat.

So funktioniert es bei mir.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte die Aktualwerte von SPS-Datenstrukturen zu Json-Nachrichten serialisieren, bzw. die Werte aus Json-Nachrichten in passendes Structs schreiben. Ziel ist Datensicherung von Rezepten, Einstellungen, etc.

Achtung:
Beim Bauen von JSONs von (L)REAL Symbolen die auf .0 enden wird in der JSON die ".0" abgeschnitten.
Das führt beim Rücklesen dazu das diese nicht auf das Symbol geparst werden können. Beckhoff konnte mir bis heute nicht sagen ob es gefixt wird/wurde. Habe dann auch nicht weiter nachgefragt.

Die Datensicherung mache ich jetzt mit einer kleinen C# Konsolenanwendung die mir alle als Persistent geflaggten Symbole mit Pfad und Wert in eine JSON schreibt.
 
Hallo,
großen Dank für die super Unterstützung! Und Sorry für die späte Rückmeldung!
Der Beckhoff-Support hat sich gemeldet und im wesentlichen das gleiche geschrieben. Ich habe jetzt mal etwas getestet, und die json library scheint jetzt für meine Anwendung gut zu funktionieren.
@Glon: Das Problem mit den LREAL-Symbolen konnte ich nicht reproduzieren. Vielleicht ist es inzwischen gefixed.

Grüße
 
Zurück
Oben