DATE_AND_TIME in String konvertieren

toto45

Level-1
Beiträge
65
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Oder so.......

Code:
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
 
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!!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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:
Code:
    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
 
Zuletzt bearbeitet:
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
 
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ß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
fertig

So, habs noch mal schnell dazwischengeschoben:

Code:
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
 
Nachfolgend ein Programmbeispiel für das Auslesen der Systemzeit der SPS und das Abspeichern der Systemzeit in einem STRING:

Code:
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
 

Anhänge

  • OB1.pdf
    5,6 KB · Aufrufe: 176
  • FB100.pdf
    9,2 KB · Aufrufe: 221
  • DB200.pdf
    4,4 KB · Aufrufe: 140
  • 41995.zip
    33,2 KB · Aufrufe: 220
  • VAT.jpg
    VAT.jpg
    285,7 KB · Aufrufe: 177
Zurück
Oben