TIA TIA V15.1: FIFO für Daten von Typ Struct erstellen

Mogli

Level-2
Beiträge
123
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe folgendes "Problem".

Wir haben einen Durchflussmesser, der mittels Reset (DI) "genullt" wird.
Der Durchflussmesser gibt mir Pulse, mit denen ich den Gesamtdurchfluss ermittle
Jedes Mal wenn der Reset gedrückt wird, soll das Aktuelle Datum und die Uhrzeit, sowie der ermittelte Durchfluss abgespeichert werden.
Gespeichert/ Angezeigt werden sollen die letzten 10 Messungen.

Dies müsste man mit einem FIFO realisieren können.
Leider habe ich keine Erfahrung in SCL und komme nicht weiter das Thema mit FUP/AWL zu realisieren.
Hat von euch vielleicht jemand eine Idee, wie man so etwas in SCL schreibt?

SW: TIA V15.1
CPU: 1215C

Vielen Dank für eure Hilfe
 
Einfach, für einen Wert:
Daten ablegen in einen Datenbaustein, z.B. Array[0..9] of DTL
Danach ein SCL-Netzwerk erstellen:
Code:
if Flanke_Reset then
DB.Werte[9]:=DB.Werte[8]; //Ältesten Eintrag überschreiben, den davor hierhinkopieren
DB.Werte[8]:=DB.Werte[7];
[...]
DB.Werte[1]:=DB.Werte[0];
DB.Werte[0]:=aktuelle_Zeit_Datum; //Neuesten Eintrag, wobei 0 der jüngste ist
end_if;
Natürlich kann man dafür auch eine Schleife nutzen, aber bei nur 10 Werten ist es in der Regel übersichtlicher und macht weniger Fehler.

Ich habe natürlich nur DTL nun verwendet. Du kannst aber gerne anstatt des DTL einen Datentyp (UDT) erstellen. Das lässt sich genauso anschließend bearbeiten bzw. verschieben, wobei beim Eintrag lediglich
Code:
DB.Werte[0].Druck:=Neuer_Wert;
DB.Werte[0].Zeitpunkt:=aktuelle_Zeit_Datum;
verwendet werden sollte.

Später ist das UDT jederzeit erweiterbar, verändert werden muss nur der erste Eintrag, bzw. ergänzt.

Hoffe es ist verständlich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja klar ...
Du erstellst dir einen FB, der als IN-Parameter dein STRUCT und einen BOOL "Daten übernehmen" hat.
In dem FB hast du ein Array of Struct in der von dir gewünschten Größe.
Mit dem Daten_übernehmen schiebst du die Einträge in dem Array um eins nach oben, also 9 nach 10, 8 nach 9, 7 nach 8 usw.
Zum Schluß dann schreibst du dein Übergabe-Struct an Pos.1
Nicht vergessen hier eine Flankenauswertung für das Daten_übernehmen zu machen ...

Willst du dich daran mal versuchen ?
 
Hallo @Larry Laffer
danke für deinen Gedankenanstoß.

Ich muss dann 10 Flanken verwenden?
Oder wie verhindere ich, dass meine Werte nicht von Array[0] auf alle Array geschrieben werden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde es noch etwas anders als @Mrtain in seinem Beispiel machen :
Code:
If #Daten_Uebernehmen and not #Flanke then
   array[10] := array[9];
   ...
   array[1] := array[0];
   array[0] := #NeuerWert;
End_if;

#Flanke := #Daten_Uebernehmen ;
Flanke muss hier natürlich ein STAT-Bool sein.
Dein Bit "Daten_Uebernehmen" steht mit Sicherheit mehr als einen SPS-Zyklus lang an. Auf diese Weise stellst du sicher, dass deine neuen Daten auch wirklich nur einmal in dein FIFO eingetragen werden (pro Flanke) ...
 
Hallo @Larry Laffer @Mrtain @escride1

Vielen lieben Dank für eure Hilfe.

Mein Fehler war, dass ich nicht richtig gelesen habe und die Daten genau anders herum beschaltet hatte ... (Wer lesen kann ist klar im Vorteil).
Sorry fürs Nerven und nochmals vielen lieben Dank für eure Hilfe.

Grüße aus Luxembourg!
 
Zurück
Oben