TIA Zeit zwischen Impulsen messen

uweschwarz

Level-2
Beiträge
214
Reaktionspunkte
11
Liebes Forum, ich arbeite mit TIA V17 und einer S7 1516.

Für eine S7-300 ich habe diesen Beitrag gefunden:

Impulse auswerten für Durchfluss-Berechnung

Meine Aufgabenstellung ist auch so wie dort beschrieben. Durchflussermittlung für 1 Impuls je 100 Liter bei 3-5 Impulsen pro Minute. Ich habe auch noch etliche andere Beiträge zu diesem oder verwandten Themen gefunden. Leider finde ich nicht einen Beitrag, bei dem ich die Lösung wirklich verstehe bzw. nachvollziehen kann wie man zu einer Lösung kommen kann.
Nun ist selber denken ja nie verkehrt. Darum habe ich versucht eine eigene Lösung zu erstellen.

Ich habe folgenden Baustein geschrieben und rufen diesen zyklisch auf. Als Impuls habe ich testweise den Taktmerker für 1Hz angelegt. Dabei berechnet mein Code allerdings sehr regelmäßig eine Impulsdauer von 16 ms. Erwartet hatte ich 1s bzw. war das, das Ziel meiner Programmierung.
Wo ist mein Denkfehler?

Vielen Dank schon mal
Uwe


1729682055352.png
 
Du müsstest bei denen Vergleichen noch den Impuls mit einem AND dazuverknüpfen.
Ansonsten schreibst du doch dauerhaft für die Startzeit die aktuelle Zeit rein, bis zu dem Moment wo der zweite Impuls kommt.
Daher wird die Zeit natürlich verfälscht. Da auch deine Startzeit nur beim Impuls geschrieben werden soll.
 
Wie genau hast du denn deinen Impuls gebildet?
Wenn dein Impuls länger als deine Zykluszeit ist, dann zählst du hier nur die Zykluszeit.
 
Wie genau hast du denn deinen Impuls gebildet?
Wenn dein Impuls länger als deine Zykluszeit ist, dann zählst du hier nur die Zykluszeit.
Da hast du recht, ich habe das überlesen, dass der Taktmerker mit 1Hz verwendet wird.

Natürlich musst du dann noch eine positive Flanke des Taktmerkers abfragen, ansonsten ist es so, wie schwimmer es gesagt hat.
 
Hey,

generell ergibt sich mir hier der Zusammenhang zwischen der Anzahl der Impulse und der Zeit, welche dazwischen liegt nicht genau.

Arbeite hier doch nur mit Flanken pos --> neg (Länge Impuls) neg --> pos (Dauer zwischen Impulsen) wenn du dann noch eine Korrelation zwischen der Impulsanzahl und der Dauer benötigst kannst du diese getrennt bilden.
 
A) Pos.Flanke bis Neg.Flanke = Länge des Puls
B) Neg.Flanke bis Pos.Flanke = Länge der Pause zwischen den Pulsen
C) Pos.Flanke bis Pos.Flanke = Dauer von einem Puls bis zum nächsten Puls (Periodendauer)
C = A + B
 
Streng genommen müsste der Abstand zwischen zwei positiven Flanken verwendet werden, um die Dauer zwischen zwei Impulsen zu bestimmen.

Edit: Mist, zu langsam.
 
Meine Aufgabenstellung ist auch so wie dort beschrieben. Durchflussermittlung für 1 Impuls je 100 Liter bei 3-5 Impulsen pro Minute.
Was für einen Impulsgeber hast du denn überhaupt?
Wenn du für 100l/min einen fest definierten Impuls bekommst, dann nutzt dir die Messung der Impulsdauer oder der Pausendauer nicht viel.
Es reicht doch wenn du die Impulse aufaddierst.
 
Impulsgeber ist ein Balgengaszähler. Die Impulse addiere ich sowieso. Dann weiß ich aber nur das Volumen, welches insgesamt über das Zählwerk gelaufen ist. Ich würde aber auch gerne den Volumenstrom wissen. Den kann ich zwar nicht in Echtzeit messen, aber immerhin den Volumenstrom der zwischen den letzten beiden Impulsen vorhanden war.

C) Pos.Flanke bis Pos.Flanke = Dauer von einem Puls bis zum nächsten Puls (Periodendauer)
Wie das ohne Impulszähler geht würde mich mal interessieren.
 
C) Pos.Flanke bis Pos.Flanke = Dauer von einem Puls bis zum nächsten Puls (Periodendauer)
Wie das ohne Impulszähler geht würde mich mal interessieren.
Einfach bei jedem Puls (bzw. jeder Pos.Flanke) die vergangene Zeit zum vorherigen Puls ermitteln. Also die Zeitdifferenz zwischen dem Zeitpunkt_jetzt und dem Zeitpunkt des vorherigen Puls bilden und dann den Zeitpunkt_jetzt als Zeitpunkt_vorher merken. Oder bei jedem Puls die Zeitmessung neu ab 0 starten, dann braucht man den Startzeitpunkt 0 nicht merken und nicht subtrahieren.


Ich würde aber auch gerne den Volumenstrom wissen.
Volumenstrom ist Volumen/Zeit = Pulse * Volumen/Puls / Zeit

Entweder man zählt die variable Anzahl Pulse in einer festen Zeiteinheit (Messzeit, Torzeit) (z.B. 1s)
z.B. Liter/s = Pulse * 100 l / 1s

oder wenn die Impulse zu selten kommen, dann misst man die variable Zeit zwischen fester Anzahl Pulsen (z.B. von einem zum nächsten Puls)
z.B. Liter/s = 1 * 100 l / Sekunden

Um eine höhere Auflösung (Anzahl Ziffern) zu bekommen, kann man die Messzeit verlängern (dann dauert es länger bis zum Ergebnis), oder man misst die variable Zeit mit hoher Auflösung (Millisekunden, Mikrosekunden, ...). Einfach nur 1 Sekunde zählen und dann mit irgendwas (z.B. 10) multiplizieren vergrößert zwar den Zahlenwert, erhöht aber nicht die Auflösung oder Genauigkeit.

Um bei langer Messzeit schon eher neue Ergebnisse zu haben, kann man Messzyklen ineinander verschachteln, z.B. die Zeiten messen vom 1. bis 11. Puls, vom 2. bis 12. Puls ... vom 10. bis 20. Puls ..., dann erhält man nach jedem Puls die Zeit für 10 Pulse. Oder man zählt die Pulse von der 1. bis 11. Sekunde, von der 2. bis 12. Sekunde ... von der 10. bis 20. Sekunde ..., dann erhält man jede Sekunde einen neuen Wert, wieviele Pulse pro 10 Sekunden kommen.
 
Ich (faul) würde mit der positiven Flanke und mittels "RUNTIME" die Zeitdifferenz messen, diesen Wert dämpfen, und entsprechend mit der Impulswertigkeit verrechnen. Bei längeren Ausbleiben des Impulses sollte man den berechneten Wert auf Null setzen. Mehr braucht's eigentlich garnicht.
 
Streng genommen müsste der Abstand zwischen zwei positiven Flanken verwendet werden, um die Dauer zwischen zwei Impulsen zu bestimmen.
Sorry, aber das stimmt doch nicht. Die Dauer zwischen einer negativen und der folgenden positiven Flanke ist die Dauer der Pause und somit die Dauer ZWISCHEN zwei Impulsen.
Aber Du meinst anscheinend das Richtige. Denn es interessiert nicht die Dauer zwischen den Impulsen, also die Dauer der Pause, sondern die Summe aus Dauer eines Impulses plus Dauer einer Pause, also die PeriodenDauer.
Dazu genügt der Abstand zwischen zwei aufeinanderfolgenden positiven Flanken bzw. zwischen zwei aufeinanderfolgenden negativen Flanken.

Harald hatte das schon genau richtig gesagt:
A) Pos.Flanke bis Neg.Flanke = Länge des Puls
B) Neg.Flanke bis Pos.Flanke = Länge der Pause zwischen den Pulsen
C) Pos.Flanke bis Pos.Flanke = Dauer von einem Puls bis zum nächsten Puls (Periodendauer)
C = A + B
 
Zuletzt bearbeitet:
Bei längeren Ausbleiben des Impulses sollte man den berechneten Wert auf Null setzen. Mehr braucht's eigentlich garnicht.
Deswegen eignet sich auch ein einfacher TON (wie in dem anderen Thread empfohlen), der beides direkt liefert: die vergangene Zeit in ms und das Time Over Signal. Allerdings ist das in FUP nicht ganz trivial zu programmieren, weil man da den TON im selben Zyklus rücksetzen und neu starten muss (in SCL kein Problem).
 
Deswegen eignet sich auch ein einfacher TON (wie in dem anderen Thread empfohlen), der beides direkt liefert:
Würde auch das Problem beheben, dass der TIME_TCK bei ~24,85 Tagen in den Überlauf geht.

Ist ein Fehler, der eher selten auftritt, aber wenn er kommt erst mal für Verwirrung sorgen kann.
Müsste wenn dann mit einem Vergleich abgefangen werden.

Code:
IF (#statStartzeit < #statEndzeit) THEN
    #statDiff = #statEndzeit - #statStartzeit;
ELSE
    #statDiff = #StatEndzeit + (#statStartzeit - 2147483647);

Ansonsten hast du bei der Messung, welche den Überlauf einschließt einen extrem hohen Wert, welcher dir dein Ergebnis verfälscht.
 
Zuletzt bearbeitet:
Würde auch das Problem beheben, dass der TIME_TCK bei ~24,85 Tagen in den Überlauf geht.

Ist ein Fehler, der eher selten auftritt, aber wenn er kommt erst mal für Verwirrung sorgen kann.
Müsste wenn dann mit einem Vergleich abgefangen werden.
Man braucht keinen extra Vergleich (und unterschiedliche Behandlung), man kann auch einfach generell das Bit31 der Differenz auf 0 setzen (herausschieben SLD + SRD oder AND 16#7FFF_FFFF). siehe TIME_TCK Überlauf Korrektur

Code:
IF (#statStartzeit < #statEndzeit) THEN
    #statDiff = #statEndzeit - #statStartzeit;
ELSE
    #statDiff = #StatEndzeit + (2147483647 - #statStartzeit);
Dein Korrekturfaktor 2147483647 ist falsch. Hast du das bei Siemens abgeschrieben? ;)
Der korrekte Wert ist -2147483648
 
Zurück
Oben