BYTE in DATE schrieben

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
 
aus der Onlinehilfe (F1):

Code:
[TABLE]
[TR]
[TD][/TD]
[TD][CENTER]Möglicher Wertebereich[/CENTER]
[/TD]
[TD][CENTER]BCD-Code[/CENTER]
[/TD]
[/TR]
[TR]
[TD="width: 109, bgcolor: #d9d9d9"]Jahr[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]1990 - 1999
2000 - 2089[/CENTER]
[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]90 - 99 
00 - 89 [/CENTER]
[/TD]
[/TR]
[TR]
[TD="width: 109, bgcolor: #d9d9d9"]Monat[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]1 - 12 [/CENTER]
[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]01 - 12 [/CENTER]
[/TD]
[/TR]
[TR]
[TD="width: 109, bgcolor: #d9d9d9"]Tag[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]1 - 31 [/CENTER]
[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]01 - 31 [/CENTER]
[/TD]
[/TR]
[TR]
[TD="width: 109, bgcolor: #d9d9d9"]Stunde[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]00 - 23[/CENTER]
[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]00 - 23 [/CENTER]
[/TD]
[/TR]
[TR]
[TD="width: 109, bgcolor: #d9d9d9"]Minute[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]00 - 59[/CENTER]
[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]00 - 59 [/CENTER]
[/TD]
[/TR]
[TR]
[TD="width: 109, bgcolor: #d9d9d9"]Sekunde[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]00 - 59[/CENTER]
[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]00 - 59 [/CENTER]
[/TD]
[/TR]
[TR]
[TD="width: 109, bgcolor: #d9d9d9"]Millisekunde[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]0 - 999[/CENTER]
[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]000 - 999 [/CENTER]
[/TD]
[/TR]
[TR]
[TD="width: 109, bgcolor: #d9d9d9"]Wochentag[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]Sonntag - Samstag[/CENTER]
[/TD]
[TD="width: 188, bgcolor: #d9d9d9"][CENTER]1 - 7 [/CENTER]
[/TD]
[/TR]
[/TABLE]

[TABLE]
[TR]
[TD="width: 52, bgcolor: #d9d9d9"]Byte
[/TD]
[TD="width: 283, bgcolor: #d9d9d9"]Inhalt
[/TD]
[TD="width: 94, bgcolor: #d9d9d9"]Beispiel
[/TD]
[/TR]
[TR]
[TD="width: 52, bgcolor: #d9d9d9"][CENTER]0 [/CENTER][/TD]
[TD="width: 283, bgcolor: #d9d9d9"]Jahr
[/TD]
[TD="width: 94, bgcolor: #d9d9d9"]B#16#93
[/TD]
[/TR]
[TR]
[TD="width: 52, bgcolor: #d9d9d9"][CENTER]1 [/CENTER][/TD]
[TD="width: 283, bgcolor: #d9d9d9"]Monat
[/TD]
[TD="width: 94, bgcolor: #d9d9d9"]B#16#12
[/TD]
[/TR]
[TR]
[TD="width: 52, bgcolor: #d9d9d9"][CENTER]2 [/CENTER][/TD]
[TD="width: 283, bgcolor: #d9d9d9"]Tag
[/TD]
[TD="width: 94, bgcolor: #d9d9d9"]B#16#25
[/TD]
[/TR]
[TR]
[TD="width: 52, bgcolor: #d9d9d9"][CENTER]3 [/CENTER][/TD]
[TD="width: 283, bgcolor: #d9d9d9"]Stunde
[/TD]
[TD="width: 94, bgcolor: #d9d9d9"]B#16#08
[/TD]
[/TR]
[TR]
[TD="width: 52, bgcolor: #d9d9d9"][CENTER]4 [/CENTER][/TD]
[TD="width: 283, bgcolor: #d9d9d9"]Minute
[/TD]
[TD="width: 94, bgcolor: #d9d9d9"]B#16#12
[/TD]
[/TR]
[TR]
[TD="width: 52, bgcolor: #d9d9d9"][CENTER]5 [/CENTER][/TD]
[TD="width: 283, bgcolor: #d9d9d9"]Sekunde
[/TD]
[TD="width: 94, bgcolor: #d9d9d9"]B#16#34
[/TD]
[/TR]
[TR]
[TD="width: 52, bgcolor: #d9d9d9"][CENTER]6 [/CENTER][/TD]
[TD="width: 283, bgcolor: #d9d9d9"]Die beiden höchstwertigen Ziffern von MSEC
[/TD]
[TD="width: 94, bgcolor: #d9d9d9"]B#16#56
[/TD]
[/TR]
[TR]
[TD="width: 52, bgcolor: #d9d9d9"][CENTER]7
(4MSB) [/CENTER][/TD]
[TD="width: 283, bgcolor: #d9d9d9"]Die niederwertige Ziffer von MSEC
 
[/TD]
[TD="width: 94, bgcolor: #d9d9d9"]B#16#7_
[/TD]
[/TR]
[TR]
[TD="width: 52, bgcolor: #d9d9d9"][CENTER]7
(4LSB) [/CENTER][/TD]
[TD="width: 283, bgcolor: #d9d9d9"]Wochentag
1 = Sonntag
2 = Montag
...
7 = Samstag
[/TD]
[TD="width: 94, bgcolor: #d9d9d9"]B#16#_5
[/TD]
[/TR]
[/TABLE]
 
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;
 
Zuletzt bearbeitet:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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
 
Zurück
Oben