Hallo,
ich versuche mich gerade in einer Hausautomatisierung und habe dabei hier die OSCAT-Bibliothek entdeckt, eine feine Sache.
Ich habe hier eine Beckhoff von IBH-Softec stehen, auf der ein Step7 draufgeflanscht wurde.
Hintergrund, CodeSys hab ich noch nie programmiert, S5 und S7 haben wir auf der Arbeit und kann/kenn ich wenigstens ein wenig
Jetzt aber zu meiner Frage:
Hab hier von Jung den 8-fach-Taster und dazu Euren Switch_X, der ist aber nur mit 6 Tastern belegt.
OK dachte ich, dann mach doch einfach zwei hinzu :-)
Gesagt getan, Step7 und den SCL-Editor aufgerufen und eingepflegt, übersetzt und zack... shit SPS geht direkt in Stop
Wo habe ich einen Denkfehler, das übersetzen gibt keine Fehlermeldung aus.
FUNCTION_BLOCK SWITCH_X
TITLE = 'SWITCH_X'
//
VERSION : '1.0'
AUTHOR : oscat
NAME : SWITCHX
FAMILY : ELECT
VAR_INPUT
IN1 : BOOL;
IN2 : BOOL;
IN3 : BOOL;
IN4 : BOOL;
IN5 : BOOL;
IN6 : BOOL;
IN7 : BOOL;
IN8 : BOOL;
END_VAR
VAR_OUTPUT
Q1 : BOOL;
Q2 : BOOL;
Q3 : BOOL;
Q4 : BOOL;
Q5 : BOOL;
Q6 : BOOL;
Q7 : BOOL;
Q8 : BOOL;
Q31 : BOOL;
Q41 : BOOL;
Q51 : BOOL;
Q61 : BOOL;
Q71 : BOOL;
Q81 : BOOL;
Q32 : BOOL;
Q42 : BOOL;
Q52 : BOOL;
Q62 : BOOL;
Q72 : BOOL;
Q82 : BOOL;
END_VAR
VAR_INPUT
t_debounce : TIME := t#50ms;
END_VAR
VAR
init : BOOL;
T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8 : TOF;
tx: TIME;
x1: BOOL;
x2: BOOL;
E1, E2 : BOOL;
END_VAR
BEGIN
(* initialize on startup *)
IF NOT init THEN
init := TRUE;
IF t_debounce < t#50ms THEN tx := t#50ms; ELSE tx := t_debounce; END_IF;
T_1(PT := Tx);
T_2(PT := Tx);
T_3(PT := Tx);
T_4(PT := Tx);
T_5(PT := Tx);
T_6(PT := Tx);
T_7(PT := Tx);
T_8(PT := Tx);
ELSE
Q1 := FALSE;
Q2 := FALSE;
Q3 := FALSE;
Q4 := FALSE;
Q5 := FALSE;
Q6 := FALSE;
Q7 := FALSE;
Q8 := FALSE;
Q31 := FALSE;
Q41 := FALSE;
Q51 := FALSE;
Q61 := FALSE;
Q71 := FALSE;
Q81 := FALSE;
Q32 := FALSE;
Q42 := FALSE;
Q52 := FALSE;
Q62 := FALSE;
Q72 := FALSE;
Q82 := FALSE;
END_IF;
(* read inputs and debounce *)
T_1(IN := IN1);
T_2(IN := IN2);
T_3(IN := IN3);
T_4(IN := IN4);
T_5(IN := IN5);
T_6(IN := IN6);
T_7(IN := IN7);
T_8(IN := IN8);
(* detect edge of IN1 and IN2 *)
IF t_1.Q AND NOT E1 THEN X1 := TRUE; END_IF;
IF t_2.Q AND NOT E2 THEN X2 := TRUE; END_IF;
IF t_1.Q THEN
IF t_3.q THEN
q31 := TRUE;
X1 := FALSE;
ELSIF t_4.q THEN
q41 := TRUE;
X1 := FALSE;
ELSIF t_5.q THEN
q51 := TRUE;
X1 := FALSE;
ELSIF t_6.q THEN
q61 := TRUE;
X1 := FALSE;
ELSIF t_7.q THEN
q71 := TRUE;
X1 := FALSE;
ELSIF t_8.q THEN
q81 := TRUE;
X1 := FALSE;
END_IF;
ELSIF t_2.Q THEN
IF t_3.q THEN
q32 := TRUE;
X2 := FALSE;
ELSIF t_4.q THEN
q42 := TRUE;
X2 := FALSE;
ELSIF t_5.q THEN
q52 := TRUE;
X2 := FALSE;
ELSIF t_6.q THEN
q62 := TRUE;
X2 := FALSE;
ELSIF t_7.q THEN
q72 := TRUE;
X2 := FALSE;
ELSIF t_8.q THEN
q82 := TRUE;
X2 := FALSE;
END_IF;
(* in1 was active alone *)
ELSIF NOT T_1.Q AND E1 AND X1 THEN
Q1 := TRUE;
X1 := FALSE;
ELSIF NOT T_2.Q AND E2 AND X2 THEN
Q2 := TRUE;
X2 := FALSE;
ELSIF T_3.Q THEN
Q3 := TRUE;
ELSIF T_4.Q THEN
Q4 := TRUE;
ELSIF T_5.Q THEN
Q5 := TRUE;
ELSIF T_6.Q THEN
Q6 := TRUE;
ELSIF T_7.Q THEN
Q7 := TRUE;
ELSIF T_8.Q THEN
Q8 := TRUE;
END_IF;
(* save state of in1 and in2 *)
E1 := T_1.Q;
E2 := T_2.Q;
END_FUNCTION_BLOCK
Vielen Dank
Gruß
Thomas