B&R x20 Impuls - Durchflusszähler in ST

Tim87

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
habe mit B&R leider noch sehr wenig Erfahrung, sondern bisher nur in der Berufsschule einiges mit der S7 300 gemacht.
Ich habe hier eine B&R 1584 CPU, Automation Studio v4.3.11, einen 10A 24VDC Trafo, eine DI2377 (2 Zähleingänge, 50khz) sowie den Sika Durchflussmesser (max. 30Liter/min) welcher pro 1Liter Wasser 1000 Pulse ausgibt.
Von Prinzip funktioniert alles Hardwaretechnisch, wenn ich im AS auf den Monitor gehe und die Wasserleitung öffne sehe ich wie die Impulse am Zähleingang bis 65500 (USINT) schön hochzählen (und bei Überschreiten wieder von vorne anfangen)

Nun frage ich mich jedoch, wie ich daraus unkompliziert und zuverlässig einen sekündlich aktualisierten Durchflusswert in Liter/Minute programmieren kann mit Strukturiertem Text. Einen Systemtaktgenerator gibt es ja soweit ich sehe leider nicht bei B&R...

Für Hilfe und Anregungen wäre ich sehr dankbar.

mfg
 
hi,
also bei 30 liter / minute und 1000 impulsen pro liter kommst du auf max 500 impulse pro sekunde ...
ich kenne die karte nicht ... aber kannst du den zählereingang auf null setzen ?
dann würde ich einfach einen pulse-timer mit 1000ms puls und 100ms pause nehmen,
bei steigender flanke zähler auf null setzen ...
bei fallender flanke zähler auslesen ... ergebnis berechnen ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hi,
also bei 30 liter / minute und 1000 impulsen pro liter kommst du auf max 500 impulse pro sekunde ...
ich kenne die karte nicht ... aber kannst du den zählereingang auf null setzen ?
dann würde ich einfach einen pulse-timer mit 1000ms puls und 100ms pause nehmen,
bei steigender flanke zähler auf null setzen ...
bei fallender flanke zähler auslesen ... ergebnis berechnen ...

Da wäre ich vorsichtig bei 500Hz. Da könnten Dir zwischen Lesen und Schreiben Pulse entgehen...
ich würde die Karte nicht zurücksetzen, nur dann muß man natürlich den Überlauf berücksichtigen ( wenn Neuwert < Altwert dann Altwert bis Überlauf + Neuwert + 1 ).
entweder macht man das in jedem Zyklus, mißt die Zykluszeit und rechnet dass auf eine Sekunde hoch oder man macht das in festen Zeitabständen: 100/500/1000ms.
 
ich würde die Karte nicht zurücksetzen, nur dann muß man natürlich den Überlauf berücksichtigen

ja genau das meinte ich mit zählereingang zurücksetzen ... nicht die karte ... ansonsten klar ... start-stop zahl mit überlauf für die berechnung .....

da ich die bibliothek von b&r nicht kenne .. aber sicher gibt es TON und TOF .. womit sich ja ein impulsgenerator machen lässt ...
schien mir das am einfachsten

aber würdest du eher mit zykluszeit arbeiten, oder eher mit zeit stoppen bis z.b. eine bestimmte anzahl pulse erfolgt sind ?
 
OK, danke erstmal.
Ich habe es auf 2 arten gemacht: zuerst mit der Differenzmessung, Flow_count1 ist dabei der Zähleingang als UINT und Flow_sum1 habe ich als UDINT angelegt da ja mit der Zeit viel Durchfließen kann:
Die Zykluszeit selber ist wohl schon auf 1000ms eingestellt gewesen...
Code:
Flow_sum1 := (Flow_sum1 + Flow_count1); // Gesamtdurchflussmessung
    Flow_diff1 := Flow_sum1 - Flow_sum1temp; //Differenz pro Sekunde
    Flow_per_m1 := (Flow_diff1*60)/1000; //Durchfluss Liter pro Minute
    Flow_sum1temp := Flow_sum1;

und dann habe ich noch eine version mit einem einfachen 1Hz takt und Rücksetzen des Zählers:
Code:
IF Blinker_1Hz THEN
        Flow_diff1:=Flow_count1; //akt. Durchfluss in mL
        Flow_per_m1 := (Flow_diff1*60)/1000; //Durchfluss Liter pro Minute
    END_IF
        Flow_count1_reset := NOT Blinker_1Hz;

Habe das ganze hier auf dem Schreibtisch erstmal nur mit nem Poti auf Analogeingang simuliert und scheint einigermaßen zu gehen.
Sollte dann ja auch mit dem realen Zähler funktionieren oder?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
ich würde R_TRIG und F_TRIG setzen auf den blinker ...

Flow_count1_reset := Blinker_1Hz_Rtrig.Q1;

if Blinker_1Hz_Ftrig.Q1 then
... berechnung
end_if

so wird dein code in if/then nur einmal ausgeführt ... und nicht immer wieder eine sekunde lang
 
Moin,

zu Deiner Frage in #4: Ich würde eher alle Sekunde die Differenz nehmen. Denn dann kann man an der Zykluszeit drehen, wenn es notwendig ist, ohne das Programm zu ändern.
Ähnlich, wie auch zuletzt angedacht in Euren Posts.

Zu #5: Ich würde die Gesamtmessung in Litern machen, weil Du dann um den Faktor 1000 weiter vom Überlauf weg bist. So läuft Deine Gesamtmessung quasi zeitgleich mit dem Zähler der Karte über. Die FlowDiff berechnest Du Dir einfach aus aktuellem Wert - letztem Wert und fängst dabei den Überlauf der Karte ab.

Bitte daran denken, daß man die Gesamtmessung manuell ändern können mußt: Wenn die SPS aus ist, läuft das Wasser vermutlich trotzdem weiter. Und dann kann man Zählerstände hinterher wieder angleichen.

Gruß
Jens
 
OK,
Zu #5: Ich würde die Gesamtmessung in Litern machen, weil Du dann um den Faktor 1000 weiter vom Überlauf weg bist. So läuft Deine Gesamtmessung quasi zeitgleich mit dem Zähler der Karte über. Die FlowDiff berechnest Du Dir einfach aus aktuellem Wert - letztem Wert und fängst dabei den Überlauf der Karte ab.

Bitte daran denken, daß man die Gesamtmessung manuell ändern können mußt: Wenn die SPS aus ist, läuft das Wasser vermutlich trotzdem weiter. Und dann kann man Zählerstände hinterher wieder angleichen.
also wäre im Grunde mein Codevorschlag 1 passend, nur dann in Litern statt ml. Quasi so, damit auch ein Überlauf abgefangen wird:
Code:
Flow_sum1 := Flow_sum1 + (Flow_count1/1000); // Gesamtdurchflussmessung in Liter
    Flow_diff1 := Flow_sum1 - Flow_sum1temp; //Differenz Liter pro Sekunde
    Flow_per_m1 := Flow_diff1*60; //Durchfluss Liter pro Minute
    Flow_sum1temp := Flow_sum1; // alten Wert speichern

über manuelle änderungen muss ich mir eigentlich keine sorgen machen, da wenn die SPS aus ist auch die gesteuerte Dosierpumpe und das Ventil zu sind.
So bräuchte ich den 1Hz Takt nicht oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei einem Blinktakt oder einer Warte- oder Timeout-Zeit ist es meistens kein Problem, wenn die dafür abgemessene Zeit bis zu 2 Zykluszeiten zu lang ist. Wenn man aber mit dem Zeittakt etwas berechnen will, dann sollte er schon möglichst genau stimmen. Wenn man den Zeittakt mit einem TON abmisst, dann den TON sofort neu starten und nicht erst im übernächsten Zyklus.
Code:
TONtakt_1s(IN:=NOT xZyklus1, PT:=T#1s, Q=>xPuls_1s); // *

IF xPuls_1s THEN         //TON hat 1s erreicht
  TONtakt_1s(IN:=FALSE); //TON Reset
  TONtakt_1s(IN:=TRUE);  //und sofort neu starten
END_IF;

//xPuls_1s ist alle 1s für 1 Zyklus lang TRUE

...
IF xPuls_1s THEN         //Berechnungen alle 1s
  Flow_diff1 := ...
  ...
END_IF;

(*) Ich weiß nicht, wie sich der TON bei B&R genau verhält. Wenn er keine 0-1-Flanke an IN braucht oder wenn die TON-Instanzen bei STOP->RUN initialisiert werden, dann kann der TON direkt mit IN:=TRUE aufgerufen werden. Sonst muß der TON im ersten Zyklus im RUN 1x mit IN:=FALSE aufgerufen werden.
Möglicherweise wird die Zeit genauer, wenn man bei PT eine Zeit angibt, die ca. 0,5 Zykluszeit kürzer als die beabsichtigte Zeit ist. Zum Test mal über längere Zeit die Anzahl xPuls_1s zählen, und mit einer Uhr vergleichen wieviele Pulse es hätten sein sollen.

Harald
 
Timer? Ich kenne mich mit B&R nicht aus, aber es gibt doch sicherlich verschiedene Tasks, darunter auch welche mit festen Zykluszeiten? Gewöhnlich ist so etwas zeitlich am genauesten.
 
Habe das ganze hier auf dem Schreibtisch erstmal nur mit nem Poti auf Analogeingang simuliert und scheint einigermaßen zu gehen.
Sollte dann ja auch mit dem realen Zähler funktionieren oder?
:confused: Was hat eine Simulation mit Poti auf AnalogEingang mit einem realen Zähler zu tun? Ich kann da nicht so recht folgen, wie die ErfolgsPrognosen für den Zähler aus der Simulation abgeleitet werden sollen. :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
nun mit dem Poti kann ich schön verschiedene sekündlich aktualisierte Integerwerte der Analogeingangskarte nehmen und so die 0-1000 Impulse des Durchflusszählers simulieren. Hat soweit funktioniert.
Allerdings habe ich das ganze beim Programmieren dann mit REAL gelöst, einfach weil der Bereich größer ist und ich mir die Liter/min auch gerne mit nachkommastellen anzeigen lasse.
Konnte es nun mit dem realen Durchflusszähler am Wasserhahn testen und läuft einwandfrei.

Code:
Flow_sum1 := Flow_sum1 + Flow_diff1; 
Flow_diff1 := (UINT_TO_REAL(Flow_count1)) - Flow_count1temp; //Differenz mL/Sek
Flow_per_m1 := (Flow_diff1*60.0)/1000.0; //Durchfluss L/Min
Flow_count1temp := (UINT_TO_REAL(Flow_count1));
 
;---------------MID 1 zählen -----------------------------------
if (Spuelzaehl_ist[1] = 1) then

UDINT_MID[1] = UDINT((Istwert_Mid[1]*100000)/600)
UD_DIS_MID[1] = UDINT_MID[1]/1000

DISPLAY_MV[1] = DISPLAY_MV[1] + UD_DIS_MID[1]
DISPLAY_TV[1] = DISPLAY_TV[1] + UD_DIS_MID[1]
endif

Mid ist der Durchflussmesser/MomentanVerbrauch/TagesVerbrauch
 
Zurück
Oben