TIA Wert einlesen, in DB speichern, usw

Matrixzerro

Level-2
Beiträge
26
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.
Ich brauche mal Hilfe und benötige euren Rat und mal ein Beispiel dafür.

Ich möchte einen Real Wert einlesen und den in einem DB speichern.
Dann Wert 2 einlesen und den in einem DB speichern und den mit dem alten Wert addieren und dann wieder speichern.

Quasi:
Lese Wert1, schreibe in DB.aktueller Wert, verschiebe DB.aktueller Wert nach DB.gespeicherter Wert, lese Wert2, schreibe in DB.aktueller Wert, addiere DB.aktueller Wert zu DB.gespeicherter Wert, Ergebnis speichern in DB.Ergebnis.
Dann wieder lese Wert3, schreibe in DB.aktueller Wert, addiere aktueller Wert zu gespeicherter Wert und verschiebe das Ergebnis in DB.gespeicherter Wert.

Quasi Mathe. In einem DB habe ich dann 3 Real- zahlen gespeichert. Aktueller Wert , Zwischenergebnis und summiertes Ergebnis. Und das im Abstand von 0,5 Sekunden.

Wer kann mir da mal einen Sinnvollen Lösungsvorschlag schicken/ schreiben, damit ich mir das dann mal daraus zusammen reimen kann.

Ich danke euch schon mal im voraus.
 
Mir ist leider nicht klar, wozu den aktuellen Wert addieren willst. Zum letzten zuvor eingelesen, (jetzt nicht mehr ganz so) aktuellen Wert oder zur Summe aus allen bisher eingelesenen Werten.
Was ist 'ZwischenErgebnis' (und willst/musst Du das wirklich abspeichern)?
Was ist 'Ergebnis'?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Tank befüllen. Der Bediener sagt "152 Liter nachfüllen" dann wird ein Ventil angesteuert und der Durchfluss wird berechnet und aufsummiert.

Ich muss einen Wert einlesen aus einem Analogeingang. Skaliert und als Real ausgegeben oder Int , das ist egal. (Aktueller Wert). Der Wert ändert sich aber ständig. Deswegen muss der gespeichert werden in einem DB.
Dann muss 0,5 Sek später der nächste Wert eingelesen und gespeichert werden und mit dem vorherigen addiert werden, damit ich irgendwann eine Summe habe (152 Liter). Das was der Bediener als Wert vorher vorgegeben hat.
Mein Problem ist gerade:
Wie speicher ich Werte in einem DB ab und wie verschiebe ich die innerhalb des DB´s, damit ich den nächsten Wert einlesen kann. Und dann das addieren zum vorherigen Wert...

Ich hoffe ich habe mich verständlicher Ausgedrückt.
Das oben war meine Überlegung und Vorgehensweise. kann gut sein, dass die nicht brauchbar ist.
 
Wo ist das Problem genau? Du kannst Werte z.B. folgendermaßen abspeichern:

"MyDB".AnalogWert1 := "AnalogWert";

Wobei dein Analogwert dein festgelegtes Eingangswort ist und den Wert in dem DB kannst du entsprechend definieren.

Wenn du die Werte addieren möchtest, kannst folgendes machen:

"MyDB".AnalogWert1 := "MyDB".AnalogWert1 + "AnalogWert";

So erhöhst du den im DB gespeicherten Wert um den Analogwert. Das Ganze könntest du dann mit einem Timer und einer Flanke versehen, sodass du nur alle 0,5 Sekunden den Wert dazu addierst. Aber reicht dir diese Genauigkeit aus? Vom Gefühl her wird das mehr schätzen als alle andere, wenn du hier einfach nur Durchflussmesswerte addieren willst.
 
Zuletzt bearbeitet:
Wie soll ich das denn machen???

ok ich frag anders: Wie kann ich einen Real Wert einlesen und den in einem DB speichern, damit er sich nicht verändert, wenn sich der Wert an Analogeingang verändert?

L PEW 100
T DB...

Der Wert im DB verändert sich ja ständig mit...

Schritt 1
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ah du hast das Problem, dass der Wert sich zyklisch ändert. Programmierst du mit TIA? Falls ja, solltest du dir meiner Meinung nach SCL anschauen, AWL kann man machen aber muss nicht sein, wenn es nicht zwingend erforderlich ist:

Du könntest dir einen Flankenmerker basteln (gern hier im Forum dazu suchen, vom Verständnis her ist sowas sehr hilfreich für das erste Mal) oder du nimmst du Taktmerker deiner CPU (zu finden in der HW-Konfig unter Eigentschaften der CPU und dann System- und Taktmerker). Dort kannst du z.B. MB 0 als Taktmerkerbyte deklarieren und hättest dann M0.3 als 2 Hz Takt.

Code:
IF M0.3 Then
[COLOR=#333333]"MyDB".AnalogWert1 := "MyDB".AnalogWert1 + "AnalogWert";
[/COLOR]end_if;

Oder falls AWL zwingend sein muss:

Code:
UN M0.3
SPB OVER
L PEW...
T DB...

OVER: nop 0

Oder das Ganze in KOP/FUP realiseren, auch hier gibt es den Move-Befehl (bzw. die Rechenoperationen) den du mit der Verknüpfung auf einen Taktmerker oder auf eine eigene Flankenauswertung verknüpfen kannst.
 
Zuletzt bearbeitet:
Dann muss 0,5 Sek später der nächste Wert eingelesen und gespeichert werden und mit dem vorherigen addiert werden, ...
Der Wert ändert sich aber ständig
So weit, so gut.
Was sagt denn der eingelesene Wert wirklich aus?
Wieviele Liter seit dem vorherigen Lesen geflossen sind?
Oder ist der Wert um entsprechend viele Liter grösser, als beim vorherigen Lesen?
 
Das Messen zwischen den Merker zeiten sollen die geflossenen Liter sein. Damit ich sagen kann: z.b. 100x gelesen und ich habe x Liter im Tank dazu bekommen. Und das ganze soll gehen, bis der eingestellte Wert in einem DB erreicht ist als vergleicher quasi und dann soll das ventil wieder zu. Deswegen ja die aufsummierten Ergebnisse, damit ich irgendwann auf meine x liter komme.

Dann kann ich sagen:
Sollwert= Istwert
Ausgang A0.0 nicht mehr setzen (also Ventil zumachen)

Quasi:
Bediener sagt 150 Liter. E0.0 initialisiert das Messen bis in einem Db 150 Liter steht
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ah du hast das Problem, dass der Wert sich zyklisch ändert. Programmierst du mit TIA? Falls ja, solltest du dir meiner Meinung nach SCL anschauen, AWL kann man machen aber muss nicht sein, wenn es nicht zwingend erforderlich ist:

Du könntest dir einen Flankenmerker basteln (gern hier im Forum dazu suchen, vom Verständnis her ist sowas sehr hilfreich für das erste Mal) oder du nimmst du Taktmerker deiner CPU (zu finden in der HW-Konfig unter Eigentschaften der CPU und dann System- und Taktmerker). Dort kannst du z.B. MB 0 als Taktmerkerbyte deklarieren und hättest dann M0.3 als 2 Hz Takt.

Code:
IF M0.3 Then
[COLOR=#333333]"MyDB".AnalogWert1 := "MyDB".AnalogWert1 + "AnalogWert";
[/COLOR]end_if;

Oder falls AWL zwingend sein muss:

Code:
UN M0.3
SPB OVER
L PEW...
T DB...

OVER: nop 0

Oder das Ganze in KOP/FUP realiseren, auch hier gibt es den Move-Befehl (bzw. die Rechenoperationen) den du mit der Verknüpfung auf einen Taktmerker oder auf eine eigene Flankenauswertung verknüpfen kannst.


Der Wert T DB... ändert sich aber immer noch, wenn ich den Wert PEW änder... Das wollte ich ja vermeiden
 
Funktioniert der Siemens Baustein "LGF_Integration" nicht? Hat Siemens da schon wieder Bugs eingebaut? ;)

Harald

nö... klappt nicht, oder ich bin zu blöde dafür.
Wollte wie gesagt, den Weg mal anders gehen und einfach nur einen Wert einlesen und den innerhalb des DB moven und einen neuen Wert dann auf die erste Position setzen. Das zu wissen, schadet bestimmt nicht.

hat jetzt nur indirekt mit meiner anderen Frage zu tuen gehabt. Der gemovte Wert soll sich einfach nur nicht mehr verändern.

Sollte man dafür einen FC oder einen FB verwenden? Wollte das mit einem FC und einem Global DB machen
 
Versuch es mal einfach DB mit 5 variablen als Testfunktion
Wert 5 := Wert4;
Wert 4 := Wert3;
Wert 3 := Wert2;
Wert 2 := Wert1;
Wert 1:= Messwert;
Wenn du das versteht kannst du überlegen wie man das schneller machen könnte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich möchte diese Frage hier noch einmal aufgreifen :
So weit, so gut.
Was sagt denn der eingelesene Wert wirklich aus?
Wieviele Liter seit dem vorherigen Lesen geflossen sind?
Oder ist der Wert um entsprechend viele Liter grösser, als beim vorherigen Lesen?

... weil die Antwort darauf mir so gar nicht gefällt :
Das Messen zwischen den Merker zeiten sollen die geflossenen Liter sein.
... denn das würde nur funktionieren wenn du da einen Reset hinschickst ...
Was ich eher vermute ist, dass du einen Momentanwert erhältst. Wenn dem so ist dann müsstest du diesen (am Besten) in schneller Folge einlesen (also öfter als alle halbe Sekunde), die Differenz zum Vorgängerwert bilden und diese Differenz dann aufaddieren ...

Gruß
Larry
 
Sind hier nicht ein paar Dinge komisch?

Wenn es sich um l/min handelt müsste man das ja auch auf den "Lesetakt" herunterbrechen. Dann müsste man das idealerweise in einem festen Zyklus einlesen, also in einem Zyklus-OB.
Zudem wird dir das einlesen des Roh-PEW alleine auch nicht viel bringen, dass muss man dann schon noch in das richtige Maß bringen.

Werte addieren in AWL wäre übrigens

Code:
L Speicher
L PEW
+R
T Speicher

Entspricht in SCL der Zeile
Code:
Speicher += PEW;

Nur mit Lade A und transferiere in B wird das nichts.

Bist du sicher das du nicht erstmal bei Adam & Eva anfangen solltest bevor du dich an solche Aufgaben traust?

Eine fertige Lösung wird dir hier niemand präsentieren.
 
Zurück
Oben