Beckhoff R_TRIG Beispiel

klaus1

Level-2
Beiträge
134
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

folgendes Code Beispiel:
Code:
Deklaration: RisingEdgeButton: R_TRIG;
KatzeImHaus                    AT %I*:BOOL;
_i_b_EGWohnen_Taster_Sued_Button3_mi_li     AT %I*:BOOL;

RisingEdgeButton(CLK:=_i_b_EGWohnen_Taster_Sued_Button3_mi_li);
IF RisingEdgeButton.Q THEN
    IF KatzeImHaus THEN
        KatzeImHaus := FALSE;
    ELSE
        KatzeImHaus := TRUE;
    END_IF
END_IF

Problem: Ich drücke den Taster der _i_b_EGWohnen_Taster_Sued_Button3_mi_li und bekomme eine pos. Flanke, danach soll die interne Variable KatzeImHaus falls TRUE auf FALSE gehen und umgekehrt.

Aktuelles verhalten:
Kurzzeitig im Taskzyklus bekomme ich die Variable auf TRUE und wird sofort wieder mit FALSE überschrieben.
Variable KatzeImHaus soll sich immer nach Tastendruck ändern, und bleiben bis zum Nächsten Tastendruck.

danke
 
Beschreibst du deine Variable KatzeImHaus noch an anderen Stellen in deinem SPS Programm? Wird die Variable vielleicht sogar von extern überschrieben, da du die Variable als Eingangsvariable im Prozessabbild liegen hast?

Du kannst unten dein IF/ELSE-Konstrukt rund im KatzeImHaus auch einfach weglassen und stattdessen
Code:
KatzeImHaus := NOT KatzeImHaus;
schreiben, um das zu invertieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
erledigt mit FB_Light Block, da gibts einen toggle eingang mit dem man das bestens lösen kann.
Und wie hast Du da "KatzeImHaus" deklariert?

Nur einen eigentlich simplen Zweizeiler-Code durch einen von fremden Programmierern erstellten Blackbox-FB ersetzen dürfte das Problem nicht erledigt haben. Oft schadet es nichts, wenn man den Code auch versteht, den man so produziert...

Harald
 
Hallo Klaus1,
du musst das Schaltsignal erst einmal entprellen! Die SPS ist so schnell, dass sie das federn der Schalterkontakte zählen kann. Das geht einfach mit einem TOF.
RisingEdgeButton: R_TRIG;
entprellen: TOF;
KatzeImHaus AT %I*:BOOL;
_i_b_EGWohnen_Taster_Sued_Button3_mi_li AT %I*:BOOL;


entprellen(IN:=_i_b_EGWohnen_Taster_Sued_Button3_mi_li, PT:=t#100ms);
RisingEdgeButton(CLK:=entprellen.Q);
IF RisingEdgeButton.Q AND entprellen.Q THEN
IF KatzeImHaus THEN
KatzeImHaus := FALSE;
ELSE
KatzeImHaus := TRUE;
END_IF
END_IF
 
Zuletzt bearbeitet:
Zurück
Oben