blind_security - position nach aktion wiederherstellen

Begonnen von volkmarrigo, 13. Februar 2008, 01:14:38

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

volkmarrigo

Hallo...

ich bin gerade dabei, meine (im moment leider noch virtuelle) jalosiesteuerung stein für stein aufzubauen. mächtige sache, die ihr da auf die beine gestellt habt.

nun bin ich beim blind_security angekommen und hab eine kleine "unschönheit" entdeckt. wenn ein ereignis (z.b. door) eintritt, wird die entsprechende position korrekt angefahren. allerdings wäre es nett, wenn die vorhergehende position wieder angefahren wird, wenn das ereignis abgeschlossen ist. das wird auch gemacht, vorausgesetzt das entsprechende blind_input objekt ist im automatikmodus. wenn dem nicht so ist und keine clicks durchgeführt werden, bleibt die jalousie offen bis nach dem manual_timeout der automatikmodus aktivert wird (im standard ja 1h). wenn ich die jalousie schliese, nach 5 minuten die tür öffne und gleich wieder schliesse, wird die jalouse nach 55 minuten wieder runtergefahren. ich hab ein bischen rumüberlegt und wäre auf folgende lösung gekommen.

nach dem deaktiveren eines ereignisses müsste der blind_security baustein für eine bestimmte zeit QU und QD auf true setzen, damit die jalousie wieder in den ursprünglichen zustand fahren können. nach ablauf der zeit oder wenn UP oder DN ungleich True sind, wird werden wieder die eingangswerte durchgeschläust.

Ich hab mal auf basis vom blind_security ein paar anpassungen gemacht, die das oben beschriebene realisieren sollte.


FUNCTION_BLOCK blind_security2
VAR_INPUT
UP, DN : BOOL;
S_IN : BYTE;
pi, ai : BYTE;
FIRE : BOOL;
Wind : BOOL;
Alarm : BOOL;
Door : BOOL;
Rain : BOOL;
END_VAR
VAR_INPUT CONSTANT
Alarm_UP : BOOL := TRUE;
END_VAR
VAR_INPUT CONSTANT
restore_timeout: TIME := T#60s;
END_VAR
VAR_OUTPUT
QU, QD : BOOL;
status : BYTE;
po, ao : BYTE;
END_VAR
VAR
tx: DWORD;
last_act: DWORD;
restore: BYTE;
END_VAR

IF Fire THEN
QU := TRUE;
QD := FALSE;
status := 111;
restore := 1;
ELSIF Wind THEN
QU := TRUE;
QD := FALSE;
status := 112;
restore := 1;
ELSIF alarm THEN
QU := Alarm_up;
QD := NOT Alarm_up;
status := 113;
restore := 1;
ELSIF Door THEN
QU := TRUE;
QD := FALSE;
status := 114;
restore := 1;
ELSIF Rain AND NOT (up XOR dn) THEN
QU := FALSE;
QD := TRUE;
status := 115;
restore := 1;
ELSE
status := S_IN;
po := pi;
ao := ai;
QU := UP;
QD := DN;

IF (restore = 1) THEN
IF (restore_timeout > t#0s) AND (UP = FALSE AND DN = FALSE) THEN
(* when a restore time is set and the automatic mode is not active,
   the activate the restore mode *)
restore := 2;
last_act := T_PLC_MS();
ELSE
restore := 0;
END_IF
END_IF

IF restore = 2 THEN
(* Manual operation or the timeout cancels the restore operation *)
IF (UP OR DN) OR (T_PLC_MS() - last_act >= TIME_TO_DWORD(restore_timeout)) THEN
restore := 0;
ELSE
QU := TRUE;
QD := TRUE;
END_IF
END_IF

END_IF;
END_FUNCTION_BLOCK


grüße

Volkmar

PS: womit erzeugt ihr die Oscat PDF dokumentation? Es gäbe da nämlich das programm HelpAndManual, mit dem man aus einmal erfassten inhalt eine windows hilfe, eine pdf datei oder eine html hilfe erzeugen kann  ;)