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_TYPEGenerierung 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_IFResultierendes 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.
![]() | Zieldatenstruktur Die Zieldatenstruktur muss exakt zum Aufbau des JSON-Dokuments passen. Ansonsten liefert SetSymbolFromJson() FALSE zurück. |
