Erstellen eines Array[1..x] of FB,SFB in SCL

Bernard

Level-1
Beiträge
205
Reaktionspunkte
53
Zuviel Werbung?
-> Hier kostenlos registrieren
Allgemein ist es in S7 nicht möglich ein Array mit FB zu erstellen.Mit kleinen Tricks läßt diese Behinderung allerdings umgehen.
Ansatz:
Die Deklaration einer Multiinstanz stellt nicht den eigentlichen Funktionbaustein dar,sondern lediglich den Speicherbereich innerhalb des Instanz DB`s.
Wenn jetzt direkt hinter der Multiinstanz ein Speicherbereich (array[1..x] of struct) definiert wird,wobei jedes Element die gleiche Größe hat wie die Multiinstanz,läßt sich mittels Index[0],innerhalb einer Schleife,auf den Speicher der Multiinstanz zugreifen-austauschen.Somit ist es möglich für jeden Schleifendurchlauf mit anderen Daten in der Multiinstanz zu arbeiten.

Beispiel:
Zeitliches Entprellen eines Array`s von Eingängen.
Jeder Eingang hat seine eigene Entprellzeit.
Verwendeter SFB 3 "TP"

Beispielprojekt liegt bei

SCL Code
Code:
FUNCTION_BLOCK "Entprell"
//**********************************************************
VAR_INPUT
einwort:ARRAY[1..16] OF bool;  // Jeder Eingang wird bei true um einen
                               //zeitlichen Impuls verlängert
Zeitfeld:ARRAY[1..16] OF TIME; // Impulszeiten der einzelnen Eingänge
END_VAR
//**********************************************************
VAR_OUTPUT
Auswort:ARRAY[1..16] OF BOOL;    // Entprellte Ausgänge
END_VAR
//**********************************************************
VAR_TEMP
index:INT;//Schleifenindex 
END_VAR
//**********************************************************
VAR
    Index_Min_minus_1:INT:=0;//Hilfsindex um Speichervariable "Speicher_TP_Feld" mit [0] anzusprechen 
     TP_aktiv:"TP";//Speicherbereich-Name der Multiinstanz(SFB 3),verlängerter Impuls
    Speicher_TP_Feld:ARRAY[1..16] OF STRUCT//Speicher für Daten der einzelnen Schleifen
        wort_1:WORD;                       //Jedes Element des Array`s hat die gleiche Größe wie      
        wort_2:WORD;                       //die Multiinstanz.Die Variable "Speicher_TP_Feld" grenzt
        wort_3:WORD;                       //unmittelbar an die Multiinstanz an.                    
        wort_4:WORD;                       //Somit kann die Multiinstanz "TP_aktiv" als Element
        wort_5:WORD;                       //von "Speicher_TP_Feld" betrachtet werden.Es muß allerdings
        wort_6:WORD;                       //in einer Hilfsvariablen ( "index_Min_minus_1")der Index[0]eingeprägt
        wort_7:WORD;                       //sein,damit der Arraybereich 1 unterschritten werden kann.
        wort_8:WORD;                       //
        wort_9:WORD;                       //
        wort_10:WORD;                      //
        wort_11:WORD;                      //
        END_STRUCT;
END_VAR
//**********************************************************
BEGIN
index:=1;
    FOR index:=1 TO 16 BY 1 DO
        //---------------------------------  
        Speicher_TP_Feld[Index_Min_minus_1]:=Speicher_TP_Feld[index];
//Informationsübergabe mittels Speicherbereichsunterschreitung von "Speicher_TP_Feld" an die Multiinstanz     
//Speicher_TP_Feld[Index_Min_minus_1]=TP_aktiv
        //---------------------------------
        TP_aktiv(IN :=einwort[index],PT :=Zeitfeld[index]);//Entprellfunktion + Befehlsausgabe
        Auswort[index] := TP_aktiv.Q OR einwort[index];
        //---------------------------------
        Speicher_TP_Feld[index]:=Speicher_TP_Feld[Index_Min_minus_1];
//Informationsübergabe mittels Speicherbereichsunterschreitung von  Multiinstanz an "Speicher_TP_Feld"  
//Speicher_TP_Feld[Index_Min_minus_1]=TP_aktiv
        //---------------------------------
    END_FOR;
OK:=true;    
END_FUNCTION_BLOCK
Mit Vielen Grüßen Bernard
 

Anhänge

  • Entprell.zip
    38,8 KB · Aufrufe: 33
Hallo.
Ich kenn deine Vorgehensweise von 3S her. Sprich auf den Bachmann Systemen ist ein Array aus FB's kein Problem.
Ehrlich gesagt ich habe es in SCL noch nicht versucht. Deine Lösung find ich sehr interessant aber auch ein wenig verwirrend. Ich glaube nicht dass du damit viel Anklang finden wirst...
SLC ist noch lange kein AnsiC!!! Aber ich bin ja schon froh dass es den AT - Operator gibt :)
 
Zurück
Oben