Tc3JsonXmlSampleJsonDataType

Beispiel zum automatischen Konvertieren von Strukturen in ein JSON-Objekt

Dieses Beispiel veranschaulicht, wie eine Datenstruktur in ein JSON-Objekt (und umgekehrt) konvertiert werden kann. Bei der Konvertierung wird der Aufbau einer Struktur eins-zu-eins in ein entsprechendes JSON-Äquivalent überführt. Über SPS-Attribute an den Member-Variablen der Struktur können zusätzlich Metadaten angelegt werden. Umgekehrt wird im zweiten Teil des Beispiels aus einem passenden JSON-Objekt eine bereits vorhandene Datenstruktur in der SPS mit Werten befüllt.

Aufbau der Datenstruktur

TYPE ST_Values :
STRUCT

  {attribute 'Unit' := 'm/s'}
  {attribute 'DisplayName' := 'Speed'}
  Sensor1 : REAL;

  {attribute 'Unit' := 'V'}
  {attribute 'DisplayName' := 'Voltage'}
  Sensor2 : DINT;

  {attribute 'Unit' := 'A'}
  {attribute 'DisplayName' := 'Current'}
  Sensor3 : DINT;

END_STRUCT
END_TYPE

Generierung des JSON-Dokuments aus einer Datenstruktur

Zunächst wird eine Instanz der Datenstruktur ST_Values direkt in ein JSON-Objekt konvertiert, anschließend werden dem JSON-Dokument noch die zugehörigen Metadaten hinzugefügt. Dann werden ausgehend von der Instanz fbJson des Funktionsbausteins FB_JsonSaxWriter zwei Wege zum Generieren eines JSON-Dokuments gezeigt. Bei einem JSON-Dokument mit nicht mehr als 255 Zeichen kann die Methode GetDocument() verwendet werden. Bei größeren JSON-Dokumenten muss hingegen die Methode CopyDocument() verwendet werden.

IF bStart
    // Part 1: create JSON with meta data from structure
    bStart := FALSE;
    stValues.Sensor1 := 42.42;
    stValues.Sensor2 := 50;
    stValues.Sensor3 := 7;
    fbJson.ResetDocument();
    fbJson.StartObject();
    fbjson.AddKeyDateTime('Timestamp', dtTimestamp);
    // Adding stValues to JSON document
    fbJsonDataType.AddJsonKeyValueFromSymbol(fbJson, 'Values', 'ST_Values', SIZEOF(stValues), ADR(stValues));
    // Adding metadata from ST_Values datatype to JSON document
    fbJsonDataType.AddJsonKeyPropertiesFromSymbol(fbJson, 'MetaData', 'ST_Values', 'Unit|DisplayName');
    fbJson.EndObject();

    sJsonDoc := fbJson.GetDocument();
    fbJson.CopyDocument(sJsonDoc2, SIZEOF(sJsonDoc2));
END_IF

Resultierendes JSON-Dokument

{
  "Timestamp": "2017-04-04T12:42:42",
  "Values": {
    "Sensor1": 42.42,
    "Sensor2": 50,
    "Sensor3": 7
  },
  "MetaData": {
    "Sensor1": {
      "Unit": "m/s",
      "DisplayName": "Speed"
    },
    "Sensor2": {
      "Unit": "V",
      "DisplayName": "Voltage"
    },
    "Sensor3": {
      "Unit": "A",
      "DisplayName": "Current"
    }
  }
}

Werte aus einem JSON-Dokument in eine Datenstruktur schreiben

Als Alternative kann auch die Methode AddJsonValueFromSymbol() verwendet werden, um aus einer Datenstruktur direkt ein JSON-Objekt zu erzeugen. Dieses resultierende JSON-Objekt wird im nächsten Schritt dazu verwendet, eine weitere Instanz der gleichen Datenstruktur mit Werten zu befüllen.

fbJson.ResetDocument();
// Adding stValues to JSON document
fbJsonDataType.AddJsonValueFromSymbol(fbJson, 'ST_Values', SIZEOF(stValues), ADR(stValues));
sJsonDoc3 := fbJson.GetDocument();
// Using JSON to set values in stValuesRcv
fbJsonDataType.SetSymbolFromJson(sJsonDoc3, 'ST_Values', SIZEOF(stValuesRcv), ADR(stValuesRcv));

Das resultierende JSON-Objekt sieht wie folgt aus:

{
  "Sensor1": 42.42,
  "Sensor2": 50,
  "Sensor3": 7
}

Die String-Variable sJsonDoc3 enthält das JSON-Objekt, das durch den Aufruf der Methode in die Strukturinstanz stValuesReceive überführt wird.

Tc3JsonXmlSampleJsonDataType 1:

Zieldatenstruktur

Die Zieldatenstruktur muss exakt zum Aufbau des JSON-Dokuments passen. Ansonsten liefert SetSymbolFromJson() FALSE zurück.