TwinCAT3 StructuredText Verbrauch pro Stunde berechnen

Perold

Level-2
Beiträge
40
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Moin,

ich stehe in im Moment irgendwie auf dem Schlauch, bei einer Aufgabe, die eigentlich recht simpel erscheint. Und zwar habe ich einen zylindrischen Behälter auf dem ein Laser zur Füllstandsmessung installiert ist, der mir einen Wert in Meter liefert. Ist der Behälter randvoll erhalte ich einen Wert von 200, ist der Behälter leer erhalte ich einen Wert von 100.

In dem Behälter ist eine Flüssigkeit die mal mehr und mal weniger schnell abläuft. Nun möchte ich jede Minute den Abfluss pro Stunde berechnen.

Als erstes habe ich mir ein ARRAY erstellt.

Code:
letzte60Minuten : ARRAY[0..59] OF REAL;

Ich schreibe also den Messwert zu jeder vollen Minute in dieses Array.
Zur Verdeutlichung:
Um 14:00:00 wird index 0 des Arrays mit dem Messwert beschrieben
Um 14:01:00 wird index 1 des Arrays mit dem Messwert beschrieben
Um 14:02:00 wird index 3 des Arrays mit dem Messwert beschrieben
...
Um 14:59:00 wird index 59 des Arrays mit dem Messwert beschrieben
Um 15:00:00 wird index 0 des Arrays mit dem Messwert beschrieben (also wieder überschrieben)

Kann ich nun einfach den Verbrauch pro Stunde berechnen, indem ich z.B. um 14:15:00 (also den Messwert von Arrayelement 15) mit dem Messwert von dem darauffolgenden Arrayelement 16 (also dem was 59 Minuten vorher aufgezeichnet wurde) subtrahiere?

Das erscheint mir irgendwie falsch, da ich dann ja den Verbrauch pro 59 Minuten erhalten würde.
Ich vermute auch, dass mein ARRAY [0..59] zu klein gewählt ist.

Vielleicht hat jemand ja den richtigen Hinweis für mich und ich hoffe meine Bisherigen Überlegungen sind nicht allzu dösig ;).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also nehme ich den Wert von Minute n und subtrahiere Wert von Minute (n-1). Dann bilde ich die Summe dieser Differenzen pro Stunde.

Wenn der Messwert einer messtechnischen Schwankung unterliegt, bekomme ich dann durch diese Art der Berechnung eine Ungenauigkeit? Weil ich für die Berechnung der einzelnen Differenzen ja immer nur den Zeitraum von einer Minute betrachte?
 
Zuletzt bearbeitet:
Ich habe das ganze jetzt mal in Code gewandelt und bin zu folgendem Ergebnis gekommen, es sollte nun so sein wie blackpeat beschrieben hat.

Zeitdaten.bMinutenwechsel ist eine BOOL Variable, die TRUE liefert sobald sich die Minute wechselt.


Code:
IF Zeitdaten.bMinutenwechsel THEN[INDENT]vorherigeMinuteFuellstand := aktuelleMinuteFuellstand;
aktuelleMinuteFuellstand := EL3182_Ch1;
MinuteVerbrauch := vorherigeMinuteFuellstand - aktuelleMinuteFuellstand;
letzte60Minuten[Zeitdaten.fbUhrzeit.TIMESTR.wMinute] := MinuteVerbrauch;

FOR iSummenberechnung := 0 TO 59 DO[/INDENT]
[INDENT=2]VerbrauchproStunde := VerbrauchproStunde + letzte60Minuten[iSummenberechnung];[/INDENT]
[INDENT]END_FOR[/INDENT]
            
END_IF

Meine Bedenken mit der Ungenauigkeit haben sich eigentlich auch aufgelöst, da ich einen Denkfehler hatte. Die Messungenauigkeit sollte sich eigentlich nicht sonderlich auswirken.


Gibt es Anmerkungen?
 
Zuletzt bearbeitet:
Und zwar habe ich einen zylindrischen Behälter auf dem ein Laser zur Füllstandsmessung installiert ist, der mir einen Wert in Meter liefert. Ist der Behälter randvoll erhalte ich einen Wert von 200, ist der Behälter leer erhalte ich einen Wert von 100.
In dem Behälter ist eine Flüssigkeit die mal mehr und mal weniger schnell abläuft. Nun möchte ich jede Minute den Abfluss pro Stunde berechnen.
Allein über den Füllstand kannst Du die abgeflossene Menge nur feststellen, wenn nicht gleichzeitig eine unbekannte Menge Flüssigkeit nachgefüllt wird.
Entweder darf in keiner MessPeriode gleichzeitig Ablaufen und Nachfüllen stattfinden oder es muss die innerhalb einer MessPeriode nachgefüllte Menge bekannt sein bzw. gemessen werden.
Nur dann kannst Du die abgeflossene Menge berechnen.
So, das war der schwierige Teil.
Deine GewissensBisse beim "HochRechnen" von Verbrauch pro Minute auf Verbrauch pro Stunde kann ich nicht wirklich verstehen. Wichtig ist dabei doch nur, dass Du aus Deinen "nichts-sagenden" Ergebnissen nicht ernsthaft versuchst, für Dich wichtige Informationen auszurechnen!
Wenn Dir Dein Auto z.B. einen MomentanVerbrauch von n cl/km anzeigt, kannst Du daraus auch nicht berechnen, wie weit Du mit x l TankFüllung kommst. Denn es dürfte eher ungewöhnlich sein, dass Du kontinuierlich mit konstanter Geschwindigkeit bei gleichbleibender Steigung, gleichbleibendem StrassenBelag, gleichbleibenden WindVerhältnissen, gleichbleibendem Verbrauch der KlimaAnlage und der StromFresser u.s.w. den Rest der Strecke zurücklegen kannst.
Deine Bedenken bezüglich der Auswertung Deines Array mit 60 SpeicherPlätzen kann ich allerdings nachvollziehen. Nach Deinem Verfahren würdest Du tatsächlich den Wert für 59 (statt 60) Minuten erhalten. Den könntest Du zwar auf 60 Minuten hochrechen, musst Du aber nicht:
Wenn Du einen neuen Wert hast, den Du in ARRAY[x] abspeichern willst, lies zuerst den Inhalt von ARRAY[x], bilde die Differenz zum neuen Wert, und speicher den neuen Wert erst dann nach ARRAY[x]. Die Differenz, die Du berechnet hast, bezieht sich auf genau 1 h.

PS:
VerbrauchproStunde := VerbrauchproStunde + letzte60Minuten[iSummenberechnung];
ist allerdings "blödsinnig". :ROFLMAO:
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Heinileini,

die Problematik mit dem Befüllen ist mir bekannt und diese kann ich über einen Kontakt am Befüllrohr erkennen. Somit kann ich die Berechnung der abfließenden Menge beim Befüllvorgang pausieren.

Der Vergleich zum Spritverbrauch ist interessant. Allerdings kann ich meiner Meinung nach mit meinen Berechnungen schon etwas anfangen. Bei dem Behälter handelt es sich um die Rohstoffversorgung von Maschinen. Also sind mal mehr und mal weniger Maschinen an einen Behälter angeschlossen und jede Maschine hat auch einen unterschiedlichen Bedarf pro Stunde. Allerdings ist es so, dass sich die an einen Behälter angeschlossenen Maschinen hauptsächlich bei Schichtwechsel verändern, also 3 mal in 24 Std. Hinzu kommt noch, dass ein Behälter wenn er zu 100% gefüllt ist und viele Maschinen aus diesem gespeist werden für ca. 7 Tage den Bedarf deckt.

Wenn Du einen neuen Wert hast, den Du in ARRAY[x] abspeichern willst, lies zuerst den Inhalt von ARRAY[x], bilde die Differenz zum neuen Wert, und speicher den neuen Wert erst dann nach ARRAY[x]. Die Differenz, die Du berechnet hast, bezieht sich auf genau 1 h.
Ich habe deinen Vorschlag jetzt wie folgt umgesetzt und die Sache ist schon wesentlich übersichtlicher geworden:
Code:
//Minutenarray füllen und Verbrauch berechnen
IF Zeitdaten.bMinutenwechsel THEN[INDENT]Wertvor60min := letzte60Minuten[Zeitdaten.fbUhrzeit.TIMESTR.wMinute];
letzte60Minuten[Zeitdaten.fbUhrzeit.TIMESTR.wMinute] := EL3182_Ch1;
VerbrauchproStunde_meter := Wertvor60min - EL3182_Ch1;[/INDENT]
END_IF

PS:
VerbrauchproStunde := VerbrauchproStunde + letzte60Minuten[iSummenberechnung];
ist allerdings "blödsinnig". :ROFLMAO:

Darüber bin ich auch schon gestolpert. Aber erst nach ein paar Stunden nach PLC Start :p. Natürlich muss ich VerbrauchproStunde vorher gleich 0 setzen. Das hatte ich irgendwie übersehen ;)

Vielen Dank und besten Gruß aus dem Nachbarort SHS nach Oerlinghausen!
 
Zuletzt bearbeitet:
Natürlich muss ich VerbrauchproStunde vorher gleich 0 setzen.
Nein, Perold, das hatte ich gar nicht gemeint. Aber darüber muss man sich natürlich auch Gedanken machen.
Die Addition von VerbrauchsWertenProStunde hatte ich gemeint.
Wenn Du 1 Stunde lang einen Verbrauch von 1 l/h hast und in der folgenden Stunde ebenfalls 1 l/h, so beträgt der Verbrauch in den 2 Stunden ebenfalls 1 l/h.
Aber durch die SummenBildung errechnest Du 2 l/h. Das habe ich gemeint. Es verdoppelt sich nicht nur das Volumen, sondern auch die Zeit, durch die Du dividieren müsstest.
(V1 + V2 + V3) / (t1 + t2 + t3) ist etwas anderes als V1/t1 + V2/t2 + V3/t3.
Gruss nach "nebenan", Heinileini

PS und off topic:
Hast Du schon wahrgenommen, dass für den 2019-10-18 im RunkelKrug (Bielefeld) ein Treffen von SPS-Forums-Mitgliedern geplant ist?
 
Zurück
Oben