Blind_Night - Automatisches Schließen nach Spannungsausfall

Begonnen von WAGO_SPS, 05. November 2016, 19:00:54

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 2 Gäste betrachten dieses Thema.

WAGO_SPS

Hallo,

ich habe eine Frage zum Blind_Night.
Dieser Baustein schließt bei mir den Rollo bei Sonnenuntergang und Sonnenaufgang.
Funktioniert auch soweit ganz gut.
Wenn ich nun einen Stromausfall habe oder den Controller neu Starte, schließen die Rollos am selben Abend nicht.
Es benötigt immer erst einen Tag, dann geht es wieder.
Kann man das irgendwie einstellen, dass er trotzdem schließt?
Und ebenso dass es am morgen öffnet?
Es ist ja in dem Sinn kein Handeingriff gewesen, der die Funktion deaktiviert.

Die andere Frage ist der Initialisierungslauf des Blind_Control_S,
kann dieser auch deaktiviert werden?

Vielen Dank.
Gruß Tobias

HopeITworks

Hi,

ich denke mal es wird an dem Abend nicht geöffnet da die Berechnungen von CALENDAR noch nicht erfolgt sind? Oder woher nimmst du diese Daten?
Bei mir geht der Baustein nämlich auch nach CPU Neustart in der 1. Nacht bzw. am Abend des CPU Neustarts.

Morgen öffnen macht nicht der BLIND_NIGHT Baustein. Das gibt der Code nicht her. Die Doku hierzu stimmt leider nicht.

Du musst bei BLIND_INPUT den MasterMode auf True schalten. Wenn dann der Sonnenaufgang + Offset um ist, gehen die Rollo und Jalousie in die Position, in der sie waren BEVOR BLIND_NIGHT sie geschlossen hat. Ich finde dieses Verhalten auch doof und ich werde mir den Baustein daher auch umbauen um day_position, day_angle und den Öffnungszeitpunkt definieren zu können. So machst du vor Nachtstellung mal kurz ein Rollo halb auf, der BLIND_NIGHT fährt das Ding komplett zu und nach Sonnenaufgang fährt das Rollo dann nicht auf POS 255 (ganz auf) sondern wieder auf diese halbe Stellung welche du zuvor angesteuert hast. Nachvollziehbar ist das nicht so wirklich - und sinnvoll meines Erachtens auch nicht. Die Lichtverhältnisse sind ja bei Positionssetzung sicherlich ganz andere als wenn dann die Sonne aufgegangen ist.

mattsches

Hallo,

ich arbeite zwar mit dem Standard-Ansatz für die Tagposition (=über MASTER_MODE:=TRUE) und bin in der Praxis ganz zufrieden damit. Aber ich habe andere Anpassungen am BLIND_NIGHT vorgenommen, die für euch interessant sein könnten:


  • Direkte Nutzung der CX-Variable aus CALENDAR_CALC (vereinfacht die Parametrierung etwas, Typkonvertierungen entfallen, es wird immer mit der richtigen Uhrzeit gearbeitet (LTOD vs. UTC))
  • Die Verdunkelung abends funktioniert auch, wenn zum Zeitpunkt des Sonnenuntergangs die Jalousie auf Handbetrieb steht. In diesem Fall geht sie dann nicht gleich zu, sondern sobald der Automatikmodus aktiv wird (=Timeout der Handbedienung).
  • Fehler bei QU und QD behoben (waren bei aktivem Nachtbetrieb undefiniert, was bei OUT-Variablen eine beliebte, aber schwer zu findende Fehlerquelle für darstellt).

Falls für euch irrelevant, bitte einfach ignorieren.

Gruß,
mattsches

Deklaration:

FUNCTION_BLOCK BLIND_NIGHT
VAR_INPUT
UP, DN : BOOL;
S_IN : BYTE;
PI, AI : BYTE;
E_NIGHT : BOOL := TRUE;
E_DAY : BOOL := TRUE;
END_VAR
VAR_INPUT CONSTANT
SUNRISE_OFFSET : TIME;
SUNSET_OFFSET : TIME;
NIGHT_POSITION : BYTE;
NIGHT_ANGLE : BYTE;
END_VAR
VAR_IN_OUT
CX : CALENDAR;
END_VAR
VAR_OUTPUT
QU, QD : BOOL;
STATUS : BYTE;
PO, AO : BYTE;
END_VAR
VAR
night : BOOL;
last_night, last_day : DATE;
END_VAR

(*
version 1.4 12 jan 2015
programmer md
tested by tobias


*)


Code:

IF NOT (up AND dn) AND night THEN
(* manual operation at night will cancel operation for one night *)
night := FALSE;
ELSIF (cx.LTOD > cx.SUN_SET + sunset_offset) AND (last_night < cx.LDATE) AND NOT night AND e_night AND UP AND DN THEN
(* enable night *)
night := TRUE;
last_night := DT_TO_DATE(cx.LDT);
ELSIF (cx.LTOD > cx.SUN_RISE + sunrise_offset) AND (last_day < cx.LDATE) AND night AND e_day AND (last_night < cx.LDATE) AND UP AND DN THEN
(* disable night *)
night := FALSE;
last_day := DT_TO_DATE(cx.LDT);
END_IF;

(* shade at night only in auto mode and enable = true *)
IF UP AND DN AND night THEN
status := 141;
po := night_position;
ao := night_angle;
ELSE


po := pi;
ao := ai;
status := s_in;
END_IF;

QU := UP;
QD := DN;


(* revision history
hm 29. sep 2007 rev 1.0
original version

hm 5. oct 2007 rev 1.1
added enable input

hm 6. oct 2007 rev 1.2
added pos and angle inputs and outputs
night position and angle can now be configured
any manual operation at night will cancel night operation

md 29 dec 2013 rev 1.3
added CX variable for sunrise, sunset and date and time information;
activated night program only if automatic mode is detected (i.e.
don't skip auto closing when in manual mode);
corrected missing QU/QD assignment when in night mode

md  12 jan 2015 rev 1.4
removed type conversion for TOD and DATE variables by directly
accessing cx.LTOD and cx.LDATE members

*)

WAGO_SPS

Hallo Mattsches,

ja das hört sich gut an.
Hab den Blind_Night abgeändert.
Nur bekomme ich jetzt eine Fehlermeldung mit dem Kalender.
Ich habe das Problem, dass ich den neuen Eingang nicht mit dem Calender_Calc Baustein verknüpft bekomme,
sodass der Blind_Night die Uhrzeit und soweiter bekommt.
Wie muss ich die sachen deklarieren?
Kannst du mir hier ein Beispielprojekt zusenden?

Gruß Tobias


mattsches

Hi Tobias,

verstehe ich das richtig, dass du versucht hast, an CX die Instanz des CALENDAR_CALC anzubinden? Das funktioniert tatsächlich nicht nicht. Der Eingang erwartet eine Variable vom Typ CALENDAR. Das ist die, die beim CALENDAR_CALC an XCAL angebunden ist. Bei mir ist das eine globale Variable, eben vom Typ CALENDAR. Die wird dann einmal an CALENDAR_CALC.XCAL gehängt und an vielen anderen Stellen verwendet, eben auch an BLIND_NIGHT.CX.

Hilft dir das weiter?

Grüße,
mattsches

HopeITworks

#5
Ich habe mir, da mir das Verhalten mit MasterMode True nicht gefällt, einen sehr einfachen BLIND_DAY gebaut. Diesen hänge ich zwischen BLIND_NIGHT und BLIND_SECURITY und schon kann ich für jedes Rollo oder jede Jalousie eine Tagposition definieren, welche angefahren wird wenn eben der Nachtmodus und der BLIND_SHADE beide inaktiv sind. In den beiden Fällen schaltet sich der Baustein durchsichtig und fertig :) In allen anderen Fällen wartet der Baustein darauf, dass er in Automatikmodus fällt, und sobald S_IN = 130 ist (Automatikmodus), schaltet er die Tagposition zum BLIND_CONTROL durch.

Der MASTER_MODE im BLIND_INPUT muss dafür dann selbstverständlich auf FALSE geschalten werden.

IF ((#S_IN = 141 OR #S_IN = 151) AND #UP AND #DN) THEN
    #QU := #UP;
    #QD := #DN;
    #po := #pi;
    #ao := #ai;
    #status := #S_IN;
ELSIF #E_day AND #UP AND #DN THEN
    #QU := #UP;
    #QD := #DN;
    #po := #day_position;
    #ao := #day_angle;
    #status := 142;
ELSE
    #QU := #UP;
    #QD := #DN;
    #po := #pi;
    #ao := #ai;
    #status := #S_IN;
END_IF;


Ja, der Code ist sicherlich seeehr primitiv und ausbaufähig, aber er funktioniert bei mir bisher so wie gewünscht  ;D

mattsches

#6
Keine Sorge, das Innenleben des BLIND_NIGHT ist ja auch nicht gerade Rocket Science. Aber wozu auch, einfacher Code ist auch einfacher zu verstehen.

Anmerkung zu Deinem BLIND_DAY: Du könntest - wenn du möchtest - den Code noch etwas straffen, in der ersten und der letzten Bedingung wird ja dasselbe gemacht:


IF #E_day AND #UP AND #DN AND NOT (#S_IN = 141 OR #S_IN = 151) THEN
    #po := #day_position;
    #ao := #day_angle;
    #status := 142;
ELSE
    #po := #pi;
    #ao := #ai;
    #status := #S_IN;
END_IF;

#QU := #UP;
#QD := #DN;



Allerdings müsste nach meiner Einschätzung dein BLIND_DAY dazu führen, dass die Jalousie bei einem Handeingriff nach Ablauf von MANUAL_TIMEOUT wieder in die Tagesposition fährt. Ist die "geöffnet", kann man den Laden manuell also nur für die Timeout-Zeit schließen. Wenn das so gewünscht ist, passt es ja. Falls nicht, könntest du das Konstrukt mit der Hilfsvariable ("night") aus dem BLIND_NIGHT übernehmen und auf den Tagbetrieb anpassen. Dann schaltet ein (auch einmaliger) Handeingriff den Baustein für den Rest des Tages ab.

HopeITworks

Ja das mit dem Manual_Timeout und dem Zurückfahren in die BLIND_DAY Position war so gewünscht. Ich habe auch im BLIND_NIGHT diese Abschaltung für eine Nacht entfernt bei Handeingriff. So fährt bei mir nach 2H alles wieder dahin zurück. Das fanden wir bisher für uns am sinnvollsten :-)

Stimmt das ganze kommt auch mit weniger Zeilen aus - Danke für den Tip ;-) Habe bisher nur die Grundfunktion getestet um zu sehen ob alles wie gewünscht arbeitet bevor ich versuche den Code noch etwas zu verbessern  ;D

WAGO_SPS

Also das mit dem Kalender habe ich jetzt hinbekommen.
ich habe jetzt die Bedingung  mit dem Datum AND (last_day < cx.LDATE) aus dem Baustein entfernt.
Nun macht er es, wenn ich die Zeit im Controller ändere am gleichen Tag.

Also so komme ich mal klar.
Jetzt habe ich noch eine andere Frage:
Ich verwende Blind_Input als Single Mode.
Wie kann ich nun über einen Taster alle Rolladen schließen oder öffnen.
Ich möchte z. B. wenn ich außer Haus gehe die Rollos eventuell eine halbe Stunde früher schließen und das über einen Taster
oder eben alle auf einmal öffnen
Wo setze ich da an?
Wenn ich keinen SingleMode hätte könnte ich den Eingang am Blind_Input verodern.
Geht ja nun nicht so einfach, da ich ja nicht weiß in welcher Position der Blind_Input steht.
Also ob er beim nächsten Taster nach oben fährt oder nach unten, kann ja bei jedem rollo anders sein.

Gruß Tobias