Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 6 von 6

Thema: Date and Time 2 String

  1. #1
    Registriert seit
    26.03.2013
    Beiträge
    86
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    wie der Titel schon sagt stehe ich vor folgendem Problem:

    Ich lese zyklisch die aktuelle SPS Zeit aus und muss diese mit vielen weiteren Telemetriedaten als Zeitstempel in einem DB ablegen. Von dort werden die Daten dann von einem Leitwarten-PC abgeholt.
    Datum un Uhrzeit muss ich in zwei getrennten strings ablegen.
    Date and Time in zwei einzelne Variablen (Date und Time of Day) auftrennen ist ja kein Ding, aber wie bekomme ich die Wandlung zum jeweiligen string hin?
    Hat hier jemand vielleicht eine Ídee oder sogar einen fertigen Wandlungsbaustein?
    Aufgrund immensem Zeitdruck bin ich für jede Hilfe dankbar.
    Zitieren Zitieren Date and Time 2 String  

  2. #2
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.358
    Danke
    456
    Erhielt 695 Danke für 520 Beiträge

    Standard

    Findest du alles in der Standard-Library.
    Dort gibt es einige Konvertierungsfunktionen mit denen du dein Auslangen finden solltest.

    Oder da ich kein Step7 mehr hier hab, mit 37 Sekunden Google:
    Which functions and IEC standard functions exist in STEP 7 for converting and comparing string variables?
    Geändert von RONIN (06.02.2014 um 20:17 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  3. #3
    Registriert seit
    26.03.2013
    Beiträge
    86
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Die Funktionen sind mir bekannt. Dachte es hätte jemand sowas in ner Lib.
    So habs selbst programmiert udn funzt wunderbar. Wenns also jemand braucht, einfach melden...

  4. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.207
    Danke
    927
    Erhielt 3.293 Danke für 2.662 Beiträge

    Standard

    Zitat Zitat von soundmachine123 Beitrag anzeigen
    So habs selbst programmiert udn funzt wunderbar. Wenns also jemand braucht, einfach melden...
    Magst Du uns Deinen Code zeigen oder willste den verkaufen?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #5
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.207
    Danke
    927
    Erhielt 3.293 Danke für 2.662 Beiträge

    Standard

    Einen fertigen Datum/Uhrzeit-String-Formatierer gibt es anscheinend nicht, die Aufgabe ist aber einfach zu lösen. Man muß nur die ersten 6 Byte eines DATE_AND_TIME in 12 Ziffern (CHAR) umwandeln und dann in der gewünschten Reihenfolge nebst Trennzeichen in die Ausgabe-Strings kopieren.

    Eine effiziente BCD(Hex)-zu-CHAR-Wandlung kann man in AWL schnell "zu Fuß" programmieren, man kann aber auch den FC95 HTA dafür nehmen. Da man für den Zugriff auf die zusammengesetzten Datentypen DATE_AND_TIME und STRING an FC-IN und FC-OUT indirekte Adressierung braucht, ist das ganze aber besser lesbar und schneller getippt in SCL zu lösen.

    Hier eine Variante in SCL welche ohne weitere Bausteine auskommt
    Code:
    FUNCTION DT_STRNG : VOID
    TITLE='DATE_AND_TIME in Datum-String und Uhrzeit-String konvertieren'
    VERSION : '1.0'
    AUTHOR  : PN_DP
    NAME    : DT_STRNG
    FAMILY  : CONVERT
    
    VAR_INPUT
        IN : DATE_AND_TIME ;
    END_VAR
    
    VAR_OUTPUT
        D : STRING[10] ; // String für Datum '31.12.2089'
        baD AT D : ARRAY[-1..10] OF BYTE ;
        T : STRING[8] ;  // String für Uhrzeit '23:59:59'
        baT AT T : ARRAY[-1..8] OF BYTE ;
    END_VAR
    
    VAR_TEMP
        tmpDT : DATE_AND_TIME ;
        baDT AT tmpDT : STRUCT
            Year   : BYTE ;  // Jahr    BCD (19)90..(20)89
            Month  : BYTE ;  // Monat   BCD 01..12
            Day    : BYTE ;  // Tag     BCD 01..31
            Hour   : BYTE ;  // Stunde  BCD 00..23
            Minute : BYTE ;  // Minute  BCD 00..59
            Second : BYTE ;  // Sekunde BCD 00..59
            msMSD  : BYTE ;
            wDay_msLSD : BYTE ;
        END_STRUCT ;
    
        tmpD : STRING[10] ; // String für Datum '31.12.2089'
        tbaD AT tmpD : ARRAY[-1..10] OF BYTE ;
    
        tmpT : STRING[8] ;  // String für Uhrzeit '23:59:59'
        tbaT AT tmpT : ARRAY[-1..8] OF BYTE ;
    
        tmpWord : WORD ;
        tmpW AT tmpWord : STRUCT
            B1 : BYTE ;
            B0 : BYTE ;
        END_STRUCT ;
    END_VAR
    
        // IN-DATE_AND_TIME in TEMP kopieren
        tmpDT := IN ;
    
        // Datum --> '31.12.2089'
        tmpD := '00.00.2000' ; // String initialisieren
    
        tmpW.B0 := baDT.Day ; // Tag
        tmpW.B1 := DWORD_TO_BYTE( SHR(IN:=BYTE_TO_DWORD(baDT.Day), N:=4) ) ;
        tmpWord := tmpWord AND W#16#0F0F OR W#16#3030 ;
        tbaD[1] := tmpW.B1 ;
        tbaD[2] := tmpW.B0 ;
    
        tmpW.B0 := baDT.Month ; // Monat
        tmpW.B1 := DWORD_TO_BYTE( SHR(IN:=BYTE_TO_DWORD(baDT.Month), N:=4) ) ;
        tmpWord := tmpWord AND W#16#0F0F OR W#16#3030 ;
        tbaD[4] := tmpW.B1 ;
        tbaD[5] := tmpW.B0 ;
    
        tmpW.B0 := baDT.Year ; // Jahr
        tmpW.B1 := DWORD_TO_BYTE( SHR(IN:=BYTE_TO_DWORD(baDT.Year), N:=4) ) ;
        tmpWord := tmpWord AND W#16#0F0F OR W#16#3030 ;
        tbaD[9] := tmpW.B1 ;
        tbaD[10] := tmpW.B0 ;
    
        baD := tbaD ; // Datum-String nach OUTPUT kopieren
    
        // Uhrzeit --> '23:59:59'
        tmpT := '00:00:00' ; // String initialisieren
    
        tmpW.B0 := baDT.Hour ; // Stunde
        tmpW.B1 := DWORD_TO_BYTE( SHR(IN:=BYTE_TO_DWORD(baDT.Hour), N:=4) ) ;
        tmpWord := tmpWord AND W#16#0F0F OR W#16#3030 ;
        tbaT[1] := tmpW.B1 ;
        tbaT[2] := tmpW.B0 ;
    
        tmpW.B0 := baDT.Minute ; // Minute
        tmpW.B1 := DWORD_TO_BYTE( SHR(IN:=BYTE_TO_DWORD(baDT.Minute), N:=4) ) ;
        tmpWord := tmpWord AND W#16#0F0F OR W#16#3030 ;
        tbaT[4] := tmpW.B1 ;
        tbaT[5] := tmpW.B0 ;
    
        tmpW.B0 := baDT.Second ; // Sekunde
        tmpW.B1 := DWORD_TO_BYTE( SHR(IN:=BYTE_TO_DWORD(baDT.Second), N:=4) ) ;
        tmpWord := tmpWord AND W#16#0F0F OR W#16#3030 ;
        tbaT[7] := tmpW.B1 ;
        tbaT[8] := tmpW.B0 ;
    
        baT := tbaT ; // Uhrzeit-String nach OUTPUT kopieren
    
    END_FUNCTION
    
    // Optimierungs-Unterstützung des SCL-Compilers (K05.03.05.00_01.03.00.01):
    // - direktes Bearbeiten der IN- und OUT-Parameter benötigt ca. doppelt soviel Programmgröße wie Bearbeiten in TEMP
    // - SHR(IN:=ByteVar, N:=4) benötigt 22 Byte mehr als DWORD_TO_BYTE(SHR(IN:=BYTE_TO_DWORD(ByteVar), N:=4))
    // - Division durch 16 statt SHR 4 oder nicht Zwischenspeichern in tmpWord benötigen geringfügig mehr
    // - (T := tmpT) String-Kopieren benötigt fast 200 Byte mehr als Array kopieren (baT := tbaT)
    Und eine zweite Variante in SCL, welche den FC95 HTA aus den TI-S7 Converting Blocks nutzt.
    Sieht kürzer aus, braucht aber mit dem FC HTA zusammen etwas mehr Programmspeicher.
    Code:
    FUNCTION DT_STRNG2 : VOID
    TITLE='DATE_AND_TIME in Strings konvertieren'
    VERSION : '1.0'
    AUTHOR  : PN_DP
    NAME    : DT_STRNG
    FAMILY  : CONVERT
    
    VAR_INPUT
        IN : DATE_AND_TIME ;
    END_VAR
    
    VAR_OUTPUT
        D : STRING[10] ; // String für Datum '31.12.2089'
        baD AT D : ARRAY[-1..10] OF BYTE ;
        T : STRING[8] ;  // String für Uhrzeit '23:59:59'
        baT AT T : ARRAY[-1..8] OF BYTE ;
    END_VAR
    
    VAR_TEMP
        tmpDT : DATE_AND_TIME ;
        tmpArray : ARRAY[1..12] OF BYTE ;
    END_VAR
    
        // IN-DATE_AND_TIME in TEMP kopieren
        tmpDT := IN ;
        // und mit FC HTA in CHARs wandeln --> 'YYMMDDHHMMSS'
        HTA(IN:=tmpDT, N:=6, OUT:=tmpArray);
    
        // Datum --> '31.12.2089'
        baD[-1] := 10 ; // max Stringlänge
        baD[0] := 10 ; // akt. Stringlänge
        baD[1] := tmpArray[5] ; // Tag
        baD[2] := tmpArray[6] ;
        baD[3] := CHAR_TO_BYTE('.') ;
        baD[4] := tmpArray[3] ; // Monat
        baD[5] := tmpArray[4] ;
        baD[6] := CHAR_TO_BYTE('.') ;
        baD[7] := CHAR_TO_BYTE('2') ;
        baD[8] := CHAR_TO_BYTE('0') ;
        baD[9] := tmpArray[1] ; // Jahr
        baD[10] := tmpArray[2] ;
    
        // Uhrzeit --> '23:59:59'
        baT[-1] := 8 ; // max Stringlänge
        baT[0] := 8 ; // akt. Stringlänge
        baT[1] := tmpArray[7] ; // Stunde
        baT[2] := tmpArray[8] ;
        baT[3] := CHAR_TO_BYTE(':') ;
        baT[4] := tmpArray[9] ; // Minute
        baT[5] := tmpArray[10] ;
        baT[6] := CHAR_TO_BYTE(':') ;
        baT[7] := tmpArray[11] ; // Sekunde
        baT[8] := tmpArray[12] ;
    
    END_FUNCTION
    Beide Varianten funktionieren korrekt nur im Datumsbereich 01.01.2000 bis 31.12.2089, weil die zweistellige Jahresangabe des DATE_AND_TIME einfach immer zu 20xx erweitert wird!

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet
    Zitieren Zitieren Function DT_STRNG in SCL  

  6. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    netsroht (04.09.2014)

  7. #6
    Registriert seit
    21.10.2010
    Beiträge
    546
    Danke
    60
    Erhielt 42 Danke für 40 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich muss mal nochmals dieses Thema ausgraben.

    Ich wollte das obere ohne FC HTA Beispiel von PN/DP ausprobieren, da ich das Datum und die Zeit in einem String brauche.
    Also das Beispiel kopiert und in eine Textdatei mit Endung .scl gespeichert. Danach im Tia (V13SP1Upd2) als externe Quelle einfügen und dann Baustein generieren. Allerdings nach Baustein generieren aus Quelle blinkt mir der Baustein nur kurz auf und verschwindet wieder!

    Also von Hand die Dekleration machen. --> Weiteres Problem: tmpW.B1 intepretiert TIA als slicezugriff auf ein Byte. Also noch ein Q vor B (Dekleration und Programm) geschrieben. Allerdings geht es mir auch so nicht.
    Ich denke mein Problem ist die Dekleration: es hat ein paar Mal ein AT drin?! Was heisst das? Z.B
    Code:
    tmpDT : DATE_AND_TIME ;
        baDT AT tmpDT : STRUCT
            Year   : BYTE ;  // Jahr    BCD (19)90..(20)89
            Month  : BYTE ;  // Monat   BCD 01..12
            Day    : BYTE ;  // Tag     BCD 01..31
            Hour   : BYTE ;  // Stunde  BCD 00..23
            Minute : BYTE ;  // Minute  BCD 00..59
            Second : BYTE ;  // Sekunde BCD 00..59
            msMSD  : BYTE ;
            wDay_msLSD : BYTE ;
        END_STRUCT ;
    Gruss blimaa



    Edit: OK hab die AT Ansicht hinbekommen und es arbeitet wie gewollt. Allerdings habe ich keine Ahnung was die AT Ansicht genau ist
    Geändert von blimaa (13.05.2015 um 13:11 Uhr)

Ähnliche Themen

  1. Date and Time umwandeln in Time
    Von veritaz89 im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 24.05.2012, 08:07
  2. Time and Date
    Von paula23 im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 22.10.2008, 08:50
  3. String in Date&Time
    Von Stohstaky im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 10.10.2007, 16:13
  4. Date/Time in Diagnoserepeater
    Von Pilami im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 26.09.2007, 14:58
  5. Date and Time im DB
    Von godi im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 19.05.2006, 15:56

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •