FB 1 Eingang - 3 Schaltzustände

Botchi

Level-1
Beiträge
19
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte einen Funktionsblock erstellen bei dem ich 1 Eingang und 3 Schaltzustände habe.
Das Ganze hab ich schon über 4 Netzwerke hin bekommen.
Allerdings möchte ich einen Block erstellen, denn ich öfters benutzen kann.

1 Eingang 3 Ausgänge.jpg

M15.4 ist im Grundzustand 1, M15.1 und M15.2 aus
1x Tasten M15.4 aus, M15.1 an, M15.2 aus
1x Tasten M15.4 aus, M15.1 aus, M15.2 an
1x Tasten wieder Grundzustand

Was muss ich jetzt tun, um einen Funktionsbaustein zu erstellen?
Merker können ausgetauscht werden.

Danke schonmal im Voraus.
 
Code:
FUNCTION_BLOCK FB_1IN_3OUT
VAR_INPUT
 IN:BOOL;
END_VAR
VAR_OUTPUT
 Grundzustand:BOOL;
 OUT1:BOOL;
 OUT2:BOOL;
END_VAR
VAR
 M_In:BOOL;
 MOut1:BOOL;
 MOut2:BOOL;
 MOut3:BOOL;
 M4:BOOL;
 PF1:R_TRIG;
 PF2:R_TRIG;
 PF3:R_TRIG;
 CU1:CTU;
 CU2:CTU;
 CU3:CTU;
END_VAR

//BEGIN

M_In:= IN;
(*Step1*)
PF1(CLK:=M_In);
CU1(
 CU:= PF1.Q,
 RESET:= M_In AND MOut3,
 PV:= 1);
MOut1:= CU1.Q AND NOT MOut2;
(*Step2*)
PF2(CLK:=M_In);
CU2(
 CU:= PF2.Q ,
 RESET:= M_In AND MOut3 ,
 PV:= 2 ,
 Q=> MOut2 );
(*Step3*)
PF3(CLK:=M_In);
CU3(
 CU:= PF3.Q,
 RESET:= M_In AND MOut3,
 PV:= 3,
 Q=> MOut3);
M4:=NOT MOut1 AND NOT MOut2;
Grundzustand:= M4;
OUT1:= MOut1;
OUT2:= MOut2;

//END FUNCTION BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Botchi,

zu Deinem Beispiel:
Du hast den Zählern in allen drei Netzwerken den gleichen Instanznamen "Zaehler1" gegeben.
Das führt früher oder später zu ganz merkwürdigem Programmverhalten.

Zur eigentlichen Frage:
Du musst beim Anlegen des Bausteins "Funktionsblock" anstatt von "Programm" auswählen.
Im erzeugten Funktionsbaustein kannst du im Deklarationsteil, unter VAR_INPUT, VAR_OUTPUT und VAR, Eingangs-, Ausgangs-, und lokale Variablen anlegen. (siehe Beispiel von el-cardinal)
Anschließend kannst du im Funktionsbaustein deine Logik mit den deklarierten Variablen programmieren.

Wenn du diesen Baustein mehrfach aufrufen willst, machst du das wie du das schon mit dem Zählerbaustein CTU gemacht hast.

Gruß L.T.
 
Hallo Botchi

Um Dein FUP-Programm in einen FB umzuformen brauchst Du eigentlich nur die Merker durch FB-Variablen (lokale VAR) ersetzen und dann die 3 Variablen mit den Schaltzuständen an FB-Outputs ausgeben. Dabei beachten: keine FB-Outputs zurücklesen und nicht auf FB-Inputs schreiben. Den Merker %MX15.0 mit dem Taster-Signal ersetze durch einen FB-Input.

Dein FUP-Programm ist allerdings sehr umständlich realisiert, das würde ich noch ändern
- Um sicherzustellen, daß von den 3 Ausgängen immer nur einer aktiv ist, nimm besser nicht 3 Zähler sondern nur einen und werte dessen Zählerstand für die 3 Ausgangszuweisungen aus - 1 Zähler kann nur 1 Zählerstand haben.
- Vor einem Zähler (CTU) braucht man keine Flankenerkennung (R_TRIG) - der CTU hat bereits selbst eine Flankenerkennung und zählt nur bei steigender Flanke.
- Wenn man eine Flankenerkennung des selben Signals mehrmals braucht, dann braucht man nicht mehrere R_TRIG sondern kann des Ausgang Q nur eines R_TRIG mehrmals verwenden.

In FUP würde ich das so realisieren (ich habe kein Codesys, ich hoffe das ist so korrekt "gemalt" und funktioniert auch):
Code:
             Zaehler1
            +---------+
            |   CTU   |
         IN-|CU      Q|-
 Zaehler1.Q-|RESET  CV|-
          3-|PV       |
            +---------+

            +----+
            | EQ |
Zaehler1.CV-|    |-Q1
          0-|    |
            +----+

            +----+
            | EQ |
Zaehler1.CV-|    |-Q2
          1-|    |
            +----+

            +----+
            | GE |
Zaehler1.CV-|    |-Q3
          2-|    |
            +----+
Weiterschalten von Q3 zu Q1 passiert hier erst 1 Zyklus später als die steigende Flanke von IN. Falls das stört dann kann man den Code-Block mit dem Zaehler1 zweimal direkt nacheinander programmieren/aufrufen (damit der Zählerstand = 3 noch vor der Auswertung für die Outputs den Zähler auf 0 zurücksetzt), oder man könnte Q1 auch bei Zählerstand = 3 einschalten (Q1 := Zaehler1.CV = 0 OR Zaehler1.CV = 3)


Variante mit nur boolsche Verknüpfungen ohne Zähler:
Code:
      Trig1
   +----------+
   |  R_TRIG  |
IN-|CLK      Q|-
   +----------+

        +-----+     +----+
        | AND |     | OR |
     M2-|     |-----|    |--+--M3
Trig1.Q-|     |  +--|    |  |
        +-----+  |  +----+  +--Q3
        +-----+  |
        | AND |  |
     M3-|     |--+
Trig1.Q-o     |
        +-----+

        +-----+     +----+
        | AND |     | OR |
     M1-|     |-----|    |--+--M2
Trig1.Q-|     |  +--|    |  |
        +-----+  |  +----+  +--Q2
        +-----+  |
        | AND |  |
     M2-|     |--+
Trig1.Q-o     |
        +-----+

        +-----+
        | AND |
     M2-o     |--+--M1
     M3-o     |  |
        +-----+  +--Q1

Die Variablen des FB
Code:
FUNCTION_BLOCK FB_SCHIEB3
VAR_INPUT
  IN : BOOL;
END_VAR
VAR_OUTPUT
  Q1 : BOOL;
  Q2 : BOOL;
  Q3 : BOOL;
END_VAR
VAR
  M1 : BOOL;
  M2 : BOOL;
  M3 : BOOL;
  Trig1 : R_TRIG;
  Zaehler1 : CTU;
END_VAR

Harald
 
Zurück
Oben