Gelöst -- SWITCH_X auf 8 Taster erweitern

Begonnen von tugsi, 27. Dezember 2012, 15:03:24

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

tugsi

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

tugsi

Hallo,

ich gebe mir hier mal selbst die Antwort :)

Nachdem ich erst jetzt wieder Zeit hatte, darüber mal zu schauen und im SCL-Syntax eigentlich kein Problem sah, hab ich einfach nochmal den FB und dazugehörigen DB gelöscht und das neu einegstellt und siehe da, es funktioniert  ;D

Schätze habe den DB noch auf alt gehabt, da ich erst die Originale SWITCH_X mit 6 Tastern getestet hatte.

Tja, manchmal liegt die Lösung so nah :)

Gruß
Thomas