Systemzeit auslesen

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?
 
Ich tippe mal darauf, dass die Zykluszeiten nicht eingehalten werden. Überprüfe das doch einmal im Systemmanager.
 
Hallo drfunfrock

Wie kann kann ich im Systemmanager prüfen ob es dabei zu Problemen kommt? (Ich habe die Funktion Auto-Start nicht aktiviert)

Gruß
Stefan
 
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.
 
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.
 
ich dachte das würde ohnehin mit meinem code nur 1x pro zyklus aufgerufen werden. Wozu prüfung zyklen? Verursacht bei mir +10% mehr cpu
 
+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?
 
Oder einfacher: Mit TIME();

Achtung: Pseudocode!
Code:
IF bSync THEN
    tsSystemTime := F_SyncTime();
    tsOutput := tsSystemTime;
    tLastSync := TIME();
ELSE
    tsOutput := tsSystemTime + (TIME() - tLastSync);
END_IF
 
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.
Könntest du mir ein Code snippet schicken?
Danke
 
Für die Nutzung dieser Website sind Cookies erforderlich. Du musst diese akzeptieren, um die Website weiter nutzen zu können. Erfahre mehr…