B&R Gas-Verbrauchsmessung mit Anzeige von m³/h (Gleitender Mittelwert)

APROLmicha

Level-1
Beiträge
27
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Wunderschönen Guten Morgen!
Ich bin neu hier und arbeite zu 99% mit dem Aprol-System von B&R.

Ich habe eine Gasmessuhr, die 100Imp/m³ Gasdurchfluss ausgibt (die angehängte Maschine benötigt VIIIELLLL Gas).
Nun möchte ich einen Baustein Programmieren, dem ich die Impulse eingebe, einen Reset-eingang und mehr nicht.
Ausgeben möchte ich die daraus resultierenden Werte Verbrauch und Verbrauch pro Stunde. Der Verbrauch pro Stunde soll jede Sekunde nachgeführt werden.
Also denke ich mal mit einem gleitenden Mittelwert.
Wie messe ich die zeit zwischen 2 impulsen, sodass ich die (sagen wir mal 1,14 sek) jeweils auf die volle stunde hochrechnen kann?

Ich bräuchte mal so einen denkanstoß ;)

Danke schonmal

Micha
 
Da müsstest du wohl schon einen eigenen Baustein erstellen der als eine Art "Stoppuhr" agiert. Ich kenn jetzt da gerade keine andere möglichkeit. Ich weiss (inzwischen) dass man bei CoDeSys bei Strukturiertem Text eine Time-Funktion vom System aus hat. Damit kann man die Zeit auf 1ms gneau abfragen. Wenn es so eine Funktion bei dir auch gibt ist die Lösung relativ einfach.

Bei einer steigenden Flanke am Impulseingang wird der Wert der Time-Funktion in eine Variable geschrieben. Beim zweiten Impuls wird die Zeit der Time-Funktion mit der Zeit der Variable verglichen (Zeit von Time - Zeit von Variable). Das Ergebnis wird abgespeichert. Danach wird die Zeit der Time-Funktion in die bereits verwendete Variable geschrieben, man macht sozusagen einen Reset. Und das wiederholt sich halt bei jeder positiven Flanke am Impuls-Eingang.

Vielleicht kannst du damit was anfangen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja so eine Time-funktion habe ich auch. und genau an das habe ich eben noch gedacht. ;)
Dann würde ich um auf den Stundenwert zu kommen einfach so vorgehen:

t := tnew - told; /*Zeit neu - Zeit alt*/
f := 3600 / t; /*Wieviele Impulse würden in eine Stunde passen?*/
VperHour := f * VperImp; /*Volumen pro Stunde ausrechnen*/

Aber wo muss ich mit der mittelwertberechnung hin? oder brauche ich die nicht mehr da ich ja ein vorggebenes Volumen pro Impuls habe?
 
Die Mittelwertberechnung wäre trotzdem noch nötig da du ja von deinem einen Wert hochrechnest. Kleine Änderungen in deinem Aktualwert wirken sich durch das hochrechnen viel stärker auf deinen Stundenwert aus. Deshalb würde ich dir empfehlen die Durchschnittsberechnung trotdem zu machen, nur damit du einen stabileren Wert erhälst.

Ich werd mir jetzt wahrscheinlich noch n bisschen den Kopf darüber zerbrechen wie man diese Mittelwertberechnung denn am einfachsten macht...


EDIT:
Ok, hab ne Idee. Du definierst 10 Variablen. Diese 10 Variablen werden immer nacheinander zugewiesen. Und zwar hast du einen Counter der bei jeder Erfassung eines Aktualwertes um 1 hochzählt bis er 10 erreicht hat. Dann wird er wieder auf 0 gesetzt, wodurch er beim nächsten erhöhen des Counters ja wieder bei 1 anfängt. Dann nutzt du "CASE" um bei dem jeweiligen Zählerstand den Wert der richtigen Variable zuzuordnen. Nun rechnest du von all diesen Variablen den Durchschnitt aus, wobei ich dir empfehlen würde beim ersten Start der Anlage die Variablen auf den zu erwarteten Wert zu setzen. Nun hast du einen schön stabilen Wert. der sich wahrscheinlich nur im wenig ändern wird, je nach dem wie gut eure Durchflussregelung für die Gaszufuhr ist.
 
Zuletzt bearbeitet:
Hallo,
für deine Messung gibt es 2 Varianten :
1. du misst die Zeit zwischen 2 Impulsen - das kann aber bei sehr kleinen Zeitwerten und einer hohen SPS-Zykluszeit schnell zu unliebsamen Verfälschungen führen.
2. du misst eine feste Zeit (z.B. 1 Sek.) und zählst die Impulse in der Zeit - das kann aber bei sehr kleinen Impulszahlen schnell zu unliebsamen Verfälschungen führen.

Den Mittelwert kannst du dir auch so bilden :
Code:
oldWert := (10 * oldWert + Neuwert) / 11 ;
- die Ringspeicher-Variante von Jan geht natürlich auch - ist nur etwas aufwändiger.

Den Zähler würde ich bei hohen Impulszahlen (Verwendung einer Zählerkarte) nicht nach jeder Messung wieder löschen sondern lieber die Differenz LastCnt-aktCnt bilden.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
*FACEPALM*

Larry, deine Lösung ist super. Warum bin ich nicht drauf gekommen. Ich bin eh meistens der der alles komplizierter macht als es eigentlich ist. xD
 
So ich habe mal was Programmiert.
Nur habe ich immo das Problem, das ich den Zeitwert noch nicht so berechnen kann wie ich will... Mit TIME oder DT will der noch net so recht...
ST-Block.PNG
 
Hallo,
leider kann ich dir gerade nicht so ganz folgen - liegt vielleicht aber auch daran, dass an deinem Codeschnipsel noch ein bißchen was fehlt.
Welche Variable ist was ? DateAndTime (also DT) und Time kann man nicht direkt verrechnen - du mußt dir aus der DT erstmal die TimeOfDay-(TOD)Komponente extrahieren. Wo passiert das wie ?

Gruß
Larry
 
Hallo,
Danke erstmal für die anregungen!
Ich habe es jetzt ein bisschen so probiert, aber es funktioniert nicht so wie ich will.

code.PNG

Ich kann aber auch nicht online gucken warum es nicht läuft. Dies unterstützt B&R im Aprol-System leider nicht in ST.
Ich hoffe mal einfach das ich nicht nur zu dösig bin... ;)

Micha
 
Hallo,

ist das 'imp' Signal ein Flankenmerker? Falls nicht solltest Du dafür einen nehmen. Falls nämlich der 'Impuls' über mehrere SPS Zyklen anliegen sollte würde der UnitCount bei jedem Zyklus erhöht werden.

Ansonsten solltest Du auch beschreiben was nicht so funktioniert wie Du es willst.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK das habe ich noch nich gemacht.
Das problem der Funktion liegt im moment darin das signale zwar reingehen, aber es kommt nichts Raus! die werte bleiben bei 0.000000

den Mittelwert habe ich schon rausgenommen als evtl. Störquelle
 
Zurück
Oben