FB_LocalSystemTime
In einigen Anwendungen wird die lokale Windows-Systemzeit mit Hilfe des SNTP-Zeitservers oder einer Funkuhr synchronisiert. Oft muss die lokale Windows-Systemzeit (z.B. als Zeitstempel Log-Meldungen an das HMI) in der SPS verwendet werden (die lokale Windows-Systemzeit wird in der Taskleiste eingeblendet). Für solche Anwendungen kann der FB_LocalSystemTime-Funktionsbaustein nützlich sein.
Dieser Funktionsbaustein vereint intern die Funktion folgender Funktionsbausteine: RTC_EX2, NT_GetTime, FB_GetTimeZoneInformation und NT_SetTimeToRTCTime. Mit Hilfe des RTC_EX2-Bausteins können z.B. Zeitstempel für Log-Ausgaben generiert werden. Dieser Baustein hat aber den Nachteil, dass seine Uhrzeit nicht synchron mit der lokalen Windows Systemzeit läuft und zyklisch mit dem NT_GetTime-Funktionsbaustein nachsynchronisiert werden muss (siehe RTC-Bausteinbeispiele in der Dokumentation). Die zyklische Synchronisierung der eigenen Uhrzeit (systemTime-Ausgang) ist bereits in dem Funktionsbaustein implementiert. Die Zykluszeit ist über den dwCycle-Eingang konfigurierbar. Außerdem liefert der Funktionsbaustein Sommerzeit-/ Winterzeit-Zeitzoneninformation.
Der FB_LocalSystemTime-Funktionsbaustein muss zyklisch (z.B. jede Sekunde oder jedem Zyklus der SPS) aufgerufen werden. Dies ist notwendig damit die Uhrzeit zwischen den Synchronisierungen berechnet werden kann.
Bedingt genaue Systemuhr Die lokale Windows Systemzeit wird mit Hilfe der azyklischen Dienste (ADS-Funktionsbausteine) gelesen. Systembedingt kann die Laufzeit der ADS-Kommandos nicht festgelegt/geschätzt werden. Durch die unterschiedliche Kommandolaufzeiten und abhängig vom Betriebssystem, Synchronisations-Intervall und der Zykluszeit der SPS kann die Uhrzeit am systemTime-Ausgang jittern. Aus diesem Grund ist die vom Baustein gelieferte Uhrzeit nur bedingt für genauere Messaufgaben geeignet. Die Genauigkeit ist aber z.B. ausreichend für Anwendungen aus dem Bereich der Gebäudeautomatisierung. |
Sommerzeit/Winterzeit-Umschaltung
Der Funktionsbaustein kann nicht exakt zu dem Zeitpunkt aufgerufen werden bei dem die Umschaltung von Sommer- auf Winterzeit bzw. umgekehrt stattfindet. Um aufwendige Berechnungen zu vermeiden wurde folgende Implementierung gewählt (am Beispiel erklärt).
In unserem Beispiel synchronisiert der Funktionsbaustein z.B. alle 60 Sekunden die eigene Uhrzeit mit der lokalen Windows Systemzeit (grau).
Die SPS-Applikation benötigt und liest die Uhrzeit am Funktionsbaustein z.B. alle 30 Sekunden (blau). In unserem Beispiel wird die Sommer/Winterzeit-Umschaltung mit einer Verspätung von 15 Sekunden erkannt. Dieses Verhalten dürfte aber für die meisten Applikationen unproblematisch sein.
Umschaltung Winterzeit -> Sommerzeit
- ...
- 30-03-2008-01:58:10, tzID = Winterzeit
- 30-03-2008-01:58:15, nach internen Synchronisation
- 30-03-2008-01:58:40, tzID = Winterzeit
- 30-03-2008-01:59:10, tzID = Winterzeit
- 30-03-2008-01:59:15, nach internen Synchronisation
- 30-03-2008-01:59:40, tzID = Winterzeit
- 30-03-2008-02:00:00, das Betriebssystem stellt die Zeit von 2 Uhr auf 3 Uhr um
- 30-03-2008-02:00:10, tzID = Winterzeit (immer noch!)
- 30-03-2008-03:00:15, nach internen Synchronisation, folgende tzID = Sommerzeit
- 30-03-2008-03:00:40, tzID = Sommerzeit
- 30-03-2008-03:01:10, tzID = Sommerzeit
- 30-03-2008-03:01:15, nach internen Synchronisation
- 30-03-2008-03:01:40, tzID = Sommerzeit
- ...
Umschaltung Sommerzeit -> Winterzeit
- ...
- 26-10-2008-02:58:10, tzID = Sommerzeit
- 26-10-2008-02:58:15, nach internen Synchronisation
- 26-10-2008-02:58:40, tzID = Sommerzeit
- 26-10-2008-02:59:10, tzID = Sommerzeit
- 26-10-2008-02:59:15, nach internen Synchronisation
- 26-10-2008-02:59:40, tzID = Sommerzeit
- 26-10-2008-03:00:00, das Betriebssystem stellt die Zeit von 3 Uhr auf 2 Uhr um
- 26-10-2008-03:00:10, tzID = Sommerzeit (immer noch!)
- 26-10-2008-02:00:15, nach internen Synchronisation, folgende tzID = Winterzeit
- 26-10-2008-02:00:40, tzID = Winterzeit
- 26-10-2008-02:01:10, tzID = Winterzeit
- 26-10-2008-02:01:15, nach internen Synchronisation
- 26-10-2008-02:01:40, tzID = Winterzeit
- ...
VAR_INPUT
VAR_INPUT
sNetID : T_AmsNetID := '';
bEnable : BOOL;
dwCycle : DWORD(1..86400) := 5;
dwOpt : DWORD := 1;
tTimeout : TIME := DEFAULT_ADS_TIMEOUT;
END_VAR
sNetID: Hier kann ein String mit der Netzwerkadresse des TwinCAT-Rechners angegeben werden, dessen Uhrzeit für die Synchronisation benutzt werden soll. Für den lokalen Rechner kann auch ein Leerstring angegeben werden.
bEnable: Bei einer steigenden Flanke an diesem Eingang wird die sofortige Synchronisation der eigenen Uhrzeit mit der lokalen Windows Systemzeit ausgelöst. Der Ausgang bValid wird solange auf FALSE gesetzt bis die Synchronisation abgeschlossen wurde. Durch die erste steigende Flanke wird die zyklische Synchronisation aktiviert. D.h. die danach folgenden zyklischen Synchronisierungen werden automatisch ausgeführt. Die Applikation muss in den meisten Fällen nur ein Mal diesen Eingang auf TRUE setzen.
dwCycle: Zykluszeit (in Sekunden) in der der Funktionsbaustein die eigene Uhrzeit nachsynchronisiert. Die zyklische Synchronisation wird nach der ersten steigenden Flanke am bEnable-Eingang aktiviert. Default: Synchronisation alle 5 Sekunden.
dwOpt: Zusätzliche Optionsparameter. Zur Zeit stehen folgende Parameter zur Verfügung:
- Bit 0: Wenn gesetzt dann wird zusätzlich die Windows Systemzeit zyklisch zu der Hardware-Uhr (RTC) synchronisiert (entspricht der Funktion: NT_SetTimeToRTCTime). Default: Aktiviert.
Auf einem Windows CE-System hat diese Option keine Bedeutung.
tTimeout: Gibt die Timeout-Zeit an, die bei der Ausführung der internen ADS-Kommandos nicht überschritten werden darf.
VAR_OUTPUT
VAR_OUTPUT
bValid : BOOL;
systemTime : TIMESTRUCT;
tzID : E_TimeZoneID := eTimeZoneID_Invalid;
END_VAR
bValid: Die Uhrzeit am systemTime-Ausgang ist ungültig wenn dieser Ausgang FALSE ist. Beim TRUE ist die Uhrzeit gültig (wurde mindestens ein Mal mit der lokalen Windows Zeit synchronisiert).
systemTime: Lokale Windows-Systemzeit.
tzID: Zeitzonen-Information (Sommerzeit, Winterzeit).
Beispiel in ST:
Im Beispiel wird der FB_LocalSystemTime-Funktionsbaustein beim Programmstart aktiviert (steigende Flanke am bEnable-Eingang). Nachdem die Uhrzeit synchronisiert wurde (bValid = TRUE) schreibt die SPS alle 500 ms eine Meldung ins TwinCAT System Logview. Die interne Synchronisierung wird jede Sekunde durchgeführt.
PROGRAM MAIN
VAR
fbTime : FB_LocalSystemTime := ( bEnable := TRUE, dwCycle := 1 );
logTimer : TON := ( IN := TRUE, PT := T#500ms );
END_VAR
fbTime();
logTimer( IN := fbTime.bValid );
IF logTimer.Q THEN
logTimer( IN := FALSE ); logTimer( IN := fbTime.bValid );
ADSLOGSTR( ADSLOG_MSGTYPE_HINT OR ADSLOG_MSGTYPE_LOG, 'Local System Time:%s', SYSTEMTIME_TO_STRING(fbTime.systemTime));
END_IF
Die geschriebenen Meldungen können Sie im TwinCAT System Manager Logview sehen.
Weitere Zeit-, Zeitzone-Funktionen und -Funktionsbausteine:
FB_TzSpecificLocalTimeToSystemTime, FB_TzSpecificLocalTimeToFileTime, FB_SystemTimeToTzSpecificLocalTime, FB_FileTimeTimeToTzSpecificLocalTime, FB_GetTimeZoneInformation, FB_SetTimeZoneInformation, NT_SetLocalTime, NT_GetTime, NT_SetTimeToRTCTime, F_TranslateFileTimeBias, FB_LocalSystemTime
Voraussetzungen
Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken |
---|---|---|
TwinCAT v2.10.0 Build > 1328 | PC or CX (x86) | TcUtilities.Lib |