TIA DTL Format zerlegen

Bitte ein Bit

Level-2
Beiträge
77
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Kollegen...
Brauche mal wieder Unterstützung für folgenden Fall.
Lese die Uhrzeit mit Rd_Sys_T und schreibe es in einem DB ab., gewünscht wird ein Zeitstempel mit folgendem Format:
yymmddHHMM, mit dem Jahr fängt das Problem schon mal an, brauche 24 statt 2024, Monat 06 statt 6, Tag 08 statt 8, usw..
wie würdet ihr rangehen? Mit meinem Wissen hänge ich noch lange dran.
 
als String oder numerischer Wert?

Wenn ja => Funktionen CONCAT / LEFT / RIGHT

edit:
Hier gabs den Spaß schon als VBS-Script für HMIs
 
Moin Bitte ein Bit,

hier eine Möglichkeit:

Code:
// Jahr
"MAIN_CLOCK_DB".LokalzeitDateChar.YYYY[0] := BYTE_TO_CHAR(INT_TO_BYTE(UINT_TO_INT("MAIN_CLOCK_DB".Lokalzeit.YEAR) / 1000 MOD 10) + 16#30);
"MAIN_CLOCK_DB".LokalzeitDateChar.YYYY[1] := BYTE_TO_CHAR(INT_TO_BYTE(UINT_TO_INT("MAIN_CLOCK_DB".Lokalzeit.YEAR) / 100 MOD 10) + 16#30);
"MAIN_CLOCK_DB".LokalzeitDateChar.YYYY[2] := BYTE_TO_CHAR(INT_TO_BYTE(UINT_TO_INT("MAIN_CLOCK_DB".Lokalzeit.YEAR) / 10 MOD 10) + 16#30);
"MAIN_CLOCK_DB".LokalzeitDateChar.YYYY[3] := BYTE_TO_CHAR(INT_TO_BYTE(UINT_TO_INT("MAIN_CLOCK_DB".Lokalzeit.YEAR) MOD 10) + 16#30);
// Monat
"MAIN_CLOCK_DB".LokalzeitDateChar.MM[0] := BYTE_TO_CHAR(INT_TO_BYTE(USINT_TO_INT("MAIN_CLOCK_DB".Lokalzeit.MONTH) / 10 MOD 10) + 16#30);
"MAIN_CLOCK_DB".LokalzeitDateChar.MM[1] := BYTE_TO_CHAR(INT_TO_BYTE(USINT_TO_INT("MAIN_CLOCK_DB".Lokalzeit.MONTH) MOD 10) + 16#30);
// Tag
"MAIN_CLOCK_DB".LokalzeitDateChar.DD[0] := BYTE_TO_CHAR(INT_TO_BYTE(USINT_TO_INT("MAIN_CLOCK_DB".Lokalzeit.DAY) / 10 MOD 10) + 16#30);
"MAIN_CLOCK_DB".LokalzeitDateChar.DD[1] := BYTE_TO_CHAR(INT_TO_BYTE(USINT_TO_INT("MAIN_CLOCK_DB".Lokalzeit.DAY) MOD 10) + 16#30);

// Stunde
"MAIN_CLOCK_DB".LokalzeitTimeChar.hh[0] := BYTE_TO_CHAR(INT_TO_BYTE(USINT_TO_INT("MAIN_CLOCK_DB".Lokalzeit.HOUR) / 10 MOD 10) + 16#30);
"MAIN_CLOCK_DB".LokalzeitTimeChar.hh[1] := BYTE_TO_CHAR(INT_TO_BYTE(USINT_TO_INT("MAIN_CLOCK_DB".Lokalzeit.HOUR) MOD 10) + 16#30);
// Minute
"MAIN_CLOCK_DB".LokalzeitTimeChar.mm[0] := BYTE_TO_CHAR(INT_TO_BYTE(USINT_TO_INT("MAIN_CLOCK_DB".Lokalzeit.MINUTE) / 10 MOD 10) + 16#30);
"MAIN_CLOCK_DB".LokalzeitTimeChar.mm[1] := BYTE_TO_CHAR(INT_TO_BYTE(USINT_TO_INT("MAIN_CLOCK_DB".Lokalzeit.MINUTE) MOD 10) + 16#30);
// Sekunde
"MAIN_CLOCK_DB".LokalzeitTimeChar.ss[0] := BYTE_TO_CHAR(INT_TO_BYTE(USINT_TO_INT("MAIN_CLOCK_DB".Lokalzeit.SECOND) / 10 MOD 10) + 16#30);
"MAIN_CLOCK_DB".LokalzeitTimeChar.ss[1] := BYTE_TO_CHAR(INT_TO_BYTE(USINT_TO_INT("MAIN_CLOCK_DB".Lokalzeit.SECOND) MOD 10) + 16#30);
// Millisekunde
"MAIN_CLOCK_DB".LokalzeitTimeChar.msmsmsms[0] := BYTE_TO_CHAR(DINT_TO_BYTE(UDINT_TO_DINT("MAIN_CLOCK_DB".Lokalzeit.NANOSECOND) / l#100_000_000 MOD 10) + 16#30);
"MAIN_CLOCK_DB".LokalzeitTimeChar.msmsmsms[1] := BYTE_TO_CHAR(DINT_TO_BYTE(UDINT_TO_DINT("MAIN_CLOCK_DB".Lokalzeit.NANOSECOND) / l#10_000_000 MOD 10) + 16#30);
"MAIN_CLOCK_DB".LokalzeitTimeChar.msmsmsms[2] := BYTE_TO_CHAR(DINT_TO_BYTE(UDINT_TO_DINT("MAIN_CLOCK_DB".Lokalzeit.NANOSECOND) / l#1_000_000 MOD 10) + 16#30);
"MAIN_CLOCK_DB".LokalzeitTimeChar.msmsmsms[3] := BYTE_TO_CHAR(DINT_TO_BYTE(UDINT_TO_DINT("MAIN_CLOCK_DB".Lokalzeit.NANOSECOND) / l#100_000 MOD 10) + 16#30);

Hinweis:
RD_SYS_T gibt aber doch das Format DT DTL oder LDT aus.
In meinem Beispiel habe ich DTL verwendet. Da ist das Jahr auch vierstellig.
 
hier eine Möglichkeit:
OK, das ist....auch eine Lösung.
Zufällig code aus einem Classic-Projekt?

Ich htte das folgendermaßen angefangen:
Code:
//Zwei Stellen von rechts aus der Jahreszahl lesen
#hYear := RIGHT(IN := UINT_TO_STRING(#hDtl.YEAR), L := 2);
//Eine 0 vorne hinzufügen und anschließend die zwei rechten Zeichen lesen
#hmoth := RIGHT(IN := CONCAT(IN1 := '0',IN2 := USINT_TO_STRING(#hDtl.MONTH)), L := 2);
//Weiter mit den restlichen Bestandteilen des Datums...

//Und am Ende die Teilstrings per Concat zusammenfassen
#hString := CONCAT(IN1 := #hYear, IN2 := #hmoth);
 
Zurück
Oben