TIA Großen Array of Char verarbeiten

Bradli123

Level-2
Beiträge
57
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
Ich habe eine S7-1517, die Daten von einer REST-Schnittstelle abfragt (LHTTP Bibliothek).
Zurück bekomme ich eine .json Datei, die im TIA Portal als Array of Char verwurschtelt ankommt.
Nun mein Problem:
Ich muss in diesem Array of char einen String suchen. Ich weiß, LHTTP hat implementierte Suchfunktion. Da der Array of Char fast 50k Zeichen lang ist, überschreitet die Funktion die Zykluszeit.
Gibt es da noch Hoffnung?
Was glaubt ihr, wie ich die Zykluszeit minimieren könnte?
Ich weiß, dass PLCs nicht für solche Art von Rechnungen ausgelegt sind, aber ich würde es gerne versuchen.
Ich freue mich über eure Vorschläge, wie man das ganze effizienter angehen kann.

 LG
 
Moin,
Ich habe eine S7-1517, die Daten von einer REST-Schnittstelle abfragt (LHTTP Bibliothek).
Zurück bekomme ich eine .json Datei, die im TIA Portal als Array of Char verwurschtelt ankommt.
Nun mein Problem:
Ich muss in diesem Array of char einen String suchen. Ich weiß, LHTTP hat implementierte Suchfunktion. Da der Array of Char fast 50k Zeichen lang ist, überschreitet die Funktion die Zykluszeit.
Gibt es da noch Hoffnung?
Was glaubt ihr, wie ich die Zykluszeit minimieren könnte?
Ich weiß, dass PLCs nicht für solche Art von Rechnungen ausgelegt sind, aber ich würde es gerne versuchen.
Ich freue mich über eure Vorschläge, wie man das ganze effizienter angehen kann.

 LG
Hast Du Dir schon mal auf der Siemens Webseite die Bibliothek LStream angesehen, die wäre zur Verarbeitung von JSON und XML gedacht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast Du Dir schon mal auf der Siemens Webseite die Bibliothek LStream angesehen, die wäre zur Verarbeitung von JSON und XML gedacht.
Danke für die Antwort.
Die Bibliothek sieht gar nicht so schlecht aus.
Leider verlangt die Bibliothek eine komprimierte Json Datei. Meine empfangenen Jason Dateien sind unkomprimiert, woran ich nichts ändern kann.
 
Ich muss in diesem Array of char einen String suchen. Ich weiß, LHTTP hat implementierte Suchfunktion. Da der Array of Char fast 50k Zeichen lang ist, überschreitet die Funktion die Zykluszeit.
Du must doch bestimmt nicht das gesamte Array in nur einem Zyklus durchsuchen? Wieviel Zeit hast du für die Auswertung?
Ist so eine JSON-Datei zeilenweise organisiert? Du könntest jeweils nur 10...x Zeilen durchsuchen und im nächsten Zyklus die nächsten Zeilen usw.
 
Smart.
Du must doch bestimmt nicht das gesamte Array in nur einem Zyklus durchsuchen? Wieviel Zeit hast du für die Auswertung?
Ist so eine JSON-Datei zeilenweise organisiert? Du könntest jeweils nur 10...x Zeilen durchsuchen und im nächsten Zyklus die nächsten Zeilen usw.
Aber wie kann ich das auf mehrere Zyklen aufteilen?
Edit: Hab's schon. Werde ich morgen mal versuchen
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast Du Dir schon mal auf der Siemens Webseite die Bibliothek LStream angesehen, die wäre zur Verarbeitung von JSON und XML gedacht
Ich habe es mit der Bibliothek versucht.
Mein Problem ist nun aber, dass ich die Json Datei als array of char erhalte, die Lstream Bibliothek aber einen array of Byte.
Wie kann ich einen so großen Array effizient umwandeln?
 
Geht das nicht direkt (implizit), da wo Array of Byte erwartet wird, einfach das Array of Char angeben?
Oder da wo du das Array of Char erhältst, das einfach als Array of Byte deklarieren?
Da braucht eigentlich nichts umgewandelt werden.
 
Du must doch bestimmt nicht das gesamte Array in nur einem Zyklus durchsuchen? Wieviel Zeit hast du für die Auswertung?
Ist so eine JSON-Datei zeilenweise organisiert? Du könntest jeweils nur 10...x Zeilen durchsuchen und im nächsten Zyklus die nächsten Zeilen usw.
Das funktioniert zeittechnisch auch nur so mittel.
Immerhin muss ich da mehrere verschiedene Strings mit mindestens 9 Zeichen drin suchen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Geht das nicht direkt (implizit), da wo Array of Byte erwartet wird, einfach das Array of Char angeben?
Oder da wo du das Array of Char erhältst, das einfach als Array of Byte deklarieren?
Da braucht eigentlich nichts umgewandelt werden.
Ich kann das gleich nochmal nachschauen, aber letztes mal hat er mir einen Fehler geschmissen. Hat mich auch gewundert.
 
Kannst du das auch mal genauer angeben? Wie schnell oder langsam ist "zeittechnisch so mittel"?
Wie schnell genau must du genau was alles machen?
Sorry.
Ich muss 50000 Zeichen auf eine beliebig erweiterbare Anzahl an Strings durchsuchen. Wahrscheinlich sinds irgendwie zwischen 10-50 Strings im Extremfall.
Die Strings sind maximal 17 Zeichen lang.

Die genaue Zeit müsste ich mal herausfinden später.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was mich auch wundert, ist, dass die Chars nicht in gleicher Reihenfolge in der sps ankommen, wie sie in in der Json Datei stehen.
Die Objekte selbst bleiben zwar zusammen, werden aber durcheinandergewürfelt angezeigt.
Schade, weil die Strings die ich raussuchen muss, immer an der gleichen Stellen stehen sonst. So aber nicht.
 
Oder da wo du das Array of Char erhältst, das einfach als Array of Byte deklarieren?
Ich kann das gleich nochmal nachschauen, aber letztes mal hat er mir einen Fehler geschmissen. Hat mich auch gewundert.
Ein array of char kann nicht an ein array of byte übergeben werden.
Aber es gibt immerhin die Möglichkeit den Baustein zu öffnen, aus der Bibliothek zu nehmen und am Input ein array of char einzutragen.
Im Programm dann, wenn benötigt, statt der Byte-Variable ein BYTE_TO_CHAR nutzen. Sollte aber eigentlich ein Variant sein.


Ansonsten, falls die Zykluszeit nicht 10x überschritten wird bei Deinen Tests und nur ab und zu eine Bearbeitung stattfindet und deine Anlage damit klarkommt in diesem Zyklus, so könnte der Baustein "RE_TRIGR" sonst vielleicht hilfreich sein.
Diese Funktion sollte aber die letzte Variante sein, und darauf achten das die Anlage das im Ablauf zeitlich verkraftet.
 
Ein array of char kann nicht an ein array of byte übergeben werden.
Aber es gibt immerhin die Möglichkeit den Baustein zu öffnen, aus der Bibliothek zu nehmen und am Input ein array of char einzutragen.
Im Programm dann, wenn benötigt, statt der Byte-Variable ein BYTE_TO_CHAR nutzen. Sollte aber eigentlich ein Variant sein.


Ansonsten, falls die Zykluszeit nicht 10x überschritten wird bei Deinen Tests und nur ab und zu eine Bearbeitung stattfindet und deine Anlage damit klarkommt in diesem Zyklus, so könnte der Baustein "RE_TRIGR" sonst vielleicht hilfreich sein.
Diese Funktion sollte aber die letzte Variante sein, und darauf achten das die Anlage das im Ablauf zeitlich verkraftet.
Du meinst also, ich soll die Inputvariable von LStream zu array of char ändern?

Und dann im restlichen Programm des Bausteins alles von Array of Byte zu Array of Char ändern?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ansonsten, falls die Zykluszeit nicht 10x überschritten wird bei Deinen Tests und nur ab und zu eine Bearbeitung stattfindet und deine Anlage damit klarkommt in diesem Zyklus, so könnte der Baustein "RE_TRIGR" sonst vielleicht hilfreich sein.
Diese Funktion sollte aber die letzte Variante sein, und darauf achten das die Anlage das im Ablauf zeitlich verkraftet.
ich denke, das wird doch wohl nicht auf die Sekunde ankommen. Die 50 kB müssen ja auch erstmal abgeholt und empfangen werden. Da sollte man auch ein paar Sekunden Zeit für die Auswertung erlauben.

Wie oft ändert sich eigentlich der Inhalt der Datei? Vielleicht reicht es auch, die Datei nur einmal einzulesen und nur die benötigten Daten zu suchen und herauszukopieren für schnelleren späteren Zugriff.
Ist da vielleicht auch ein HMI vorhanden, was mit einem nicht zykluszeit-kritischen Hochsprachen-Skript die Dateiauswertung machen könnte?
 
ich denke, das wird doch wohl nicht auf die Sekunde ankommen. Die 50 kB müssen ja auch erstmal abgeholt und empfangen werden. Da sollte man auch ein paar Sekunden Zeit für die Auswertung erlauben.

Wie oft ändert sich eigentlich der Inhalt der Datei? Vielleicht reicht es auch, die Datei nur einmal einzulesen und nur die benötigten Daten zu suchen und herauszukopieren für schnelleren späteren Zugriff.
Ist da vielleicht auch ein HMI vorhanden, was mit einem nicht zykluszeit-kritischen Hochsprachen-Skript die Dateiauswertung machen könnte?
Eine HMI ist nicht vorhanden, da es so schlank gehalten sein soll, wie es geht.
Ja, wir haben irgendwie zwischen 6 und 10 Sekunden Zeit.
Ich weiß ehrlich gesagt nicht, ob das genug Zeit ist. Ich kann es aber mal ausprobieren.
Dennoch ist es eine super zeitineffiziente Lösung.
Da der Baustein irgendwann wiederverwendet werden soll, würde ich die 6-10s nicht ausreißen.

Weiß jemand, woran es liegt, dass die Json Datei durcheinandergewürfelt ankommt?
 
Und dann im restlichen Programm des Bausteins alles von Array of Byte zu Array of Char ändern?
Sollten, wenn eine Änderung benötigt wird, nur 2-3 Vorkommen sein.
In der Regel sollte insearch als Variant angegeben sein. Also am Input müsste sowas stehen wie array[*] of byte, aber im Baustein müsste es auf eine Variable insearch:variant zeigen.

Ich weiß ehrlich gesagt nicht, ob das genug Zeit ist. Ich kann es aber mal ausprobieren.
Wäre vielleicht hilfreich das zu wissen.

Weiß jemand, woran es liegt, dass die Json Datei durcheinandergewürfelt ankommt?
Hilfreich wäre zu wissen welcher Baustein da was würfelt. Da wird ein System hinterstecken. Vielleicht magst auch die Ein-/Ausgabe einmal zeigen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was glaubt ihr, wie ich die Zykluszeit minimieren könnte?
Ich würd da vielleicht erstmal die Rest-API ganz genau anschauen ... 50kB sind bei Rest nämlich auch recht viel.
Bei vielen Rest-APIs kann man Filter in der Abfrage setzten. Vielleicht mal mit dem Hersteller / Programmierer des Geräts sprechen.
Bei meiner Wallbox sieht das z.B. so aus:
URL + '/api/status?filter=car,amp,nrg,wh,fup,modelStatus,alw'
Geb ich den Filter nicht an, so bekomme ich auch alle Daten.
 
Moin,
Ich habe es jetzt so gelöst:
Ich übertrage den array of char in einen array of byte, indem ich jedes Element einzeln rüberkopiere. Das verteile ich über mehrere zyklen. Das funktioniert ganz gut.

Noch eine Frage:
Ich möchte bei der Funktion "deserialize" der Bibliothel Lstream die search Funktion nutzen.
Laut Doku soll man den Key, der gesucht werden soll, vorher in den Tree schreiben.
Komischerweise findet er dann aber nichts zu dem Key und löscht die Einträge wieder raus.
Wenn ich ohne search mache, bekomme ich unter anderem genau den Key, den ich vorher mit search suchen wollte.
Hat da jemand Erfahrungen? Die Doku beschreibt das echt dürftig
 
In der Regel sollte insearch als Variant angegeben sein. Also am Input müsste sowas stehen wie array[*] of byte, aber im Baustein müsste es auf eine Variable insearch:variant
Ich habe das mal versucht. In dem Baustein gibt es einen searchfor Befehl, der ein searchIn bekommt. Er soll aber einen Array[*] of Byte bekommen.
Wenn ich da einen Variant dranschreibe, schmeißt er einen Fehler.
 
Zurück
Oben