Willkommen › Foren › LogoControl › Formatierung für Uhrzeit und Datum.
- Dieses Thema hat 8 Antworten sowie 3 Stimmen und wurde zuletzt vor vor 4 Jahren, 6 Monaten von flopius aktualisiert.
-
AutorBeiträge
-
31. Januar 2017 um 16:38 #3240ixo65Teilnehmer
Mal eine Frage an den Admin:
Bei der LOGO! 0BA8 liegen ja Uhrzeit und Datum in den für den User nicht zugänglich Bereich, können aber mit Logo Control byteweise ausgelesen werden (und auch wieder beschrieben werden). Die Daten liegen ein Mal in Dezimal vor und ein Mal in Hexadezimal.Dezimal:
VB985 = Jahr
VB986 = Monat
VB987 = Tag
VB988 = Stunde
VB989 = Minute
VB990 = SekundeHexadezimal:
VB991 = Jahr
VB992 = Monat
VB993 = Tag
VB994 = Stunde
VB995 = Minute
VB996 = SekundeKann man da über einen Textkonverter oder/und eine Kalkulation jeweils 3 Byte zusammenfassen mit den entsprechenden Trennzeichen?
Zum Beispiel:
Datum = VB987.Vb986.VB985 (TT.MM.JJ)
Uhrzeit = VB988:VB989:VB990 (hh:mm:ss)1. Februar 2017 um 13:58 #3243adminAdministratorHm, knifflige Frage! Also mehrere Attribute in LogoControl zusammenfassen geht schon mal nicht. Einzige Möglichkeit wäre alle 3 Bytes in ein Attribut zu lesen und dann mit irgendwelchen NCalc-Ausdrücken in der Calculation auseinanderzunehmen. Allerdings gibt es keinen Datentyp um 3 Bytes zu lesen, nur 1, 2 oder 4 Bytes und das ist das Hauptproblem!
Das Datum könnte man als DWord (also 4 Bytes) lesen, indem man bereits 1 Byte früher (bei Adresse 984) anfängt zu lesen. Den Inhalt kann man ja durch Bit-Opterationen verschwinden lassen. In der Doku steht, dass dies ein Diagnosebyte ist, keine Ahnung was da konkret drin steht. Lesen sollte kein Problem sein, allerdings das Schreiben des Attributs. Denn dann wird auch immer Byte 948 mit geschrieben. Und da wir den Wert zuvor durch Bit-Operationen verschwinden liesen, können wir diesen Original-Wert auch nicht mehr schreiben. Ob das ein Problem ist, müsstest du ausprobieren, ich habe keine Logo 8.
Bei der Uhrzeit sehe ich da ein ähnliches Problem, allerdings macht es meiner Meinung nach wenig Sinn die Sekunden mit in das Attribut aufzunehmen, da dies zu einer dauerhaften Aktualisierungschleife der Weboberfläche führen wurde (jede Sekunden ändert sich ja der Wert). Daher würde ich nur 2 Bytes lesen/schreiben für Stunde und Minute.
Anbei 2 Calculations für die Konvertierung:
<calculation id="logo_clock_time"> <!-- Logo 8 Dezimal Uhrzeit (z.B. 2334 zu 09:30) --> <valueToText calculation="{[value]>>8}:{if(([value]&255)>9,'','0')}{[value]&255}" /> <textToValue valueParseRegex="(\d+):(\d+)" calculation="{([value1]<<8)+[value2]}" /> </calculation> <calculation id="logo_clock_date"> <!-- Logo 8 Dezimal Datum (z.B. 1114625 zu 01.02.2017.) --> <valueToText calculation="{if(([value]&255)>9,'','0')}{[value]&255}.{if((([value]>>8)&255)>9,'','0')}{([value]>>8)&255}.20{([value]>>16)&255}" /> <textToValue valueParseRegex="(\d+).(\d+).20(\d+)" calculation="{[value1]+([value2]<<8)+([value3]<<16)}" /> </calculation>
Sieht ziemlich verwirrend aus, da die größer/kleiner-Zeichen und Kaufmannsund-Zeichen in XML escaped werden müssen…
Einbinden der TextConverter würde so aussehen:
<device id="uhr" name="LOGO-Uhr"> <attribute id="datum" name="Datum" plc="dummy" address="984" datatype="dword" valueTextConverter="logo_clock_date" /> <attribute id="uhrzeit" name="Uhrzeit" plc="dummy" address="988" datatype="word" valueTextConverter="logo_clock_time" /> </device>
- Diese Antwort wurde vor vor 7 Jahren, 9 Monaten von admin bearbeitet.
1. Februar 2017 um 15:00 #3247ixo65TeilnehmerWenn man das Byte 984 in Logo Control nicht verändert, dann wird der Wert doch unverändert zurückgeschrieben, oder sehe ich das verkehrt?
Und bei der Uhrzeit geht es mir gerade um die Sekunden, weil ich die zum korrekten Stellen der Uhrzeit benötige.
1. Februar 2017 um 15:30 #3248ixo65TeilnehmerBinde ich calkulation für das Datum ein, erhalte ich folgende Fehlermeldung in Logo Control.
1. Februar 2017 um 15:30 #3249adminAdministratorEs werden Byte 984-987 in einen 4byte-Datentyp des LogoControl-Attributs gelesen. Dort wäre also der Wert noch vorhanden. Dieser Wert wird für die Anzeige per ValueText-Converter in Text umgewandelt. Wenn der Benutzer nun aber in der WebUI einen neuen Wert für das Attribut eingibt, so wird dieser eingegebene Text vom ValueTextConverter wieder rückwärts gewandelt in einen 4byte-Wert. Da in der textuellen Repräsentation des Werts jedoch Byte 984 nicht enthalten war, fehlt dem ValueTextConverter diese Information und kann sie folglich auch nicht im 4byte-Wert wiederherstellen.
Wegen der Uhrzeit: ich dachte dir geht es vorrangig um die Anzeige der Uhrzeit und da hätte ich auf die Anzeige der Sekunden aus oben beschriebenen Performance-Gründen verzichtet. Prinzipiell besteht bei der Uhrzeit aber das gleiche Problem wie beim Datum. Du willst 3 Bytes lesen/schreiben kannst aber nur 4 Bytes lesen/schreiben. Entweder du nimmst also ein viertes Byte mit dazu (davor oder dahinter) mit dem Wissen, dass dieses beim Schreiben des Attributs „genullt“ wird, oder aber du definierst dir einfach 3 einzelne Attribute mit je einem Byte für Stunde, Minute, Sekunde getrennt. Da es dir ja nicht um die Anzeige geht, sondern nur um das Stellen der Uhr, ist es ja nicht so wichtig, dass die Zeit in Form eines kombinierten Textes in Form von hh:mm:ss geschieht.
Die WebUI wird dann aber trotzdem sekündlich mit Update-Events geflutet, wenn sich der Wert von Sekunde ändert…
1. Februar 2017 um 17:00 #3250ixo65TeilnehmerDa es dir ja nicht um die Anzeige geht, sondern nur um das Stellen der Uhr, ist es ja nicht so wichtig, dass die Zeit in Form eines kombinierten Textes in Form von hh:mm:ss geschieht.
Es geht mir eigentlich um beides, Anzeigen und Stellen.
Aber wenn es nicht geht, geht es halt eben nicht.2. Februar 2017 um 10:00 #3254adminAdministratorZu deinem Fehler oben: das liegt an einer Beschränkung der von mir verwendeten Biblothek NCalc, welche für Bitoperationen nur 16 bit unterstützt. Diese Beschränkung habe ich in meiner Entwicklerversion schon vor einigen Monaten aufgehoben, so dass künftig mit 32bit gerechnet wird. Daher trat der Fehler bei mir gar nicht auf und ich hatte leider nicht mehr daran gedacht, dass die aktuell veröffentlichte Version 0.5.2 noch dieses Problem hat. Im nächsten Release von LogoControl wird jedenfalls auch die gepatchte Version von NCalc enthalten sein, so dass die obigen ValueTextConverter funktionieren sollten. Sorry…
2. Februar 2017 um 11:43 #3255ixo65TeilnehmerDanke für die Info.
5. Mai 2020 um 8:01 #3927flopiusTeilnehmerEinen wunderschönen guten Morgen!
bin auch gerade an dem Punkt mit der falschen Datums-Calculation. Wäre es möglich, eine Vorab-Version ohne die entsprechende Begrenzung zu erhalten?
Ansonsten muss ich sagen, vielen vielen Dank für die tolle Arbeit! Mit LogoControl konnte ich ganz super lustige Dinge realisieren, die sonst unmöglich gewesen wären!
Viele Grüße und Gesundheit in dieser Zeit,
Flo -
AutorBeiträge
- Du musst angemeldet sein, um zu diesem Thema eine Antwort verfassen zu können.