CLICK und "summende Relais"

Begonnen von charlie85, 22. Januar 2018, 22:47:59

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

charlie85

Hallo,

ich bin gerade dabei die ersten Schritte der Hausautomation mit einer Beckhoff SPS zu realisieren. Die eingesetzten Taster werden anhand von CLICK ausgewertet auf SINGLE, DOUBLE und TRIPLE, in den meisten Fällen wird dann ein Relais getoggelt. Funktionier soweit prima, aber wenn ein Taster lange gedrückt wird (statt einem oder mehreren kurzen Klicks), toggelt das Relais so schnell, dass es zum "summen" anfängt. Eine ziemlich zuverlässige Methode das angeschlossene Relais und Leuchtmittel ins Jenseits zu befördern.

Was ist eine "saubere" Methode um das zu verhindern? Z.B. das Toggeln eines Relais/erneutes Auslösen des Tasters nach einer Aktion für 1-2 Sekunden zu unterbinden?


IF InButton_10_03.SINGLE THEN
OutLight_10_07 := NOT OutLight_10_07;
END_IF


Vielen Dank für Eure Tipps!


ADS_0x1

#1
Du kannst bei TwinCAT Breakpoints im Code setzen. Wenn das Relais ein- und direkt wieder ausgeschaltet wird, dann schau dir mal verschiedene Zeitpunkte an, indem du Breakpoints in eine einfache IF-Abfrage setzt:

IF ausgang THEN
blubb := TRUE; // <= Hier Breakpoint auf eine Nonsens-Zuweisung setzen
END_IF;


Dann kannst du mit weiterlaufen lassen, bis das nächste mal der Ausgang gesetzt wird oder gesetzt bleibt. Um das Relais nicht zu himmeln, kannst du das erst einmal auf eine andere Variable legen.

Ansonsten kann man nur vermuten, was du angestellt hast, denn du fütterst uns nicht gerade mit Informationen... dein Codeausschnitt wird dir mit den Breakpoints wahrscheinlich das Verhalten zeigen, warum es nicht klappt.

Der Click-Baustein hält den Ausgang lediglich für einen Zyklus auf HIGH, also musst du dir danach eine Selbsthaltung oder ein Flip-Flop hinsetzen, damit das ganze gespeichert wird.

Für dich als Hausaufgabe also:

- Flip Flop googlen
- Selbsthaltung googlen
- OSCAT Building manual lesen, Abschnitt 'CLICK'
- Breakpoints setzen

Damit solltest du deinem Problem auf die Schliche kommen.

Viele Grüße!

Edit:

Habe ein Beispiel für dich, Stichwort Stromstoßschalter:
https://www.sps-forum.de/codesys-und-iec61131/85633-zentral-aus-fuer-stromstossschalter.html

mattsches

@ADS_0x1: Dass die Ausgänge SINGLE, DOUBLE und TRIPLE vom CLICK nur als Impulse ausgegeben werden, also nur für einen Zyklus anstehen, stimmt nicht:

ZitatDer entsprechende Ausgang bleibt mindestens einen Zyklus aktiv und maximal solange wie der Eingang IN aktiv bleibt.

Der Code bestätigt das für mich auch, ohne es jedoch noch einmal ausprobiert zu haben.

@charlie85:

Für das Umschalten deines Relais solltest du daher nicht direkt den Bausteinausgang nehmen, sondern ihn vorher über eine Flankenerkennung ziehen. R_TRIG heißt der entsprechende Baustein, ist in der Standard.lib enthalten. Die R_TRIG-Instanz rufst du im Code nach dem betreffenden CLICK auf, übergibst ihr als CLK InButton_10_03.SINGLE und baust deinen Dreizeiler so um:


IF <Name der R_TRIG-Instanz>.Q THEN
OutLight_10_07 := NOT OutLight_10_07;
END_IF


Dann schaltet dein Relais bei jedem Drücken um (toggeln), ohne zu summen.

Wenn du auch mit DOUBLE und TRIPLE etwas toggeln willst, brauchst du dafür je eine weitere R_TRIG-Instanz.

charlie85

#3
@ADS_0x1:

Danke für den Hinweis, nach längerem Suchen wäre ich vermutlich auf dem vorgeschlagenen Weg zum Problem gekommen.

@mattsches:

Vielen Dank für den wertvollen Tipp. Problem und Ursache verstanden und über den Trigger gelöst. Soeben umgesetzt und erfolgreich getestet!


Resultat: Folgender FB (BUTTON) funktioniert analog zu CLICK, reagiert aber jeweils nur auf die steigende Flanke.
Q und STATUS sind außen vor, da derzeit nicht in Verwendung.

FUNCTION_BLOCK BUTTON
VAR_INPUT
in : BOOL;
END_VAR
VAR_OUTPUT
single : BOOL;
double : BOOL;
triple : BOOL;
END_VAR
VAR
_triggerSingle : R_TRIG;
_triggerDouble : R_TRIG;
_triggerTriple : R_TRIG;
_click    : CLICK;
END_VAR



_click(IN := in);

_triggerSingle(CLK := _click.single);
_triggerDouble(CLK := _click.double);
_triggerTriple(CLK := _click.triple);

IF _triggerSingle.Q THEN single := TRUE; ELSE single := FALSE; END_IF;
IF _triggerDouble.Q THEN double := TRUE; ELSE double := FALSE; END_IF;
IF _triggerTriple.Q THEN triple := TRUE; ELSE triple := FALSE; END_IF;

(*
Version 0.1
Date 01.02.2018

Extends the oscat CLICK (FB) to be active for one single cyclus
after a rising edge to prevent toggling during button is pressed
*)

Maradon