CALL #meinFB_1
In := M0.0
Out := M0.1
CALL #meinFB_2
In := M1.0
Out := M1.1
CALL #meinFB_3
In := M2.0
Out := M2.1
U #meinFB_1.Wert
U #meinFB_2.Wert
U #meinFB_3.Wert
= m5.0
L 0
T "index"
L 3
NEXT: T
CALL #meinFB_Array["index"]
In := InArray["index"]
Out := OutArray["index"]
L "index"
LOOP NEXT
U #meinFB_Array[0].Wert
U #meinFB_Array[1].Wert
U #meinFB_Array[2].Wert
= m5.0
...
UC FB [#index]
...
Damit rufst Du allerdings NICHT verschiedene Instanzen eines FB auf sondern verschiedene FB<nr>, deren nr in #index steht.Code:... UC FB [#index] ...
Damit rufst Du allerdings NICHT verschiedene Instanzen eines FB auf sondern verschiedene FB<nr>, deren nr in #index steht.
Harald
Im übrigen halte ich nichts von solchen Schweinereien, die aus einer einmaligen Schreibfaulheit des Programmierers resultieren aber für immer das Programm total undurchsichtig machen.
Außerdem ist gar nicht sicher, ob dabei überhaupt irgendwas "gespart" wird, wenn die FB-Aufrufe mit verschiedenen Übergabeparametern versorgt werden müssen.
Harald
Code:... UC FB [#index] ...
Warum? Das hat der TE doch gar nicht gefragt, sieheja, genau das habe ich beschrieben.Damit rufst Du allerdings NICHT verschiedene Instanzen eines FB auf sondern verschiedene FB<nr>, deren nr in #index steht.
Harald
ich rufe innerhalb eines Multiinstanz FB mehrfach den selben FB, allerdings mit verschiedenen instanzen auf.
Ist es Möglich diese in einem Array unterzubringen und dann über eine Schleife aufzurufen?
Das geht eben nicht mit Deinem "UC FB [#index]". Deshalb ja auch das aufwändige Kopieren der kompletten Instanzdaten (Übergabeparameter + STAT!) zwischen dem Instanzen-Array und der Ausführ-Instanz im Codebeispiel von Thomas_V2.1Gern kann der TE auch einen FB mit fester
Nummer in ähnlicher Weise programmieren,
der #index wird dann nur für die Adressierung
der Array-Bereiche benutzt.
Das geht auch.
Es geht nicht um den Speicherplatz sondern: Der Wert der unterschiedlichen Aktualparameter muß in die Array-Instanzen kopiert werden und dann nochmal vom Array in die für den Aufruf genutzte Instanz. Was daran wohl vorteilhaft sein soll??? Da kann man doch auch ganz klassisch mit weniger Aufwand und schön übersichtlich jeden Instanz-Aufruf einzeln ausprogrammieren.Und der Speicher für die Übergabeparameter
wird doch so oder so schon in seinem Array
vorgehalten.
Hallo Ihr zwei,
nach genau so einer Lösung habe ich gesucht!
Ich probie das mal!
Vielen Dank!
chomp
So ein Schwachsinn....
Code:... UC FB [#index] ...
Der FB wird hier ohne Instanz-DB aufgerufen und
darf damit auch keine Bausteinparameter und keine
statischen Lokaldaten haben.
Wenn du schon einmal dabei bist, beim Nachdenken meine ich, dann käme vielleicht auch "meine" Lösung in Betracht. Ich hatte vor Jahren die selben Gedankengänge. Bei ähnlichen und wohl bemerkt über Jahre gut durchdachten Dingen lege ich einmalig einen UDT mit dem Inhalt der "Instanzdaten" an. Diesen UDT vereinbare ich x-fach in einem Global-DB und übergebe den DB an eine FC zur Bearbeitung. Ein zweiter Baustein-Parameter zeigt aus einem bestimmten Grund (bei mir HMI-Anbindung) auf eine weitere (einzelne) Variable von diesem Typ. Aus der DB-Größe und aus der UDT-Größe erkennt die FC die Anzahl der "Instanzen" und bearbeitet eine nach der anderen. In meinem Fall wird pro Zyklus immer nur eine Instanz bearbeitet. Grundlegend wichtig ist dass der UDT wirklich gut durchdacht ist. Nachträgliche Änderungen führen quasi zu einer neuen Generation der gesamten Bibliothek. Diese Schweinerei nenne ich "System".. allerdings wenn es sich nicht nur um eine einmalige Tipparbeit handelt sondern um mehrfache und es sich nochdazu nicht nur um 5 - 10 Aufrufe der selben Instanz handelt, sondern das ganze sich im hohen zweistelligen Bereich bewegt, bin ich gerene Bereit über so eine "Schweinerei" nachzudenken! ..
VAR
[COLOR="#0000FF"] meinFB_1 : meinFB; //Ventil 12Y1 Presszylinder
meinFB_2 : meinFB; //Ventil 12Y4 Schubzylinder horizontal
meinFB_3 : meinFB; //Ventil 14Y3 Hubzylinder vorne[/COLOR]
END_VAR
[COLOR="#0000FF"]CALL #meinFB_1
In := M0.0
Out := M0.1
CALL #meinFB_2
In := M1.0
Out := M1.1
CALL #meinFB_3
In := M2.0
Out := M2.1[/COLOR]
U #meinFB_1.Wert
U #meinFB_2.Wert
U #meinFB_3.Wert
= m5.0
VAR
FB_ARRAY : ARRAY[0..2] OF meinFB_t; //einzelnen Instanzen kann kein Kommentar und kein eigenes Symbol gegeben werden
doInst : meinFB;
END_VAR
VAR_TEMP
i : INT;
END_VAR
BEGIN
//Eingänge aller Instanzen mit ihren Aktualwerten versorgen:
[COLOR="#0000FF"] FB_ARRAY[0].In := M0.0;
FB_ARRAY[1].In := M1.0;
FB_ARRAY[2].In := M2.0;[/COLOR]
//alle Instanzen aufrufen
FOR i := 0 TO 2 DO
// Array-Instanz in Ausführ-Instanz kopieren
doInst.In := FB_ARRAY[i].In;
doInst.Out := FB_ARRAY[i].Out;
doInst.Wert := FB_ARRAY[i].Wert;
doInst.Stat1 := FB_ARRAY[i].Stat1;
doInst.Stat2 := FB_ARRAY[i].Stat2;
doInst.Stat3 := FB_ARRAY[i].Stat3;
// die Ausführ-Instanz aufrufen
doInst();
// Daten von Ausführ-Instanz in Array zurückkopieren
FB_ARRAY[i].In := doInst.In;
FB_ARRAY[i].Out := doInst.Out;
FB_ARRAY[i].Wert := doInst.Wert;
FB_ARRAY[i].Stat1 := doInst.Stat1;
FB_ARRAY[i].Stat2 := doInst.Stat2;
FB_ARRAY[i].Stat3 := doInst.Stat3;
END_FOR;
//alle Instanz-Ausgänge auf die Ausgangsvariablen schreiben:
[COLOR="#0000FF"] M0.1 := FB_ARRAY[0].Out;
M1.1 := FB_ARRAY[1].Out;
M2.1 := FB_ARRAY[2].Out;[/COLOR]
//Beispiel-Verknüpfung
M5.0 := FB_ARRAY[0].Wert AND FB_ARRAY[1].Wert AND FB_ARRAY[2].Wert;
END_FUNCTION_BLOCK
// Das findets jeweils in einem Multiinstanz FB statt den ich Pro Raum habe!
//Für jeden Lichtschalter im Haus
CALL #Switch
I_Enabled:=TRUE
Input :="E_Switch_Guest"
Q_SC :=
Q_DC :=
Q_LC :=
Q_Sig :=
// -----------------------------------------
// Lamp 1
// -----------------------------------------
// Toggle
O #Switch.Q_SC
O "GivenValueInterface".Lamps.Guest.Toggle
= #Toggle
// TurnOn
O "GivenValueInterface".Lamps.Guest.TurnOn
= #TurnOn
// TurnOff
O "StairsBasement".Switch_2.Q_SC
O "StairsFirstFloor".Switch_1.Q_DC
O "GivenValueInterface".Lamps.Guest.TurnOff
= #TurnOff
// TimedOn
O #Switch.Q_DC
O "GivenValueInterface".Lamps.Guest.TimedOn
= #TimedOn
CALL #Light
I_TimedOn:=#TimedOn
I_Toggle :=#Toggle
I_TurnOn :=#TurnOn
I_TurnOff:=#TurnOff
I_Enabled:="GlobalConfig".Lamps.Guest.Enabled
I_Time :="GlobalConfig".Lamps.Guest.TimeOnValue
Q_On :=
U #Light.Q_On
= "A_Li_Guest"
= "SystemState".Lamps.Guest
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?