Bernard
Level-2
- Beiträge
- 205
- Reaktionspunkte
- 53
-> 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
Mit Vielen Grüßen Bernard
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