FB_LocalSystemTime

FB_LocalSystemTime 1:

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.

FB_LocalSystemTime 2:

Jitter!

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 unterschiedlichen 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

Umschaltung Sommerzeit -> 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 (Typ: T_AmsNetID). 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. Zurzeit stehen folgende Parameter zur Verfügung:

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 einmal mit der lokalen Windows Zeit synchronisiert).

systemTime: Lokale Windows-Systemzeit (Typ: TIMESTRUCT).

tzID: Zeitzonen-Information (Sommerzeit, Winterzeit) (Typ: E_TimeZoneID).

Beispiel:

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 „Error List“-Fenster. 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 „Error List“-Fenster sehen.

FB_LocalSystemTime 3:

Weitere Zeit-, Zeitzone-Funktionen und -Funktionsbausteine:

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS-Bibliotheken (Kategoriegruppe)

TwinCAT v3.1.0

PC oder CX (WES7/Win7/Win10: TC RT x86/x64, WEC6/7: TC RT x86, WEC7: TC CE7 ARMV7, TC/BSD: TC RT x64, TC OS ARMT2)

Tc2_Utilities (System)