FUP-Beispiele Zähler, Tagesdurchfluss und 30-Tage-Liste
Hallo chefren_new,
bevor Du Dein letztes Problem mit dem Ablegen der Tagesdurchflüsse in die 30-Tage-Liste
löst, solltest Du Dir noch einmal Gedanken über Dein Programmdesign machen.
Designfehler später ausmerzen macht einige Arbeit.
Du hast einen maximalen Durchfluss von 50 Liter/Minute, also mußt Du damit rechnen,
daß der Tagesdurchfluss maximal 72.000 Liter betragen kann. Das passt nun nicht mehr
in einen INT. Also nimm gleich
DINT. Deswegen wird Dein Programm NICHT komplizierter.
Den Zählerstand täglich um Mitternacht auf 0 zurücksetzen halte ich für keine gute Idee
(die echte Wasseruhr stellt sich auch nicht täglich zurück). Laß doch den Zählerstand
weiterlaufen und merke Dir nur den Zählerstand um Mitternacht. Der Tagesdurchfluss ist
dann einfach die Differenz zwischen dem Zählerstand Heute_Mitternacht und dem gestern
um Mitternacht gemerkten Zählerstand_Gestern.
Mit dem weiterlaufenden Zähler kannst Du besser kontrollieren, ob der Zähler in der CPU
langfristig mit der Wasseruhr synchron läuft und nicht doch Zählimpulse verloren gehen.
Beispiel für einen Zähler, der bei 1.000.000.000 auf 0 springt
Code:
M124.0 E124.0 Zähleingang
+-----+ +--------+ M124.0 Flankenmerker
| P | | ADD_DI | DB10.DBD0 Zähler (DINT)
E124.0-| |---|EN |
+-----+ | |
DB10.DBD0-|IN1 OUT|-DB10.DBD0 +--------+
| | | MOD_DI |
L#1-|IN2 ENO|-----------|EN |
+--------+ | |
DB10.DBD0-|IN1 OUT|-DB10.DBD0
| |
L#1000000000-|IN2 ENO|-
+--------+
Den Zähler und die 30-Tage-Liste würde ich NICHT in einem Instanz-DB speichern (STAT),
sondern in einem ganz normalen Global-DB, den ich später nicht mehr verändere.
Wenn Du später mal in Deinem FB2 Variablen hinzufügst, dann muß der Instanz-DB neu erzeugt
und in die CPU geladen werden. Die Werte im Zähler und in der 30-Tage-Liste sind dann weg
(alle wieder 0).
Verstehe ich Dich richtig, daß Du in WCCflexible Deine 30-Tage-Durchfluss-Liste etwa so
anzeigen willst?
Code:
vor 30 Tagen (Datum - 30 ) 99999 l
... ...
vor 3 Tagen (Datum - 3 ) 99999 l
Vorgestern (Datum - 2 ) 99999 l
Gestern (Datum - 1 ) 99999 l
Heute seit 0:00 Uhr (Datum_heute) 99999 l
Dann wäre es doch sinnvoll, wenn alle Tageswerte um Mitternacht automatisch zum Tag davor
weiterrücken. Und das vereinfacht Dein Programm zum Ablegens des Tagesdurchflusses in die
30-Tage-Liste ganz erheblich, weil Du dann um Mitternacht den Tagesdurchfluss des gerade
abgelaufenen Tages
immer in die Variable für den Tagesdurchfluss_Gestern speicherst,
nachdem Du vorher die anderen Tagesdurchflüsse zum jeweiligen Vortag umgespeichert hast.
Falls Du in WCCflexible in der Liste der Tagesdurchflüsse auch das zugehörige Datum mit
anzeigen willst, dann überlege, was für Dich einfacher ist: die Datumswerte in WCCflexible
berechnen oder auch für das Datum eine 30-Tage-Liste in der CPU anlegen und in WCCflexible
nur anzeigen. Die 30-Tage-Datum-Liste in der CPU wäre genauso aufzubauen und zu verwalten
wie die 30-Tage-Durchfluss-Liste, nur daß diese Liste eben ein Datum enthält statt eines
Liter-Wertes.
Tip:
Mach in das Liter-Ausgabefeld in WCCflexible 3 Stellen von hinten ein Komma rein, dann hast
Du die gleiche Anzeige wie auf der Wasseruhr, nämlich
m³.
Berechnung des Tagesdurchflusses seit Mitternacht (beachtet Wrap 1.000.000.000->0)
Code:
+--------+
| SUB_DI |
...-|EN |
| |
DB10.DBD0-|IN1 OUT|-#Liter_heute
| |
#Zaehlerstand_ | | +---+
Gestern-|IN2 ENO|---------| & |
+--------+ | | +--------+
+----+ | | | ADD_DI |
| <0 |--| |--|EN |
+----+ +---+ | |
| |
#Liter_heute-|IN1 OUT|-#Liter_heute
| |
L#1000000000-|IN2 ENO|-
+--------+
Um Mitternacht alle Tagesdurchflüsse 1 Tag zurück umspeichern, der älteste Wert verschwindet.
Danach den heute gezählten Tagesdurchfluss in den letzten = neuesten Wert speichern.
Zuletzt den aktuellen Zählerstand als Zählerstand_Gestern merken.
Code:
+---+ +--------+
| & | | MOVE |
#Mitternacht-| |-+--------------|EN OUT|-#Liter_1 // ältester Wert
+---+ | | | // vor 29 -> nun 30 Tagen
^ | #Liter_2-|IN ENO|-
| | +--------+
| | +--------+
(BOOL, nur | | MOVE |
1 Zyklus lang) +--------------|EN OUT|-#Liter_2
| | |
| #Liter_3-|IN ENO|-
| +--------+
| +--------+
| | MOVE |
+--------------|EN OUT|-#Liter_3
| | |
| #Liter_4-|IN ENO|-
| +--------+
|
... ... //noch Liter_5 bis Liter_29 einfügen
|
| +--------+
| | MOVE |
+--------------|EN OUT|-#Liter_29
| | |
| #Liter_30-|IN ENO|-
| +--------+
| +--------+
| | MOVE |
+--------------|EN OUT|-#Liter_30 // neuester Wert
| | | // "gestern"
| #Liter_heute-|IN ENO|-
| +--------+
| +--------+
| | MOVE |
+--------------|EN OUT|-#Zaehlerstand_Gestern
| |
DB10.DBD0-|IN ENO|-
+--------+
@ Paul
Ich hoffe, Du nutzt den schönen Tag für was "besseres" als das SPS-Forum.
Deshalb bin ich hier doch noch einmal eingesprungen.
Gruß
PN/DP