Hallo Klaus,
ich habe mir mal ganz frech Deinen BLIND_DARK Baustein gekapert und ihn etwas modifiziert. Dabei habe ich dann auch gleich noch den XBLIND_NIGHT Baustein von Hugo zur Vorlage genommen. Jetzt reagiert der BLIND_DARK_2 auf einen Helligkeitssensor, prüft, ob Nacht ist und lässt die Eingabe von Positions- und Winkelangaben für Tag und Nacht zu. Ausserdem schleift er jetzt den Status und die Positionen der anderen Blind-Bausteine durch, ordnet sich also sauber in die Kette ein.
Die Variablen sehen wie folgt aus:
FUNCTION_BLOCK BLIND_DARK_2
(* abgeleitet von BLIND_NIGHT aus der Oscat -Lib at http://www.oscat.de *)
VAR_INPUT
UP : BOOL; (* Eingang AUF *)
DN : BOOL; (* Eingang AB *)
S_IN : BYTE; (* ESR kompatibler Status Eingang *)
PI : BYTE; (* Jalousiestellung im Automatikbetrieb *)
AI : BYTE; (* Lamellenwinkel im Automatikbetrieb *)
DARK_ENABLE : BOOL; (* Baustein aktiv *)
DAY_LIGHT : WORD; (* Helligkeit *)
END_VAR
VAR_IN_OUT
CX : CALENDAR; (* Kalenderdaten *)
END_VAR
VAR_INPUT CONSTANT
TWILIGHT : WORD; (* Aktivierungsschwelle *)
DARK_POSITION : BYTE; (* Position für Nachtschaltung *)
DARK_ANGLE : BYTE; (* Winkel für Nachtschaltung *)
LIGHT_POSITION : BYTE; (* Position für Tagschaltung *)
LIGHT_ANGLE : BYTE; (* Winkel für Tagschaltung *)
SWITCH_DEBOUNCE_TIME : TIME := T#90s; (* Verzoegerungszeit Lichterkennung *)
TIMEOUT : TIME := T#2m; (* force time for actions *)
END_VAR
VAR_OUTPUT
QU : BOOL; (* Motor auf Signal *)
QD : BOOL; (* Motor ab Signal *)
STATUS : BYTE; (* ESR kompatibler Status Ausgang *)
PO : BYTE; (* Aktuelle Jalousiestellung *)
AO : BYTE; (* Aktueller Lamellenwinkel *)
END_VAR
VAR
LIGHT_DEBOUNCE : DEBOUNCE; (* Enprellen Sonnenaufgang *)
DARK_DEBOUNCE : DEBOUNCE; (* Enprellen Sonnenuntergang *)
DAY_FLAG : BOOL := FALSE; (* ist Tag *)
NIGHT_FLAG : BOOL := FALSE; (* ist Nacht *)
TIMER : TOF_1; (* wie lange bleibt Tag/Nachschaltung aktiv*)
END_VAR
Hier folgt der Code:
(* Lichschwankungen / Bewoelkung ausgleichen *)
(* auf Tag pruefen *)
LIGHT_DEBOUNCE (IN := DAY_LIGHT > TWILIGHT (* Tageslicht > Lichtschewlle *)
AND NOT CX.NIGHT, (* Tageszeit liegt zwischen Sonnenauf- und Sonnenuntergang *)
TD := SWITCH_DEBOUNCE_TIME,
PM := TRUE, (* feuert genau 1x pro Zustandsaenderung*)
Q => DAY_FLAG);
(* auf Nacht pruefen *)
DARK_DEBOUNCE (IN := DAY_LIGHT < TWILIGHT (* Tageslicht < Lichtschewlle *)
AND CX.NIGHT, (* Tageszeit liegt zwischen Sonnenauf- und Sonnenuntergang *)
TD := SWITCH_DEBOUNCE_TIME,
PM := TRUE, (* feuert genau 1x pro Zustandsaenderung*)
Q => NIGHT_FLAG);
IF UP
AND DN (* Automatik aktiv *)
AND DARK_ENABLE THEN
IF NIGHT_FLAG = TRUE THEN
status := 101; (* Status 101, manuelle Steuerung aktiv, Sonnenuntergang Position *)
END_IF;
IF DAY_FLAG = TRUE THEN
status := 102; (* Status 102, manuelle Steuerung aktiv, Sonnenaufgang Position *)
END_IF;
TIMER (IN := DAY_FLAG OR NIGHT_FLAG,
PT := TIMEOUT);
ELSE
TIMER (IN := FALSE);
END_IF;
CASE STATUS OF
0: (* power up init *)
STATUS := 100;
100: (* standby *)
;
101: (* sunset position *)
IF NIGHT_FLAG = TRUE THEN
po := DARK_POSITION;
ao := DARK_ANGLE;
END_IF;
IF NOT timer.Q THEN
STATUS := 100;
NIGHT_FLAG := FALSE;
END_IF;
102: (* sunrise position *)
IF DAY_FLAG THEN
po := LIGHT_POSITION;
ao := LIGHT_ANGLE;
END_IF;
IF NOT timer.Q THEN
STATUS := 100;
DAY_FLAG := FALSE;
END_IF;
END_CASE;
QU := UP;
QD := DN;
Den Baustein habe ich auch nochmal drangehängt.
Also, vielen Dank für Deine Vorlage.
Gruss
Majaestix
[gelöscht durch Administrator]