# Programmierung TwinCat PLC



## dirknico (3 September 2010)

Habe bisher eher mit Step7 zu tun, kleinere Sachen mit Beckhoff.
Nun soll aber unser komplettes S7-Programm auf Beckhoff umgestellt werden.
Ich bin schon mal damit angefangen einzelne Bausteine umzustellen und hätte nun gerne gewusst was ich in nachfolgendem Programmm besser / anders machen könnte/sollte.
Wäre für jede Anregung dankbar!

Es handelt sich hier um insgesamt 5 Stückzähler, 4 werden über 1 Signal gezählt und können einzeln zurück gesetzt werden. Zähler 5 wird immer nur um 1 hochgezählt.


```
FUNCTION_BLOCK FB46_Stueckzaehler
VAR_INPUT
    Impuls:BOOL;
    Presse_UT:BOOL;
    Freigabe_Zaehler_Kiste:BOOL;
    Freigabe_Zaehler_Auftrag:BOOL;
    Freigabe_Zaehler_Schicht:BOOL;
    Freigabe_Zaehler_Gesamt:BOOL;
END_VAR
VAR_OUTPUT
    Stueckzahl_erreicht:BOOL;
END_VAR
VAR
    FLK_1:R_TRIG;
    FLK_2:R_TRIG;
    Zaehler: INT;
END_VAR

FLK_1(CLK:=Impuls, Q=> );
FLK_2(CLK:=Presse_UT, Q=> );

IF FLK_1.Q=TRUE THEN
    (*Stückzähler Kiste*)
    IF Freigabe_Zaehler_Kiste THEN
        FB46_Stueckzaehler_Ist[1]:=FB46_Stueckzaehler_Ist[1]+FB46_Stueckzaehler_Teile_pro_Hub;
    END_IF
    (*Stückzähler Auftrag*)
    IF Freigabe_Zaehler_Auftrag THEN
        FB46_Stueckzaehler_Ist[2]:=FB46_Stueckzaehler_Ist[2]+FB46_Stueckzaehler_Teile_pro_Hub;
    END_IF
    (*Stückzähler Schicht*)
    IF Freigabe_Zaehler_Schicht THEN
        FB46_Stueckzaehler_Ist[3]:=FB46_Stueckzaehler_Ist[3]+FB46_Stueckzaehler_Teile_pro_Hub;
    END_IF
    (*Stückzähler Gesamt*)
    IF Freigabe_Zaehler_Gesamt THEN
        FB46_Stueckzaehler_Ist[4]:=FB46_Stueckzaehler_Ist[4]+FB46_Stueckzaehler_Teile_pro_Hub;
    END_IF
END_IF

(*Stückzähler Gesamthubzahl*)
IF FLK_2.Q=TRUE THEN
    FB46_Stueckzaehler_Ist[5]:=FB46_Stueckzaehler_Ist[5]+1;
END_IF

(*Stückzahl erreicht*)
IF (FB46_Stueckzaehler_Ist[1]>=FB46_Stueckzaehler_Soll[1]) OR
     (FB46_Stueckzaehler_Ist[2]>=FB46_Stueckzaehler_Soll[2]) THEN
    Stueckzahl_erreicht:=TRUE;
END_IF

(*Stückzähler zurücksetzen*)
FOR Zaehler:=1 TO 4 DO
    IF FB46_Stueckzaehler_null[Zaehler]=TRUE THEN
        FB46_Stueckzaehler_Ist[Zaehler]:=0;
    END_IF
END_FOR;
```


----------



## witkatz (6 September 2010)

Hi dirknico

das wird so wahrscheinlich funktionieren, aber du hast um Meckerei gebeten, also will ich etwas anmeckern. Mir persönlich gefällt es an deiner Projektstruktur nicht, dass du einen Funktionsblock verwendest, der auf globale Zählvariablen zugreift. Wenn du von dem FB mehrere Instanzen verwendest, wie das mit einem FB vorgesehen ist, dann zählen alle FB's die selben Variablen hoch. Ich würde entweder
1. das Array mit Zählvariablen FB46_Stueckzaehler_Ist lokal in VAR_OUTPUT deklarieren
oder
2. wenn es FB46_Stueckzaehler nur einmal im Projekt gibt, würde ich den Baustein als Programm und nicht als Functionblock definieren (einfach im Deklarationsteil FUNCTION_BLOCK mit PROGRAM überschreiben). Der Vorteil ist dann - du brauchst keine Instanzen und damit ist die Inbetriebnahme etwas einfacher. 

Gruß,
witkatz


----------

