Hallo Hugo
Ich habe mir den Baustein XBLIND_NIGHT angesehen.
IF CX.LDATE <> last_set THEN (* event is only generated once per day *)
tmp := DINT_TO_TOD(TOD_TO_DINT(CX.SUN_SET) + SET_OFFSET * 60000);
IF (CX.LTOD > TSB AND cx.LTOD > tmp) OR CX.LTOD > TSE THEN
last_set := CX.LDATE;
timer(IN := TRUE, PT := TIMEOUT);
status := 101;
END_IF;
ELSIF CX.LDATE <> last_rise THEN (* event is only generated once per day *)
tmp := DINT_TO_TOD(TOD_TO_DINT(CX.SUN_RISE) + RISE_OFFSET * 60000);
IF (CX.LTOD > TRB AND CX.LTOD > tmp) OR CX.LTOD > TRE THEN
last_rise := CX.LDATE;
timer(IN := TRUE, PT := TIMEOUT);
STATUS := 102;
END_IF;
ELSE
timer.IN := FALSE;
END_IF;
Das würde bedeuten, ein neuer Tag beginnt und bei der If schleife würde dann CX.LDATE <> last_set so lange TRUE sein bis die Sonne untergegangen ist. Dann würde der elsif Zweig berücksichtigt dort ist aber die Sonnenaufgangsbedingung.
Fazit ich glaube die if und elsif sollten vertauscht werden.
Was bringt eigentlicht die Zuweisung timer.IN := FALSE; im else Zweig

Bei Aufruf des Timerbausteins wird sowieso dann immer IN:= TRUE mitgegeben.
Bin ich mit meiner Behauptung auf den Holzweg und ich habe gerade einen Knopf im Kopf?
ich bin noch immer beim Testen der Bausteine mir fehlt leider etwas Zeit.
Grüße,
GA_Home