Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 7 von 7

Thema: Tages,Vortages,Monats,Jahreszähler programmieren

  1. #1
    Registriert seit
    09.04.2008
    Beiträge
    21
    Danke
    5
    Erhielt 3 Danke für 1 Beitrag

    Standard


    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


    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;
    ???????????????????????????????????
    Zitieren Zitieren Tages,Vortages,Monats,Jahreszähler programmieren  

  2. #2
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    669
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    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
    "arbeite klug, nicht hart" - deutsches Sprichwort

  3. #3
    Bosga ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    09.04.2008
    Beiträge
    21
    Danke
    5
    Erhielt 3 Danke für 1 Beitrag

    Standard

    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

  4. #4
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.735
    Danke
    321
    Erhielt 1.523 Danke für 1.283 Beiträge

    Standard

    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
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  5. #5
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    669
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    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...
    "arbeite klug, nicht hart" - deutsches Sprichwort

  6. #6
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.735
    Danke
    321
    Erhielt 1.523 Danke für 1.283 Beiträge

    Standard

    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
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  7. #7
    Registriert seit
    29.08.2006
    Beiträge
    195
    Danke
    0
    Erhielt 35 Danke für 21 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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
    OSCAT
    Open Source Community for Automation Technolgy
    www.oscat.de

Ähnliche Themen

  1. letzten Tag des Monats ermitteln
    Von roadrunner im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 16.08.2011, 12:44
  2. Programmieren FM 350-2
    Von soginet im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 23.06.2010, 17:09
  3. S7- 200 SBR wie FB Programmieren?
    Von godi im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 31.07.2008, 14:39
  4. DELTALOGIC 4-Monats-Kalender
    Von Gerhard Bäurle im Forum Werbung und Produktneuheiten
    Antworten: 0
    Letzter Beitrag: 02.12.2006, 23:38
  5. OBs in S7-300 programmieren
    Von Syntaxfehler im Forum Programmierstrategien
    Antworten: 6
    Letzter Beitrag: 21.09.2006, 19:21

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •