Tages,Vortages,Monats,Jahreszähler programmieren

Bosga

Level-1
Beiträge
21
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Halli Hallo,
ich bin gerade dabei eine Aufsummierung in Abhängigkeit von der Sys_CLK zu programmieren. (Aufsummierung eines Gewichtes)
Soweit auch alles gut, nur hab ich nun an der Stelle Monatswert das Problem das ich keine festen "Konstanten" wie 24h oder 60sek pro min habe...Es gibt ja Monate mit mehr oder wenige Taage.
Wenn ich nun z.B. den Monat 1 aufsummiere(alle 30 sek) muss ja der aufsummierte Wert wieder auf 0.0 gestellt werden, sobald die Sys_CLK einen neuen Monat meldet. --> Bsp: Monat 2. Dies auch bei Monat 3 usw..
Aber irgendwie hab ich im Moment eine Denkblockade und komm einfach nicht weiter.
Hier mal mein Code :ROFLMAO:


FUNCTION_BLOCK FB200 //Aufsummierung Tageswert ->Vortag Monatswert -> Jahreswert

VAR_INPUT
Bandwaage {S7_m_c:='true'} : REAL ;

END_VAR

VAR_IN_OUT
END_VAR

VAR_OUTPUT

Tageswert_Akt {S7_m_c:='true'} : REAL:=0.0;
Vortag {S7_m_c:='true'} : REAL:=0.0;
Monatswert {S7_m_c:='true'} : REAL:=0.0;
Jahreswert {S7_m_c:='true'} : REAL:=0.0;
TESTSek :INT;
TESTMin :INT;
TESTStun :INT;
TESTTag :INT;
TESTMon :INT;
TESTJahr :INT;
END_VAR


VAR
Sekunden : INT;
Minuten : INT;
Stunden : INT;
Tag : INT;
Monat : INT;
Jahr : INT;
Monatswert : REAL :=0.0;
S_Tageswert_Akt : REAL; //Summe Tageswert;
x : INT;
END_VAR


BEGIN
//----------------------------------------------Aus DB Uhrzeit und Datum auslesen-------------------------------------------------------------

Sekunden :=BYTE_TO_INT(WORD_TO_BLOCK_DB(1).DB[33]);
Minuten :=BYTE_TO_INT(WORD_TO_BLOCK_DB(1).DB[32]);
Stunden :=BYTE_TO_INT(WORD_TO_BLOCK_DB(1).DB[31]);
Tag :=BYTE_TO_INT(WORD_TO_BLOCK_DB(1).DB[30]);
Monat :=BYTE_TO_INT(WORD_TO_BLOCK_DB(1).DB[29]);
Jahr :=BYTE_TO_INT(WORD_TO_BLOCK_DB(1).DB[28]);

TESTSek := Sekunden;
TESTMin := Minuten;
TESTStun :=Stunden;
TESTTag :=Tag;
TestMon :=Monat;
TESTJahr :=Jahr;

//-------------------------------------------------Atueller Tageswert aufsummieren-------------------------------------------------------------


IF Stunden = 16#0000 AND Sekunden = 16#0000 THEN //Neuer Tag : 0 h 0 min
S_Tageswert_Akt := 0.0;

ELSE
IF Sekunden = 16#0030 THEN

S_Tageswert_Akt := S_Tageswert_Akt + Bandwaage;
Tageswert_Akt := S_Tageswert_Akt;


END_IF;
END_IF;


//--------------------------------------------------------Tageswert Vortag---------------------------------------------------------------------


IF Stunden = 16#0023 AND Sekunden = 16#0059 THEN
Vortag := S_Tageswert_Akt;
END_IF;


//------------------------------------------------------------Monatswert-----------------------------------------------------------------------
??????????????????????????????????
IF Monat = 16#0001 THEN
IF Sekunden = 16#0030 THEN
Monatswert := Monatswert + Bandwaage;
END_IF
END_IF;
???????????????????????????????????
 
hallo,

ich denke das ist so zu umständlich.

Warum liest du nicht DATE&TIME aus?
Da hast du Bytes für Tag, Monat und Jahr.

Diese Bytes kannst du auf Änderung überwachen, und dann deine Aktionen ausführen.

Was für ne CPU benutzt du denn?
Evtl. kannst du das auch über Uhrzeitalarme machen.
Das ist das allereinfachste.

Gruß Micha
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
danke für deine Antwort ;)

Aber schau mal oben, genau das mach ich mit den Bytes.
Die Bytes sind auf einem DB und von dort aus greife ich dann zu und wandle in INT um . BYTE_TO_INT.DB(X)....
(Int wegen Vergleichsfunktion.Geht ja mit Byte nicht so einfach)
Das funktioniert auch alles super.Bekomme alle Werte.Sekunde,Minute usw...
Nur irgendwie komm ich nicht weiter wie ich Monatsweise aufsummiere und danach bei jedem neuem Monatsanfang den Wert neu auf 0.0 setze..

LG
Bosga
 
Willst du am Ende des Jahres auch die 12 Monatswerte?

Ansonsten in etwa so:
IF Monat <> Monat_Last_Cycle THEN
Monatswert:= 0.0 ;
END_IF;

Monat_Last_Cycle := Monat ;

Damit wird bei einem Monatswechsel dein Zähler entsprechend 0 ...

Mfg
Manuel
 
so mein ich das auch.

Wenn im Byte Monat z.B. 3 steht (März) dann ändert sich dieser Wert bis zum 1.April NICHT.

Du brauchst keine Tage zählen.

Genauso beim Tag usw.
Du musst nur die Änderungen der 3 Bytes überwachen, und dann deine Berechnungen ausführen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Anmerkung meinerseits noch:
Da du deine Zähler mit Real rechnest, halte ich das bei einem Tageszähler,
spätestens aber Monats / Jahreszähler für relativ ungenau,
das solltest du evtl. noch bedenken und u.U. auf DINT umsteigen, da hast du dann immerhin 10 nutzbare Zahlen, und nicht nur 7 wie bei Real ...

Mfg
Manuel
 
in der freien OSCAT libraray findest du verbrauchszähler und verbrauchsstatistik (meter und meter_stat) die genau das machen was du suchst.
die lib ist auch open source schaus dir dort einfach mal an
 
Zurück
Oben