Einzelnen Wert aus einem JSON-String auslesen

Otwin

Level-2
Beiträge
143
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

ich versuche gerade aus einem JSON-String (API von einer OpenDTU) einen einzelnen Wert auszulesen.
Leider funktioniert das gar nicht.
Was ich verwendet habe:
- Controller: CC100 von Wago
- Codesys 3.5SP19
- appHTTP um die Daten von der OpenDTU zu holen
- appJSON FbGetSingleKeyValue um einen einzelnen Wert zu extrahieren.

Code:
PROGRAM prk_Komm_OpenDTU
VAR
    FbHTTP_Get:  FbHTTP_Get;
    FbGetSingleKeyValue: FbGetSingleKeyValue;
    xTrtigger1:BOOL;
    Buffer: uMQTTString;
    
    sResult:STRING;
END_VAR


FbGetSingleKeyValue(sKey:= '.total.Power.v', paJsonData:= ADR(Buffer.sString), udiSizeData:= SIZEOF(Buffer.sString), sValue=> sResult);

Als Buffer haber ich eine UNION aus Bytearray und String verwendet, hilft aber auch nicht.

Der FbGetSingleKeyValue liefert keinen Wert zurück.
Die Doku von Wago ist leider auch nicht allzu hilfreich.

Hat das so schonmal jemand gemacht und kann mir weiter helfen?

Gruß
Otwin
 
Zuviel Werbung?
-> Hier kostenlos registrieren
{"inverters":[{"serial":"116484413696","name":"Balkon Sued-West","order":2,"data_age":7,"poll_enabled":true,"reachable":true,"producing":true,"limit_relative":100,"limit_absolute":1600,"AC":{"0":{"Power":{"v":90.40000153,"u":"W","d":1},"Voltage":{"v":231.6999969,"u":"V","d":1},"Current":{"v":0.389999986,"u":"A","d":2},"Power DC":{"v":95.09999084,"u":"W","d":1},"YieldDay":{"v":1986,"u":"Wh","d":0},"YieldTotal":{"v":1173.458984,"u":"kWh","d":3},"Frequency":{"v":50,"u":"Hz","d":2},"PowerFactor":{"v":0.999000013,"u":"","d":3},"ReactivePower":{"v":0,"u":"var","d":1},"Efficiency":{"v":95.05784607,"u":"%","d":3}}},"DC":{"0":{"name":{"u":"Modul 1"},"Power":{"v":23.60000038,"u":"W","d":1},"Voltage":{"v":29.60000038,"u":"V","d":1},"Current":{"v":0.790000021,"u":"A","d":2},"YieldDay":{"v":494,"u":"Wh","d":0},"YieldTotal":{"v":291.2900085,"u":"kWh","d":3},"Irradiation":{"v":5.900000095,"u":"%","d":3}},"1":{"name":{"u":""},"Power":{"v":24,"u":"W","d":1},"Voltage":{"v":29.89999962,"u":"V","d":1},"Current":{"v":0.800000012,"u":"A","d":2},"YieldDay":{"v":499,"u":"Wh","d":0},"YieldTotal":{"v":294.1210022,"u":"kWh","d":3},"Irradiation":{"v":6,"u":"%","d":3}},"2":{"name":{"u":""},"Power":{"v":23.79999924,"u":"W","d":1},"Voltage":{"v":29.79999924,"u":"V","d":1},"Current":{"v":0.790000021,"u":"A","d":2},"YieldDay":{"v":497,"u":"Wh","d":0},"YieldTotal":{"v":294.0480042,"u":"kWh","d":3},"Irradiation":{"v":5.949999809,"u":"%","d":3}},"3":{"name":{"u":""},"Power":{"v":23.70000076,"u":"W","d":1},"Voltage":{"v":29.70000076,"u":"V","d":1},"Current":{"v":0.790000021,"u":"A","d":2},"YieldDay":{"v":496,"u":"Wh","d":0},"YieldTotal":{"v":294,"u":"kWh","d":3},"Irradiation":{"v":5.925000191,"u":"%","d":3}}},"INV":{"0":{"Temperature":{"v":18,"u":"°C","d":1}}},"events":1},{"serial":"116484256846","name":"Balkon Sued-Ost","order":1,"data_age":2,"poll_enabled":true,"reachable":true,"producing":true,"limit_relative":100,"limit_absolute":1600,"AC":{"0":{"Power":{"v":79.5,"u":"W","d":1},"Voltage":{"v":230.1000061,"u":"V","d":1},"Current":{"v":0.340000004,"u":"A","d":2},"Power DC":{"v":83.59999847,"u":"W","d":1},"YieldDay":{"v":1798,"u":"Wh","d":0},"YieldTotal":{"v":844.5740356,"u":"kWh","d":3},"Frequency":{"v":50,"u":"Hz","d":2},"PowerFactor":{"v":0.999000013,"u":"","d":3},"ReactivePower":{"v":0,"u":"var","d":1},"Efficiency":{"v":95.0956955,"u":"%","d":3}}},"DC":{"0":{"name":{"u":"Gelaender 1"},"Power":{"v":23.60000038,"u":"W","d":1},"Voltage":{"v":29.79999924,"u":"V","d":1},"Current":{"v":0.790000021,"u":"A","d":2},"YieldDay":{"v":517,"u":"Wh","d":0},"YieldTotal":{"v":259.4219971,"u":"kWh","d":3},"Irradiation":{"v":5.900000095,"u":"%","d":3}},"1":{"name":{"u":"Gelaender 2"},"Power":{"v":24,"u":"W","d":1},"Voltage":{"v":29.89999962,"u":"V","d":1},"Current":{"v":0.800000012,"u":"A","d":2},"YieldDay":{"v":522,"u":"Wh","d":0},"YieldTotal":{"v":331.25,"u":"kWh","d":3},"Irradiation":{"v":6,"u":"%","d":3}},"2":{"name":{"u":"Kamin links"},"Power":{"v":17.60000038,"u":"W","d":1},"Voltage":{"v":30.29999924,"u":"V","d":1},"Current":{"v":0.579999983,"u":"A","d":2},"YieldDay":{"v":361,"u":"Wh","d":0},"YieldTotal":{"v":101.6060028,"u":"kWh","d":3},"Irradiation":{"v":4.400000095,"u":"%","d":3}},"3":{"name":{"u":"Kamin rechts"},"Power":{"v":18.39999962,"u":"W","d":1},"Voltage":{"v":29.89999962,"u":"V","d":1},"Current":{"v":0.610000014,"u":"A","d":2},"YieldDay":{"v":398,"u":"Wh","d":0},"YieldTotal":{"v":152.2960052,"u":"kWh","d":3},"Irradiation":{"v":4.599999905,"u":"%","d":3}}},"INV":{"0":{"Temperature":{"v":16.60000038,"u":"°C","d":1}}},"events":1},{"serial":"116484424196","name":"Holzhalle","order":0,"data_age":17,"poll_enabled":true,"reachable":true,"producing":true,"limit_relative":100,"limit_absolute":1600,"AC":{"0":{"Power":{"v":76.09999847,"u":"W","d":1},"Voltage":{"v":230.6999969,"u":"V","d":1},"Current":{"v":0.330000013,"u":"A","d":2},"Power DC":{"v":80,"u":"W","d":1},"YieldDay":{"v":1982,"u":"Wh","d":0},"YieldTotal":{"v":855.3279419,"u":"kWh","d":3},"Frequency":{"v":50,"u":"Hz","d":2},"PowerFactor":{"v":0.999000013,"u":"","d":3},"ReactivePower":{"v":0,"u":"var","d":1},"Efficiency":{"v":95.12499237,"u":"%","d":3}}},"DC":{"0":{"name":{"u":"unten rechts"},"Power":{"v":21.10000038,"u":"W","d":1},"Voltage":{"v":32.5,"u":"V","d":1},"Current":{"v":0.639999986,"u":"A","d":2},"YieldDay":{"v":525,"u":"Wh","d":0},"YieldTotal":{"v":226.2259979,"u":"kWh","d":3},"Irradiation":{"v":6.492307663,"u":"%","d":3}},"1":{"name":{"u":"oben rechts"},"Power":{"v":21,"u":"W","d":1},"Voltage":{"v":33.09999847,"u":"V","d":1},"Current":{"v":0.629999995,"u":"A","d":2},"YieldDay":{"v":526,"u":"Wh","d":0},"YieldTotal":{"v":219.3500061,"u":"kWh","d":3},"Irradiation":{"v":6.461538315,"u":"%","d":3}},"2":{"name":{"u":"unten links"},"Power":{"v":19.20000076,"u":"W","d":1},"Voltage":{"v":32.40000153,"u":"V","d":1},"Current":{"v":0.589999974,"u":"A","d":2},"YieldDay":{"v":469,"u":"Wh","d":0},"YieldTotal":{"v":211.8739929,"u":"kWh","d":3},"Irradiation":{"v":5.907692432,"u":"%","d":3}},"3":{"name":{"u":"oben links"},"Power":{"v":18.70000076,"u":"W","d":1},"Voltage":{"v":32.90000153,"u":"V","d":1},"Current":{"v":0.569999993,"u":"A","d":2},"YieldDay":{"v":462,"u":"Wh","d":0},"YieldTotal":{"v":197.878006,"u":"kWh","d":3},"Irradiation":{"v":5.753846645,"u":"%","d":3}}},"INV":{"0":{"Temperature":{"v":18,"u":"°C","d":1}}},"events":1},{"serial":"116491622890","name":"Fassade Sued-Ost","order":0,"data_age":12,"poll_enabled":true,"reachable":true,"producing":true,"limit_relative":100,"limit_absolute":1600,"AC":{"0":{"Power":{"v":67.59999847,"u":"W","d":1},"Voltage":{"v":230.6999969,"u":"V","d":1},"Current":{"v":0.289999992,"u":"A","d":2},"Power DC":{"v":71,"u":"W","d":1},"YieldDay":{"v":1501,"u":"Wh","d":0},"YieldTotal":{"v":332.5280151,"u":"kWh","d":3},"Frequency":{"v":50,"u":"Hz","d":2},"PowerFactor":{"v":1,"u":"","d":3},"ReactivePower":{"v":0,"u":"var","d":1},"Efficiency":{"v":95.21126556,"u":"%","d":3}}},"DC":{"0":{"name":{"u":"unten"},"Power":{"v":14.39999962,"u":"W","d":1},"Voltage":{"v":29.20000076,"u":"V","d":1},"Current":{"v":0.49000001,"u":"A","d":2},"YieldDay":{"v":309,"u":"Wh","d":0},"YieldTotal":{"v":66.29100037,"u":"kWh","d":3},"Irradiation":{"v":3.599999905,"u":"%","d":3}},"1":{"name":{"u":"mitte unten"},"Power":{"v":17.79999924,"u":"W","d":1},"Voltage":{"v":29.60000038,"u":"V","d":1},"Current":{"v":0.600000024,"u":"A","d":2},"YieldDay":{"v":382,"u":"Wh","d":0},"YieldTotal":{"v":83.28199768,"u":"kWh","d":3},"Irradiation":{"v":4.449999809,"u":"%","d":3}},"2":{"name":{"u":"mitte oben"},"Power":{"v":18.89999962,"u":"W","d":1},"Voltage":{"v":28.70000076,"u":"V","d":1},"Current":{"v":0.649999976,"u":"A","d":2},"YieldDay":{"v":398,"u":"Wh","d":0},"YieldTotal":{"v":90.10399628,"u":"kWh","d":3},"Irradiation":{"v":4.724999905,"u":"%","d":3}},"3":{"name":{"u":"oben"},"Power":{"v":19.89999962,"u":"W","d":1},"Voltage":{"v":29.60000038,"u":"V","d":1},"Current":{"v":0.670000017,"u":"A","d":2},"YieldDay":{"v":412,"u":"Wh","d":0},"YieldTotal":{"v":92.85099792,"u":"kWh","d":3},"Irradiation":{"v":4.974999905,"u":"%","d":3}}},"INV":{"0":{"Temperature":{"v":17.29999924,"u":"°C","d":1}}},"events":1}],"total":{"Power":{"v":313.6000061,"u":"W","d":1},"YieldDay":{"v":7267,"u":"Wh","d":0},"YieldTotal":{"v":3205.888916,"u":"kWh","d":3}},"hints":{"time_sync":false,"radio_problem":false,"default_password":true}}
 
Wenn man danach geht, was man so im Netz findet, fragt man sich, ob überhaupt jemand die appJSON Bibliothek benutzt.

Ein bisschen mehr Zeit könnte Wago da wirklich in die Dokumentation investieren.........
 
Okay ... schon besser ...
So wie ich das sehe ist "Total" eine Klasse, die wiederum aus den Klassen "Power", "Yieldday" und "Yieldtotal" besteht. Jede dieser Klassen hat die Properties "v", "u" und "d".
Wenn du also an Total.Power.v ran willst so geht das nur über den obersten Key "Total". Das Ergenis davon könntest du dann wieder nach "Power" abfragen und das dann wieder nach "v".
So wäre es für mich logisch - ich habe allerdings nicht wirklich Ahnung von Wago / Codesys.
Unter .Net könnte ich da ein Komplett-Klassenmodell anlegen welches dann über den DeSerializer entsprechend zugewiesen wird. Die Möglichkeiten hast du in der SPS so aber nicht ...
 
Der FbGetSingleKeyValue wird das vermutlich nicht können, aber mit Fb_JSON_ParseAndModify geht's. Es ist nur wichtig den Bibliothek-Parameter JSON_MAX_TOKEN_COUNT über die Token-Anzahl von 1377 in dem String zu setzen.

Code:
PROGRAM prgParseAndModify
VAR
    sKey                : STRING(255) := '/total/Power/v';
    oJSON_ParseAndModify: WagoAppJSON.Fb_JSON_ParseAndModify;

    xStartParsing        : BOOL := TRUE;
    diNumOfToken        : DINT;
    xGetValue            : BOOL;
    oRT_ParseDone        : Standard.R_TRIG;
    typValue            : WagoAppJSON.typJSON_Pointer;
    xCfgErr_IncreaseLibParameter: BOOL;
END_VAR

---------------------------------

IF WagoAppJSON.ParameterList.JSON_MAX_TOKEN_COUNT < 1380 THEN
    xCfgErr_IncreaseLibParameter := TRUE;
END_IF

oJSON_ParseAndModify(
//     pData        := ADR(JSON.sFormat),
//     udiSizeData    := SIZEOF(JSON.sFormat),
    pData        := ADR(JSON.sLine),
    udiSizeData    := SIZEOF(JSON.sLine),
    oStatus        => ,
    xError        => ,
    xDone        => ,
    diToken        => diNumOfToken, // 1377
    xTrigger    := xStartParsing);

oRT_ParseDone(CLK:= oJSON_ParseAndModify.xDone);
IF oRT_ParseDone.Q THEN
    xGetValue := TRUE;
END_IF

typValue := oJSON_ParseAndModify.GetValueByPath(
    sPointer    := sKey,
    xTrigger    := xGetValue);
typValue.sValue;
typValue.eType;
typValue.eReturn;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hatte inzwischen auch rausgefunden, dass der FbGetSingleKeyValue nicht so geeignet ist.

Mit dem Fb_JSON_ParseAndModify hatte ich dann auch probiert.
Heute Mittag hatte ich ein Gespräch mit dem Wago-Support, der ist immer noch absolut tadellos.
Hätte man aber in die Doku des Bausteins irgendwo geschrieben, dass man evtl. die Konstanten in der Bibliothek erhöhen muss, hätte mir das ein paar graue Haare erspart :)

Nachdem ich die Parameter JSON_MAX_TOKEN_COUNT und JSON_MAX_STRING erhöht habe funktioniert der Baustein tadellos.
 
Zurück
Oben