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

Page 2 of 2 FirstFirst 12
Results 11 to 15 of 15

Thread: Tagesnummer berechnen?

  1. #11
    Join Date
    02.02.2006
    Location
    Hessen
    Posts
    428
    Danke
    16
    Erhielt 28 Danke für 22 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Quote Originally Posted by volker View Post

    für sps anwendungen sollte das aber meist reichen
    Hallo,
    wer jetzt schon weiß, daß seine S7 das Jahr 2090 nicht im Museum erlebt, sollte sich Gedanken um das ausfallende Schaltjahr im Jahr 2100 (auch 2200 und 2300) machen. Die heutige Generation Simatic-Steuerungen interpretiert Jahreszahlen über 89 als 1990 bis 1999. Ich habe allerdings nicht vor, solange zu programmieren und mache mir deswegen keinen Kopf.
    mfG Werner
    Hoch lebe die Suchfunktion!
    Reply With Quote Reply With Quote S7-Datum nur bis 2089  

  2. #12
    Join Date
    24.02.2011
    Posts
    5
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Default

    Hallo Leute, ich habe jetzt eine Lösung gemacht, in AWL, basiert auf dem Code von oben und beinhaltet gleich die Berechnung des Schaltjahres:

    Code:
      IN  0.0
        Tag         Int        0.0
        Monat       Int        2.0
        Jahr        Int        4.0       2-4 stellig
      OUT  0.0
      IN_OUT  0.0
      TEMP  0.0
        TEMP_INT    Int        0.0
        Schaltjahr  Bool       2.0
        MOD4        Bool       2.1       True wenn REST = 0
        MOD400      Bool       2.2       True wenn REST = 0
        MOD100      Bool       2.3       True wenn REST = 0
      RETURN  0.0
        RET_VAL     Int        6.0
    
    ------------------------------------------
    
    Beschreibung:
    03.03.2011
                                  D. Kaserer
     
    Beschreibung: In dieser Funktion wird der Tag des aktuellen Jahres berechnet.
                  z.B. 01.02. ist der 32. Tag im Jahr
                  Dabei wird kontrolliert ob es sich um ein Schaltjahr handelt.
     
    Definition Schaltjahr:
    * Ist die Jahreszahl durch 4 teilbar, aber nicht durch 100, dann ist es ein 
      Schaltjahr mit 366 Tagen. Beispiele: 1980, 1972, 1720.
    * Ist die Jahreszahl durch 100 teilbar, aber nicht durch 400, dann ist das Jahr 
      ein gewöhnliches Gemeinjahr und hat nur 365 Tage, z. B. in den Jahren 1700, 
      1800 und 1900 oder ferner 2100.
    * Ist die Jahreszahl durch 400 teilbar, ist das Jahr ein Schaltjahr. Die Jahre 
      1600 und 2000 waren – in Übereinstimmung mit der Julianischen Schaltregel – 
      Schaltjahre zu 366 Tagen.
     
    Anschlüsse:
    IN:
           Tag             INT      aktueller Tag im Monat
           Monat           INT      aktuelles Monat
           Jahr            INT      aktuelles Jahr zur Schaltjahrberechng
     
    OUT:
           RET_VAL         INT      gibt den Tag im Jahr zurück
    
    ------------------------------------------
    
    Netzwerk: 1      Schaltjahr berechnen
    //*** Ist das Jahr ein Schaltjahr?
          L     #Jahr        //Jahreszahl
          L     4 //jedes 4. Jahr
          MOD    //Divisionsrest ermitteln
          L     0 //wenn kein Rest,
          ==I   
          =     #MOD4        //durch 4 teilbar
    
          L     #Jahr        //Jahreszahl
          L     400          //duch 400
          MOD   
          L     0 //Rest 0
          ==I   
          =     #MOD400      //durch 400 teilbar
    
          L     #Jahr        //Jahreszahl
          L     100          //duch 100
          MOD   
          L     0 //Rest 0
          ==I   
          =     #MOD100      //durch 100 teilbar
    
          O     #MOD4        //Berechnung siehe Beschreibung
          UN    #MOD100
          O     #MOD400
          =     #Schaltjahr
    
    Netzwerk: 2      Tage zählen
    //*** Tage voller Monate seit Jahresbeginn
          L     #Monat
          DEC   1          // 0..11
          SPL   ERR        // >11
          SPA   JAN
          SPA   FEB
          SPA   MAE
          SPA   APR
          SPA   MAI
          SPA   JUN
          SPA   JUL
          SPA   AUG
          SPA   SEP
          SPA   OKT
          SPA   NOV
          SPA   DEZ
    
    //*** Verlassen mit Fehler
    ERR:  L     0
          T     #RET_VAL
          CLR   
          SAVE  
          BEA  
     
    //*** Tage der abgeschlossenen Monate
    //    (Tage vom Vormonat)
    JAN:  L     0
          SPA   TAGE
    FEB:  L     31
          SPA   TAGE
    MAE:  L     59         // ohne Schaltjahr
          SPA   TAGE
    APR:  L     90
          SPA   TAGE
    MAI:  L     120
          SPA   TAGE
    JUN:  L     151
          SPA   TAGE
    JUL:  L     181
          SPA   TAGE
    AUG:  L     212
          SPA   TAGE
    SEP:  L     243
          SPA   TAGE
    OKT:  L     273
          SPA   TAGE
    NOV:  L     304
          SPA   TAGE
    DEZ:  L     334
          SPA   TAGE
    
    //*** verstrichene Tage vom aktuellen Monat dazu
    TAGE: L     #Tag
          +I    
          T     #TEMP_INT
    
    Netzwerk: 3      Korrektur und Ausgabe
    //*** Korrektur, wenn SCHALTJAHR und Monat > Februar
          U     #Schaltjahr
          U(    
          L     #Monat
          L     2
          >I    
          )     
          L     #TEMP_INT
          SPBN  M001
          L     1
          +I    
    
    //*** Ausgabe
    M001: T     #RET_VAL
    bei Fehlern bitte Informieren

    lg dkaserer
    Reply With Quote Reply With Quote Lösung AWL  

  3. #13
    Join Date
    11.07.2004
    Posts
    1,739
    Danke
    10
    Erhielt 213 Danke für 183 Beiträge

    Default

    Ich habe allerdings nicht vor, solange zu programmieren und mache mir deswegen keinen Kopf.
    So haben damals die Verursacher vom Y2K-Problem auch gedacht.

  4. #14
    Join Date
    09.09.2010
    Posts
    78
    Danke
    14
    Erhielt 8 Danke für 8 Beiträge

    Default

    Da ich heute vor einem ähnlichen Problem stand und dkaserer den Thread vor gar nicht allzu langer Zeit mal ausgebuddelt hat,
    wollte ich noch schnell meine Lösung für die Findung des Monatsletzten hier posten, da das sonst nur über Weckalarme
    möglich ist und ich in meinem Anwendungsfall auf keinen Fall die Produktion stoppen kann.


    Code:
    
    Beschreibung:
    TITLE:           Berechnung Monatsletzter
    DATE:            08.09.2011
    AUTHOR:          EliteGurke
    
    Beschreibung: In dieser Funktion wird der Monatsletzte berechnet.
    z.B. Februar -> 28, es sei denn es handelt sich um ein Schaltjahr -> 29
    
    Definition Schaltjahr:
    *  Ist die Jahreszahl durch 4 teilbar, aber nicht durch 100, dann ist es  ein Schaltjahr 
       mit 366 Tagen. Beispiele: 1980, 1972, 1720.
    * Ist die  Jahreszahl durch 100 teilbar, aber nicht durch 400, dann ist das Jahr 
      ein gewöhnliches Gemeinjahr und hat nur 365 Tage, z. B. in den Jahren  1700, 1800 und 1900 oder ferner 2100.
    * Ist die Jahreszahl durch 400  teilbar, ist das Jahr ein Schaltjahr. Die Jahre 1600 und 2000 waren – 
      in  Übereinstimmung mit der Julianischen Schaltregel – Schaltjahre zu 366  Tagen.
    
    Credits to Onkel Dagobert und D. Kaserer
    
    ------------------------------------------
    
    Variablen:  
    
    IN
    
    INOUT
    
    TEMP
    DateAndTime    0.0        DATE_AND_TIME        
    RET_VAL        8.0        RET_VAL          ReturnValue von SFC1
    MOD4          10.0        Bool            True wenn REST = 0
    MOD400        10.1        Bool            True wenn REST = 0
    MOD100        10.2        Bool            True wenn REST = 0
    Monat         12.0        INT                    
    Jahr          14.0        INT                    
    
    OUT
    Schaltjahr     0.0        Bool
    Monatsletzter  2.0        Int 
    
    ------------------------------------------
    
    Netzwerk: 1 --- Monat und Jahr auslesen
    CALL SFC1
        RET_VAL    :=    #RET_VAL
        CDT        :=    #DateAndTime
    NOP 0
    
    Netzwerk: 2 --- BCD zu INT wandeln
    L LB 0          //Jahr
    BTI
    T #Jahr
    
    L LB 1          //Monat
    BTI
    T #Monat
    
    Netzwerk: 3 --- Schaltjahr berechnen
    //<-- Ist das Jahr ein Schaltjahr?
    L #Jahr         //Jahreszahl
    L 4             //jedes 4. Jahr
    MOD             //Divisionsrest ermitteln
    L 0             //wenn kein Rest,
    ==I
    = #MOD4         //durch 4 teilbar
    
    L #Jahr         //Jahreszahl
    L 400           //durch 400
    MOD
    L 0             //Rest 0
    ==I
    = #MOD400       //durch 400 teilbar
    
    L #Jahr         //Jahreszahl
    L 100           //durch 100
    MOD
    L 0             //Rest 0
    ==I
    = #MOD100       //durch 100 teilbar
    
    O #MOD4         //Berechnung siehe Beschreibung
    UN #MOD100
    O #MOD400
    = #Schaltjahr
    
    Netzwerk: 4 --- Tage zählen
    //<-- Tage voller Monate seit Jahresbeginn
    L #Monat
    DEC 1           // 0..11
    SPL ERR         // >11
    SPA JAN
    SPA FEB
    SPA MAE
    SPA APR
    SPA MAI
    SPA JUN
    SPA JUL
    SPA AUG
    SPA SEP
    SPA OKT
    SPA NOV
    SPA DEZ
    
    //<-- Verlassen mit Fehler
    ERR: L 0
    T #Monatsletzter
    CLR
    SAVE
    BEA
    
    //<-- Tage der abgeschlossenen Monate
    JAN: L 31
    SPA TAGE
    FEB: L 28         //ohne Schaltjahr
    SPA TAGE
    MAE: L 31
    SPA TAGE
    APR: L 30
    SPA TAGE
    MAI: L 31
    SPA TAGE
    JUN: L 30
    SPA TAGE
    JUL: L 31
    SPA TAGE
    AUG: L 31
    SPA TAGE
    SEP: L 30
    SPA TAGE
    OKT: L 31
    SPA TAGE
    NOV: L 30
    SPA TAGE
    DEZ: L 31
    SPA TAGE
    
    TAGE: T #Monatsletzter
    
    Netzwerk: 5 --- Korrektur und Ausgabe
    //<-- Korrektur, wenn Schaltjahr und Monat == Februar
    U #Schaltjahr
    U(
    L #Monat
    L 2
    ==I
    )
    L #Monatsletzter
    SPBN M001
    L 1
    +I
    
    //<-- Ausgabe
    M001: T #Monatsletzter
    
    SET
    SAVE
    


    Damit ist es mir nun möglich auch ohne Weckalarme am letzten des Monats um 23:59:59 noch
    mit dem alten Datum meine Statistiken wegzuspeichern.

    Code muss allerdings noch getestet werden, habe den schnell in N++ zusammen gefriemelt.


    mfg EliteGurke
    Last edited by EliteGurke; 08.09.2011 at 02:43.
    Reply With Quote Reply With Quote Monatsletzter in AWL  

  5. #15
    Join Date
    11.04.2010
    Posts
    44
    Danke
    1
    Erhielt 5 Danke für 5 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Habe heute versucht den Code aus Post #3 von Dagobert im TIA zu benutzen, nachdem ich ihn auf TIA schreibweiße umgebaut habe läuft er zwar, gibt mir jedoch wenn überhaupt nur den richtigen Monat aus.

    Da ich SCL jedoch nur sehr Oberflächlich kenne habe ich keinerlei Idee was das Problem sein könnte bzw wie es zu lösen ist. Oder gibt es hierzu andere Beispiel-Codes?


    Schönen Feiertag und schon mal DANKE für die Hilfe!

Similar Threads

  1. Wärmedurchgang berechnen
    By stylophonics in forum Stammtisch
    Replies: 21
    Last Post: 19.07.2016, 15:12
  2. Drehmomentbegrenzung berechnen
    By Pico1184 in forum Simatic
    Replies: 19
    Last Post: 05.09.2011, 11:19
  3. 2^x berechnen
    By TimoK in forum Simatic
    Replies: 4
    Last Post: 23.02.2010, 09:31
  4. Checksumme berechnen?
    By mpexx in forum Simatic
    Replies: 6
    Last Post: 30.01.2008, 07:52
  5. Kalenderwoche berechnen
    By Simatics in forum Simatic
    Replies: 1
    Last Post: 06.05.2007, 21:59

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •