BYTE in DATE schrieben

emilio20

Well-known member
Beiträge
825
Punkte Reaktionen
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; ???
 

Ralle

Supermoderator
Teammitglied
Beiträge
14.627
Punkte Reaktionen
3.484
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.
 
OP
emilio20

emilio20

Well-known member
Beiträge
825
Punkte Reaktionen
20
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
 
OP
emilio20

emilio20

Well-known member
Beiträge
825
Punkte Reaktionen
20
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 ?
 

dalbi

Well-known member
Beiträge
1.364
Punkte Reaktionen
371
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:
OP
emilio20

emilio20

Well-known member
Beiträge
825
Punkte Reaktionen
20
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
 

dalbi

Well-known member
Beiträge
1.364
Punkte Reaktionen
371
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?
 

dalbi

Well-known member
Beiträge
1.364
Punkte Reaktionen
371
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.
 
OP
emilio20

emilio20

Well-known member
Beiträge
825
Punkte Reaktionen
20
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:

dalbi

Well-known member
Beiträge
1.364
Punkte Reaktionen
371
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.
 
OP
emilio20

emilio20

Well-known member
Beiträge
825
Punkte Reaktionen
20
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:

dalbi

Well-known member
Beiträge
1.364
Punkte Reaktionen
371
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
 

dalbi

Well-known member
Beiträge
1.364
Punkte Reaktionen
371
Ah. OK das Ergebnis passt doch schon. ;)

Also brauchst du vom Jahr nur noch die 2000 abziehen.
 
OP
emilio20

emilio20

Well-known member
Beiträge
825
Punkte Reaktionen
20
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.
 
Oben