Witam,
Odpisuję z pewnym opóźnieniem, może już probem rozwiązany, ale jak nie to podpowiem jak u mnie to rozwiązalem. Mam dosłownie ten sam scenariusz, lampkę przed gankiem zapalam po zachodzie słońca a gaszę o 23:00.
W bloku zmiennych mam:
PROGRAM READ_CLOCK
VAR
CurrentLocal, Sunset_Offset: DATE_AND_TIME;
CurrentTimeInt : INT;
Sun : FbCalculateSunriseSunset := (xDST:= TRUE, rTimeZone := 1, rLatitude := XX.XX, rLongitude := YY.YY);
Switch_Sunset_Offset: F_TRIG;
Switch_11PM: R_TRIG;
END_VAR
a w kodzie programu:
GLOBAL.CURRENT_TIME := SysRtcGetTime(TRUE);
CurrentLocal := UTC_TO_LTIME(
UTC := GLOBAL.CURRENT_TIME,
DST_ENABLE := TRUE,
TIME_ZONE_OFFSET := 60
);
CurrentTimeInt := HOUR_OF_DT(CurrentLocal) * 60 + MINUTE_OF_DT(CurrentLocal);
Switch_11PM(CLK := CurrentTimeInt > 1380);
Sun(dtUTC_Time := GLOBAL.CURRENT_TIME);
Sunset_Offset := Sun.dtSunset + T#40M;
Switch_Sunset_Offset(CLK := CurrentLocal < Sunset_Offset);
Potem, w bloku gdzie steruję lampką:
...
Ganek(
xButton := Wiatrolap_Dolny.xShort OR ModbusGanek,
xCentralOn := READ_CLOCK.Switch_Sunset_Offset.Q,
xCentralOff := Wiatrolap_Lewy.xLong OR Schody_Parter.xLong OR READ_CLOCK.Switch_11PM.Q
);
...
"Ganek" to zmienna FbLatchingRelay. Generalnie całe rozwiązanie opiera się na użyciu zbocza opadającego do stwierdzenia czy czas obecny nie jest już mniejszy niż czas zachodu (+offset). Do wyłączenia używamy zbocza rosnącego do sprawdzenia czy obecna godzina dnia ma więcej minut niż 1380 (23 * 60). Oba podpinamy do xCentralOn/Off dla włącznika.
pozdrawiam