Datenauswertung

KrazyD

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Forum,
ich habe eine grundsätzliche Frage zu einem Problem von mir.
Ich bekomme über eine serielle Schnittstelle einen endlosen String von Daten die durch CR und LF getrennt sind. Diesen muss ich trennen und in CoDeSys auslesen und auswerten in Echtzeit. Das Problem das ich habe ist die Datenmenge die etwa 2500 Byte pro Sekunde (ca 20 Datensätze pro Sek) ist. Ich weiß leider keinen Absatz mit dem ich mit dieser Datenmenge umgehen kann. Wäre über jede Hilfe Dankbar

mfg
D
 
Was bedeutet denn "auswerten"? Den Satz "überfliegen" und gucken, ob etwas interessantes drin stehen könnte und nur dann etwas intensiver damit beschäftigen?
Kannst Du denn hoffen, dass Du z.B. 99% der Sätze einfach ignorieren (und "wegwerfen") kannst?
Oder bekommst Du auf diesem Wege ständig Updates für relativ wenige Zahlen?
Die Infos in den Sätzen, sofern es sich um (vielstellige) Zahlen handelt, dürfte sich (bezogen auf die Anzahl Byte) hoffentlich reduzieren durch die Umwandung aus ASCII in z.B. REAL oder DINT.
Auch durch die Umwandlung von "True" oder "False" in (-)1 oder 0 dürfte die erschlagende Menge von Bytes überschaubarer werden.
Mit was für Daten wird denn Deine SPS zugeschüttet und worin soll die Auswertung bestehen?
Gruss, Heinileini
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es ist ein String der Daten enthält die ich dann auslesen muss. Ich kann da leider nix wegwerfen, sondern muss die einzelnen Datenpakete (meistens ca. 125 Byte aber manchmal auch nur ca. 30 Byte ) trennen und dann daraus einzelne Daten lesen und weitergeben.
Relevant zum weiterverarbeiten sind ca 75 Byte aus den Paketen.
 
Du bekommst also quasi endlos über die serielle Schnittstelle ständig Zeichenketten in deine SPS geschoben ...?
Ich nehme einmal an, dass es sich hier NICHT um einen Endlos-String handelt sondern das immer nur eine Zeile, die dann mit CR-LF abgeschlossen ist, gesendet wird. Idealerweise ist es ein String mit immer gleicher Länge ...
In dem Fall würde ich andauernd die serielle Schnittstelle abfragen und schauen, ob der String im Empfangspuffer mit CR-LF endet. Wenn ja dann ihn auslesen und auswerten. Und dann immer so weiter.
Ich könnte mir allerdings vorstellen, dass diese Aufgabenstellung in deiner SPS nicht so ganz richtig aufgehoben ist ... und das die SPS da ggf. früher oder später Probleme hat ...

Gruß
Larry
 
Ja es sind immer einzelne Zeilen von denen aber 20-25 pro Sekunde kommen.
Deinen Ansatz mit der zyklischen Abfrage habe ich schon realisiert der funktioniert. Ich schreibe das Datenpaket in nen Buffer ziehe die relevanten Daten raus und überschreibe mit dem nächsten Paket wieder.
Es gibt von auf meinem sendenden Gerät halt auch die Funktion automatisch zu senden ohne zyklische Abfrage. Diese Funktion wollte ich gerne nutzen finde aber keine Möglichkeit die Masse an Daten ordentlich zwischenzuspeichern um die relevanten Daten zu extrahieren.

mfg
D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab jetzt mal die Zykluszeit an die Datenpaketrate angepasst damit ich pro Zyklus ein Paket erhalte ... damit kann ich das schon auslesen finde ich aber nicht so elegant ;)
 
Was genau steht denn in den Telegrammen?

Brauchst Du wirklich jedes Telegramm?

Was passiert wenn mal eins nicht ankommt? (Übertragungsfehler, SPS-Stop, Falsche Mondphase)

Sind die Pakete immer gleich aufgebaut? Kannst Du sie also "leicht" auswerten?

Wie sieht denn grad deine Zykluszeit aus? Warum kannst Du nicht jeden String direkt beim Empfange verarbeiten / auswerten?

Was meinst Du mit "ich habe die Zykluszeit angepasst" -> Hast Du sie soweit verringert das alles ankommt?

Davon mal abgesehen:

Wie wäre es mit einem Puffer, ich denke da an ein Array of Struct.

Dein Struct wäre

Array of Char (125 Byte)
Telegramlänge (Int)

Beim Empfangen prüfst Du ob noch ein Platz im Puffer frei ist (For-Schleife ob die Länge 0 ist)
und trägst dann die Daten und die Telegrammlänge ein (Bekommst Du ja beides vom RECV Baustein)

Beim Auswerten rennst Du dann mit einer For-Schleife durch den Puffer und arbeitest alle
Strings ab bei denen die Telegrammlänge > 0 ist und setzt sie anschließend auf 0 (damit musst Du das Array of Char nie löschen, spart Zeit).




Grüße

Marcel
 
... Problem das ich habe ist die Datenmenge die etwa 2500 Byte pro Sekunde (ca 20 Datensätze pro Sek) ist. ...

Also sollte eine ZaklusZeit, die unter 50 ms liegt ausreichen.
Ich hab jetzt mal die Zykluszeit an die Datenpaketrate angepasst damit ich pro Zyklus ein Paket erhalte ... damit kann ich das schon auslesen finde ich aber nicht so elegant
???
Stört es Dich etwa, wenn die DatenPakete zu langsam bzw. zu selten kommen? Oh, Du glücklicher! ;o)
Marcels Vorschlag mit dem Puffer stimme ich zu, würde aber nur Platz für 2 DatenSätze vorsehen: immer abwechselnd den einen und den anderen Platz der Schnittstelle zum Auffüllen zur Verfügung stellen und "in Ruhe" den jeweils anderen auswerten, der nicht durch gerade eintreffende Daten gestört wird.
Das ist (zumindest für "Anfänger") übersichtlicher.
Gruss, Heinileini


.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Marcel:
Ich nehme einmal an, dass der TE hier von seinem Task bzw. der für den Task eingeplanten Zeit spricht. Den Ansatz halte ich für nicht unbedenklich da es hier mittelfristig ganz sicher zu einer Drift im Zeitraster kommt ...

Gruß
Larry
 
genau das meinte ich.
ich habe jetzt einfach einen String(30000) gemacht in den ich alles speicher. Dann teile ich die Größe des gelesenen durch die Größe eines Pakets (Größe ist bekannt)und bekomme so die Anzahl der Pakete. Bilde mit einer FOR-Schleife den Mittelwert aller Werte in dem String indem ich immer einen mit DELETE rauswerfe und den nächsten bearbeite. fertig ^^
 
Zurück
Oben