Date nach DINT Format

PhilippL

Level-1
Beiträge
250
Reaktionspunkte
28
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

erstmal möchte ich meine Dank an die Macher und kompetenten Leute dieses Forums los werden!

Ich hab ein kleines Problem mit einer Anlage...
Ich lese mittels SFC20 das aktuelle Datum und Uhrzeit der CPU aus
mit dem FC6 aus der stdlib wandle ich date_and_time nach date da ich nur das Datum benötige.
Ich möchte nun folgendes aus meiner Variablen Datum vom Format date erzeugen.

z.B. 20070905 als double integer

leider stehe ich hierbei voll auf dem Schlauch und weiß nicht mehr weiter

Vielleicht kann mir ja einer von euch weiterhelfen?

Vielen Dank schon einmal

Grüße

Philipp
 
Hier mal ein kurzes Programmbeispiel:

Code:
// FC100 : Datum
 
// Systemzeit (DATE_AND_TIME) - Alle Angaben im BCD-Format
// Byte 0  -  Jahr          -  0 bis 99
// Byte 1  -  Monat         -  1 bis 12
// Byte 2  -  Tag           -  1 bis 31
// Byte 3  -  Stunde        -  0 bis 23
// Byte 4  -  Minute        -  0 bis 59
// Byte 5  -  Sekunde       -  0 bis 59
// Byte 6  -  Millisekunde  -  0 bis 999
// Byte 7  -  Wochentag     -  1 Sonntag bis 7 Samstag 
 
 
// Systemzeit (DATE_AND_TIME)
 
      CALL  "READ_CLK"
       RET_VAL:=#SFC1_RET_VAR
       CDT    :=#SYSTEMZEIT
 
 
// Systemzeit (DATE_AND_TIME) => DATUM (DINT)
 
      L     P##SYSTEMZEIT               // Systemzeit
      LAR1  
 
      L     B [AR1,P#2.0]               // Systemzeit Byte 2  
      BTD   
      T     #TAG                        // Tag
 
      L     B [AR1,P#1.0]               // Systemzeit Byte 1
      BTD   
      L     L#100
      *D    
      T     #MONAT                      // Monat
 
      L     B [AR1,P#0.0]               // Systemzeit Byte 0
      BTD   
      L     L#2000
      +D    
      L     L#10000
      *D    
      T     #JAHR                       // Jahr
 
      L     #TAG                        // Tag
      L     #MONAT                      // Monat
      +D    
      L     #JAHR                       // Jahr
      +D    
      T     #DATUM                      // Datum

Gruß Kai
 

Anhänge

  • OB1.pdf
    3,3 KB · Aufrufe: 29
  • FC100.pdf
    4,1 KB · Aufrufe: 26
  • Datum.zip
    527,7 KB · Aufrufe: 14
Es geht auch noch etwas kürzer: :)

Code:
// FC120 : Datum
 
// Systemzeit (DATE_AND_TIME) (Alle Angaben im BCD-Format)
 
// Byte 0  -  Jahr           -  0 bis 99
// Byte 1  -  Monat          -  1 bis 12
// Byte 2  -  Tag            -  1 bis 31
// Byte 3  -  Stunden        -  0 bis 23
// Byte 4  -  Minuten        -  0 bis 59
// Byte 5  -  Sekunden       -  0 bis 59
// Byte 6  -  Millisekunden  -  0 bis 999
// Byte 7  -  Wochentag      -  1 Sonntag bis 7 Samstag 
 
 
// Systemzeit (DATE_AND_TIME)
 
      CALL  "READ_CLK"
       RET_VAL:=#SFC1_RET_VAR
       CDT    :=#SYSTEMZEIT
 
 
// Systemzeit (DATE_AND_TIME) => DATUM (DINT)
 
      L     P##SYSTEMZEIT               // Systemzeit
      LAR1  
 
      L     D [AR1,P#0.0]               // Systemzeit Byte 0 - 3  
      SRD   8
      BTD   
      L     L#20000000
      +D    
      T     #DATUM                      // Datum

Gruß Kai
 

Anhänge

  • OB1.pdf
    3,5 KB · Aufrufe: 14
  • FC100.pdf
    4,2 KB · Aufrufe: 13
  • FC120.pdf
    4,1 KB · Aufrufe: 19
  • Datum.zip
    528,8 KB · Aufrufe: 16
Hallo Kai,

ich hab schon den SFC20 gemeint.
Aufruf im OB1
Ich werd mir deine Beispiele mal anschauen.
Erstmal vielen Dank!

Code:
 CALL  "BLKMOV"
 SRCBLK :=#OB1_DATE_TIME
 RET_VAL:=#retval
 DSTBLK :="Arbeits_DB".ZEIT
 
 CALL  "DT to Date"
 IN     :="Arbeits_DB".ZEIT
 RET_VAL:="Arbeits_DB".DATUM

Gruß Philipp
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Philipp,

alles klar, jetzt habe ich verstanden, was Du mit dem SFC20 BLKMOV machst.

Das Problem bei Deinem Lösungsansatz mit dem SFC20 BLKMOV und dem FC6 DT_DATE ist jedoch, dass man die damit erzeugte Variable vom Datentyp DATE hier nicht wirklich gut gebrauchen kann.

DATE

Eine Variable mit dem Datentyp DATE wird in einem Wort als vorzeichenlose Festpunktzahl gespeichert. Der Inhalt der Variablen entspricht der Anzahl der Tage seit dem 01.01.1990. Die Darstellung enthält das Jahr, den Monat und den Tag, jeweils getrennt durch einen Bindestrich.

DATE#1990-01-01 (= HEX 0000)

DATE#2168-12-31 (= HEX FF62)

Ich bin daher einen anderen Lösungsweg gegangen und habe mit dem SFC1 READ_CLK die Systemzeit als Variable vom Datentyp DATE_AND_TIME ausgelesen. Das in dieser Variablen enthaltene Datum kann dann sehr einfach in eine Variable vom Datentyp DINT umgewandelt werden.

Gruß Kai
 
Zuletzt bearbeitet:
Zurück
Oben