TimerSwitch

Ein Zeitschalter ist eine Uhr, die eine Reihe von Ausgängen zu festgelegten Zeiten ein- oder ausschaltet. Die Schaltzeiten sind individuell konfigurierbar.

Der folgende Ausschnitt zeigt die Definition einer bestimmten TimeZone.

Beispiel

Die Hauptinseln Neuseelands nutzen die Neuseeland-Standardzeit (NZST), 12 Stunden vor UTC. In den Sommermonaten - vom letzten Sonntag im September bis zum ersten Sonntag im April - wird die Sommerzeit (NZDT) berücksichtigt und die Uhren um eine Stunde vorgestellt.

Siehe: https://en.wikipedia.org/wiki/Time_in_New_Zealand

tzTimeZoneNZST : TimeZone :=
(
    iBias := 12*60 (* T#1M *),
    asgPeriod := [
    ( (* (NZDT -> NZST) - First Sunday in April at 03:00:00.000 (NZDT) *)
        sName:='NZST',
        dtDate := (uiMonth := 4, eWeekday := WEEKDAY.SUNDAY, uiDay := 1, uiHour := 3)
    ),( (* (NZST -> NZDT) - Last Sunday in September at 02:00:00.000 (NZST) *)
        sName := 'NZDT',
        dtDate := (uiMonth := 9, eWeekday := WEEKDAY.SUNDAY, uiDay := 5, uiHour := 2),
        iBias := 60 (* T#1M *)
    )]
);
Info

Aufgrund aktueller Mängel im Compiler können für den Eingang tzTimeZone des Bausteins TimerSwitch keine Konstanten verwendet werden. Daher ist es notwendig, eine Variable vom Typ TimeZone zu deklarieren und dieser Variable dann die Werte der vordefinierten Konstanten (z.B. TSW.gc_tzTimeZoneCET oder TSW.gc_tzTimeZoneUTC) zuzuordnen.

tzTimeZoneUTC : TimeZone := TSW.gc_tzTimeZoneUTC;
myTimerSwitch : TimerSwitch := (tzTimeZone := tzTimeZoneUTC);

Aufgrund eines weiteren Mangels im Compiler wird der Datentyp des Eingangs aslSchedule des Bausteins TimerSwitch falsch angezeigt. Das Folgende wäre richtig:

FUNCTION_BLOCK PUBLIC FINAL TimerSwitch EXTENDS CBML.LConC IMPLEMENTS ITimeSwitch, IDateTimeProvider
VAR_INPUT CONSTANT
    /// Source for the current date and time information in milliseconds since 1.1.1970 00:00:00.000
    itfDateTimeProvider : IDateTimeProvider := Globals.g_dtpDateTimeProvider;
    /// Compensation speed [ms/h] for the transition from one time zone period to another.
    tCompensationSpeed : TIME;
END_VAR
VAR_IN_OUT (* CONSTANT *)
    /// Switching Schedule
    aslSchedule : ARRAY[*] OF Schedule;
END_VAR

[...]