Jalousie Steuerung wechselt die States nicht

TimVo04

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Programmierer!

In Vorbereitung auf meine Matura/Abitur, programmiere ich gerade eine Jalousiesteuerung. Ich will bei einmaligem Drücken des Tasters automatisch hoch oder runter fahren und bei längerem gedrückt halten (2s) in den Handbetrieb-State gehen. Der Wind-State wird nur durch einen Schalter ausgelöst, das funktioniert aber.

Ich habe das mithilfe von R_TRIG gelöst, allerdings wechselt mein Programm nicht in den nächsten State. Könntet ihr mir vielleicht den Fehler sagen? Dankeschön!

LG Tim


PROGRAM _INIT

S1_Rauf := 0;
S2_Runter := 0;


END_PROGRAM

PROGRAM _CYCLIC


R_TRIG_0(CLK := S1_Rauf);
R_TRIG_1(CLK := S2_Runter);

Rauf := R_TRIG_0.Q;
Runter := R_TRIG_1.Q;

TON_0(IN := (Jalousie = Z1_Auto_Rauf), PT := T#2s);
TON_1(IN := (Jalousie = Z2_Auto_Runter), PT := T#2s);

CASE Jalousie OF

Z0_Stopp:

A0_Rauf := 0;
A1_Runter := 0;

IF(Rauf AND NOT S4_Oben AND NOT S2_Runter) THEN
Jalousie := Z1_Auto_Rauf;
END_IF;

IF(Runter AND NOT S5_Unten AND NOT S1_Rauf) THEN
Jalousie := Z2_Auto_Runter;
END_IF;

Z1_Auto_Rauf;

A0_Rauf := 1;
A1_Runter := 0;

IF(TON_0.Q AND S1_Rauf AND NOT S2_Runter) THEN
Jalousie := Z3_Hand_Rauf;
END_IF;

IF(S2_Runter OR S4_Oben) THEN
Jalousie := Z0_Stopp;
END_IF;

Z2_Auto_Runter;

A0_Rauf := 0;
A1_Runter := 0;

IF(TON_1.Q AND S2_Runter AND NOT S1_Rauf) THEN
Jalousie := Z4_Hand_Runter;
END_IF;

IF(S1_Rauf OR S5_Unten) THEN
Jalousie := Z0_Stopp;
END_IF;

Z3_Hand_Rauf:

A0_Rauf := 1;
A1_Runter := 0;

IF( NOT S1_Rauf OR S4_Oben) THEN
Jalousie := Z0_Stopp;
END_IF;

Z4_Hand_Runter:

A0_Rauf := 0;
A1_Runter := 0;

IF( NOT S2_Runter OR S5_Unten) THEN
Jalousie := Z0_Stopp;
END_IF;

Z5_Wind_Rauf:

A0_Rauf := 1;
A1_Runter := 0;

IF(S4_Oben) THEN
Jalousie := Z6_Wind_Oben;
END_IF;

Z6_Wind_Oben:

A0_Rauf := 0;
A1_Runter := 0;

IF(NOT S3_Wind) THEN
Jalousie := Z0_Stopp;
END_IF;

END_CASE


IF(S3_Wind) THEN
Jalousie := Z5_Wind_Rauf;
END_IF;

END_PROGRAM

PROGRAM _EXIT
(* Insert code here *)

END_PROGRAM
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe mir deinen Code jetzt nicht wirklich angeschaut - ich beschreibe dir aber gerne wie ich es machen würde.
Du hast dich ja, so wie es aussieht für die 2-Tasten-Variante entschieden (es gibt auch noch die 1-Tasten-Variante - also alles nur mit einem Taster).
Handbetrieb heißt für mich : Fahre solange der Taster gedrückt ist
Su mußt also für deinen Taster erstmal einen Timer nehmen, der erkennt, ob der Taster LANG betätigt ist oder nur KURZ angetippt worden ist - hier würde ich zur Unterscheidung ca. 200 bis 400ms Verzögerung nehmen.
Konnte der Timer durchlaufen dann fährst du solange die Taste gedrückt wird.
Läuft der Timer nicht durch (es wurde nur getippt) dann setzt du dir einen Merker und mit dem Merker läßt du die Jalousie fahren.
Normalerweise haben die Jalousien aber keine Endschalter, die eine "Endlage erreicht" melden - kannst du also auch nicht verwerten. Du läßt also parallel mit dem Merker einen weiteren Timer laufen (ca. 20s - das mußt du ausprobieren), der das Ganze dann stoppt.
Das brauchst du jetzt natürlich für beide Richtungen ...
 
Ich habe mir deinen Code jetzt nicht wirklich angeschaut - ich beschreibe dir aber gerne wie ich es machen würde.
Du hast dich ja, so wie es aussieht für die 2-Tasten-Variante entschieden (es gibt auch noch die 1-Tasten-Variante - also alles nur mit einem Taster).
Handbetrieb heißt für mich : Fahre solange der Taster gedrückt ist
Su mußt also für deinen Taster erstmal einen Timer nehmen, der erkennt, ob der Taster LANG betätigt ist oder nur KURZ angetippt worden ist - hier würde ich zur Unterscheidung ca. 200 bis 400ms Verzögerung nehmen.
Konnte der Timer durchlaufen dann fährst du solange die Taste gedrückt wird.
Läuft der Timer nicht durch (es wurde nur getippt) dann setzt du dir einen Merker und mit dem Merker läßt du die Jalousie fahren.
Normalerweise haben die Jalousien aber keine Endschalter, die eine "Endlage erreicht" melden - kannst du also auch nicht verwerten. Du läßt also parallel mit dem Merker einen weiteren Timer laufen (ca. 20s - das mußt du ausprobieren), der das Ganze dann stoppt.
Das brauchst du jetzt natürlich für beide Richtungen ...
Ja ich versuche mal die Endschalter wegzubekommen, mithilfe von Timern. Eigentlich ist das von Grund auf ein ziemlich primitives Programm, ich wollte nur mal die R_TRIG Funktion testen.

Vielen Dank!
 
Zurück
Oben