Multiinstanz-FB Aufrufe

waldi

Level-1
Beiträge
25
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an alle.
Ich hätte da eine Frage an euch Profis.
Ich muss eine Analge Standardisieren und habe z.B.: für Tanks einen
FB (5000) Programmiert der die Funktion drin hat um alle Tanksignale abzugfragen.

So um Platz zu sparen habe ich einen FB (4999) hergenommen um alle FB's zu Parametrieren. Der FB4999 ist Multiinstanz fähig.
Sprich ich habe einen DB4999 mit den ganzen Daten der FB's.

Mein Probelm ist nun folgendes. Ich rufe nun so ca. 18 mal den FB (5000) mit ensprechender Parametrierung auf. Funktionieren tut aber nur einer und zwar der erste Aufruf.

hier ein bisschen Code:
Netzwerk1: T-001
CALL #Tank_T001
Level_Transmitter:="T001_Level_Transmitter"
Temp_Transmitter :="T001_Temp_Transmitter"
LAHHH_dig_IN :="T001_LAHHH_dig_IN"
LAHH_dig_IN :="T001_LAHH_dig_IN"
LAH_dig_IN :="T001_LAH_dig_IN"
LAL_dig_IN :="T001_LAL_dig_IN"
LALL_dig_IN :="T001_LALL_dig_IN"
LALLL_dig_IN :="T001_LALLL_dig_IN"
LAHHH_out :="T001_LAHHH_out"
LAHH_out :="T001_LAHH_out"
LAH_out :="T001_LAH_out"
LAL_out :="T001_LAL_out"
LALL_out :="T001_LALL_out"
LALLL_out :="T001_LALLL_out"
TAHHH_out :="T001_TAHHH_out"
TAHH_out :="T001_TAHH_out"
TAH_out :="T001_TAH_out"
TAL_out :="T001_TAL_out"
TALL_out :="T001_TALL_out"
TALLL_out :="T001_TALLL_out"
Level :="T001_Level_Output"
Percent :="T001_Percent_Output"

Netzwerk2: T-002
CALL #Tank_T002
Level_Transmitter:="T002_Level_Transmitter"
Temp_Transmitter :="T002_Temp_Transmitter"
LAHHH_dig_IN :="T002_LAHHH_dig_IN"
LAHH_dig_IN :="T002_LAHH_dig_IN"
LAH_dig_IN :="T002_LAH_dig_IN"
LAL_dig_IN :="T002_LAL_dig_IN"
LALL_dig_IN :="T002_LALL_dig_IN"
LALLL_dig_IN :="T002_LALLL_dig_IN"
LAHHH_out :="T002_LAHHH_out"
LAHH_out :="T002_LAHH_out"
LAH_out :="T002_LAH_out"
LAL_out :="T002_LAL_out"
LALL_out :="T002_LALL_out"
LALLL_out :="T002_LALLL_out"
TAHHH_out :="T002_TAHHH_out"
TAHH_out :="T002_TAHH_out"
TAH_out :="T002_TAH_out"
TAL_out :="T002_TAL_out"
TALL_out :="T002_TALL_out"
TALLL_out :="T002_TALLL_out"
Level :="T002_Level_Output"
Percent :="T002_Percent_Output"

Wenn ich über PLCSIM oder WinCC Flexible auf die Ausgänge zu greifen will kommt nichts raus. Wenn ich mir im laufenden zustand den FB(5000) beobachte dann sind die Werte wie eingefroren und wechseln kurzzeitig, bei jedem Zyklus, den Wert und wieder zurück.

Bräuchte da wirklich Hilfe, da ich mit meinem Latein zu ende bin.:confused:
Danke schon mal im vorraus. :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der FB Funktioniert. An dem liegt es nicht, hoffe ich zumindest.
Da ist nicht besonders viel drin. Nur Signalverarbeitung mitunter auch der FC105 (Anag). Ansonsten ist da nur Lade und Tranfer und Umrechnungen drin.

Mein Problem ist folgendes. (neu herausgefunden).
Wenn ich z.B.: den T-002 aufrufe, wenn T-001 auskommtenirt ist, dann funktioniert der T-002. Beim T-003 ist es dan so das die jeweiligen zu schaltenen Ausgänge nur dan geschaltet werden wenn diese auch im T-002 Aufruf geschaltet wurden.
Sprci die Ausgänge bei den nachfolgenden Aufrufen sind abhängig von den hervorgehenden Aufrufen und das verstehe ich nicht.

Den FB5000 habe ich schon tausend mal überprüft. Wenn ich alle aufrufe auskommtenier bis auf einen, dann Funktioniert alles so wie ich das haben will. Nur bei zwei oder mehr aufrufen geht es nicht mehr.
 
Dieser Code funktioniert bei allen gleich.

// Scale Level_Transmitter
CALL FC 105
IN :=#Level_Transmitter
HI_LIM :=#max_level
LO_LIM :=#min_level
BIPOLAR:=FALSE
RET_VAL:=MW0
OUT :=#Level_Transmitter_Merker

// Scale Temp_Transmitter
CALL FC 105
IN :=#Temp_Transmitter
HI_LIM :=#max_temp
LO_LIM :=#min_temp
BIPOLAR:=FALSE
RET_VAL:=MW8
OUT :=#Temp_Transmitter_Merker


Und dieser Code sollte das schalten der Level Alarme machen.
Vieleicht ist dort der Hund begraben?:confused:

M015: NOP 0
L -1.000000e+000
L #LAHHH_analog
>=R
SPB M030

L #Level_Transmitter_Merker
L #LAHHH_analog
>=R
L #LAHHH_delay
SE "Delay_Timer_HHH_analog"
U "Delay_Timer_HHH_analog"
S #LAHHH_out

L #Level_Transmitter_Merker
L #hysteresis1
<=R
R #LAHHH_out


M030: NOP 0
L -1.000000e+000
L #LAHH_analog
>=R
SPB M031

L #Level_Transmitter_Merker
L #LAHH_analog
>=R
L #LAHH_delay
SE "Delay_Timer_HH_analog"
U "Delay_Timer_HH_analog"
S #LAHH_out

L #Level_Transmitter_Merker
L #hysteresis2
<=R
R #LAHH_out

M031: NOP 0
L -1.000000e+000
L #LAH_analog
>=R
SPB M032

L #Level_Transmitter_Merker
L #LAH_analog
>=R
L #LAH_delay
SE "Delay_Timer_H_analog"
U "Delay_Timer_H_analog"
S #LAH_out

L #Level_Transmitter_Merker
L #hysteresis3
<=R
R #LAH_out

M032: NOP 0
L -1.000000e+000
L #LAL_analog
>=R
SPB M033

L #Level_Transmitter_Merker
L #LAL_analog
<=R
L #LAL_delay
SE "Delay_Timer_L_analog"
U "Delay_Timer_L_analog"
S #LAL_out

L #Level_Transmitter_Merker
L #hysteresis4
>=R
R #LAL_out

M033: NOP 0
L -1.000000e+000
L #LALL_analog
>=R
SPB M034

L #Level_Transmitter_Merker
L #LALL_analog
<=R
L #LALL_delay
SE "Delay_Timer_LL_analog"
U "Delay_Timer_LL_analog"
S #LALL_out

L #Level_Transmitter_Merker
L #hysteresis5
>=R
R #LALL_out

M034: NOP 0
L -1.000000e+000
L #LALLL_analog
>=R
SPB M035

L #Level_Transmitter_Merker
L #LALLL_analog
<=R
L #LALLL_delay
SE "Delay_Timer_LLL_analog"
U "Delay_Timer_LLL_analog"
S #LALLL_out

L #Level_Transmitter_Merker
L #hysteresis6
>=R
R #LALLL_out

M035: NOP 0
 
Laut Objekteigenschaften ist er auch Multiinstanzfähig. Aber das verstehe ich nicht. Der FB5000 ist doch der Baustein denn ich benutzen will. Um Datenbausteine zu sparen und die Konfiguration zentral zu halten wird der FB5000 beim FB4999 mehrfach aufgerufen und somit ist doch der FB4999 eine Multiinstanz.

Im DB 4999 sind alle Daten zum Konfigurieren der Tanks. Der FB5000 ist lediglich ein Baustein der mir Daten ausliest, diese Verarbeitet und je nach einstellungen im DB4999 die jeweiligen Ausgänge schaltet.
Eigentlich simpel, oder???? :D
 
Zusatz: Mit dem FC105 geht es doch auch. Der sitzt sogar noch tifer im System und arbeitet aber richtig. Und das bei jedem Tank den ich aufrufe.!:D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Laut Objekteigenschaften ist er auch Multiinstanzfähig. Aber das verstehe ich nicht. Der FB5000 ist doch der Baustein denn ich benutzen will. Um Datenbausteine zu sparen und die Konfiguration zentral zu halten wird der FB5000 beim FB4999 mehrfach aufgerufen und somit ist doch der FB4999 eine Multiinstanz.

Heisst das, dass Du den FB5000 als Multiinstanz im Deklarationsteil des FB4999 vereinbart hast und diese Multiinstanz dann mehrfach aufrufst?

Oder rufst du einfach den FB5000 mehrfach auf, mit der Hoffnung, dies wäre dann automatisch eine Multiinstanz?

Gruß
raika
 
Heisst das, dass Du den FB5000 als Multiinstanz im Deklarationsteil des FB4999 vereinbart hast und diese Multiinstanz dann mehrfach aufrufst?

Genau. Ich rufe im FB4999 den FB5000 mehrfach auf.
Dadurch habe ich nur einen Instanz-Datenbaustein und zwar den DB4999.
Dadurch kann ich zentral alle Tanks konfigurieren.

Frage: Macht es was aus wenn der FB5000 als Multiinstanz in den Eigenschaften steht, dieser aber nicht als Multiinstanz verwendet wird.

Um genau zu sein rufe ich im STAT Bereich des FB4999 den FB5000 insgesamt 16 mal auf.
Also so:
Name: Datentyp Adresse
Tank_T001 -> FB5000 0.0
Tank_T002 -> FB5000 120.0
Tank_T003 -> FB5000 240.0
und so weiter
 
Zuletzt bearbeitet:
OK. Multiinstanzfähig darf jeder sein.

Wie hast Du die Variablen im FB deklariert?

z.B. #LALLL_out

als OUT, STAT, INOUT?

OUT könnte als Fehlerursache in Frage kommen, wenn die Zuweisung nicht in jedem Durchlauf erfolgt.

Gruß
raika
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe gerade etwas entdeckt.
Kann es daran liegen das ich Timer verwende.
Also T501-T506 und T511-516.

Kann es sein das beim nächsten Aufruf im FB4999 die aktuellen Werte der Timer wieder auf 0 gestzt werden und die Ausgänge dadruch nicht geschalten werden.

Die Timer werden hier für eine Einschalt verzögerung verwendet, da ein kleiner Überstieg des Wertes nicht sofort zum Ausgang schalten soll.
Sprich erst wenn ein Wert über eine bestimmte zeit ansteht, soll geschalten werden.

Hoffentlich ist dies der Fehler.:-D
 
OK. Multiinstanzfähig darf jeder sein.

Wie hast Du die Variablen im FB deklariert?

z.B. #LALLL_out

als OUT, STAT, INOUT?

OUT könnte als Fehlerursache in Frage kommen, wenn die Zuweisung nicht in jedem Durchlauf erfolgt.

Gruß
raika

Die habe ich als OUT deklariert. Aber beim Aufruf verwende ich immer eine andere Adressierung. Also dürfte es an diesem doch nicht leigen !?
 
Ich habe in deinem Baustein bedingte Sprünge entdeckt. Die sind eigentlich ein sicheres Zeichen dafür, dass die Zuweisung NICHT in jedem Durchlauf erfolgt.
Eine Variable vom Typ OUT hat, wenn nicht zugewiesen, irgendeinen Zustand nach Bearbeitung des FC's , FB's ...
Besser ist, man nimmt Variablen vom Typ IN_OUT :rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe gerade etwas entdeckt.
Kann es daran liegen das ich Timer verwende.
Also T501-T506 und T511-516.

Kann es sein das beim nächsten Aufruf im FB4999 die aktuellen Werte der Timer wieder auf 0 gestzt werden und die Ausgänge dadruch nicht geschalten werden.

Die Timer werden hier für eine Einschalt verzögerung verwendet, da ein kleiner Überstieg des Wertes nicht sofort zum Ausgang schalten soll.
Sprich erst wenn ein Wert über eine bestimmte zeit ansteht, soll geschalten werden.

Hoffentlich ist dies der Fehler.:-D

Code:
SE "Delay_Timer_H_analog"
U "Delay_Timer_H_analog"
Meinst du diese Timeraufrufe?
Diesen Timer verwendest du in jeder FB-Instanz. Das geht definitv nicht, da du ja nie sicherstellen kannst, daß dr Timer nur in einem FB gerade läuft und in den anderen umsprungen wird. Du mußt auch die Timer an den FB als Parameter übergeben.

Für Multiinstanz-FB machen sich in desem Fall sicher die IEC-Timer besser.
 
Genau. Also muss ich entweder zig tausende Timer verschwenden oder mit dem SFB4 eine Einschaltversögerung programmieren.
Ich hoffe ich sehe das richtig :)

Auf jeden Fall danke an alle die hir schon mal geantwortet haben.

Ich werde mal dies ausprobieren und melde mich wenn es funktioniert hat, auf jeden Fall nochmal.
 
also da bin ich wieder.
Ich habe nun folgendes ausprobiert.

M015: NOP 0
L -1.000000e+000
L #LAHHH_analog
>=R
SPB M030

L #Level_Transmitter_Merker
L #LAHHH_analog
>=R
S #Merker_Timer1


CALL #Timer1
IN:=#Merker_Timer1
PT:=#LAHHH_delay
Q :=#LAHHH_out
ET:=


L #Level_Transmitter_Merker
L #hysteresis1
<=R
R #Merker_Timer1


Jetzt spare ich mir die Timer. Ich wollte auch gleich nicht mehr Datenbaustein verschwenden und habe den SFB4 im STAT Bereich deklariert. Funktioniert auch nur bedingt. Sprich ein Aufruf verändert den anderen aufruf.

HILFE!!! Warum ist das so??????????:confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
also da bin ich wieder.
Ich habe nun folgendes ausprobiert.

M015: NOP 0
L -1.000000e+000
L #LAHHH_analog
>=R
SPB M030
L #Level_Transmitter_Merker
L #LAHHH_analog
>=R
S #Merker_Timer1

CALL #Timer1
IN:=#Merker_Timer1
PT:=#LAHHH_delay
Q :=#LAHHH_out
ET:=

L #Level_Transmitter_Merker
L #hysteresis1
<=R
R #Merker_Timer1

Jetzt spare ich mir die Timer. Ich wollte auch gleich nicht mehr Datenbaustein verschwenden und habe den SFB4 im STAT Bereich deklariert. Funktioniert auch nur bedingt. Sprich ein Aufruf verändert den anderen aufruf.

HILFE!!! Warum ist das so??????????:confused:

Was meinsr du mit "Ein Aufruf verändert den anderen Aufruf"?
Benutzt du Timer 1 mehrmals im FB?
Ich weiß auch nicht, wie der TON reagiert, wenn er umsprungen wird.
Wenn er eine Flanke zum Starten braucht, wäre Umspringen nicht so gut.
Die Timer kann man kann man ja ruhig immer aufrufen, sie laufen ja nur in Abhängigkeit vom Startmerker.
 
Zuletzt bearbeitet:
Was meinsr du mit "Ein Aufruf verändert den anderen Aufruf"?
Benutzt du Timer 1 mehrmals im FB?
Ich weiß auch nicht, wie der TON reagiert, wenn er umsprungen wird.
Wenn er eine Flanke zum Starten braucht, wäre Umspringen nicht so gut.
Die Timer kann man kann man ja ruhig immer aufrufen, sie laufen ja nur in Abhängigkeit vom Startmerker.

... aber auch diese brauchen ein Gedächtnis.

Das kriminelle an deiner Vorgehensweise ist daß du wahrscheinlich in deinem "FB5000" S7 Timer mit deren Nummern direkt angesprochen hast -> alleine deswegen kannst du ihn als Multiinstanz schon mal vergessen.

Dieser FB5000 muß komplett von aussen versorgt werden und dessen output muß auch wieder vor jeder nächsten Instanz abgefangen werden sonst hast du immer Salat...

Warum rufst du den FB 5000 nicht 18 mal nacheinander mit separatem Instanzdatenbaustein auf (direkt im OB1)?

Das einzige was du dann wahrscheinlich ändern müsstest wäre die Timernummern über die Schnittstelle reinzuschreiben damit jede Instanz "eigene" Timer zur Verfügung hat.

Also 18 oder auch 50 Instandatenbausteine sind doch nicht das Problem oder ?

Ausserdem kannst du dann auch die Instanzen wieder im Status beobachten und zwar nicht am FB (da wirst du nichts mehr erkennen) sondern am jeweiligen IDB...
 
... aber auch diese brauchen ein Gedächtnis.

Das kriminelle an deiner Vorgehensweise ist daß du wahrscheinlich in deinem "FB5000" S7 Timer mit deren Nummern direkt angesprochen hast -> alleine deswegen kannst du ihn als Multiinstanz schon mal vergessen.

Da hat er ja gerade TON aus der Bibo draus gemacht, das mit den s7Timern war wirklich falsch.

Dieser FB5000 muß komplett von aussen versorgt werden und dessen output muß auch wieder vor jeder nächsten Instanz abgefangen werden sonst hast du immer Salat...

??? wie, was, abgefangen ???

Wenn FB5000 als STAT (also Multiinstanz) im FB10 18 mal definiert wird, werden dann nicht auch alle TON-Timer, die als STAT im FB5000 definiert sind entsprechend mit ihren Daten im Instanz-DB des FB10 eingeordnet?
 
Zurück
Oben