TIA Zählen ohne Digital Eingang (Impuls) IDM

pramkies

Level-2
Beiträge
80
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie kann man nur mit den Analogsignal vom Durchflussmessgerät Zählen ? Am besten würde ich mir selber einen Impuls bilden der zum Beispiel alle 10L einen Flanke bildet. Bsp. bei 36m³/h und gewünschte 10 Liter Impuls, würde das heißen > Impuls/1sec. Gibt es ein FB von Siemens ?

Es muss nicht genau sein, ich will damit nicht dosieren sondern nur Medium bis X ermitteln. Hat einer eine Idee ?
 
Den Analogwert "Durchfluß/Zeit" über eine Zeit integrieren, z.B. mit dem FB LGF_Integration (Achtung, den Baustein ausgiebig testen! In der Vergangenheit waren da einige Fehler drin, ich kenne die aktuelle Version nicht.) Und dann aus dem Integralwert die Pulse bilden. Siehe auch hier

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Ich wüßte nicht, dass es dafür etwas fertiges gibt.
Aus einem Weck-OB heraus läßt sich das rel. einfach erledigen. Angenommen der analoge Istwert hat die Einheit m³/h und der Weck-OB wird alle 100ms aufgerufen, dann kann man sich den Rest herleiten. In einer Stunde wird der Weck-OB 36000 mal aufgerufen, also den analogen Istwert durch 36000 teilen oder besser mit 0.0000277778 multiplizieren und das Ergebnis aufsummieren. Die Einheit ist dann m³.

Gruß Micha
 
Ja stimmt ! klappt wunderbar !Danke!
hier die Lösung:

Aus OB30 mit 100ms FC Aufruf:

AWL-Quelle:

FUNCTION "AI_Impulsbildung_Real" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
//Baustein wird über OB30 Aufgerufen bzw muss mit 100ms Aufgerufen werden !
VAR_INPUT
Durchfluss : Real;
Impulsrate : Real; // selbe Einheit wie Istwert
Zeitimpuls : Bool;
END_VAR

VAR_OUTPUT
FT_imp : Bool;
END_VAR

VAR_IN_OUT
Restwert : Real;
END_VAR

VAR_TEMP
Berechnung : Real;
END_VAR


BEGIN
NETWORK
TITLE =

CLR;
= #FT_imp;

UN #Zeitimpuls;
BEB;

L #Durchfluss;
L 36000.0;// bei 100ms Aufruf // besser L 0.0000277778 & multiplizieren
/R; // *R
L #Restwert;
+R;
T #Berechnung;

L #Berechnung;
L #Impulsrate ;// Impuls/LiterX
>=R;
SPB ma10;
TAK;
T #Restwert;
BEA;

ma10: NOP 0;
L #Berechnung;
L #Impulsrate ;// 10 Liter
-R;
T #Restwert;

SET;
= #FT_imp;

END_FUNCTION
 
Zuletzt bearbeitet:
Warum programmierst Du eine S7-1500 in AWL? Willst Du das nicht besser nochmal in schön lesbarem SCL programmieren? Dann brauchst Du auch keine Spaghetti-Sprünge ...

Dein #FT_imp: In einem FC einen Output erst auf 0 setzen und evtl. später auf 1 setzen ist ganz schlechter Programmierstil, besonders wenn an dem Output ein M, E oder A verschaltet ist.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum programmierst Du eine S7-1500 in AWL? Willst Du das nicht besser nochmal in schön lesbarem SCL programmieren? Dann brauchst Du auch keine Spaghetti-Sprünge ...

Dein #FT_imp: In einem FC einen Output erst auf 0 setzen und evtl. später auf 1 setzen ist ganz schlechter Programmierstil, besonders wenn an dem Output ein M, E oder A verschaltet ist.

Harald

keine Ahnung Warum... Ich hatte eine Vorlage... aber du hast 100% recht. Hier in SCL:


#Berechnung := (#Durchfluss * 2.777784E-05) + #Restwert;

IF #Berechnung >= #Impulsrate THEN

#Restwert := #Berechnung - #Impulsrate;
#FT_imp := True;

ELSE
#Restwert := #Berechnung;
#FT_imp := False;


END_IF;


;):cool:

Pramkies
 
Ich weiß ja nicht, was du mit dem Impuls machst. Generell ist es aber sehr heimtückisch, im OB30 einen Impuls zu bilden, den man dann in einem anderen Task verwendet.
 
Ich weiß ja nicht, was du mit dem Impuls machst. Generell ist es aber sehr heimtückisch, im OB30 einen Impuls zu bilden, den man dann in einem anderen Task verwendet.
Warum nicht ? Test war erfolgreich bei 36m³ und 10 Liter hatte ich exakt ein Impuls/1sec... Verglichen auch mit den Taktmerker 1 sec.. mit einem ZV Z1.... passt alles oder was übersehe ich ? Gruß

Pramkies
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eigentlich wollte ich nur darauf hinweisen, dass ein Impuls, der in einem Weckalarm (OB30) gebildet wird, im OB1 nicht konsistent ist. D.h., er kann in einem OB1-Zyklus sein Zustand wechseln, ggf. auch mehrmals. Je nach dem, wie du deinen Impuls auswertest, kann das zu Problemen führen. Das ist ein prinzipielles Problem. Bei deinen 100ms-OB30 wird es wahrscheinlich nicht auftreten. Was machst du überhaupt mit dem Impuls?

Aber beim genaueren Hinsehen, gibt es noch weitere Probleme. Wenn du den Durchfluss integrieren willst, dann musst du ihn in zeitlich konstanten Abständen aufsummieren. Das bedeutet, "Berechnung" muss ein statischer Wert sein, so wie dein "Restwert", der sicherlich über INOUT statisch abgelegt wird, z.Bsp. im Merkerbereich. In deinem AWL-Code ist "Berechnung" aber als TEMP deklariert. Du kannst nicht davon ausgehen, dass in jedem OB30-Aufruf ein Impuls gebildet wird. "Berechnung" muss also im nächsten Berechnungszyklus mit seinem Zählwert wieder zum weiteren Integrieren zur Verfügung stehen.

Code:
Berechnung := Berechnung + Durchfluss;
 
Eigentlich wollte ich nur darauf hinweisen, dass ein Impuls, der in einem Weckalarm (OB30) gebildet wird, im OB1 nicht konsistent ist. D.h., er kann in einem OB1-Zyklus sein Zustand wechseln, ggf. auch mehrmals. Je nach dem, wie du deinen Impuls auswertest, kann das zu Problemen führen. Das ist ein prinzipielles Problem. Bei deinen 100ms-OB30 wird es wahrscheinlich nicht auftreten. Was machst du überhaupt mit dem Impuls?

Aber beim genaueren Hinsehen, gibt es noch weitere Probleme. Wenn du den Durchfluss integrieren willst, dann musst du ihn in zeitlich konstanten Abständen aufsummieren. Das bedeutet, "Berechnung" muss ein statischer Wert sein, so wie dein "Restwert", der sicherlich über INOUT statisch abgelegt wird, z.Bsp. im Merkerbereich. In deinem AWL-Code ist "Berechnung" aber als TEMP deklariert. Du kannst nicht davon ausgehen, dass in jedem OB30-Aufruf ein Impuls gebildet wird. "Berechnung" muss also im nächsten Berechnungszyklus mit seinem Zählwert wieder zum weiteren Integrieren zur Verfügung stehen.

Code:
Berechnung := Berechnung + Durchfluss;
Ich will damit eine Menge zählen. Ich habe eine Schnittstelle über eine andere PLC wo ich einen Durchfluss als REAl in m³ bekomme.
Der andere Programmierer meint das er keinen Impuls bzw. er kann mir nicht einen Zähler rüber senden hierzu. Das heißt ich muss mit den REAL wert arbeiten. Und ich werde damit auch keine genaue Dosierungen zählen sondern nur Mengen bis Tank um die Phasentrennung bei der CIP zu bestimmen.

Der temp #Berechnung wird auch nur als temp genutzt... ich schreibe den wert in Restwert und der ist INOUT deklariert. ist schon richtig.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das tust du ja eigentlich schon durch das Integrieren.
Ok, "Restwert" wird "Berechnung" beschrieben, kann man machen.
Ja habe auch damit versucht mit den "LGF_Integration FB" von Siemens.... Aber irgendwie bekomme ich das nicht hin. Aus der Beschreibung werde ich auch nicht schlau>
Bei der der Schnittstelle des Baustein ist "Value" als Input und "LReal" deklariert > "Analogwert der kontinuierlichen Funktionskurve, basierent auf [ms], (z.B. [Volumenstrom/ms])"

1. Wie bekomme ich mein REAL auf LReal transferiert ? und Ja ich muss noch mit 3600000.0 multiplizieren, wegen m³/h in m³/ms umzurechnen.


immer diese halbe Beschreibungen von Siemens... Früher war der Value auch als Real deklariert...

Was übersehe ich ?
Gruß

Pramkies
 
Ja habe auch damit versucht mit den "LGF_Integration FB" von Siemens....

Aber das tust du doch schon mit:
Code:
#Berechnung := (#Durchfluss * 2.777784E-05) + #Restwert;

Deutlicher zu lesen wäre es in einer anderen Schreibweise, bzw. mit nur einer Summen-Variable. Für die Summenbildung würde sich hier der Datentyp "LReal" anbieten.
Code:
#Summe := #Summe + (#Durchfluss * k);

Bei der der Schnittstelle des Baustein ist "Value" als Input und "LReal" deklariert > "Analogwert der kontinuierlichen Funktionskurve, basierent auf [ms], (z.B. [Volumenstrom/ms])"
Das ist dein Durchfluss-Messwert, normiert auf 1ms. Den verwendest du doch auch in ähnlicher Form bei deiner Berechnung?

1. Wie bekomme ich mein REAL auf LReal transferiert ? und Ja ich muss noch mit 3600000.0 multiplizieren, wegen m³/h in m³/ms umzurechnen.
In SCL müsste das mit "REAL_TO_LREAL" funktionieren. Hier musst du eine temporäre Hilfsvariable vom Typ "LREAL" verwenden, die du dann an den Baustein übergibst.

... Früher war der Value auch als Real deklariert...
Früher gab's ja auch kein "LReal". Die größere Datenbreite von "LReal" hat gerade in so einem Fall, wo ein kleiner Realbetrag auf eine immer größer werdende Summe aufsummiert wird, eine Bedeutung. Zu den Rechenfehler bei Strichrechnung mit Realzahlen kannst du aber mal Google bemühen. Diesen Rechenfehler kannst du deutlich verringern, indem du, so wie du es auch getan hast, einen Impuls bei einer gewissen Summe bildest, oder wenn du direkt (ohne Impuls) einen Übertrag auf einen ganzzahligen Zähler bildest.

Code:
#Summe := #Summe + (#Durchfluss * k);
if Summe >= 1.0 then
   MeinZaehler := MeinZaehler + 1; 
   Summe := Summe - 1.0;
end_if;

"MeinZaehler" wird früher oder später "überlaufen". Das kannst du ggf. durch Zurücksetzen und durch einen weiteren Übertrag auf eine weitere Zähl-Variable berücksichtigen.
 
Zurück
Oben