# [PROBLEM] FB lässt sich nicht mehrfach aufrufen bzw ..



## openminded23 (1 Juni 2008)

... hat beim erneuten Aufruf die falschen Werte.

Hallo zusammen,
nachdem mir kürzlich so gut geholfen wurde, habe ich hier die nächste Frage:
Ich habe einen FB erstellt, mit dessen Hilfe ich eine bestimmte Position (mit 2 Motoren) anfahre. Rufe ich nun denselben FB ein weiteres Mal auf, um zum Beispiel eine zweite Position anzufahren, so kann ich die erste Position nicht mehr anfahren.

Der FB ist wurde mit Formalparametern programmiert, für jeden FB habe ich einen eigenen DB angelegt. Trotzdem ...


----------



## vierlagig (1 Juni 2008)

generier mal ne awl-quelle und stell sie online


----------



## openminded23 (1 Juni 2008)

So, die Funktion als PDF - Datei im ANhang.


----------



## vierlagig (1 Juni 2008)

die globalen zugriffe in netzwerk 1 und 2 verhindern, dass dein baustein mehrfach aufgerufen werden kann und dabei richtig arbeitet... definiere zwei in-variablen für die x- und y-achse...


----------



## openminded23 (1 Juni 2008)

Danke für die schnelle Antwort.


----------



## openminded23 (1 Juni 2008)

So,
habe den Funktionsbaustein jetzt dementsprechend geändert. Nur leider hat sich nichts verändert. Ich habe noch den gleichen Fehler wie vorher


----------



## HeizDuese (1 Juni 2008)

Nochwas:

Gern gemachter Fehler:

NIE TEMPORÄRE VARIABLEN SETZEN / RÜCKSETZEN !!!

Temp. Variablen können beim nächsten Basuteinaufruf an einer anderen Speicherstelle liegen und einen undefinierten Zustand haben, wenn Sie nicht vor Ihrer ersten Verwendung im Baustein einen Wert zugewiesen bekommen haben. Das gibt schon mal fieße, schlecht zu findene Fehler. Besser im "stat"-Bereich anlegen!

Auch Zeit_Impuls wird verwendet, ohne dass ihm zuvor einen Wert zugewiesen wurde (besser die Zeit als IN-Formalparameter definieren, mit Initialwert, dann kann er auch später individuell bei jedem Aufruf angegeben werden!

Und wie schon geschrieben wurde: die PEW-Zugriffe nicht als absolut-Zugriffe, sondern z.B. als IN-Formalparameter definieren!


----------



## Jordy (1 Juni 2008)

HeizDuese schrieb:


> Nochwas:
> 
> Gern gemachter Fehler:
> 
> NIE TEMPORÄRE VARIABLEN SETZEN / RÜCKSETZEN !!!


 

Was du meinst ist klar... richtig. Aber setzen Rücksetzen ist kein Problem. Mach das auch manchmal, nur halt am Anfang vom Baustein Initialisieren, also den Variablen die halt Gesetzt Rückgesetzt werden, einmal zu Null schreiben, ober halt einen festen Wert zuweisen!


----------



## openminded23 (1 Juni 2008)

Alle Änderungen übernommen.
Immernoch keine Verbesserung.
Problematisch ist es auch, dass ich wenn ich den Baustein ein drittes Mal aufrufe, nur zwischen zwei Plätzen verfahren kann: Jeweils dem, den ich zuerst und den, den ich zuletzt angegeben habe ....


----------



## Jordy (1 Juni 2008)

Hab mir die Funktion jetzt nicht angeguckt, aber, beim aufruf vom FB sind auch andere Daten an die Formalparameter angebunden?

Also keine Bits oder Timer oder sonst was doppelt benutzt??


Wieso eigentlich immer FB!! In deinem Falle reicht doch FC...


----------



## Jordy (1 Juni 2008)

Ja, und wenn ichs mal so überfliege...

Setze mal direkt am Anfang alle Merker aus dem Temp Bereich zurück



> SET
> R Merker_01
> R Merker_02
> R Merker_03


----------



## openminded23 (1 Juni 2008)

Jordy schrieb:


> Hab mir die Funktion jetzt nicht angeguckt, aber, beim aufruf vom FB sind auch andere Daten an die Formalparameter angebunden?
> 
> Also keine Bits oder Timer oder sonst was doppelt benutzt??
> 
> ...




Habe den gesamten Baustein auch schon als FC programmiert - gleiches Spiel, gleiche Funktion .... keine Verbesserung.


----------



## Jordy (1 Juni 2008)

Das ist mir klar...

Meine nur... Ein FB ist halt einfach überflüssig. Aber ok... jeder hat seinen eigenen stil...


----------



## openminded23 (1 Juni 2008)

Selbes Programm als FC.


----------



## Jordy (1 Juni 2008)

?????

Ne!! Ist immer noch ein FB, nur das du ihn DIEMSAL auch als FB genutzt hast. Jetzt sind doch die STAT-Variablen genutzt...




Änder das doch mal mit dem setzen rücksetzen...
Setze am Anfang vom FC/FB mal alle Temporären zurück...


----------



## Ralle (1 Juni 2008)

Kann es sein, daß du außen, am FB/FB die gleichen Variablen anträgst. Das geht natürlich auch nicht, da der letzte FC-Aufruf dann für den Wert deiner Variablen verantwortlich ist. Damit würde ich mir erklären, daß beim Einfügen des 2. Aufrufes nur noch die 2. Position angefahren wird.


----------



## openminded23 (1 Juni 2008)

Ralle schrieb:


> Kann es sein, daß du außen, am FB/FB die gleichen Variablen anträgst. Das geht natürlich auch nicht, da der letzte FC-Aufruf dann für den Wert deiner Variablen verantwortlich ist. Damit würde ich mir erklären, daß beim Einfügen des 2. Aufrufes nur noch die 2. Position angefahren wird.



Schade, wenn es so einfach wäre .....
Leider habe ich außen am FB/FC nicht die gleichen Variablennamen eingetragen.

Habe jetzt gerade nochmals probiert, die Variablen am Anfang der Funktion einmalig zurück zu setzen. Leider nützt das auch nichts. ...


----------



## Simatiker (1 Juni 2008)

Hallo,

kann es sein das immer beide Aufrufe ausgeführt werden?
Falls das so ist wird ja dein Motor von beiden Bausteinen angesteuert und es ist immer nur der zuletzt zugewiesene Wert für die Ausgänge ausschlaggebend.

Grüße...


----------



## Jordy (1 Juni 2008)

Simatiker schrieb:


> Hallo,
> 
> kann es sein das immer beide Aufrufe ausgeführt werden?
> Falls das so ist wird ja dein Motor von beiden Bausteinen angesteuert und es ist immer nur der zuletzt zugewiesene Wert für die Ausgänge ausschlaggebend.
> ...


 

??? Klar werden beide aufgerufen... Aber er hat ja unterschiedliche Variablen angebunden sagt er!


----------



## Larry Laffer (1 Juni 2008)

... ich kann auch keinen wirklich offensichtlichen Fehler in dem Baustein erkennen. Ich würde vielleicht die Merker entsprechend ihrer Funktion benennen. Das macht es für Andere einfacher ...
Vielleicht wäre es auch sinnig, wenn man schon einen FB erstellt, dann mit den SFB 4 , 5 Timern zu arbeiten. So ein Timer, der von extern kommt ist ja auch immer so eine Sache ...

Eine Frage hätte ich aber doch :
Im letzten Netzwerk (#8#) hast du u.A. als Bedingung das der Motor_X und auch der Motor_Y sowohl rechts wie auch links stehen ... Was soll das ?

So, und dann ist mir zum Schluß doch noch etwas aufgefallen ...
Mach aus der IN-Bedingung "ENDE" mal eine IN_OUT. Das könnte es vielleicht bringen ...

Gruß
LL

Ich muß hier doch noch was nachtragen ... 
Das mit dem IN_OUT war Quatsch ... ersten meinte ich da ENDE (imd OUT) und zweitens ist das ja, wie ich im Nachhinein gesehen habe schon ein IN_OUT ...
So kann es laufen ...


----------



## Simatiker (1 Juni 2008)

> ??? Klar werden beide aufgerufen... Aber er hat ja unterschiedliche Variablen angebunden sagt er!





> Rufe ich nun denselben FB ein weiteres Mal auf, um zum Beispiel eine zweite Position anzufahren, so kann ich die erste Position nicht mehr anfahren.


----------



## HeizDuese (1 Juni 2008)

openminded23 schrieb:


> .....
> Leider habe ich außen am FB/FC nicht die gleichen Variablennamen eingetragen....



Ganz sicher? Auch nicht an den Ausgangsvariablen?? (bzw. InOut)


----------



## openminded23 (1 Juni 2008)

Ich musste gerade feststellen, dass ich das Problem auch mit anderen FCs habe ... daher muss es wohl etwas grundsätzliches sein ... Sch***


----------



## Larry Laffer (1 Juni 2008)

openminded23 schrieb:


> Ich musste gerade feststellen, dass ich das Problem auch mit anderen FCs habe ... daher muss es wohl etwas grundsätzliches sein ... Sch***


 
Vielleicht liegt das Problem (ganz grundsätzlich) an einer anderen Stelle ...?
Wie schon gesagt ... der gezeigte FB (FC ?) hat keinen offensichtlichen Fehler ... und FC's (oder FB's) lassen sich durchaus mehrfach innerhalb eines Zyklusses aufrufen.

Gruß
LL


----------



## Jordy (1 Juni 2008)

Stell doch mal das ganze Prgramm als ZIP hier rein...


----------



## openminded23 (1 Juni 2008)

Dann stellt sich jetzt nur noch die Frage, an welcher Stelle der Fehler liegen könnte. Habe noch eine Funktion zur Ansteuerung eines Zylinders. Und diese funktioniert auch nur, wenn sie einmal aufgerufen wird. Beim zweiten Mal (mit vollkommen anderen Werten) überschreibt die Funktion die Werte des ersten Aufrufes und nimmt die des zweiten. Nach dem zweiten Aufruf der Funktion lässt sich allerdings die erste auch nicht mehr aufrufen .....

Jetzt verstehe ich gar nichts mehr ...


----------



## Larry Laffer (1 Juni 2008)

Vielleicht ist es gar nicht nötig, das ganze Programm zu sehen ...
Es reicht vielleicht, wenn du uns zeigst, wie deine beiden FC's aufgerufen werden ...


----------



## Kai (1 Juni 2008)

Wenn Du Deinen FB änderst, dann musst Du auch bei jedem Aufruf des FB den jeweils zugehörigen Instanz-DB neu generieren. Hast Du das gemacht?

Gruß Kai


----------



## Simatiker (1 Juni 2008)

Hallo,

mich würde mal interessieren woran du das fest machst, das das nicht funktioniert. Beobachtest du die Bausteine in der online-Ansicht? Das geht natürlich nicht wenn er öfter aufgerufen wird.

Und nochwas, nach neuen generieren der DB's, natürlich diese auch in die Steuerung übertragen.


----------



## HeizDuese (1 Juni 2008)

Simatiker schrieb:


> Hallo,
> 
> mich würde mal interessieren woran du das fest machst, das das nicht funktioniert. Beobachtest du die Bausteine in der online-Ansicht? Das geht natürlich nicht wenn er öfter aufgerufen wird.
> ....



Das ist nicht richtig - das geht:

Baustein, in dem der Aufruf erfolgt *online* öffnen (nicht offline und Status - das geht ggf. mit der Umschaltung in der Symbolleiste oben im Editor - 3. Icon von links), dann Menü "Test"-> "Betrieb"->"Testbetrieb" auswählen.
Rechte Maustaste auf den FB, dann "Beobachten mit Aufrufpfad" auswählen.


----------



## Jordy (1 Juni 2008)

HeizDuese schrieb:


> Das ist nicht richtig - das geht !


 

Nein das geht nicht!! Es ist glaub ich der als letztes aufgerufene FC online, aber da kannst du nicht verlässlich reingucken...


----------



## openminded23 (1 Juni 2008)

So, hier einmal ein Beispielprogramm für unsere Zylindersteuerung. Diese Funktion möchte ebenfalls nicht so, wie ich es gerne hätte. Selbes Problem, wie bei allen anderen.


----------



## HeizDuese (1 Juni 2008)

Jordy schrieb:


> Nein das geht nicht!! Es ist glaub ich der als letztes aufgerufene FC online, aber da kannst du nicht verlässlich reingucken...



Es geht definitiv !


----------



## Jordy (1 Juni 2008)

HeizDuese schrieb:


> Es geht definitiv !


 

Ja? OK, dann erklärs mir bitte, ich kenn es nicht.

Angenommen ich rufe einen FC 5 mal auf, gucke dann online rein in diesen FC.

Welchen Status der 5 aufrufe sehe ich? Doch nur einen, oder? Ich kann auf jedenfall nicht zuweisen, zu welchem aufruf der "onlinezustand" zählt!?


----------



## HeizDuese (1 Juni 2008)

Bei FC's ist es nicht möglich - das stimmt schon.
Meine Beschreibung beschränkt sich auf FB's die mehrfach mit unterschiedlichen Instanz-Daten aufgerufen werden!
(Als ich den Beitrag geschrieben habe, war noch von FB die Rede).


----------



## Larry Laffer (1 Juni 2008)

Zurück zum Thema ...

@openminded:
Auch an dem FC88 kann ich auf dem ersten (und zweiten) Blick erstmal nichts Schlimmes entdecken. Ich gehe mal davon aus, das er Stand-Alone funktioniert. Wie sieht es den mit den IN_OUT-Merkern im restlichen Programm aus ... Ist es wirklicher sichergestellt, dass sie (wenn überhaupt) im Weiteren nur lesend benutzt werden ...?


----------



## Jordy (1 Juni 2008)

HeizDuese schrieb:


> Bei FC's ist es nicht möglich - das stimmt schon.
> Meine Beschreibung beschränkt sich auf FB's die mehrfach mit unterschiedlichen Instanz-Daten aufgerufen werden!
> (Als ich den Beitrag geschrieben habe, war noch von FB die Rede).


 

Abgemacht... 

Bei FBs weiß ich es nicht, aber durch die unterschiedlichen IDBs, kann es möglich sein...
Nutze selten FB's... Werds aber mal ausprobieren is ja praktisch.


----------



## vierlagig (1 Juni 2008)

Frank schrieb:
			
		

> 1. cpu in testbetrieb versetzen
> 2. aufrufenden baustein online öffnen
> 3. zu beobachtenden baustein mit rechter maustaste anklicken
> und "beobachten mit aufrufpfad" wählen



das funktioniert für FCs und FBs ... BASTA!


----------



## Jordy (1 Juni 2008)

Leck mich am A****

Das is ja geil, probier ich morgen direkt aus.
Wusste ich echt nicht.

Sorry, ziehe alles zurück...


----------



## HeizDuese (1 Juni 2008)

vierlagig schrieb:


> das funktioniert für FCs und FBs ... BASTA!



Zumindest gibt es den Menüeintrag "Beobachten mit Aufrufpfad" auch bei den FC's - das lässt hoffen


----------



## openminded23 (1 Juni 2008)

Larry Laffer schrieb:


> Zurück zum Thema ...
> 
> @openminded:
> Auch an dem FC88 kann ich auf dem ersten (und zweiten) Blick erstmal nichts Schlimmes entdecken. Ich gehe mal davon aus, das er Stand-Alone funktioniert. Wie sieht es den mit den IN_OUT-Merkern im restlichen Programm aus ... Ist es wirklicher sichergestellt, dass sie (wenn überhaupt) im Weiteren nur lesend benutzt werden ...?



Ja, das ist sichergestellt. Zur Zeit werden die Merker nur von den Funktionen beschrieben.


----------



## Larry Laffer (1 Juni 2008)

... dann sag doch noch mal, was der FC88 nicht so macht, wie er soll ...


----------



## openminded23 (1 Juni 2008)

Wie gesagt:
Bei Aufruf erfolgen unkontrollierte Zugriffe, und die Funktionen funktionieren nicht oder nur unzulässig (halt unkontrolliert ...)


----------



## Larry Laffer (1 Juni 2008)

... und Stand-Alone ist alles in Ordnung ...?


----------



## openminded23 (1 Juni 2008)

Genau. :-D


----------



## Larry Laffer (1 Juni 2008)

... dann weiß ich mir da im Augenblick wirklich keinen Rat.

Resume:
Dein Baustein ist Stand-Alone OK
Im Baustein sind keine Offensichtlichen Fehler
Die Merker und Timer werden nicht doppelt verwendet ...

Vorschlag:
Da das Ding bei dir (in deiner Firma) ja so eine Art Standard-Charkter einnehmen soll (so habe ich es verstanden) ...

Mach einen FB daraus.
Verwende als Timer IEC-Timer (z.B. SFB 4). Die kannst du mit in die Instanz integrieren - du bist somit unabhängig von den "normalen" Timern.
Benenne Variablen nach deren Funktion (nicht Merker).
Lege die "Merker" in den STAT-Bereich (wie schon bei deinem anderem Beispiel).

noch so zum Schluß:
Wenn du den Ablauf im Baustein startest ... entsprechen die Merker in ihrem Zustand dann dem Sollzustand ... (Frage gilt für den Doppel-Betrieb) ?


----------



## Simatiker (1 Juni 2008)

Also dein FC 88, da stimmt was nicht mit dem #EIN zum rücksetzen wolltest du doch bestimmt den #AUS benutzen?

erklär doch mal was passieren soll!


----------



## JoopB (1 Juni 2008)

In OB1 werden die merker M12.5 M12.6 und M12.7 in Netzwerk2 2x benutz und das gibt volgens mir die fehler.

Joop


----------



## Larry Laffer (1 Juni 2008)

JoopB schrieb:


> In OB1 werden die merker M12.5 M12.6 und M12.7 in Netzwerk2 2x benutz und das gibt volgens mir die fehler.
> 
> Joop


 
*Stimmt ...!*
Sie sind als IN_OUT and der Merkern und auch an den OUT's dran ... Das hatte ich überhaupt nicht gesehen ...


----------



## openminded23 (1 Juni 2008)

Problem besteht immer noch - trotz Änderungen.


----------



## Larry Laffer (2 Juni 2008)

... wen der Beitrag #48 von JoopB nicht geholfen hat (da hätte ich jetzt darauf gewettet) , dann siehe Beitrag #46 von mir ...

Gruß
LL


----------

