# Analoge Messwerte verrechnen...



## parkkralle (9 März 2011)

Guten Tag,

ich habe folgendes Problem und suche dafür eine Lösung.

Problemdarstellung:

Ich verwende eine Wago 750-841 (Programmierung erfolgt mit CodeSys) um mehrere Messwerte zu erfassen.
Hierbei ist auch eine analoges Signal (4-20mA) eines Wasserdurchflusswächters (0-100 l/min). 
D.h. ich erhalte ein analoges Signal von 4-20mA, welches dem aktuellen Durchfluss von 0-100 l/min entspricht. 
Die Normierung des Integer-Wertes auf einen REAL-Wert habe ich bereits erledigt. 
Nun würde ich gerne mit dem Aktualwert den gesamten Wasserverbrauch in Litern eines Tages und eines Jahres berechnen. Der Fluss des Wassers ist nicht immer gleich!
Nach einem Tag bzw. Jahr sollen diese Werte wieder auf 0 zurückgesetzt werden. 

Meine Idee war nun jede Sekunde den aktuellen normierten Wert des Analogsignals durch 60 zu teilen und in zwei Variablen hinein zu addieren. 
Variable_1 wird um 00:00:00 Uhr auf 0 zurückgesetzt und Variable_2 wird am 01.01.xxxx 00:00:00 Uhr zurückgesetzt.

Meine Frage: Wie bekomme ich das Ressourcen schonend programmiert, bzw. geht das überhaupt?

Wäre für eure Hilfe und ggf. Programmcode sehr dankbar.

MfG

parkkralle


----------



## dante (9 März 2011)

Hi, bist du sicher das du jede Sekunde den Aktualwert aufnehmen willst und dann durch 60 teilst? Wenn dein Wasserdurchflusswächters0 - 100 Liter pro minute rechnet würe es doch reichn jede Minute den Aktalwert aufzunehmen und dann zu addieren.

Um Aktual, Tag, Jahr dar zu stellen würde ich 3 Variablen vom Type Real nutzen. Diese Werte würde ich dan *[FONT=&quot]RETRAIN PERSISTENT [/FONT]*mache. Systemschonend ist anders ich weiß aber die 100% lösung mach ich dir net 
Den aktuellen Wert würde ich "fließend" anzeigen lassen, bzw ich würde je nach Schwankung das mit ner Zeit machen sonst haste Probleme beim ablesen.

Gehen tut das alles


----------



## winnman (9 März 2011)

womit erfasst du deinen Durchfluss?
Falls das ein Zähler ist, hat der eventuell einen Impulsausgang, dann musst du nur die Impulse zb. pro 15 min Zählen und dann entsprechend rechnen.


----------



## parkkralle (9 März 2011)

der sensor ist von ifm und kann auch pulse ausgeben, allerdings kann ich diesen nicht nutzen, da dieser eingang schon von einer CNC-Maschine als Schalthysteres genutzt wird. Diesen eingang möchte ich auch nicht über die Wago laufen lassen, da ich einen unabhängigen betrieb der CNC-Maschine gewährleisten möchte.
Was ist den RETRAIN PERSISTENT. ich würde gerne 1s gewählen, da die maschine na bedarf automatisch wasser nachfüllt und es sein kann, dass sie nur 30sec nachfüllt. wenn ich nun nur jede minute erfasse, kann es passieren, dass die machine 30sec was nachgefüllt hat aber der momentane Wert des sensors 0 ausgibt bei der abfrage (da gerade nicht gefüllt wird). 

Hoffe das war bissle verständlich 

Wie bekomme ich den mit codesys einen Addierer hin der jede Sekunde einen WertX zu einem ErgebnisY addiert? Sprich Takt = 1 => wertX + ergebnisY = ErgebnisY takt=0 nix!

Fettes Danke für die schnellen Antworten!!!


----------



## dante (9 März 2011)

RETRAIN PERSISTENT: Du willst Werte über JAHR abspeichern, wasn nu bei Spannungsverlust? Genau all deine Werte sind weg! Das musst du ja iergentwie abfangen, also am besten die Werte so speichern, das sie auch ggn spannungsausfall gesichert sind.


if tackt=true then (*hier würde sich ein RTRIG anbieten!!*)
ErgebnisY := (WertX + ergebnisY);
end_if;

so einfach (*in ST*)


----------



## parkkralle (9 März 2011)

Ich werde das dann morgen mal versuchen. falls es nicht klappt werde ich mich wieder melden  !!!
Schönen feierabend euch noch und DANKE!!!


----------



## cas (9 März 2011)

man könnte auch alle den Wert addieren und dann durch die Anzahl werte Teilen.

(*Alle Minute ausführen*)
Wert_tmp:=Wert_tmp+Messwert;
Anzahl_Werte:=Anzahl_Werte+1;

If Anzahl_Werte=60 then
Durchschnittswert:=Wert_tmp/60;
Anzahl_Werte:=0;
end_if

(*ENDE*)

So hast du immer den Durchschnittswert für die letzte Stunde.

MfG CAS


----------



## parkkralle (10 März 2011)

Guten Morgen,

habe soweit alles hinbekommen. Habe nun 2 Werte einemal Wert_Tag und Wert_Jahr welche sekundeweise mit dem Verbrauch beschrieben werden. Das funktioniert soweit auch super! 
Nun hänge ich aber an den Rücksetzzeiten. 
Ich würde gerne einmal die Variable Reset_Tag und Reset_Jahr zu bestimmten Zeiten setzen.
D.h. die Variable Reset_Tag soll immer um 00:00:00 Uhr gesetzt werden (Rücksetzung um 00:00:01 Uhr).
Die Variable Reset_Jahr soll immer am 01.01.xxxx 00:00:00 Uhr gesetzt werden (Rücksetzung am 01.01.xxxx um 00:00:01 Uhr). 
1. Gibts es evtl. schon einen Baustein dafür?
2. Wie mache ich das mit dem fortlaufendem Jahr?

Grüssle Parkkralle


----------



## dante (10 März 2011)

Dafür solltest du die Systemzeit nehmen und dann mit ner 0815 if anweisung den Befehl ausführen. 
ich weiß gerade aus dem Kopf nicht wie die Systemzeit sich zusammensetzt aber:

if Systemzeit='00:00:00' then
Reset_Tag:=true;
else
Reset_Tag:=false;
end_if;

Das würde dir ja schon reichen. Wie hast du dir denn jetzt vorgestellt die Werte über nen Jahr zu speichern?


----------



## parkkralle (10 März 2011)

Die Werte für das Jahr werden auch sekundenweise in die Variable Wert_Jahr hineingeschrieben und addiert. Dieser Wert soll immer am 01.01.xxxx um 00:00:00 Uhr auf Null gesetzt werden. Mit welchem Befehl kann ich denn die Systemzeit auslesen?


----------



## dante (10 März 2011)

google mein freund 

http://infosys.beckhoff.com/index.p.../tcplclibutilities_fb_localsystemtime.htm&id=

damit gehts Ausgang 
*systemTime*: Lokale Windows-Systemzeit.


	systemTime 	: TIMESTRUCT;

http://infosys.beckhoff.com/index.p...ies/html/TcPlcLibUtilities_TIMESTRUCT.htm&id=

viel erfolg!


----------



## parkkralle (11 März 2011)

Guten Morgen,

wenn ich die Seiten von Beckoff anschaue verstehe ich nur Bahnhof  
Ich habe nun im CodeSys die SysLibTime.lib gefunden, in welcher der CurTime(FB) und der CurTimeEx(FB) liegen. Ich würde nun gerne mit Hilfe des CurTimeEx die aktuellen Sekunden, Minuten, Stunden auslesen (Systemzeit der Wago). 
Ich habe absolut keine Ahnung wie ich nun den CurTimeEx(FB) einbinden muss. 
Woher bekomme ich die Sekunden-, Minuten- und Stundenwerte? 
Ich möchte dann in einem PRG eine globale Variable (Reset genannt) um 00:00:00 Uhr auf 1 setzen und um 00:00:01 Uhr wieder auf 0 setzen. 
Ich bitte um eine möglichst einfache und genaue Anleitung, da ich mich weder mit CodeSys noch mit diesem Programmierstandard besonders gut auskenne. Ich komme nämlich aus der S7-Ecke!!!
Bin um jede Hilfe dankbar....

Grüssle parkkralle


----------

