Steigende Flanke mit TOF - Verzweifle langsam

Schlappendulli

Level-1
Beiträge
29
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich bräuchte Hilfe mit folgendem Problem:
Per Wetterstation wird das Tageslicht gemessen. Z.B. bei 2 Lux sollen die Rolläden (nach Gruppendefinition) herunterfahren und z.B. bei 900 Lux wieder hochfahren.
Dazu muss ein Puls von ca 5s auf den KNX-Bus gesendet werden. Der jeweilige Rolladen in der Gruppendefinition (wird im HMI festgelegt) wird dann gefahren.
Folgender Code funktioniert einwandfrei für rauf und runter, aber leider jeweils nur 1x. Beim 2. Rauf- oder Runterfahren geht es nicht mehr.

Lokal definiert:
RTRIG_AB_Fahren,RTRIG_AUF_Fahren: R_TRIG;
Gr_P_AUF,Gr_P_AB: TOF;
AB_gefahren, AUF_gefahren: BOOL;
AB_fahren,AUF_fahren: BOOL;

Code:
[/B]
IF Tageslicht=Dunkelheit AND NOT AB_gefahren THEN
    IF    Gruppe_Auto_AB  THEN
        AB_fahren:=TRUE;
        RTRIG_AB_Fahren(CLK:= AB_fahren);
        Gr_P_AB(IN :=RTRIG_AB_Fahren.Q , PT:= T#5s);
        GruppeAB_Tageslicht:=Gr_P_AB.Q;
        IF NOT Gr_P_AB.Q THEN
            AB_gefahren:=TRUE;
        END_IF
        AB_fahren:=FALSE;
    END_IF
ELSIF Tageslicht=Helligkeit AND NOT AUF_gefahren THEN
    IF    Gruppe_Auto_AUF  THEN
        AUF_fahren:=TRUE;
        RTRIG_AUF_Fahren(CLK:= AUF_fahren);
        Gr_P_AUF(IN :=RTRIG_AUF_Fahren.Q , PT:= T#5s);
        GruppeAUF_Tageslicht:=Gr_P_AUF.Q;
        IF NOT Gr_P_AUF.Q THEN
            AUF_gefahren:=TRUE;
        END_IF
        AUF_fahren:=FALSE;
    END_IF
ELSIF Tageslicht>Helligkeit THEN
        AB_gefahren:=FALSE;
ELSIF Tageslicht=0 THEN
        AUF_gefahren:=FALSE;
END_IF
[B]

Anhang anzeigen SPSForum.txt als formatierter Text

Vielleicht kennt jemand eine elegantere Lösung. Mit Pulse_T von Oscat hatte ich es auch schon versucht, hat auch nicht geklappt. Eine globale Definition von R_Trig und TOF ändert ebenfalls nichts.

Schönen Sonntag
 
Zuletzt bearbeitet:
Nutze bitte mal für den Code die Codetags [CODE] [/CODE] bzw. das entsprechende Icon # in der 2. Iconreihe ganz am Ende. Dann läßt sich der Code besser lesen. Guckst Du:

Code:
IF Tageslicht = Dunkelheit AND NOT AB_gefahren THEN
    IF    Gruppe_Auto_AB THEN
        AB_fahren:=TRUE;
        RTRIG_AB_Fahren(CLK:= AB_fahren);
        Gr_P_AB(IN :=RTRIG_AB_Fahren.Q , PT:= T#5s);
        GruppeAB_Tageslicht:=Gr_P_AB.Q;
        IF NOT Gr_P_AB.Q THEN
            AB_gefahren:=TRUE;
        END_IF
        AB_fahren:=FALSE;
    END_IF;
ELSIF Tageslicht =Helligkeit AND NOT AUF_gefahren THEN
    IF    Gruppe_Auto_AUF  THEN
        AUF_fahren:=TRUE;
        RTRIG_AUF_Fahren(CLK:= AUF_fahren);
        Gr_P_AUF(IN :=RTRIG_AUF_Fahren.Q , PT:= T#5s);
        GruppeAUF_Tageslicht:=Gr_P_AUF.Q;
        IF NOT Gr_P_AUF.Q THEN
            AUF_gefahren:=TRUE;
        END_IF
        AUF_fahren:=FALSE;
    END_IF;
ELSIF Tageslicht > Helligkeit THEN
        AB_gefahren:=FALSE;
ELSIF Tageslicht = 0 THEN
        AUF_gefahren:=FALSE;
END_IF;

Ansonsten ist es immer schlecht, wenn Timer nicht in jedem Zyklus passiert werden, weil Sie sich z.B. innerhalb einer IF..ELSE-Verzweigung befinden. Dann haben sie in der Regel Schwierigkeiten, die Low-High-Flanke an ihrem Eingang zu erkennen und werden so nicht sicher gestartet oder beendet.
Du solltest also zuerst mal die Timer dort herauslösen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau, du kannst den Timer außerhalb der If...Then Abfrage aufrufen. (z.B. ganz am Ende) Aktiviert wird er ja mit der Variable am Input IN. Das Ergebnis kannst du an beliebiger Stelle jederzeit abfragen.

PS: Auch bei Flanken mußt du darauf achten, dass sie nicht nur True am Eingang "sehen", sondern auch das False, denn sonst können die naturgemäß ja keine Flanke erkennen!
Zur Sicherheit könntest du also auch die Flanken außerhalb der If...Then Anweisung anlegen.
 
Zuletzt bearbeitet:
Vielen Dank an Euch ! Danke für den Tip mit
Code:
, ich hatte mir mit der Textdatei fast einen abgebrochen. Wusste ich nicht, sorry.
Und schon gehts !

[CODE]
IF Tageslicht=Dunkelheit AND NOT AB_gefahren THEN
    IF    Gruppe_Auto_AB  THEN
        AB_fahren:=TRUE;
        IF NOT Gr_P_AB.Q THEN
            AB_gefahren:=TRUE;
        END_IF
    END_IF
ELSIF Tageslicht=Helligkeit AND NOT AUF_gefahren THEN
    IF    Gruppe_Auto_AUF  THEN
        AUF_fahren:=TRUE;
        IF NOT Gr_P_AUF.Q THEN
            AUF_gefahren:=TRUE;
        END_IF
    END_IF
ELSIF Tageslicht>Helligkeit THEN
        AB_gefahren:=FALSE;
ELSIF Tageslicht=0 THEN
        AUF_gefahren:=FALSE;
END_IF

RTRIG_AB_Fahren(CLK:= AB_fahren);
Gr_P_AB(IN :=RTRIG_AB_Fahren.Q , PT:= T#5s);
GruppeAB_Tageslicht:=Gr_P_AB.Q;
AB_fahren:=FALSE;

RTRIG_AUF_Fahren(CLK:= AUF_fahren);
Gr_P_AUF(IN :=RTRIG_AUF_Fahren.Q , PT:= T#5s);
GruppeAUF_Tageslicht:=Gr_P_AUF.Q;
AUF_fahren:=FALSE;

Ich dachte es ist kein Problem wenn die IF-Schleife solange offen ist wie der Timer läuft. Ausserdem würde der Zyklus durch die geschlossene IF Anweisung entlastet. Nun muss er halt jedesmal Flanke und TOF durchlaufen. Eine elegantere Lösung fällt mir im Moment nicht ein - totale Blockage.

Auf jeden Fall wieder was gelernt und es läuft.
DANKE.
Schönen Sonntag noch
 
du fragst IF tageslicht ======= das passiert ja fast nie also da soll <= stehen.
weiter sagst du wenn die tageslicht =0 dan ist die aufgeharen false das stimmt nicht, wenn die laden runter ist nicht wenn das licht anders ist.
 
Zurück
Oben