Systemzeit auslesen

Zuviel Werbung?
-> Hier kostenlos registrieren
alle 2min dann kann es keinen Zusammenhang damit haben. Da die Zeit alle 1.2s gelesen wird..

Früher ist es ja gegangen. Hast etwas geupdate? Hast du es schon auf einem anderen Rechner/SPS Probiert?
 
Du musst einfach dein System in den Runmodus bringen und dann im Systemmanager bei geladener Konfiguration auf das SPS-Projekt gehen und dort auf die Task. Unter Online sind die Zeiten zu finden.
 
Ich bin vor kurzem bei TwinCAT auf das selbe Problem gestoßen, dass die Zeit manchmal nicht mehr aktualisiert wird. Im Normalfall sind es 3-5ms (Zykluszeit 1ms), aber manchmal hat es über 2 Sekunden gedauert.
Das ganze war kein Problem mit der Auslastung, sondern es scheint so, als würde ein laufender Timer das NT_Gettime blockieren. Immer wenn ich einen Timer in einem Funktionsblock gestartet habe (z.B. als Timeout), dann ist das busy bei NT_Gettime nicht mehr abgefallen.
Ich habe das jetzt so gelöst, dass ich die Zykluszeit als Konstante definiert habe und jeden Zyklus das Datum/Uhrzeit um eins hochzähle, damit meine Log Dateien wieder eine richtige aufsteigende Zeit haben (inkl. Millisekunden!!!). Das Gettime wird dann einmal in der Minute aufgerufen und die Zeit wird wieder synchronisiert z.B. wenn jemand gerade einen Breakpoint gesetzt hat oder es eine Zykluszeitüberschreitung gegeben hat.
Die Lösung reicht in meinem Fall aus, da es bei den Log Dateien egal ist, wenn die Uhrzeit auch einmal ein paar ms rückwärts zählt. Bei anderen Projekten kann das jedoch zu einem Problem werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bevorzuge folgende Variante:

Mit FB_GetTimeZoneInformation die UTC-Zeitverschiebung auslesen.

Mit GETSYSTEMTIME und FILETIME_TO_SYSTEMTIME hole ich mir die aktuelle Zeit und addiere die UTC-Verschiebung drauf.
 
Ich verwende folgendes auf dem CX9001:

Code:
VAR
    fbSystemTime     : GETSYSTEMTIME;
    timeAsFileTime    : T_FILETIME;
    _dt_Rtc             : DT;
END_VAR

fbSystemTime( timeLoDW =>timeAsFileTime.dwLowDateTime , timeHiDW =>timeAsFileTime.dwHighDateTime );
_dt_Rtc := FILETIME_TO_DT( timeAsFileTime );

Nur leider nimmt das die CPU ziemlich her... mir würde auch genügen alle paar Stunden mal abzugleichen, aber wenn ich GETSYSTEMTIME nicht konstant pro zyklus mache, habe ich nur die Uhrzeit/Datum der letzten abfrage...
Kann mir jemand sagen wie ich das hier lösen kann? Bzw. mit welchen Bausteinen?
Danke,
Klaus
 
Also ich nutze diese Bausteine. Prüfe dann über den CycleCount, ob ein neuer Zyklus vorhanden ist und aktualisiere ggf. den Wert. Damit habe ich einmal pro Zyklus den Aufruf der Zeit.
 
+10% durch eine einfache IF-Anweisung??

Da ich eine allgemeine Funktion geschrieben habe, welche mir die aktuelle Zeit als SystemTime liefert. Diese Funktion wird im Programm an vielen hunderten Stellen verwendet. Damit nicht jedes mal wieder der GetSystemTime aufgerufen wird, prüfe ich ob diesen Zyklus bereits die Zeit abgerufen wurde und gebe dann einen zwischengespeicherten Wert zurück. Das Auslesen vom CycleCount geschieht über die Struktur SYSTEMTASKINFOTYPE aus der TcSystem.lib.
 
hab noch eine zweite stelle gehabt. Mit einer einzigen stelle sinds 4% mehr cpu auslastung.
Wäre es nicht sinnvoller alle stunde mal die zeit zu synchronisieren, da der twincat server ohnehin nur alle paar stunden abfragt am ntp.
Nur wie lasse ich die zeit weiter laufen ? Mit Ton?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oder einfacher: Mit TIME();

Achtung: Pseudocode!
Code:
IF bSync THEN
    tsSystemTime := F_SyncTime();
    tsOutput := tsSystemTime;
    tLastSync := TIME();
ELSE
    tsOutput := tsSystemTime + (TIME() - tLastSync);
END_IF
 
Zurück
Oben