Hallo,
in meinem Projekt möchte ich einen Taster per CLICK_MODE dekodieren und dann damit einen SWITCH_I tasten. Dabei ist mir aufgefallen, dass das nicht funktioniert.
Meine Vermutung: SWITCH_I schaltet erst, wenn eine Flanke erkannt wurde UND das neue Signal länger als T_debounce (10ms) gehalten wird. CLICK_MODE schaltet seinen Ausgang aber nur für einen Zyklus auf TRUE und damit eventuell kürzer als 10ms. Somit reagiert SWITCH_I nicht. Dieses Verhalten wird im SWITCH_I als entprellen bezeichnet. Meiner Meinung nach sollte beim Entprellen aber die erste Flanke den Schaltvorgang auslösen und danach die Flankenerkennung eine Totzeit einlegen.
Ich habe mal versucht den SWITCH_I zu ändern, ohne das Funktionalität verlorengeht. Dabei habe ich meinen DBOUNCE-Baustein verwendet, den ich in einem anderen Thread vorgestellt habe.
(* read system time *)
tx := DWORD_TO_TIME(T_PLC_MS());
(* debounce input *)
deb(IN:= IN, TD := T_debounce);
(* asynchronous set and reset first *)
IF set AND NOT rst THEN
Q := TRUE;
T_on := tx;
ELSIF rst THEN
Q := FALSE;
(* check FOR input edge *)
ELSIF (deb.Q XOR edge) THEN
T_on := Tx;
(* react on rising or falling edge depending on r_edge *)
IF r_edge XOR deb.Q THEN Q := NOT Q; END_IF;
(* wait for T_reconfig and adjust r_edge *)
ELSIF Tx - t_reconfig >= T_on THEN
r_edge := deb.Q;
END_IF;
IF Q AND T_on_max > t#0ms AND Tx >= T_on + T_on_max THEN
Q := FALSE;
END_IF;
edge := deb.Q;
In meiner Simulation funktioniert der modifizierte SWITCH_I jetzt hinter CLICK_MODE und auch sonst scheint das Verhalten gleich geblieben zu sein.
Gruß
Klaus