Getting Started

Dieser Dokumentationsartikel soll Ihnen einen ersten, schnellen Start in die Verwendung der Tc3_JsonXml SPS-Bibliothek ermöglichen. Der Artikel geht hierbei von folgendem Anwendungsfall aus:

Für weitere Code-Beispiele empfehlen wir auch unsere Samples.

Inhalt der Datei

Die Datei myJsonContent.json liegt im lokalen Dateisystem unter folgendem Pfad: c:\temp\myJsonContent.json und hat den folgenden Inhalt:

{
  "Timestamp":"2017-04-04T12:42:42",
  "Values": {
      "Sensor1": 42.41999816894531,
      "Sensor2": [1,2,3,4,5],
      "Sensor3": 10
  }
}

Deklarationen

Die folgenden Variablen-Deklarationen werden für das weitere Vorgehen benötigt:

fbJson : FB_JsonDomParser;
jsonRoot : SJsonValue;
jsonProp : SJsonValue;
jsonIterator : SJsonValue;
jsonIteratorEnd : SJsonValue;
bLoadJsonFile : BOOL;
sTimestamp : STRING;
fSensor1 : LREAL;
aSensor2 : ARRAY[0..4] OF DINT;
nSensor3 : DINT;
i : UINT;

Bitte stellen Sie des Weiteren sicher, dass Sie eine Referenz zu der SPS-Bibliothek Tc3_JsonXml zu Ihrem SPS-Projekt hinzugefügt haben.

Einlesen der Datei

Zum Einlesen der Datei wird die Methode LoadDocumentFromFile aus dem Funktionsbaustein FB_JsonDomParser verwendet. Die Ausführung der Methode wird über eine steigende Flanke am Eingang bExec gesteuert.

IF bLoadJsonFile = TRUE THEN
  fbJson.LoadDocumentFromFile('C:\Temp\myJsonContent.json', bLoadJsonFile);
END_IF
Getting Started 1:

Quelle des JSON Dokuments

Falls in Ihrem Anwendungsfall das JSON Dokument bereits in der SPS vorliegt, z. B. in einer Variablen vom Datentyp STRING, so können Sie die Methode ParseDocument verwenden, um das Dokument in den Speicher zu laden und weiter zu verarbeiten.

Parsen des JSON Dokuments

Mit der Methode GetDocumentRoot lässt sich der Anfang des JSON Dokuments im Speicher referenzieren. Der Rückgabewert der Methode ist ein Interface Pointer.

jsonRoot := fbJson.GetDocumentRoot();

Von hier können nun die weiteren Keys auf erster Ebene ausgelesen werden, z. B. der Key 'Timestamp' über die Methode GetString:

jsonProp := fbJson.FindMember(jsonRoot, 'Timestamp');
IF (jsonProp <> 0) THEN
  sTimestamp := fbJson.GetString(jsonProp);
END_IF

Bei dem nächsten Key ('Values') handelt es sich um ein verschachteltes JSON Objekt. Die Kindelemente von diesem Objekt können über die Methode FindMemberPath direkt ausgelesen werden, zum Beispiel für das Element 'Values/Sensor1':

jsonProp := fbJson.FindMemberPath(jsonRoot, 'Values/Sensor1');
IF (jsonProp <> 0) THEN
  fSensor1 := fbJson.GetDouble(jsonProp);
END_IF

Bei dem nächsten Kindelement ('Values/Sensor2') handelt es sich um ein Array. Dieses kann über die Verwendung der Methoden ArrayBegin und ArrayEnd ausgelesen werden.

jsonProp := fbJson.FindMemberPath(jsonRoot, 'Values/Sensor2');
IF (jsonProp <> 0) THEN
  jsonIterator := fbJson.ArrayBegin(jsonProp);
  jsonIteratorEnd := fbJson.ArrayEnd(jsonProp);
  WHILE jsonIterator <> jsonIteratorEnd DO
    IF (jsonProp <> 0) THEN
      aSensor2[i] := fbJson.GetInt(jsonIterator);
    END_IF
    jsonIterator := fbJson.NextArray(jsonIterator);
    i := i + 1;
  END_WHILE
  i := 0;
END_IF

Das nächste Kindelement ('Values/Sensor3') ist ähnlich in der Handhabung wie das Element 'Values/Sensor1'. Anstelle der Methode GetDouble wird hier dann jedoch die Methode GetInt verwendet, um den Wert des Keys auszulesen.

jsonProp := fbJson.FindMemberPath(jsonRoot, 'Values/Sensor3');
IF (jsonProp <> 0) THEN
  nSensor3 := fbJson.GetInt(jsonProp);
END_IF

Komplettes Codebeispiel

Im Folgenden finden Sie die obigen Code-Snippets einmal als vollständiges Beispiel.

Deklarationsteil

PROGRAM MAIN
  fbJson : FB_JsonDomParser;
  jsonRoot : SJsonValue;
  jsonProp : SJsonValue;
  jsonIterator : SJsonValue;
  jsonIteratorEnd : SJsonValue;
  bLoadJsonFile : BOOL;
  sTimestamp : STRING;
  fSensor1 : LREAL;
  aSensor2 : ARRAY[0..4] OF DINT;
  nSensor3 : DINT;
  i : UINT;
END_VAR

Implementierungsteil

IF bLoadJsonFile = TRUE THEN
  fbJson.LoadDocumentFromFile('C:\Temp\myJsonContent.json', bLoadJsonFile);
  jsonRoot := fbJson.GetDocumentRoot();
  jsonProp := fbJson.FindMember(jsonRoot, 'Timestamp');
  IF (jsonProp <> 0) THEN
    sTimestamp := fbJson.GetString(jsonProp);
  END_IF
  jsonProp := fbJson.FindMemberPath(jsonRoot, 'Values/Sensor1');
  IF (jsonProp <> 0) THEN
    fSensor1 := fbJson.GetDouble(jsonProp);
  END_IF
  jsonProp := fbJson.FindMemberPath(jsonRoot, 'Values/Sensor2');
  IF (jsonProp <> 0) THEN
    jsonIterator := fbJson.ArrayBegin(jsonProp);
    jsonIteratorEnd := fbJson.ArrayEnd(jsonProp);
    WHILE jsonIterator <> jsonIteratorEnd DO
      IF (jsonProp <> 0) THEN
        aSensor2[i] := fbJson.GetInt(jsonIterator);
      END_IF
      jsonIterator := fbJson.NextArray(jsonIterator);
      i := i + 1;
    END_WHILE
    i := 0;
  END_IF
  jsonProp := fbJson.FindMemberPath(jsonRoot, 'Values/Sensor3');
  IF (jsonProp <> 0) THEN
    nSensor3 := fbJson.GetInt(jsonProp);
  END_IF
END_IF

Nach dem erfolgreichen Durchlauf des obigen Codes befinden sich die ausgelesenen Keys in den entsprechenden SPS Variablen, z. B. wie folgt:

Getting Started 2: