TIA Time&Date Stamp zu String

yasvegu

Level-1
Beiträge
22
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag zusammen,

vor folgendem Problem stehe ich.
Und zwar muss ich bei Erfüllung einer Bedingung einen String mit Timestamp der Erfüllung und einem Klarnamen via OPC UA zur Verfügung stellen.
Mein Gedanke war also, einen Timestamp mit Hilfe der Systemzeit zu erzeugen und diesen zu einem String zu konvertieren, welcher dann mit dem Klarnamen String zu einem geformt werden soll.
Da es aber wohl leider keine Konvertierungsfunktionen von LDT/DTL/DT/(gibt es weitere Möglichkeiten für Datum und Zeit?) gibt (oder habe ich sie nur nicht gefunden?) bin ich nun ganz schön ratlos.

Ich hoffe sehr, ihr könnt mir etwas weiterhelfen.
Hardware ist ne S7-1515, daher sollte es hierdurch zumindest keine Limitierung geben.

Liebe Grüße und Danke im Voraus
yasvegu
 
Variable in einzelne Stellen zerlegen und diese in ein ASCII-Zeichen (+ 48 ) wandeln und daraus den String zusammenbauen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Yasvegu,

einen String mit Datum und Uhrzeit habe ich neulich auch gemacht.
Erst die Systemzeit als DTL auslesen. Dort sind dann ja Jahr, Monat, Tag usw. gespeichert.
Dann mittels S_CONV (Erweiterte Anweisungen: String + Char) umwandeln (z.B. UINT to String). Ich musste noch mit delete String ein paar Zeichen löschen, und konnte mir den String zusammenbauen wie ich wollte.

Grüße
Peter
 
Hi, danke dir für den Link.
Ich werde wohl die Rd Loc Time nehmen.

Ich habe noch ein paar Verständnisfragen zu dem Convert Baustein.


#s_Year := UINT_TO_STRING(#LOC_T_DTL.YEAR);
#s_Year := RIGHT(IN := #s_Year, L := 4); //Entfernen der Leerzeichen (Keine Leerzeichen in Namen der Datenfiles erlaubt)
Ist der USINT nicht sowieso nur 4 Stellig bei der Jahreszahl?



#s_Month := USINT_TO_STRING(#LOC_T_DTL.MONTH);

IF #LOC_T_DTL.MONTH >= 10 THEN
#s_Month := RIGHT(IN := #s_Month, L := 2);
ELSE
#s_Month := RIGHT(IN := #s_Month, L := 1);
#s_Month := CONCAT(IN1 := '0', IN2 := #s_Month);
END_IF;
Warum wird hier concat genutzt? Reicht es nicht den USINT auf 1 bzw. 2 Stellen zu kürzen und dann zu einem String zu konvertieren?



#s_Hour := USINT_TO_STRING(#LOC_T_DTL.HOUR);

IF #LOC_T_DTL.HOUR >= 10 THEN
#s_Hour := RIGHT(IN := #s_Hour, L := 2);
ELSE
#s_Hour := RIGHT(IN := #s_Hour, L := 1);
#s_Hour := CONCAT(IN1 := 'T', IN2 := #s_Hour);
END_IF;
Ich habe hier T in IN1 eingefügt, da ich später solch einen String benötige "Location=varLocationName,Timestamp=2020-07-19T20:14:05.122Z"
Funktioniert das oder sollte ich das erst später beim abschließenden erzeugen des Strings einfügen? bzw kann ich bein Concat auch mit In1, In2, In3, Inxyz arbeiten?/ gibt es eine andere Funktion dafür?


Liebe Grüße und Danke im Voraus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
1. Ich habe noch ein paar Verständnisfragen zu dem Convert Baustein.

2. Ist der USINT nicht sowieso nur 4 Stellig bei der Jahreszahl?

3. Warum wird hier concat genutzt? Reicht es nicht den USINT auf 1 bzw. 2 Stellen zu kürzen und dann zu einem String zu konvertieren?

4. Ich habe hier T in IN1 eingefügt, da ich später solch einen String benötige "Location=varLocationName,Timestamp=2020-07-19T20:14:05.122Z"
Funktioniert das oder sollte ich das erst später beim abschließenden erzeugen des Strings einfügen? bzw kann ich bein Concat auch mit In1, In2, In3, Inxyz arbeiten?/ gibt es eine andere Funktion dafür?
:confused:
Zu 1.:
Von welchem Convert-Baustein sprichst Du?
'Rd Loc Time'? Ich finde nur an zwei Stellen eine "beiläufige" Erwähnung von 'Fehler/Status von unterlagerten Baustein „RD_LOC_T“' aber nichts näheres zu dem Baustein, der allerdings auch kein KonvertierBaustein sein dürfte.
Der Dir von Harald nahegelegte 'LGF_DTLtoString' kann es ja wohl auch nicht sein.

Zu 2.:
USINT kann maximal 3 Stellen: 0..255. UINT kann maximal 5 Stellen: 0..65535. Siehe auch sinngemäss 'Zu 3.'.

Zu 3.:
Wie kürzt man denn einen USINT auf 1 bzw. 2 Stellen? USINT hat eine Länge von 1 Byte = 8 Bit. Kürzen auf 7 oder 6 Bit?
Concat wird benutzt, um an eine '0' die EinerStelle des Monats anzuhängen, wenn der Monat im Bereich 1..9 liegt und somit die ZehnerStelle als ' ' (Leerzeichen) ausgegeben wird (unterdrückte, d.h. als Leerzeichen dargestellte, vorlaufende 0).

Zu 4.:
Laut dem gezeigten Code wird aber das 'T' an die Stelle gesetzt, an der ein Leerzeichen stehen würde, wenn die Zehnerstelle der Stunde 0 wäre (bei Stunde 0..9 - nicht jedoch bei Stunde 10..23).
Das dürfte nicht die Wirkung sein, die Du Dir erhoffst.

Ich schätze mit dem 'LGF_DTLtoString' kämst Du schneller ans Ziel. Da musst Du doch nur ein Leerzeichen zwischen Datum und Uhrzeit durch 'T' oder etwas anderes ersetzen und vielleicht noch ein paar ns, µs, ms oder s hinten abschneiden.
Insgesamt mit LEFT und MID (oder RIGHT) zerlegen und mit CONCAT wieder zusammenbasteln und dabei das 'T' einfügen.
 
Zuletzt bearbeitet:
#s_Year := UINT_TO_STRING(#LOC_T_DTL.YEAR);
#s_Year := RIGHT(IN := #s_Year, L := 4); //Entfernen der Leerzeichen (Keine Leerzeichen in Namen der Datenfiles erlaubt)
Ist der USINT nicht sowieso nur 4 Stellig bei der Jahreszahl?
Weil Siemens nicht dokumentiert (und somit auch nicht garantiert), wie der von UINT_TO_STRING erzeugte String aussieht, muß man selber dafür sorgen daß der gewünschte (Teil-)String garantiert nur/genau die letzten 4 Zeichen/Ziffern enthält. Möglicherweise hat der von UINT_TO_STRING erzeugte String eine feste Länge (5 oder 6 Zeichen?), vermutlich mit Vor-Leerzeichen und evtl. Vorzeichen oder Platzhalter für das Vorzeichen.

Übrigens ist DTL.Year kein USINT sondern ein UINT. Ein USINT kann nur Werte von 0..255 enthalten.

Harald
 
Ich habe noch ein paar Verständnisfragen zu dem Convert Baustein.


#s_Year := UINT_TO_STRING(#LOC_T_DTL.YEAR);
#s_Year := RIGHT(IN := #s_Year, L := 4); //Entfernen der Leerzeichen (Keine Leerzeichen in Namen der Datenfiles erlaubt)
Welchen Convert Baustein meinst Du?

In dem LGF_DTLtoString bzw. LGF_DTLtoString_ISO in den Versionen für TIA V15.1 kommt der gezeigte Code nicht vor, da sieht der Code nicht so unnötig umständlich aus. Ich hänge mal den SCL-Quelltext hier an den Beitrag an. Du kannst auch den SCL-Quellcode nehmen und direkt auf Deine Bedürfnisse umschreiben (das T einfügen, die Nanosekunden entfernen).

Harald
 

Anhänge

  • LGF_DTLtoString_ISO_V300.scl.txt
    8,1 KB · Aufrufe: 75
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
sorry für die Unklarheiten.
Der Code ist aus einem FB, den ich in unserer interen Bibliothek gefunden habe.

zu 2. da habe ich ein S in meine Frage mit reingeschummelt, meinte natürlich einen UINT. Danke für die Erklärung, dass es nicht genau definiert ist.
Danke ebenfalls für das Aufmerksam machen, dass das mit dem T so natürlich nicht funktioniert! Jetzt wo ihr es sagt, ist dass natürlich klar... :oops:

Ich möchte natürlich auch verstehen, was warum wie gemacht wird und nicht einfach nur stur nutzen, daher die ganzen Fragen. Seid bitte auch in Zukunft so gnädig mit mir ;)
Mühsam ernährt sich das Eichhörnchen... Danke euch :)
 
Bin den LGF Baustein mal durchgegangen und finde ihn um ehrlich zu sein komplizierter.
Was ich jedoch gesehen habe, ist dass Defaultwerte vorgegeben sind. z.B. bei beim String für Year "4".
Ist die Funktion des Default Wertes bei Strings die Anzahl der Zeichen? Und würde "right mit L=4" somit überflüssig machen?

Liebe Grüße
 
Was ich jedoch gesehen habe, ist dass Defaultwerte vorgegeben sind. z.B. bei beim String für Year "4".
Ist die Funktion des Default Wertes bei Strings die Anzahl der Zeichen? Und würde "right mit L=4" somit überflüssig machen?
Ich fürchte, der Begriff "Defaultwert" ist hier irreführend. Damit ist ein Wert gemeint, der "ersatzweise" genommen wird, wenn nichts anderes spezifiziert wird.
Die ganzen Parameter geben an, wie lang die einzelnen Bestandteile sind und wo sie im Ergebnis stehen bzw. beginnen und welche Trennzeichen benutzt werden.
Es sind alles Konstanten.
Den 'REPLACE_NANOSECOND_COUNT' könnte man vielleicht als Defaultwert bezeichnen, wenn er als Startwert der ForSchleife verwendet (und herunter gezählt) würde.

Der Parameter SIZE von VAL_STRG gibt an, wie lang das Ergebnis dieser Funktion wird, also wie viele Zeichen ausgegeben werden.
Wo siehst Du "right mit L=4"? Ich finde 'right' nur als Teil des Wortes 'Copyright' und in den Kommentaren 'place ... at the right position'. Also right im Sinne von Recht bzw. richtig, aber nicht im Sinne von rechts. :confused:
 
Zurück
Oben