BLIND_DARK

Begonnen von Homesps, 06. April 2012, 11:07:34

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

Homesps

Hallo,

BLIND_NIGHT aktiviert sich nur in zeitlicher Abhängigkeit von Sonnenuntergang und -aufgang. Die aktuelle Helligkeit wird dabei nicht berücksichtigt.
Da wir einen Helligkeitssensor in der Wetterstation haben, möchte ich die Aktivierung der Raffstore von der Helligkeit abhängig machen. Deshalb habe ich vom BLIND_NIGHT einen BLIND_DARK abgeleitet. Der ist momentan sehr simpel gehalten und sieht so aus:


IF UP AND DN AND E_DARK AND LIGHT < TWILIGHT THEN (* wenn im Automatikmodus, Baustein eingeschaltet und die Helligkeit kleiner als die Schwelle *)
status := 181; (* Status 181, BLIND_DARK aktiv *)
po := dark_position; (* Position bei Dunkelheit *)
ao := dark_angle; (* Lamellenwinkel bei Dunkelheit *)
ELSE
po := pi;
ao := ai;
status := s_in;
END_IF;

QU := UP;
QD := DN;


Den Baustein habe ich angehängt.

Gruß
Klaus

[gelöscht durch Administrator]

mike_roh_soft

Könntest du nicht einfach deinen Helligkeitswert abfragen und das Bit an den Eingang E_NIGHT vom BLIND_NIGHT hängen?
Nur wenn E_NIGHT TRUE ist fährt der Rollo runter!

Majaestix

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]

eloboy

Hallo Majaestix,

geht dein BLIND_DARK_2 Baustein auch mit BLIND_CONTROL_S?

bei mir fährt nichts.

Kann das sein der der BLIND_CONTROL_S Baustein den Status 123 benötigt um zu fahren?


[gelöscht durch Administrator]

Majaestix

Hallo Eloboy,

Zitatgeht dein BLIND_DARK_2 Baustein auch mit BLIND_CONTROL_S?

Sollte er, da alle Blind-Bausteine nur über die ESR Stati voneinander abhängen. Allerdings kann ich das nicht zu 100% bestätigen, da ich selber den BLIND_CONTROL_S nicht benutze. Der BLIND_CONTROL läuft bei mir seit ein paar Wochen gut.

ZitatKann das sein der der BLIND_CONTROL_S Baustein den Status 123 benötigt um zu fahren?

Keine Ahnung, wie oben gesagt, den BLIND_CONTROL_S habe ich (noch) nicht im Einsatz.

Ein Problem habe ich noch mit meinem BLIND_DARK_2, da er nur exakt einmal bei Sunrise und exakt einmal bei Sunset gertriggert wird, dass das Senden eines neuen Impulses immer 24 h Wartezeit bedingt.
Will sagen, gab es einen manuellen Eingriff, wird erst der nächste Trigger (Sunset/Sundown) ausgewertet.

Gruss

Majaestix