Timer_EXT wirklich korrekt?

Begonnen von tugsi, 24. Dezember 2013, 17:42:32

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

tugsi

Hallo,
wollte mal den Timer-Ext einbauen und hab mal etwas mit den Zeiten gespielt, aber irgendwie schaltet der das nicht so ein wie ich möchte bzw auch nicht aus.
Wollte eigentlich mit dem Sonnenuntergang einschalten und um 23h ausschalten.
Also Sunset mit dem Calender eingebunden, dann T_SET_START auf 1s gestellt, damit der auch genommen wird. T_DAY_STOP hab ich auf 23h gestellt. Aber irgendwie geht da nichts wie es soll ;)

Hab mir gerade auch mal den SCL-Code angeschaut, da kommen mir ein paar Fragen auf.

Ich habe jetzt mal T_DAY_STOP beschaltet, wenn ich nur die Zeile sehe:
ELSIF T_DAY_STOP > TOD#00:00:0.0 AND tdx - T_DAY_STOP <= tc THEN
    (* turn off at specific daytime *)
    qx := FALSE;
    status := 112;

Dann ist doch die erste BEdingung auf jedenfall gewährleistet, da größer als 0.
tdx ist ja die aktuelle Uhrzeit, dies minus der Ausschaltzeit heisst ja, solange die Ausschaltzeit nicht erreicht ist, bin ich immer kleiner gleich tc (200ms Zykluszeit).
Müsste da nicht ein >= stehen?

Ich hab den Block mal etwas verändert.
Es ist ja eine ELSIF-Schleife, also immer wieder Bedingung erfüllt ja oder nein, bei ja zum Ende, bei nein nächste Bedingung.
Also habe ich die Ausschaltebedingungen priorisiert, vor den Einschaltbedingungen, dann mein >= noch rein und siehe da, der Baustein macht das was er soll.
Ich beschalte zum Beispiel mein Sunset und T_SET_START (1s), den T_SET_STOP (4h), T_DAY_STOP (23:00Uhr).
Alles andere immer mit 0 belegen als Zeiten.

Jetzt geht das Licht 1 Sekunde (T_SET_START) nach Sonnenuntergang (SUNSET) an.
Das Licht geht aus, wenn einer der beiden Bedingungen erfüllt ist, also entweder 23Uhr (T_DAY_STOP) oder eben 4 Stunden nach Sonnenuntergang (T_SET_STOP).  - Ist nur ein Beispiel-

Hier der geänderte Codeschnippsel:
ELSIF T_DAY_STOP > TOD#00:00:0.0 AND tdx - T_DAY_STOP >= tc THEN
    (* turn off at specific daytime *)
    qx := FALSE;
    status := 112;
ELSIF T_day_start > TOD#00:00:0.0 AND tdx - T_DAY_START >= tc THEN
    (* turn on at specified daytime *)
    qx := TRUE;
    status := 111;
ELSIF T_SET_start > T#0s AND tdx - SUN_SET + T_SET_START >= tc THEN
    (* turn on before sunset *)
    qx := TRUE;
    status := 115;
ELSIF T_SET_STOP > t#0s AND tdx - SUN_SET - T_SET_STOP >= tc THEN
    (* turn off after sunset *)
    qx := FALSE;
    status := 116;
ELSIF T_RISE_START > T#0s AND tdx - SUN_RISE + T_RISE_START >= tc THEN
    (* turn on before sunrise *)
    qx := TRUE;
    status := 113;
ELSIF T_RISE_STOP > T#0s AND tdx - SUN_RISE - T_RISE_STOP >= tc THEN
    (* turn off after sunrise *)
    qx := FALSE;
    status := 114;
END_IF;


Gruß
Thomas

tugsi

Doch noch ein Fehler drin :)
Eben noch geschrieben, dass Stop ja Vorrang hat, hab ich das beim Sunset und Sunrise nicht richtig sortiert ;)

ELSIF T_DAY_STOP > TOD#00:00:0.0 AND tdx - T_DAY_STOP >= tc THEN
    (* turn off at specific daytime *)
    qx := FALSE;
    status := 112;
ELSIF T_day_start > TOD#00:00:0.0 AND tdx - T_DAY_START >= tc THEN
    (* turn on at specified daytime *)
    qx := TRUE;
    status := 111;
ELSIF T_SET_STOP > t#0s AND tdx - SUN_SET - T_SET_STOP >= tc THEN
    (* turn off after sunset *)
    qx := FALSE;
    status := 116;
ELSIF T_SET_start > T#0s AND tdx - SUN_SET + T_SET_START >= tc THEN
    (* turn on before sunset *)
    qx := TRUE;
    status := 115;
ELSIF T_RISE_STOP > T#0s AND tdx - SUN_RISE - T_RISE_STOP >= tc THEN
    (* turn off after sunrise *)
    qx := FALSE;
    status := 114;
ELSIF T_RISE_START > T#0s AND tdx - SUN_RISE + T_RISE_START >= tc THEN
    (* turn on before sunrise *)
    qx := TRUE;
    status := 113;
END_IF;