# mehrere Instanzen/globale variablen/hauptprogramm



## blackedding (15 Juli 2011)

Hallo,

Ich habe einen TCP Server als FB erstellt.
Darin ist eine Callback-Funktion, die eine globale BOOL-Variable aufruft. Damit werden die Callbacks registriert.

Wie kann ich mit der globalen Variable umgehen, wenn ich nun in meinem Hauptprogramm mehrere Instanzen des Servers aufrufe (praktischer wäre natürlich ein mehrfacher aufruf eines clients, aber das ist ähnlich).
Die Callbacks werden für die erste Instanz registriert, für die nächsten aber nicht mehr.

Damit gleich zu meiner 2. Frage:
Die Callback Funktion greift auf das Socket im Server über den namen des Hauptprogrammes zu, z.B. so:


```
IF MAIN.fbTCPserver.server_socket <> SOCKET_INVALID THEN
```
 usw.

Wenn ich nun den Umgang mit dem FB so einfach wie möglich gestalten möchte, kann ich doch nicht vom Nutzer verlangen, jedes Mal den Namen des Hauptprogramms (hier: MAIN) zu ändern (wenn er sich ändern sollte..)
Kann man auf die Variablen im FB auch irgendwie anders zugreifen?

Versteht das jemand? 

Vielen Dank an alle, die sich mit der Frage beschäftigen,
Norman


----------



## StructuredTrash (16 Juli 2011)

So ganz verstehe ich es noch nicht. Brauchst Du nur einen Callback-Zähler oder eine Callback-Registrierung für jede einzelne Server-Instanz? Und warum muss das eine globale Variable sein?
Zum zweiten Punkt: Ich nehme an, dass MAIN.fbTCPServer die FB-Instanz ist, aus der heraus die Callback-Funktion aufgerufen wird. Dann übergib ihr doch die Variable Server_Socket des FB's als Input-Parameter.


----------



## blackedding (17 Juli 2011)

Hallo,

Also, ich bräuchte eine Callback-Registrierung für jede Server- bzw. Client-Instanz. Vielleicht lässt es sich mit einem Callback-Zähler einfacher realisieren. Kannst du mir ein Beispiel dazu geben?

Meines Wissens dürfen Callback-Funktionen keine lokalen Variablen besitzen, deswegen arbeite ich mit der globalen Variable. Zählen VAR_INPUT Variablen zu lokalen Variablen? Muss ich mal ausprobieren.


Danke für die Vorschläge!
Ich werde das Thema auf dem aktuellsten Stand halten.


----------



## StructuredTrash (17 Juli 2011)

Wenn du die Callbacks den FB-Instanzen eindeutig zuordnen willst, ist ein Zähler nicht das richtige, da brauchst Du schon eine Variable für jede FB-Instanz. Die könntest Du aber auch als VAR_OUTPUT in den FB's anlegen. Dann ist sie für das aufrufende Programm auch sichtbar.

Funktionen können schon lokale Variablen enthalten, die sind allerdings nicht statisch, d. h. sie werden beim Aufruf der Funktion angelegt und beim Verlassen wieder freigegebén.


----------



## blackedding (18 Juli 2011)

*Code*

Es ist, glaube ich, mal Zeit für Code 

Zur Zeit habe ich den FB, der bei erfolgreichem Erstellen eines Sockets diese Funktion aufruft (g_bCallbackRegistered ist die globale Variable):

```
FUNCTION Register_Callbacks : DWORD
VAR_INPUT
END_VAR
VAR
END_VAR
```


```
IF NOT g_bCallbackRegistered THEN
	SysCallbackRegister(INDEXOF(Callback_Reset), EVENT_BEFORE_RESET);
	g_bCallbackRegistered := TRUE;
END_IF
```

Call back_Reset sieht so aus:

```
FUNCTION Callback_Reset : BOOL
VAR_INPUT
	dwEvent:DWORD;
	dwFilter:DWORD;
	dwOwner:DWORD;
END_VAR
VAR
END_VAR
```
In der Doku zur SysLibCallback.lib steht übrigens, dass der Prototyp immer so aussehen muss (... wie über diesem Satz).


```
IF MAIN.fbServer.server_socket <> SOCKET_INVALID THEN
	TCPserverCloseSocket(ADR(MAIN.fbServer.server_socket));
END_IF
IF MAIN.fbServer.socket <> SOCKET_INVALID THEN
	TCPserverCloseSocket(ADR(MAIN.fbServer.socket));
END_IF
```

Hast du gemeint, dass die Callbacks für jede Instanz im Hauptprogramm registriert werden? An das Hauptprogramm wird also eine Variable vom FB übergeben wird? - Sobald diese zB TRUE ist, wird der Callback aufgerufen?
Diese Variable wird an der Stelle TRUE gesetzt, an der die Register_Callbacks Funktion aufgerufen wird?
Könnte man es so angehen?

Vielen Dank für deine Tipps!


----------



## blackedding (18 Juli 2011)

*andere Lösung*

Hallo,

Danke für die Vorschläge.
Ich habe es nun anders lösen können. Ein Kollege hat mir einen Tipp gegeben, der mich weitergeführt hat.

Anstatt Callbacks für bestimmte Events zu registrieren, schließe ich alle Sockets zu Beginn des Zyklus.
Das macht genau, was ich will 

Viele Grüße und nochmals vielen Dank,
Norman


----------

