weitere Funktion zu ARRAY_* Reihe

Begonnen von easytherm, 12. März 2009, 12:34:28

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 2 Gäste betrachten dieses Thema.

easytherm

Hallo,

Ich benutze die _ARRAY_* Funktionen Reihe um zB einen floating average von Messwerten zu bilden. Dazu fehlte mir eine _ARRAY_PUSH Funktion, die mir erlaubt, neue Daten im Takt in die Array zu schieben.

Neue Daten werden jeweils beim grössten Index gepusht und der erste Wert wird gelöscht.

Initialisierung wird zB mit der bestehenden _ARRAY_INIT durchgeführt.

(*Variablendeklaration  *)
FUNCTION array_push : BOOL
VAR_INPUT
   pt : POINTER TO ARRAY[1..32000] OF REAL;
   size : UINT;
      new_val:REAL;
END_VAR
VAR
   i: INT;
END_VAR


(* Code *)
size := SHR(size,2);
FOR i := 2 TO SIZE DO
     pt^[i-1] := pt^;
END_FOR;
pt^[size] :=new_val;
array_push := TRUE;



Vielleicht nütz jemandem diese Funktion, oder kann in der nächsten Release sogar eingebaut werden.

Jacques

hugo

ich sehe noch nicht den sinn für eine solche funktion.

was du benötigst ist ein simpler ringpuffer.
bei jedem schreiben auf das array bewegt sich der zeiger um eine stelle vorwärts und schreibt dort den neuen wert.
der älteste wird dann automatisch überschrieben.
speziell für average bildung ist das die gängige methode.
du sparst dir damit das dauernde umkopieren der elemente, was einen extremen performance gewinn bedeutet.

easytherm

Das performance problem ist mir klar, sowie die Lösung mit einem Ringpuffer, obwohl ich ausser STACK_16 und STACK_32 keinen enstprechenden FB in der Bibliothek sehe.

Was ich eigentlich ausser mittelwertbildung brauche, ist einen Puffer der letzten Daten eines Messwertes zur Trendbildung.

Konkret habe ich folgendes Problem:
ich bilde eine Steuerung und Visualisierung mit Codesys HMI, für ein integrierte Hausheizung mit Sonnenkollekoren, Akku und Schnittholzheizung.
Zur Visualisierung benutze ich codesys und vorgesehen ist Visualisierung mit webserver. Ich möchte aber dazu keinen PC ständig laufen lassen, aber nur ab und zu schauen.
Beim connect startet der Trend immer von Null an und füllt sich dann mit neuen Werten. Blick in die Vergangenheit ist nicht möglich, was bei Problemen nützlich sein kann!

Es ist möglich, Trends in der Steuerung zu speichern, ich meine aber es hat keinen Sinn, da die Daten ständig auf Flash geschrieben werden und dieser Speicher dann schnell kaputt geht.
Besser möchte ich eher meine Daten in einen Array (Ram) speichern, und Zugriff auf diese Daten dann bilden (zB mit einem ActivX). Die Menge wäre begrenzt, zb 120 reals, jeweils 1 Wert/Minute, also 2 Stunden. Diese Daten dürfen flüchtig sein. Es ist mir klar, das ein Ringpuffer, wenn sein Daten verfügbar sind, auch brauchbar wäre.
Die Möglichkeit, Daten extern zu schicken habe ich nicht gecheckt, wie gesagt, ich möchten keinen PC oder NAS ständig laufen lassen.

Vielleicht ist die Problematik einer Kurzzeitmesswertspeicherung und Visualisierung schon irgendwoanders gelöst worden?

Vielen Dank für die Bemühung und die Superbibliothek!

Jacques

b.b.

tag zusammen,

das ist zwar ein uraltes Thema, interessiert mich jedoch auch.
Ich benötige zur Visu ein Array mit den letzen 100 Messwerten. Dieses wird dann an die Visu übergeben.

Gibt es eine elegantere Möglichkeit, als das Array bei jedem neuen Eintrag umzukopieren?