BYTE in DATE schrieben

emilio20

Level-1
Beiträge
835
Reaktionspunkte
20
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich habe einen JAHR, Monat und einen Tag im Format BYTE

wie bekomme ich diesen in SCL in eine in Format DATE?

aZEIT:DATE;

Wenn ic mir einen ZEIT: ARAAY[0..7] of BYTE anlege und die Bytes an die ensprechende stelle schreibe kann ich nicht das

aZEIT:=ZEIT; ???
 
Ich denke, in SCL wäre der AT-Befehl die richtige Wahl, damit kann man eine Sicht auf eine Variable anlegen. Sie dir mal in der Step7-Hilfe von SCl den AT-Befehl an. Kannst auch hier im Forum nach "AT" suchen, aber nicht mit dem AT aus Codesy verwechseln, das ist etwas anderes.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja das habe ich aber ich bekomme ich BYTE nicht in die aDATE

Code:
FUNCTION OSTERN : DATE
TITLE = 'OSTERN'

VAR_INPUT
  year : INT;
END_VAR


VAR_TEMP
    // temporäre Variablen 
    a,b,c,d,e,f,g,h,i,k,l,m,n,o,x:INT;
    
    
    aDATE:DT;
    cDATE : DATE ;
        
           SZP AT aDATE:
       STRUCT 
        JAHR                          : BYTE;
        MONAT                         : BYTE;
        TAG                           : BYTE;
        STUNDE                        : BYTE;
        MINUTE                        : BYTE;
        SEKUNDE                       : BYTE;
        MS_MSD                        : BYTE;                          // MSD (most significant decade) von ms 
        MS_LSD                        : BYTE;
       END_STRUCT;
 END_VAR
 
 BEGIN


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;

SZP.JAHR:=INT_TO_BYTE (year);
SZP.MONAT:=INT_TO_BYTE (n);
SZP.TAG:=INT_TO_BYTE (o);


cDATE :=DT_DATE(IN :=aDATE);  
 
ostern :=cDATE;

               
 END_FUNCTION
 
Ja aber ich wollte doch das berechnete DATUM haben in DATE.
Wie bekomme ich jetzt die einselnen Byte' s von JAHR MONAT und TAG in ein DATE format ?
 
cDATE :=DT_DATE(IN :=aDATE);:confused:

Geht es um das Übersetzen des Codes oder um die Funktion an sich?

Das Programm passt so nicht du musst bevor Du damit rechnest die Werte von BCD nach INT Wandeln und beim zurückschreiben von INT nach BCD.

Gruss Daniel
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei mir geht es nicht. Übersetzen geht, bekomme aber kein DATUM geliefert für OSTERN 2013
Hast du den CODE übersetzt und es ging ?

Bekomme am Ausgang OSTERN kein ergenbis
 
Ne der Code ist vom Ergebnis her falsch. Aber lässt sich Problemlos in SCL übersetzen.
Geht es um die Funktion oder das übersetzen an sich das kam aus der Fragestellung POST#1 nicht eindeutig hervor?
 
cDATE :=DT_DATE(IN :=aDATE);:confused:

Geht es um das Übersetzen des Codes oder um die Funktion an sich?

Das Programm passt so nicht du musst bevor Du damit rechnest die Werte von BCD nach INT Wandeln und beim zurückschreiben von INT nach BCD.

Gruss Daniel

Hab ich bereits geschrieben an was es liegt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es geht um den CODE.

Mein Problem ist das ich die errechneten Werte in das Format DATE schreiben will.

Ich schreibe die BYTE year,n,o in die BYTE der AT Sicht aDATE, wie bekomme ich jetzt diese Werte in die aDATE Format DT .



Code:
SZP.JAHR:=INT_TO_BYTE (year);
SZP.MONAT:=INT_TO_BYTE (n);
SZP.TAG:=INT_TO_BYTE (o);

cDATE :=DT_DATE(IN :=aDATE);

ostern :=cDATE;
 
Zuletzt bearbeitet:
Code:
SZP.JAHR := WORD_TO_BYTE(INT_TO_BCD(year));
SZP.MONAT := WORD_TO_BYTE(INT_TO_BCD(n));
SZP.TAG := WORD_TO_BYTE(INT_TO_BCD(o));

Praktisch so. Oben musst Du das zum rechnen auch noch Wandeln.
 
Ich verwenden doch zum rechnen schon einen INT als eingangswert. Warum muss dieser umgewandelt werden?

Hab mal ein Bild gemacht das Datum wird richtig berechnet kommt aber nicht in der Datei an
 

Anhänge

  • ostern1.JPG
    ostern1.JPG
    62,4 KB · Aufrufe: 20
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Da DATE_AND_TIME BCD kodiert ist. 13 für das Jahr ist da nicht gleich 13 als INT sondern 19 als INT, daher muss es vorher gewandelt werden.

Gruss Daniel
 
Ich möchte doch das Ergebnis OSTER =D#2013-3-31

Warum muss ich da 2000 abziehen ?

Wenn man im Programm daten aus der AT sicht ändern stehen diese doch nicht automatisch in der ausgangsdatei oder ?

Ich glaube das Problemm ist, das ich die geänderten daten nicht erhalte da fehlt sowas wie aDATE := SZP.
 
Zurück
Oben