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

Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 30 von 30

Thema: BYTE in DATE schrieben

  1. #21
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Doch passt schon.

    Nur kann der Status von DATE_AND_TIME nicht beobachtet werden. (S7 halt)
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

  2. #22
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    Ja habe auch eine Variable in Panel da kommt nur 01.01.1990 an ? da stimmt irgend etwas noch nicht ? Ich versuche noch ein bischen mein glück

  3. #23
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard

    Wie gesagt es passt das einzige was verkehrt ist ist das Jahr 2013 - 2000 und dann wandeln in BCD.
    Der Rest scheint ja zu passen.

    Gruss Daniel
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

  4. #24
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    Und es geht Super
    aber warum muss mann 2000 abziehen ? das verstehe ich nicht ganz

  5. #25
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard

    aus der Onlinehilfe (F1):

    Code:
    Möglicher Wertebereich
    BCD-Code
    Jahr
    1990 - 1999 2000 - 2089
    90 - 99 00 - 89
    Monat
    1 - 12
    01 - 12
    Tag
    1 - 31
    01 - 31
    Stunde
    00 - 23
    00 - 23
    Minute
    00 - 59
    00 - 59
    Sekunde
    00 - 59
    00 - 59
    Millisekunde
    0 - 999
    000 - 999
    Wochentag
    Sonntag - Samstag
    1 - 7
    Byte Inhalt Beispiel
    0
    Jahr B#16#93
    1
    Monat B#16#12
    2
    Tag B#16#25
    3
    Stunde B#16#08
    4
    Minute B#16#12
    5
    Sekunde B#16#34
    6
    Die beiden höchstwertigen Ziffern von MSEC B#16#56
    7 (4MSB)
    Die niederwertige Ziffer von MSEC B#16#7_
    7 (4LSB)
    Wochentag 1 = Sonntag 2 = Montag ... 7 = Samstag B#16#_5
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

  6. #26
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    Vielen Dank dalbi du hast mir wieder mal sehr geholfen bei meinen Problem.

  7. #27
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    Hallo habe noch ein weiters Problem
    Wie bekomme ich aus der Aktuellen Zeit die Jahr 2013?
    Code:
     
     // Aktuelle Systemzeit
    TEMP_INT := READ_CLK(CDT := AKT_DT);
    AKT_TIME :=DT_DATE(IN :=AKT_DT);
    
    year:=BCD_TO_INT (BYTE_TO_WORD (AT_AKT_DT.JAHR));
    Bekomme nur das Ergebnis 13 . Benötige aber 2013.

    Habe es jetzt so gelöst
    year:=BCD_TO_INT (BYTE_TO_WORD (AT_AKT_DT.JAHR))+2000;
    Geändert von emilio20 (07.01.2013 um 20:22 Uhr)

  8. #28
    Registriert seit
    17.10.2009
    Beiträge
    37
    Danke
    4
    Erhielt 11 Danke für 11 Beiträge

    Standard

    Was Du da vor hast, daß sieht mir so nach Feiertagsberechnung aus.
    Da ich das auch schon hinter mir hab, mal ein paar Tips:

    Ich habe mir zwar auch zuerst die Gaußsche Osterformel gesucht und sogar in Pascal gefunden, so daß
    man mit wenigen Änderungen schon den fertigen SCL Code hat.
    Dann bin ich aber hier im Forum auf die oscat-Bibliothek aufmerksam gemacht worden. (www.oscat.de)
    Dort gibt es bereits die fertige Funktion.
    Auch viele weitere Funktionen für Datum und Zeit findet man dort. Diese gehen weit über den Funktionsumfang der Siemens Bibliothek hinaus.
    Die einzelnen Bytes aus "Date And Time" zu zerlegen bzw. wieder zusammen zu setzen geht natürlich auch.
    Wenn Du das als Übungsobjekt machst, ist das o.k.
    Falls Du Dir aber Arbeit ersparen willst, kannst Du ja mal dort schauen.

    m.f.g

  9. #29
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    Hallo ich kenne ich OSCAT Bibliothek. mich hat aber gestört das ich 14 weiter Bausteine benötige die ich erst mal von der Bezeichnung FC... ändern muss da ich viele dieser Adressen schon verwenden.

    Habe mich dann entschieden mir einen einfachen Bausten nur für Feiertage zu schreiben nicht so Variabel wie HOLIDAY von OSCAT.

  10. #30
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo habe meinen Feiertag Baustein fertig stelle ihn mal ein fals jeman Interesse hat.

    Code:
    (****************************************************************************************************************************************************)
    
    TYPE UDT_FEIERTAG
        STRUCT
        NAME_TAG       :STRING[30];
        DATUM          :DATE;
    
        END_STRUCT
    END_TYPE
    
    
    (*****************************************************************************************************************************************************)
    
    
    (*****************************************************************************************************************************************************)
    DATA_BLOCK DB_FEIERTAGE
    (*****************************************************************************************************************************************************)
    
        STRUCT
              
        AKT_TIME                    :DATE;
        YEAR_SPEICHER               :INT;
        NAME_FEIERTAG_AKTIV         :STRING[30]; 
        FEIERTAG_AKTIV              :BOOL; 
        FEIERTAGE: ARRAY[0..13] OF UDT_FEIERTAG ;
                        
     
        END_STRUCT
    BEGIN
    
       FEIERTAGE[0].NAME_TAG :='Neujahr'                    ;
       FEIERTAGE[0].DATUM    :=D#2012-01-01                 ;
       FEIERTAGE[1].NAME_TAG :='Drei_Koenige'               ;
       FEIERTAGE[1].DATUM    :=D#2012-01-06                 ;
       FEIERTAGE[2].NAME_TAG :='Karfreitag'                 ;
       FEIERTAGE[3].NAME_TAG :='Ostern'                     ;
       FEIERTAGE[4].NAME_TAG :='Ostermontag'                ;
       FEIERTAGE[5].NAME_TAG :='Maifeiertag'                ;
       FEIERTAGE[5].DATUM    :=D#2012-05-01                 ;
       FEIERTAGE[6].NAME_TAG :='Christi Himmelfahrt'        ;
       FEIERTAGE[7].NAME_TAG :='Pfingstmontag'              ;
       FEIERTAGE[8].NAME_TAG :='Fronleichnam'               ;
       FEIERTAGE[9].NAME_TAG :='Mariae Himmelfahrt'         ;
       FEIERTAGE[9].DATUM    :=D#2012-08-15                 ;
       FEIERTAGE[10].NAME_TAG:='Tag der deutschen Einheit'  ;
       FEIERTAGE[10].DATUM    :=D#2012-10-03                ;
       FEIERTAGE[11].NAME_TAG:='Allerheiligen'              ;
       FEIERTAGE[11].DATUM    :=D#2012-11-01                ;
       FEIERTAGE[12].NAME_TAG:='Erster Weihnachtsfeiertag'  ;
       FEIERTAGE[12].DATUM    :=D#2012-12-26                ;
       FEIERTAGE[13].NAME_TAG:='Zweiter Weihnachtsfeiertag' ;
       FEIERTAGE[13].DATUM    :=D#2012-12-27                ;
    
     END_DATA_BLOCK
    
    (*****************************************************************************************************************************************************)
    FUNCTION BER_FEIERTAGE:VOID
    TITLE = 'Berechnung Feiertage'
    (*****************************************************************************************************************************************************)
    
    
    VAR_TEMP
        // temporäre Variablen 
        a,b,c,d,e,f,g,h,i,k,l,m,n,o,x:INT;
        
        TEMP_INT                      :INT;
        AKT_DT                        :DT;
        DT_TIME                       :DT;
        i2                            :INT;
        i3                            :INT;
        T                             :TOD;
        YEAR                          :INT;
    
            
        AT_AKT_DT AT AKT_DT:
                  STRUCT 
                    JAHR             : BYTE;
                    MONAT            : BYTE;
                    TAG              : BYTE;
                    STUNDE           : BYTE;
                    MINUTE           : BYTE;
                    SEKUNDE          : BYTE;
                    MS_MSD           : BYTE;                          
                    MS_LSD           : BYTE;
                 END_STRUCT;
                
        AT_DT_TIME AT DT_TIME:
                 STRUCT 
                    JAHR             : BYTE;
                    MONAT            : BYTE;
                    TAG              : BYTE;
                    STUNDE           : BYTE;
                    MINUTE           : BYTE;
                    SEKUNDE          : BYTE;
                    MS_MSD           : BYTE;                          
                    MS_LSD           : BYTE;
                 END_STRUCT;
     END_VAR
     
     BEGIN
     
    
     // Aktuelle Systemzeit
    TEMP_INT := READ_CLK(CDT := AKT_DT);                                                            // Systemzeit auslesen in Format DT
    DB_FEIERTAGE.AKT_TIME :=DT_DATE(IN :=AKT_DT);                                                   // Datum in Variable schreiben
    
    year:=BCD_TO_INT (BYTE_TO_WORD (AT_AKT_DT.JAHR))+2000;                                          // Jahreszahl (z.b 12 + 2000 = 2012) in Variable schrieben 
    // Feiertage nur bei Jahreswechsel berechnen   
    IF year <> DB_FEIERTAGE.YEAR_SPEICHER THEN
            
    // Jahreszahl bei Feiertage anpassen 
    
        FOR i2 := 0 TO 13 BY 1 DO
            
           DT_TIME:=D_TOD_DT(IN1 :=DB_FEIERTAGE.FEIERTAGE[i2].DATUM,IN2 := T);                      // Feiertag aus DB auslesen und in DT umwandeln T=Platzhalter
           AT_DT_TIME.JAHR  := WORD_TO_BYTE(INT_TO_BCD(year-2000));                                 // Jahreszahl in AT Sicht Jahr schreiben
           DB_FEIERTAGE.FEIERTAGE[i2].DATUM  :=DT_DATE(IN :=DT_TIME);                               // Festes Datum mit geänderter Jahreszahl in DB Speichern
    
            ;
        END_FOR;
    
                
    // Berechnung des Osterdatum nach der Gaußsche Osterformel mit berücksichtigung der Schaltjahre 
     
    a := year MOD 19;
    b := year / 100;
    c := year MOD 100;
    d := b / 4;
    e := b MOD 4;
    f := (b + 8) / 25;
    g := (b - f + 1) / 3;
    h := (19 * a + b - d -g + 15) MOD 30;
    i := C / 4;
    k := c MOD 4;
    l := (32 + 2*e + 2*i - h - k) MOD 7;
    m := (a + 11 * h + 22 * l) / 451;
    x := h + l - 7 * m + 114;
    n := X / 31;
    o := x MOD 31 + 1;
    
    AT_DT_TIME.MONAT := WORD_TO_BYTE(INT_TO_BCD(n));                                                                   // Oster Monat in AT Sicht MONAT schreiben
    AT_DT_TIME.TAG   := WORD_TO_BYTE(INT_TO_BCD(o));                                                                   // Oster Tag in AZ Sicht TAG schreiben
    
    //Bewegliche Feiertage Berechnen in abhängigkeit vom Osterdatum
    
    DB_FEIERTAGE.FEIERTAGE[3].DATUM:=DT_DATE(IN :=DT_TIME);                                                             // Ostern
    DB_FEIERTAGE.FEIERTAGE[2].DATUM             := DINT_TO_DATE(DATE_TO_DINT(DB_FEIERTAGE.FEIERTAGE[3].DATUM) -2 );     // Kafreitag
    DB_FEIERTAGE.FEIERTAGE[4].DATUM             := DINT_TO_DATE(DATE_TO_DINT(DB_FEIERTAGE.FEIERTAGE[3].DATUM) +1 );     // Ostermontag
    DB_FEIERTAGE.FEIERTAGE[6].DATUM             := DINT_TO_DATE(DATE_TO_DINT(DB_FEIERTAGE.FEIERTAGE[3].DATUM) +39);     // Christi_Himmelfahrt 
    DB_FEIERTAGE.FEIERTAGE[7].DATUM             := DINT_TO_DATE(DATE_TO_DINT(DB_FEIERTAGE.FEIERTAGE[3].DATUM) +50);     // Pfingstmontag
    DB_FEIERTAGE.FEIERTAGE[8].DATUM             := DINT_TO_DATE(DATE_TO_DINT(DB_FEIERTAGE.FEIERTAGE[3].DATUM) +60);     // Fronleichnam
    
    
    DB_FEIERTAGE.year_SPEICHER:=year;                                                                                   // Aktuelles Jahr in Speicher JAHR
    END_IF;
    
    
     // Verkleich Aktuelle Datum mit Fereitag Datum, Wenn Aktiv schreiben Name Feiertag in Variable  
    
        FOR i3 := 0 TO 13 BY 1 DO
            DB_FEIERTAGE.FEIERTAG_AKTIV:=DB_FEIERTAGE.AKT_TIME=DB_FEIERTAGE.FEIERTAGE[i3].DATUM;
            IF DB_FEIERTAGE.FEIERTAG_AKTIV=TRUE THEN
               DB_FEIERTAGE.NAME_FEIERTAG_AKTIV:=DB_FEIERTAGE.FEIERTAGE[i3].NAME_TAG;  
               EXIT;
            ELSE
               DB_FEIERTAGE.NAME_FEIERTAG_AKTIV:='';    
            END_IF;   
                   
        END_FOR;
    
    
    
                  
     END_FUNCTION

Ähnliche Themen

  1. Wie kann man Hi-Byte Low-Byte spiegeln?
    Von Klärmolch im Forum Simatic
    Antworten: 23
    Letzter Beitrag: 11.12.2010, 20:58
  2. Umwandeln von INT nach Byte u Byte + n
    Von Gerold im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 07.04.2009, 10:07
  3. libnodave integer in sps schrieben
    Von david.ka im Forum Hochsprachen - OPC
    Antworten: 2
    Letzter Beitrag: 10.09.2008, 09:27
  4. Antworten: 4
    Letzter Beitrag: 08.07.2008, 08:52
  5. Antworten: 4
    Letzter Beitrag: 23.09.2007, 21:25

Lesezeichen

Berechtigungen

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