# DATE_AND_TIME in String konvertieren



## toto45 (17 Januar 2011)

Hallo,

bezüglich eines SMS Versand mit CP341 und MD720-3 möchte ich die Uhrzeit und Datum mitversenden.
Wie kann ich den Datentyp DATE_AND_TIME in ein String konvertieren. Oder welche Möglcihkeiten gibt es die Uhrzeit und Datum in ein String zu speichern?

Vielen Dank schonmal


----------



## Nordischerjung (17 Januar 2011)

Kennst du Oscat.Lib ? Dort gibt es den Baustein DT_TO_STRF



> DT_TO_STRF konvertiert einen DATETIME Wert in eine formatierte Zeichenkette.


----------



## erick_wick (17 Januar 2011)

Hallo,
müsste mit den stdlibs/iec fc5 und fc2 ebenfalls funktionieren.

mfg Erick


----------



## StefanK (17 Januar 2011)

*Oder so.......*


```
FUNCTION_BLOCK  FB202
TITLE = 'DT_To_STR'
// 
VERSION : '1.1'
AUTHOR  : SKSE
NAME    : DT2STR
FAMILY  : Lib10

VAR_INPUT
  DtValue : DATE_AND_TIME ;
    atDT AT DtValue: STRUCT
        Jahr    : BYTE ;
        Monat   : BYTE ;
        Tag     : BYTE ;
        Stunde  : BYTE ;
        Minute  : BYTE ;
        Sekunde : BYTE ;
        MSD     : BYTE ;
        LSDWT   : BYTE ;
    END_STRUCT;
END_VAR
VAR_OUTPUT
    DtStr : STRING[8] ;
END_VAR
VAR
    tJahr  : STRING[5] ;
    tMonat : STRING[3] ;
    tTag   : STRING[3] ;
END_VAR

BEGIN

    (* Variablen initialisieren *)
    DtStr := '00000000';
    (* Jahr wandeln *)
    tJahr := DELETE (IN:= I_STRNG(2000 + BCD_TO_INT(atDT.Jahr)), L:= 1, P:= 1);
    (* Monat wandeln *)
    IF BCD_TO_INT(atDT.Monat) < 10 THEN
        tMonat := CONCAT(IN1 := '0' , IN2 := DELETE(IN:= I_STRNG(BCD_TO_INT(atDT.Monat)), L:= 1, P:= 1));
    ELSE ;
        tMonat := DELETE(IN:= I_STRNG(BCD_TO_INT(atDT.Monat)), L:= 1, P:= 1);
    END_IF ;
    (* Tag wandeln *)
    IF BCD_TO_INT(atDT.Tag) < 10 THEN
        tTag := CONCAT(IN1 := '0' , IN2 := DELETE (IN:= I_STRNG(BCD_TO_INT(atDT.Tag)), L:= 1, P:= 1));
    ELSE ;
        tTag := DELETE (IN:= I_STRNG(BCD_TO_INT(atDT.Tag)), L:= 1, P:= 1);
    END_IF ;
    (* Zeichenketten zusammenführen, Ergebnis ausgeben *)
    DtStr   := CONCAT(IN1 := tJahr , IN2 := CONCAT(IN1 := tMonat , IN2 := tTag));

END_FUNCTION_BLOCK
```

Gruß
Stefan


----------



## toto45 (17 Januar 2011)

Hallo Stefan K

muss ich bei deiner Lösung nur DtValue als DATE_AND_TIME übergeben und kann
Bin da absoluter Neuling. Wir bei dieser Lösung nur dieser FB202 benötigt?
Wie kann ich dann auf die Uhrzeit und die Tage zugreifen?

Vielen Dank schon mal!!


----------



## StefanK (17 Januar 2011)

*nur Datum...*

Hallo,
es muss nur ein Date_and_Time übergeben werden.
Der FB benutzt außerdem die Bausteine: CONCAT, I_STRNG, DELETE aus der S7 Standard Library. Diese werden aber deinem S7-Projekt hinzugefügt, wenn du die SCL-Quelle übersetzt.
Allerdings ist hier die Uhrzeit nicht enthalten. Die ist aber in der Stuktur:

```
atDT AT DtValue: STRUCT
        Jahr    : BYTE ;
        Monat   : BYTE ;
        Tag     : BYTE ;
        Stunde  : BYTE ;
        Minute  : BYTE ;
        Sekunde : BYTE ;
        MSD     : BYTE ;
        LSDWT   : BYTE ;
    END_STRUCT;
```
enthalten. Du mußt eigentlich den Baustein lediglich um die Uhrzeit nach dem gleichen Schema, wie Monat oder Tag erweitern und dabei nicht vergessen, die String-Länge der Ausgangsvariablen anzupassen.

Der FB stammt aus einer Druckeransteuerung. Für deine Anforderungen müsstest du evtl. noch das Format anpassen, so wie der Baustein oben steht, gibt er das Datum im folgenden Format aus:

'20110117'

für heute.

Wenn du bis heute-abend warten kannst, kann ich den Baustein auch nach deinen Anforderungen anpassen. Oder du nutzt den Baustein aus der Oscat-Lib (siehe #2), dort kann man die Ausgabe formatieren.

Gruß
Stefan


----------



## toto45 (17 Januar 2011)

Hallo

das mit dem Oscat habe ich probiert aber irgendwas mache ich da falsch. Wäre super wenn du denn FB so anpassen könntest.

Ich danke dir schon mal.

Bei mir sollte der String folgendermaßen aussehen: 17-01-2010 15:22 Uhr


----------



## StefanK (17 Januar 2011)

*ok*

Hallo toto45,
das sollte kein Problem sein. könnte jetzt allerdings ein bisschen dauern, da ich zwischendurch noch ein bisschen Geld verdienen muss 

Die Oscat-Lib solltest du dir dennoch anschauen, da ist sehr viel nützliches drin.

Gruß


----------



## StefanK (17 Januar 2011)

*fertig*

So, habs noch mal schnell dazwischengeschoben:


```
FUNCTION_BLOCK  FB203
TITLE = 'DaT_To_STR'
// 
// Uses: CONCAT, I_STRNG, DELETE from the S7 Standard Library
// 
VERSION : '1.0'
AUTHOR  : SKSE
NAME    : DaT2STR
FAMILY  : Lib10

VAR_INPUT
  DtValue : DATE_AND_TIME ;
    atDT AT DtValue: STRUCT
        Jahr    : BYTE ;
        Monat   : BYTE ;
        Tag     : BYTE ;
        Stunde  : BYTE ;
        Minute  : BYTE ;
        Sekunde : BYTE ;
        MSD     : BYTE ;
        LSDWT   : BYTE ;
    END_STRUCT;
END_VAR
VAR_OUTPUT
    DtStr : STRING[20] ;
END_VAR
VAR
    tJahr  : STRING[5] ;
    tMonat : STRING[3] ;
    tTag   : STRING[3] ;
    tStd   : STRING[3] ;
    tMin   : STRING[3] ;
END_VAR

BEGIN

    (* Variablen initialisieren *)
    DtStr := '0000-00-00 00:00 Uhr';
    (* Jahr wandeln *)
    tJahr := DELETE (IN:= I_STRNG(2000 + BCD_TO_INT(atDT.Jahr)), L:= 1, P:= 1);
    (* Monat wandeln *)
    IF BCD_TO_INT(atDT.Monat) < 10 THEN
        tMonat := CONCAT(IN1 := '0' , IN2 := DELETE(IN:= I_STRNG(BCD_TO_INT(atDT.Monat)), L:= 1, P:= 1));
    ELSE ;
        tMonat := DELETE(IN:= I_STRNG(BCD_TO_INT(atDT.Monat)), L:= 1, P:= 1);
    END_IF ;
    (* Tag wandeln *)
    IF BCD_TO_INT(atDT.Tag) < 10 THEN
        tTag := CONCAT(IN1 := '0' , IN2 := DELETE (IN:= I_STRNG(BCD_TO_INT(atDT.Tag)), L:= 1, P:= 1));
    ELSE ;
        tTag := DELETE (IN:= I_STRNG(BCD_TO_INT(atDT.Tag)), L:= 1, P:= 1);
    END_IF ;
    (* Stunden wandeln *)
    IF BCD_TO_INT(atDT.Stunde) < 10 THEN
        tStd := CONCAT(IN1 := '0' , IN2 := DELETE (IN:= I_STRNG(BCD_TO_INT(atDT.Stunde)), L:= 1, P:= 1));
    ELSE ;
        tStd := DELETE (IN:= I_STRNG(BCD_TO_INT(atDT.Stunde)), L:= 1, P:= 1);
    END_IF ;    
    (* Minuten wandeln *)
    IF BCD_TO_INT(atDT.Minute) < 10 THEN
        tMin := CONCAT(IN1 := '0' , IN2 := DELETE (IN:= I_STRNG(BCD_TO_INT(atDT.Minute)), L:= 1, P:= 1));
    ELSE ;
        tMin := DELETE (IN:= I_STRNG(BCD_TO_INT(atDT.Minute)), L:= 1, P:= 1);
    END_IF ;    
    (* Zeichenketten zusammenführen, Ergebnis ausgeben *)
    DtStr   := CONCAT(IN1 := tJahr  , IN2 := '-');
    DtStr   := CONCAT(IN1 := DtStr  , IN2 := tMonat);
    DtStr   := CONCAT(IN1 := DtStr  , IN2 := '-');
    DtStr   := CONCAT(IN1 := DtStr  , IN2 := tTag);
    DtStr   := CONCAT(IN1 := DtStr  , IN2 := ' ');
    DtStr   := CONCAT(IN1 := DtStr  , IN2 := tStd);
    DtStr   := CONCAT(IN1 := DtStr  , IN2 := ':');
    DtStr   := CONCAT(IN1 := DtStr  , IN2 := tMin);
    DtStr   := CONCAT(IN1 := DtStr  , IN2 := ' Uhr');

END_FUNCTION_BLOCK
```

Ist eigentlich nicht kompliziert. 
Den Baustein aus der Oscat-Lib habe ich mir mal kurz angeschaut, da musst du neben der eigentlichen Quelle noch eine (meiner Meinung nach große) Anzahl zusätzlicher Quellen (Funktionen & Datentypen) in dein Projekt kopieren. Welche, steht im Header der SCL-Quelle.

Gruß
Stefan


----------



## Kai (17 Januar 2011)

Nachfolgend ein Programmbeispiel für das Auslesen der Systemzeit der SPS und das Abspeichern der Systemzeit in einem STRING:


```
FUNCTION_BLOCK FB 100
TITLE =Systemzeit
//16
AUTHOR : Kai
FAMILY : SPSForum
NAME : '41995'
VERSION : 1.0
 
VAR_OUTPUT
  OUT_Systemzeit : STRING  [16 ] := '00-00-2000 00:00'; 
END_VAR
VAR_TEMP
  TEMP_DBO_Register : WORD ; 
  TEMP_AR1_Register : DWORD ; 
  TEMP_Systemzeit : DATE_AND_TIME ; 
  TEMP_RETVAL : INT ; 
END_VAR
BEGIN
NETWORK
TITLE =Register sichern
 
      L     DBNO; // DBO-Register
      T     #TEMP_DBO_Register; 
 
      TAR1  ; // AR1-Register
      T     #TEMP_AR1_Register;
 
NETWORK
TITLE =Systemzeit (DATE_AND_TIME)
//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
//   
 
      CALL SFC    1 (
           RET_VAL                  := #TEMP_RETVAL,
           CDT                      := #TEMP_Systemzeit);
      NOP   0; 
 
NETWORK
TITLE =Systemzeit (DATE_AND_TIME) -> Systemzeit (STRING)
//ASCII-Zeichensatz
//
//DEZ 48 = HEX 30 = CHAR '0'
//DEZ 49 = HEX 31 = CHAR '1'
//DEZ 50 = HEX 32 = CHAR '2'
//DEZ 51 = HEX 33 = CHAR '3'
//DEZ 52 = HEX 34 = CHAR '4'
//DEZ 53 = HEX 35 = CHAR '5'
//DEZ 54 = HEX 36 = CHAR '6'
//DEZ 55 = HEX 37 = CHAR '7'
//DEZ 56 = HEX 38 = CHAR '8'
//DEZ 57 = HEX 39 = CHAR '9'
//   
// Systemzeit
 
      L     P##TEMP_Systemzeit; // Systemzeit (POINTER)
      LAR1  ; 
 
// Systemzeit Tag
 
      L     LB [AR1,P#2.0]; // Systemzeit Tag
      SRW   4; 
      L     48; 
      +I    ; 
      T     #OUT_Systemzeit[1]; // Systemzeit Tag Zehnerstelle
 
      L     LB [AR1,P#2.0]; // Systemzeit Tag
      SLW   12; 
      SRW   12; 
      L     48; 
      +I    ; 
      T     #OUT_Systemzeit[2]; // Systemzeit Tag Einerstelle
 
// Systemzeit Monat
 
      L     LB [AR1,P#1.0]; // Systemzeit Monat
      SRW   4; 
      L     48; 
      +I    ; 
      T     #OUT_Systemzeit[4]; // Systemzeit Monat Zehnerstelle
 
      L     LB [AR1,P#1.0]; // Systemzeit Monat
      SLW   12; 
      SRW   12; 
      L     48; 
      +I    ; 
      T     #OUT_Systemzeit[5]; // Systemzeit Monat Einerstelle
 
// Systemzeit Jahr
 
      L     LB [AR1,P#0.0]; // Systemzeit Jahr
      SRW   4; 
      L     48; 
      +I    ; 
      T     #OUT_Systemzeit[9]; // Systemzeit Jahr Zehnerstelle
 
      L     LB [AR1,P#0.0]; // Systemzeit Jahr
      SLW   12; 
      SRW   12; 
      L     48; 
      +I    ; 
      T     #OUT_Systemzeit[10]; // Systemzeit Jahr Einerstelle
 
// Systemzeit Stunde
 
      L     LB [AR1,P#3.0]; // Systemzeit Stunde
      SRW   4; 
      L     48; 
      +I    ; 
      T     #OUT_Systemzeit[12]; // Systemzeit Stunde Zehnerstelle
 
      L     LB [AR1,P#3.0]; // Systemzeit Stunde
      SLW   12; 
      SRW   12; 
      L     48; 
      +I    ; 
      T     #OUT_Systemzeit[13]; // Systemzeit Stunde Einerstelle
 
// Systemzeit Minute
 
      L     LB [AR1,P#4.0]; // Systemzeit Minute
      SRW   4; 
      L     48; 
      +I    ; 
      T     #OUT_Systemzeit[15]; // Systemzeit Minute Zehnerstelle
 
      L     LB [AR1,P#4.0]; // Systemzeit Minute
      SLW   12; 
      SRW   12; 
      L     48; 
      +I    ; 
      T     #OUT_Systemzeit[16]; // Systemzeit Minute Einerstelle
 
NETWORK
TITLE =Register wiederherstellen
 
      AUF   DB [#TEMP_DBO_Register]; // DBO-Register
 
      L     #TEMP_AR1_Register; // AR1-Register
      LAR1  ; 
 
END_FUNCTION_BLOCK
```
 
Gruß Kai


----------



## toto45 (18 Januar 2011)

Läuft alles. Vielen Dank!!!


----------



## olddragon (14 März 2012)

Heißen Dank, Kai,
ich werde es allerdings erst morgen probieren können. Hab heute noch nen Termin beim Doc.


----------

