Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Echtzeit mit Millisekunden Auflösung

2006-07-30
2006-08-17
  • chichiberti - 2006-07-30

    Hallo zusammen

    ich möchte gerne die Echtzeituhr des WAGO 750-841 Controller mit Millisekunden Auflösung auslesen. Leider bekommt man beim Auslesen nur eine Sekundenauflösung der Echtzeit. Zusätzlich gibt es aber einen Counter mit Mikrosekunden Auflösung der ab Systemstart hochläuft. Kann man daraus die Millisekunden der Echtzeit ergänzen und wenn ja, wie? Jeder Tip ist herzlich willkommen.

    Grüsse!

     
  • mwatermann - 2006-07-31

    guten morgen, befürchte zwar, dass es nicht weiterhilft, aber trotzdem:

    mit

    zeitwert := TIME_TO_DWORD(TIME());

    bekommt man ja die systemzeit seit start in millisekunden.

    habe aber keine ahnung, wie es sich verhält, wenn man versucht diese alle millisekunde auszulesen, bzw. ob das sinnvoll ist (je nach zykluszeit der applikation, bzw. echtzeitfähigkeit + cpu last).

    ich habe mir verschiedene timerflags gebastelt, die sich an der zykluszeit des programmes orientieren; dabei war es für mich aber erst ab 50ms flag (bis 60sek) sinnvoll timer zu erstellen, da die zykluszeit des programms 10ms ist...

    mfg MW

     
  • chichiberti - 2006-08-02

    Der 841 Controller von WAGO hat eine Echtzeituhr. Für das Auslesen dieser Echtzeituhr gibt es die Funktion CurTimeEx in der SysLibTime. Darin ist unter anderem eine Struktur SysTime64 mit dem Wert der Echtzeituhr in Mikrosekunden vorhanden.

    Ich musste leider feststellen, dass dieser Wert ca. 5 Sekunden auf 60 Sekunden nachgeht! Erstaunt hat mich auch, dass in der Struktur SystemTimeDate, die von der Funktion CurTimeEx zurück gegeben wird, die Millisekunden nicht eingetragen werden, obwohl eine Variable definiert ist mit Milliseconds: UINT.

    Hat jemand Erfahrung mit dieser Funktion CurTimeEx?

     
  • grauerwolf - 2006-08-14

    hallo chichiberti,

    bin auch gerade am Millisekunden basteln, ich habe die millisekunden von time() genommen und an einen Date-Time-String hintenran concated. ich stelle fest, daß ich irgendwie 2 vollkommen verschiedene Dinge verbinde. Da ich Timestamps für eine Reihe gezählte Ereignisse damit erzeugen will, erkenne ich, das die Millisekunden nicht stimmen. Zähler und Timestamp haben nicht die gleiche Reihenfolge.

    Wenn Du mit CurTimeEx Erfolg hast, würde mich Deine Lösung stark interessieren.

    Viele Grüße

     
  • Uwe - 2006-08-16

    Die interne Uhr des 841 hat nur eine Sekundenauflösung.

    Daher wird mit CurTimeEx in der Struktur SystemTimeDate das Element Milliseconds nicht gefüllt.

    Die IEC-Timer sind vom Systemtakt abgeleitet und haben eine ms-Auflösung.

    Man muss nun das Element Milliseconds in der Struktur mit einem IEC-Timer ergänzen.

    Problem : Die Uhr und die Timer laufen asynchron und müssen daher entsprechend synchronisiert werden.

    D.h. wenn die Sekunde der internen Uhr wechselt muss der ms-Anteil 0 sein und der ms-Anteil sollte nicht über 999 hinaus laufen.

    Ich habe hierzu ein Beispielprojekt angehängt.

    Vielleicht hilft es euch weiter.

    Uwe

    msTimer.zip [5.5 KiB]

     
  • grauerwolf - 2006-08-16

    Hallo,

    das Beispiel funktioniert hervorragend, war eine große Hilfe, Danke.

    Allerdings habe ich an einer dünnen Stelle gebohrt. Mein Problem ist noch ein vielleicht triviales:

    UINT_TO_STRING liefert nach meinen Erkenntnissen keine definierte Länge(wo soll ich die auch angeben). Wenn ich also einen Timestamp konstanter Länge (z.B. 2006-08-16-09:10:10.123) ausgeben soll, würde z.B. der Monat August aus der Struktur SystemTimeDate nur "8" und nicht "08" liefern. Also nahm ich als Zeitstring DT_TO_STRING, denn dort wird eine konstante Länge erzeugt und hängte dann die ms hinten ran.

    Frage :

    Ist nun die RTC-Zeit dieselbe wie CurtimeEx ??

    Wenn nicht, wie kann man denn vernünftig Ausgabe-Konvertieren in einen String ( die Länge abfragen und Vornullen einschieben habe ich für die ms schon gemacht, aber für alle Werte ist das schon aufwendig, oder?)?

     
  • Uwe - 2006-08-16

    Viele Wege führen nach Rom, aber der von grauerwolf ist gefährlich !

    Da die interne Uhr asynchron zur PLC läuft darf ich auch nur einmal die Zeit holen und muss auf diese Zeit die ms synchronisieren.

    Wenn ich nun wie in meinem vorherigen Beispiel die Zeit mit CurTimeEx hole und hierauf die ms synchronisiere, dann kann ich nicht einfach zu einem

    anderen Zeitpunkt z.B. mit SysRtcGetTime die Zeit erneut auslesen und die ms

    einfach vom ersten Aufruf übernehmen (ist ja nicht synchronisiert).

    Könnte ja sein das ich beim ersten Aufruf z.B. 10:23:05 erhalte und 999 ms dazu synchronisiere

    und beim Aufruf von SysRtcGetTime (der ja zeitlich z.B. 1 ms später erfolgt) die Sekunde schon umgesprungen ist.

    Ich würde dann 10:23:06 erhalten und einfach die 999 ms dazurechnen.

    Geht also nicht.

    Besser das was zusammen gehört entsprechend formatieren (ist auch nicht so schwer).

    Ich habe hierzu das Beispiel noch einmal erweitert.

    Die Format-Funktion kann sich jeder so anpassen wie er sie gern hätte.

    Uwe

    msTimer.zip [6.34 KiB]

     
  • grauerwolf - 2006-08-17

    Hallo Uwe,

    Mist, wenn einem die Faulheit so direkt und schnell um die Ohren gehauen wird. Zur Entschuldigung: die String-Formatierung hätte ich so nie hingekriegt.

    Das Problem mit Deinem Beispiel von 999ms und dann einer Sekunde Differenz hatte ich vor der ms-Synchronisation ja schon erkannt, nur waren es dort hunderte ms Differenz. Jetzt wären es (absolut) nur wenige oder gleich mal eine Sekunde.

    Ich fühle mich ertappt...

    Das Beispiel ist sehr gut.

     
  • grauerwolf - 2006-08-17

    Nachdem ich SysTime64 auswerte, fällt mir auf, das ich meinen Timestamp in diesem Format doch speichern könnte (Ringspeicher) und erst wenn die Daten aus der PLC rausgehen, bräuchte ich diesen Timestamp in einen String umwandeln. Wenn ich zum Umwandeln der gemerkten Zeit CurTimeEx mit der gemerkten SysTime64-zeit als Eingang einsetze, bekomme ich immer wieder die aktuelle Zeit (eigentlich verständlich, liest doch CurTimeEx die Echtzeituhr aus). Wie also kann ich denn eine gemerkte SysTime64-Zeit in SystemTimeDate-Format bringen ??

    Der Ringspeicher würde um ca. 13 Byte pro Datensatz erleichtert, was der Anzahl der merkbaren Datensätze sehr entgegenkommen würde.

     
  • Uwe - 2006-08-17

    Nee geht nicht.

    SysTime64 enthält nur Zeitspanne seit Systemstart.

    Also nicht die absolute Uhrzeit oder gar das Datum.

    Wenn man Speicher sparen will oder muss, dann kann man ein eigenes Format zum Speichern der Werte anlegen.

    Am einfachsten geht das mit einer eigenen Struktur in der man die einzelnen Werte für z.b. Tag / Monat u.s.w. ablegt.

    Man kann dann für die meisten Werte den Typ BYTE statt UINT nehmen (spart schon mal 50%).

    Denn Tag / Monat / Stunde / Minute / Sekunde / Wochentag sind alle kleiner 255 also reicht ein Byte.

    Wenn man die Werte geschickt in der Struktur anordnet werden auch keine Füllbytes durch Wordalignment hinzugefügt.

    Auch bleiben die Werte lesbar in der Statusanzeige.

    Ich habe hierzu noch einmal das Beispiel erweitert.

    In dem Beispiel belegt jeder Eintrag 10 Byte.

    (man könnte noch komprimieren ist aber blödsinn weil zu aufwendig und schlecht beim debuggen)

    Man würde die Variable "MeineSpeicherZeit" in einem Ringbuffer speichern und könnte sie bei der Weitergabe an z.B. einen

    externen Rechner durch die entsprechende Funktion "FORMAT_MeinZeitFormat" einfach in einen formatierten String konvertieren.

    Uwe

    msTimer_01.zip [7.17 KiB]

     
  • grauerwolf - 2006-08-17

    Hallo Uwe,

    so mach ich es. Ich nehme noch DayOfWeek ganz weg und ziehe vom Jahr "1990" ab, so daß auch hier ein Byte reicht (sollte noch ca. 239 Jahre reichen, dann muß jemand anderes eine Programmkorrektur vornehmen). Dann habe ich 8 Byte Länge - genau so viele wie das SysTime64-Format . Beim String-Erzeugen darf ich bloß die Addition von 1990 zum Jahr nicht vergessen.

     

Log in to post a comment.