TIA Konvertieren von Date_and_Time zu String

Der Basti

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


Ich setze TIA V12 mit einer 300er Steuerung ein.


Ich habe folgendes Problem. Ich muss einen String generieren, der sich aus der letzten Ziffer des Kalenderjahres, des Wochentags, der Kalenderwoche und einigen anderen Dingen zusammensetzt.



Das Auslesen der Systemzeit und Aufsplitten in Datum, Uhrzeit und Wochentag ist kein Problem. Allerdings liegt mir das Datum dann nur als Datentyp "Date" vor. Ich finde keine Möglichkeit den Datentyp Date nach string zu konvertieren um die letzte Ziffer aus dem Jahr zu extrahieren.

Hat jemand eine Idee dazu?



Die Kalenderwoche muss ich mir auch noch ermitteln.



Vielen Dank für eure Bemühungen.



 
Hallo,

wenn dir mir SCL an dieser Stelle geholfen ist dann hätte ich einen Baustein, der dir das Datum einliest und in seine Einzelbestandteile (also Tag, Monat, Jahr - aber auch KW) zergliedert.
Ist allerdings S7-Classic.

Gruß
Larry
 
Nein, die Einzel-Bestandteile werden als INT ausgegeben. Aber um von INT zu String zu kommen gibt es (auch bei TIA) entsprechende Umwandlungs-FC's.
Ich poste dir mal den FC. Du kannst in dir ja ggf. anpassen / umbauen ...

Code:
FUNCTION FC440 : VOID                                        // UP Tag, Monat, Jahr etc. von Systemuhr abfragen
Title   = 'UP Tag, Monat, Jahr etc. von Systemuhr abfragen'  // UUP Tag, Monat, Jahr etc. von Systemuhr abfragen
AUTHOR  : 'Larry'
VERSION : '1.0'     //    30.09.2014
FAMILY  : 'LL_Std'
KNOW_HOW_PROTECT
// --------------------------------------------------------------------------------------
//     Bausteinparameter
// --------------------------------------------------------------------------------------
VAR_INPUT 
END_VAR
VAR_IN_OUT 
END_VAR
VAR_OUTPUT
   Jahr              : INT ;       // Jahr des Vorgabe-Date's
   Monat             : INT ;       // Monat des Vorgabe-Date's
   Tag               : INT ;       // Tag des Vorgabe-Date's
   Wochentag         : INT ;       // Wochentag des Vorgabe-Date's  [1=So ... 7=Sa]
   Schaltjahr        : INT ;       // =1: Vorgabe-Date ist ein Schaltjahr
   Jahrestag         : INT ;       // Tag im Jahr des Vorgabe-Date's
   Kalenderwoche     : INT ;       // Kalenderwoche des Vorgabe-Date's
   SommerZeit        : INT ;       // =1: Vorgabe-Date ist innerhalb der Sommerzeit
END_VAR
VAR_TEMP
   Date_Time : DT ;                 // Date_and_Time für Umwandlung 
      at_Date_Time AT Date_Time : ARRAY [0..7] OF BYTE ;
   Error           : INT ; 
   b_Jahr : INT ;
   Anz_SJ : INT ; 
   Diff_J : INT ;
   h_Wochentag : INT ;
   h_Datum     : INT ;
   
   Tag_Wechsel_SZ   : INT ;          // - Jahrestag, an dem nach Sommerzeit gewechselt wird
   Tag_Wechsel_WZ   : INT ;          // - Jahrestag, an dem nach Winterzeit gewechselt wird
   Stunde           : INT ;
END_VAR
// --------------------------------------------------------------------------------------
//     Anweisungsteil
// --------------------------------------------------------------------------------------
BEGIN
  Error := READ_CLK (CDT := Date_Time) ; 
  WochenTag := BCD_TO_INT (at_Date_Time [7] AND 2#0000_1111) ;
  b_Jahr := BCD_TO_INT (at_Date_Time [0]) ; 
     IF b_Jahr < 90 THEN Jahr := 2000 + b_Jahr ; ELSE Jahr := 1900 + b_Jahr ; END_IF ;
  Monat  := BCD_TO_INT (at_Date_Time [1]) ;
  Tag    := BCD_TO_INT (at_Date_Time [2]) ;
  
  Schaltjahr := 0 ; IF ((Jahr MOD 4) = 0) AND (NOT ((Jahr MOD 100) = 0) OR ((Jahr MOD 400) = 0)) THEN Schaltjahr := 1 ; END_IF ;
  Jahrestag := Tag ;
     IF Monat >  1 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
     IF Monat >  2 THEN Jahrestag := Jahrestag + 28 + Schaltjahr ; END_IF ;
     IF Monat >  3 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
     IF Monat >  4 THEN Jahrestag := Jahrestag + 30 ; END_IF ;
     IF Monat >  5 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
     IF Monat >  6 THEN Jahrestag := Jahrestag + 30 ; END_IF ;
     IF Monat >  7 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
     IF Monat >  8 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
     IF Monat >  9 THEN Jahrestag := Jahrestag + 30 ; END_IF ;
     IF Monat > 10 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
     IF Monat > 11 THEN Jahrestag := Jahrestag + 30 ; END_IF ;
     
   Kalenderwoche := (Jahrestag + 7 + 3 - Wochentag) / 7 ;
  
// Sommerzeit ?  
   Stunde := BCD_TO_INT (at_Date_Time [3]) ;
 
   h_Datum := Anz_SJ + (Diff_J * 365) + 83 ;  // 83 = Jahrestag vom 24.03. im nicht-Schaltjahr
   h_Wochentag := 6 - (h_Datum MOD 7) ;
   IF (h_Wochentag = 0) THEN h_Wochentag := 7 ; END_IF ;
       
   Tag_Wechsel_SZ := 83 + h_Wochentag ;
       
   h_Datum := Anz_SJ + (Diff_J * 365) + 297 ;  // 297 = Jahrestag vom 24.10. im nicht-Schaltjahr
   h_Wochentag := 6 - (h_Datum MOD 7) ;
   IF (h_Wochentag = 0) THEN h_Wochentag := 7 ; END_IF ;
       
   Tag_Wechsel_WZ := 297 + h_Wochentag ;
  
   SommerZeit := 0 ;
   IF    (Jahrestag > Tag_Wechsel_SZ) AND (Jahrestag < Tag_Wechsel_WZ) THEN SommerZeit := 1 ;
   ELSIF (Jahrestag = Tag_Wechsel_SZ) AND (Stunde >= 02)               THEN SommerZeit := 1 ;
   ELSIF (Jahrestag = Tag_Wechsel_WZ) AND (Stunde <= 02)               THEN SommerZeit := 1 ; 
   END_IF ;
   
// --------------------------------------------------------------------------------------
END_FUNCTION  
// --------------------------------------------------------------------------------------
 
Ich hab leider noch nie mit SCL gearbeitet und hab dein Programm kopiert und in meins eingefügt und bekomme jetzt ungefähr 150 Fehlermeldungen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So ist der Baustein damit du ihn in TIA importieren kannst.

Ich habe Den Know_how_protect entfernt damit man ihn beobachten kann.
Ausserdem ist der aufruft von RD_SYS_T in TIA etwas anders als in Step7

Code:
FUNCTION FC440 : VOID                                        // UP Tag, Monat, Jahr etc. von Systemuhr abfragenTitle   = 'UP Tag, Monat, Jahr etc. von Systemuhr abfragen'  // UUP Tag, Monat, Jahr etc. von Systemuhr abfragen
AUTHOR  : 'Larry'
VERSION : '1.0'     //    30.09.2014
FAMILY  : 'LL_Std'
// --------------------------------------------------------------------------------------
//     Bausteinparameter
// --------------------------------------------------------------------------------------
VAR_INPUT 
END_VAR
VAR_IN_OUT 
END_VAR
VAR_OUTPUT
   Jahr              : INT ;       // Jahr des Vorgabe-Date's
   Monat             : INT ;       // Monat des Vorgabe-Date's
   Tag               : INT ;       // Tag des Vorgabe-Date's
   Wochentag         : INT ;       // Wochentag des Vorgabe-Date's  [1=So ... 7=Sa]
   Schaltjahr        : INT ;       // =1: Vorgabe-Date ist ein Schaltjahr
   Jahrestag         : INT ;       // Tag im Jahr des Vorgabe-Date's
   Kalenderwoche     : INT ;       // Kalenderwoche des Vorgabe-Date's
   SommerZeit        : INT ;       // =1: Vorgabe-Date ist innerhalb der Sommerzeit
END_VAR
VAR_TEMP
   Date_Time : DT ;                 // Date_and_Time für Umwandlung 
      at_Date_Time AT Date_Time : ARRAY [0..7] OF BYTE ;
   Error           : INT ; 
   b_Jahr : INT ;
   Anz_SJ : INT ; 
   Diff_J : INT ;
   h_Wochentag : INT ;
   h_Datum     : INT ;
   
   Tag_Wechsel_SZ   : INT ;          // - Jahrestag, an dem nach Sommerzeit gewechselt wird
   Tag_Wechsel_WZ   : INT ;          // - Jahrestag, an dem nach Winterzeit gewechselt wird
   Stunde           : INT ;
END_VAR
// --------------------------------------------------------------------------------------
//     Anweisungsteil
// --------------------------------------------------------------------------------------
BEGIN
	Error := RD_SYS_T(Date_Time);
  WochenTag := BCD_TO_INT (at_Date_Time [7] AND 2#0000_1111) ;
  b_Jahr := BCD_TO_INT (at_Date_Time [0]) ; 
     IF b_Jahr < 90 THEN Jahr := 2000 + b_Jahr ; ELSE Jahr := 1900 + b_Jahr ; END_IF ;
  Monat  := BCD_TO_INT (at_Date_Time [1]) ;
  Tag    := BCD_TO_INT (at_Date_Time [2]) ;
  
  Schaltjahr := 0 ; IF ((Jahr MOD 4) = 0) AND (NOT ((Jahr MOD 100) = 0) OR ((Jahr MOD 400) = 0)) THEN Schaltjahr := 1 ; END_IF ;
  Jahrestag := Tag ;
     IF Monat >  1 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
     IF Monat >  2 THEN Jahrestag := Jahrestag + 28 + Schaltjahr ; END_IF ;
     IF Monat >  3 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
     IF Monat >  4 THEN Jahrestag := Jahrestag + 30 ; END_IF ;
     IF Monat >  5 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
     IF Monat >  6 THEN Jahrestag := Jahrestag + 30 ; END_IF ;
     IF Monat >  7 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
     IF Monat >  8 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
     IF Monat >  9 THEN Jahrestag := Jahrestag + 30 ; END_IF ;
     IF Monat > 10 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
     IF Monat > 11 THEN Jahrestag := Jahrestag + 30 ; END_IF ;
     
   Kalenderwoche := (Jahrestag + 7 + 3 - Wochentag) / 7 ;
  
// Sommerzeit ?  
   Stunde := BCD_TO_INT (at_Date_Time [3]) ;
 
   h_Datum := Anz_SJ + (Diff_J * 365) + 83 ;  // 83 = Jahrestag vom 24.03. im nicht-Schaltjahr
   h_Wochentag := 6 - (h_Datum MOD 7) ;
   IF (h_Wochentag = 0) THEN h_Wochentag := 7 ; END_IF ;
       
   Tag_Wechsel_SZ := 83 + h_Wochentag ;
       
   h_Datum := Anz_SJ + (Diff_J * 365) + 297 ;  // 297 = Jahrestag vom 24.10. im nicht-Schaltjahr
   h_Wochentag := 6 - (h_Datum MOD 7) ;
   IF (h_Wochentag = 0) THEN h_Wochentag := 7 ; END_IF ;
       
   Tag_Wechsel_WZ := 297 + h_Wochentag ;
  
   SommerZeit := 0 ;
   IF    (Jahrestag > Tag_Wechsel_SZ) AND (Jahrestag < Tag_Wechsel_WZ) THEN SommerZeit := 1 ;
   ELSIF (Jahrestag = Tag_Wechsel_SZ) AND (Stunde >= 02)               THEN SommerZeit := 1 ;
   ELSIF (Jahrestag = Tag_Wechsel_WZ) AND (Stunde <= 02)               THEN SommerZeit := 1 ; 
   END_IF ;
   
// --------------------------------------------------------------------------------------
END_FUNCTION  
// ---------------
 
Ich hab leider noch nie mit SCL gearbeitet
Auch in AWL/FUP/KOP machbar:
Du könntest eine Struktur oder UDT anlegen, welche den Byte-Aufbau des Datentyps DATE_AND_TIME abbildet (siehe TIA Hilfe), Deine Zeit auf diese Struktur kopieren, auf die Einzelbestandteile direkt symbolisch zugreifen, ggf. von BCD zu Dezimal wandeln, in CHAR wandeln und in Deinen String schreiben.

Harald
 
Jetzt ärgere ich mich gerade darüber, dass ich das Beispiel gepostet habe :
Ich hab leider noch nie mit SCL gearbeitet und hab dein Programm kopiert und in meins eingefügt und bekomme jetzt ungefähr 150 Fehlermeldungen.

Dann bin ich ja mal gespannt, ob du nach der Änderung von René mit dem Baustein nun etwas anfangen kannst und vor Allem : ob du die von dir noch benötigten String-Funktionen da hinein bekommst.

Gruß
Larry
 
Zurück
Oben