BLIND_INPUT Doppelklick-Funktion Fehler?

Begonnen von Daniel79, 06. Januar 2009, 18:32:37

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

Daniel79

Ich bin letzte Tage auf diese Seite gestoßen und probiere gerade ein wenig die Bausteine zur Jalousiesteuerung aus.
Sie haben bei weitem mehr Funktionen als meine selbst erstellten.

Beim BLIND_INPUT in Verbindung mit dem BLIND_CONTROL ist mir aber eine Unstimmigkeit mit der Dokumentation aufgefallen. Bei Doppelklick und gesetztem DBL_CLK, soll ja die Vordefinierte Position angefahren werden und der D1/D2 Ausgang nicht gesetzt werden. In meinem Aufbau mit einem ifm AS-i Controller AC1354 und der CoDeSys 2.3 (Lib V3.03), hat er zwar die Position rausgegeben, aber auch die "D-Ausgänge" gesetzt. Wenn ich die Variable DBL_CLK auf FALSE setze, passiert am BLIND_INPUT garnichts mehr. Er gibt zwar den Status richtig aus, schaltet aber keinen Ausgang und die Position bleibt (wie sie es soll) unverändert.

Habe den Baustein mal verändert, so wie ich meine, dass die Funktion laut Dokumentation gegeben ist.
Alles was Fett geschrieben ist, habe ich geändert.

(* inputs S1 and S2 are debounced and then decoded for multiple clicks *)
s1e(in := S1, pt := DEBOUNCE_TIME);
s2e(in := S2, pt := DEBOUNCE_TIME);
s1d(in := (s1e.Q AND NOT SINGLE_SWITCH) OR (s1e.Q AND SINGLE_SWITCH AND NOT dir.Q), tc := CLICK_TIME);
s2d(in := (s2e.Q AND NOT SINGLE_SWITCH) OR (s1e.Q AND SINGLE_SWITCH AND dir.Q), tc := CLICK_TIME);

(* run the manual timeout timer *)
manual_timer(in := s1e.Q OR s2e.Q, rst := FALSE, PT := MANUAL_TIMEOUT);


(* check inputs and execute *)
IF IN THEN
   (* force mode *)
   manual_timer(rst := TRUE);   (* reset the manual timer to select auto_mode *)
   dir(rst := TRUE);   (* direction in single switch mode is next up *)
   D1 := D2 := FALSE;
   up := dn := FALSE;
ELSIF s1d.Q2 AND DBL_CLK1 THEN
   (* double click on s1 *)
   (* D1 := NOT D1; *)
   manual_timer(rst := TRUE);   (* reset the manual timer to select auto_mode *)
   dir(rst := TRUE);   (* direction in single switch mode is next up *)
   up := dn := FALSE;
ELSIF s2d.Q2 AND DBL_CLK2 THEN
   (* double click on s2 *)
   (* D2 := NOT D2; *)
   manual_timer(rst := TRUE);   (* reset the manual timer to select auto_mode *)
   dir(rst := TRUE);   (* direction in single switch mode is next up *)
   up := dn := FALSE;
ELSIF s1d.Q2 AND NOT DBL_CLK1 THEN
   (* double click on s1 *)
   D1 := NOT D1;
   manual_timer(rst := TRUE);   (* reset the manual timer to select auto_mode *)
   dir(rst := TRUE);   (* direction in single switch mode is next up *)
   up := dn := FALSE;
ELSIF s2d.Q2 AND NOT DBL_CLK2 THEN
   (* double click on s2 *)
   D2 := NOT D2;
   manual_timer(rst := TRUE);   (* reset the manual timer to select auto_mode *)
   dir(rst := TRUE);   (* direction in single switch mode is next up *)
   up := dn := FALSE;

ELSIF s1d.Q1 AND CLICK_MODE THEN
   up := NOT up;
   dn := FALSE;
   D1 := D2 := FALSE;
ELSIF s2d.Q1 AND CLICK_MODE THEN
   dn := NOT dn;
   up := FALSE;
   D1 := D2 := FALSE;
ELSIF s1d.Q0 OR s2d.Q0 THEN
   up := dn := FALSE;
   D1 := D2 := FALSE;
END_IF;

(* monitor the maximum runtime *)
tm1(IN := up OR s1d.Q0, PT := MAX_RUNTIME);
tm2(IN := dn OR s2d.Q0, PT := MAX_RUNTIME);
IF tm1.Z OR tm2.Z THEN
   (* max runtime is reached, clear up and dn *)
   up := dn := FALSE;
END_IF;

(* set outputs QU and QD and monitor the maximum ontime *)
IF NOT manual_timer.Q THEN
   (* set automtik mode *)
   QU := QD := TRUE;
ELSE
   QU := tm1.Q;
   QD := tm2.Q;
END_IF;

(* set AO and PO *)
IF IN THEN
   PO := PI;
   AO := AI;
ELSIF s1d.Q2 AND DBL_CLK1 THEN
   PO := DBL_CLK1_POS;
   AO := DBL_CLK1_ANG;
ELSIF s2d.Q2 AND DBL_CLK2 THEN
   PO := DBL_CLK2_POS;
   AO := DBL_CLK2_ANG;
ELSIF NOT (QU AND QD) THEN
   PO := POS;
   AO := ANG;
END_IF;

(* set the direction flag dir *)
dir(cs := NOT QU, cr := NOT QD, rst := FALSE);

(* set the status output *)
IF IN THEN
   STATUS := 131;
ELSIF s1d.Q2 THEN
   STATUS := 135;
ELSIF s2d.Q2 THEN
   STATUS := 136;
ELSIF QU AND NOT QD THEN
   STATUS := 132;
ELSIF NOT QU AND QD THEN
   STATUS := 133;
ELSIF (QU AND QD AND (DBL_CLK1 OR DBL_CLK2)) OR  (QU AND QD AND NOT (DBL_CLK1 OR DBL_CLK2 OR D1 OR D2)) THEN
   STATUS := 134;
END_IF;

hugo

hallo daniel79,

der blind input wird in der nächsten release repariert