# libnodave Begriffserklärungen rund um PLC - Verbindungen



## Limette (26 Februar 2013)

Hallo,

weiß jemand was folgende begriffe bedeuten und bewirken bzw. wo ich es nachlesen kann ?



```
libnodave.closeSocket(fds.rfd);

dc.disconnectPLC();

di.disconnectAdapter();

libnodave.closePort(fds.rfd)

libnodave.closeS7online(fds.rfd)
```


----------



## MW (26 Februar 2013)

Für eine Erklärung solltest du dich mal intensiver mit den Dateien beschäftigen, die du mit Libnodave heruntergeladen hast.

Ich verwende Libnodave nur mit TCP-Verbindungen, deshalb kann ich nicht auf die Serielen Verbindungen bzw. S7Online eingehen, aber ich versuche es mal:

Grundsätzlich werden alle genannten Befehle zum beenden einer Verbindung zur Steuerung benötigt und je nach verwendeter Verbindung müssen diese kombiniert werden.  

```
libnodave.closeSocket(fds.rfd);
```
Schliesst einen geöffneten Netzwerk Socket und ist nur nötig wenn du deine Verbindung zur Steuerung über TCP betreiben möchtest.

```
dc.disconnectPLC();
```
Beendet eine über "connectPLC" aufgebaute Verbindung

```
di.disconnectAdapter();
```
Schliesst den Adapter. Soweit ich weis ist der bei TCP Verbindungen nicht nötig, soll aber trotzdem verwendet werden.

```
libnodave.closePort(fds.rfd)
```

Schliesst den geöffneten Port bei Seriellen Verbindungen.

```
libnodave.closeS7online(fds.rfd)
```
Beendet die Verbindung zur Siemenseigenen Schnittstelle(hab ich noch nie verwendet)

Bei TCP-Verbindungen müsste ein Verbindungsabbau in etwa in dieser Reihenfolge passieren:


```
[SIZE=2]dc.disconnectPLC();
[/SIZE][SIZE=2]di.disconnectAdapter();
[/SIZE][SIZE=2]libnodave.closeSocket(fds.rfd);[/SIZE][SIZE=2]
[/SIZE]
```


----------



## Limette (26 Februar 2013)

MW schrieb:


> Bei TCP-Verbindungen müsste ein Verbindungsabbau in etwa in dieser Reihenfolge passieren:
> 
> 
> ```
> ...



danke, werde es morgen gleich mal so ausprobieren. Wusste nicht dass man sie kombinieren muss. gibt es dazu irgendwo beispiele ? finde diesbezüglich recht wenig.


----------



## MW (27 Februar 2013)

Limette schrieb:


> gibt es dazu irgendwo beispiele ? finde diesbezüglich recht wenig.



Es sind einige Beispiele beim Download vo Libnodave dabei, z.B. müsste es dort einen Ordner namens "Dot.Net" geben in dem Beispiele für VB.net und C# drin sind.
Dort ist dan auch die Grundlegende Reihenfolge zum Auf- und Abbau einer Verbindung ersichtlich.


----------



## Limette (28 Februar 2013)

```
[SIZE=2]  dc.disconnectPLC();
} 
di.disconnectAdapter();
libnodave.closeS7online(fds.rfd);
[/SIZE][SIZE=2][COLOR=#2b91af][SIZE=2][COLOR=#2b91af]GC[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].Collect();
[/SIZE][SIZE=2][COLOR=#2b91af][SIZE=2][COLOR=#2b91af]GC[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].WaitForPendingFinalizers();
[/SIZE][SIZE=2][COLOR=#2b91af][SIZE=2][COLOR=#2b91af]Console[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].WriteLine([/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]"Here we are"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]);
} [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]else[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] {
[/SIZE][SIZE=2][COLOR=#2b91af][SIZE=2][COLOR=#2b91af]Console[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].WriteLine([/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]"Couldn't open s7 online "[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]+args[adrPos]);
[/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] -1;
}
[SIZE=2][COLOR=#0000ff]return[/COLOR] 0;[/SIZE] 
[SIZE=2]}[/SIZE]
[SIZE=2]}[/SIZE]
 
[/SIZE]
```

Ist ein Auszug aus der C# Datei "testS7online".
Ich habe Befehle


```
dc.disconnectPLC();
di.disconnectAdapter();
libnodave.closeS7online(fds.rfd);
```
mir ausgepickt und versucht damit eine Verbindung zu beenden. Aber es wird nur eine Exception geworfen.
Was muss ich noch beachten ? das Aufrufen der Befehle alleine scheint wohl nicht zu reichen.


----------



## Rainer Hönle (28 Februar 2013)

Und wurde die entsprechenden "Gegenbefehle" (connect zu disconnect) auch davor ausgeführt oder nur diese Funktionen aufgerufen? Wie war z.B. die fds-Struktur initialisiert? Welche Funktion löst die Exception aus? Was sagt die Exception? Was sagt der Debugger?


----------



## Limette (1 März 2013)

Rainer Hönle schrieb:


> Und wurde die entsprechenden "Gegenbefehle" (connect zu disconnect) auch davor ausgeführt oder nur diese Funktionen aufgerufen? Wie war z.B. die fds-Struktur initialisiert? Welche Funktion löst die Exception aus? Was sagt die Exception? Was sagt der Debugger?



Hallo Rainer,

ich verstehe nicht ganz was sie mit "Gegenbefehle" meinen. Ich habe nur diese Funktionen ausgeführt.

_fds-Struktur initialisiert?
_

```
[COLOR=#000000][SIZE=2][SIZE=2]libnodave.daveOSserialType fds;
libnodave.daveInterface di;
[/SIZE][/SIZE][SIZE=2][SIZE=2]libnodave.daveConnection dc;
[/SIZE][/SIZE][SIZE=2][SIZE=2]int rack = 0;
[/SIZE][/SIZE][SIZE=2]int slot = 2;
[/SIZE][/COLOR]
```

gleich beim ersten bleibt es hängen:

```
dc.disconnectPLC();
```
hab es noch nicht mitgelogt was die Exception sagt, werde es aber noch machen.


----------



## Rainer Hönle (1 März 2013)

Ein disconnect ohne connect macht keinen Sinn, denn der disconnect ist der Gegenbefehl zu connect. Ich kann eine Tür erst zu machen, wenn ich sie vorher geöffnet habe.
Welche Funktion löst die Exception aus? 
Was sagt der Debugger?


----------



## Limette (4 März 2013)

Rainer Hönle schrieb:


> Ein disconnect ohne connect macht keinen Sinn, denn der disconnect ist der Gegenbefehl zu connect. Ich kann eine Tür erst zu machen, wenn ich sie vorher geöffnet habe.
> Welche Funktion löst die Exception aus?
> Was sagt der Debugger?



nein nein, die Verbindung wird schon mit dc.connectPLC aufgebaut.
die Exception sagt:
Exception --> Nr. System.NullReferenceException: Object reference not set to an instance of an object.

Weiß nicht wie man hier den debugger anwendet.

Gruß und Dank.


----------



## Mobi (4 März 2013)

Um welche S7 handelt es sich denn? Kommt überhaupt eine Verbindung zustande?

Das ist zwar jetzt ne andere Sprache, aber so sieht meine DisconnectFunktion aus. Ist aber halt TCP.

```
Func _LibNoDave_TCPDisconnect(ByRef $_iSocket, ByRef $_hInterface, ByRef $_hConnection)
    If $_hConnection Then
        _LibNoDave_DisconnectPLC($_hConnection)
        _LibNoDave_Free($_hConnection)
    EndIf
    If $_hInterface Then
        _LibNoDave_DisconnectAdapter($_hInterface)
        _LibNoDave_Free($_hInterface)
    EndIf
    If $_iSocket Then _LibNoDave_CloseSocket($_iSocket)
    Return True
EndFunc
```
Und das ist die daveFree zum bereinigen:

```
Func _LibNoDave_Free($_pConnection)
    DllCall($__ghLNDDll, "none", "daveFree", "ptr", $_pConnection)
    If @error Then Return SetError(@error, 0, False)
    Return True
EndFunc
```


----------



## Limette (5 März 2013)

Mobi schrieb:


> Um welche S7 handelt es sich denn? Kommt überhaupt eine Verbindung zustande?
> 
> Das ist zwar jetzt ne andere Sprache, aber so sieht meine DisconnectFunktion aus. Ist aber halt TCP.
> 
> ...



Ja, Verbindung aufbauen geht. Kommunikation geht auch. Ist ne 317F-2PN/DP


----------



## Rainer Hönle (5 März 2013)

Limette schrieb:


> nein nein, die Verbindung wird schon mit dc.connectPLC aufgebaut.
> die Exception sagt:
> Exception --> Nr. System.NullReferenceException: Object reference not set to an instance of an object.
> 
> ...


Wenn im Visual Studio eine Exception kommt, dann wird automatisch die auslösende Codestelle gezeigt und man kann die Variablenwerte direkt ansehen. Dann wird sicher auch klar, was der Fehler ist.


----------



## Mobi (5 März 2013)

Hast du auch daveFree benutzt?


----------



## Limette (5 März 2013)

Mobi schrieb:


> Hast du auch daveFree benutzt?



sagt mir jetzt nichts.


----------



## Mobi (5 März 2013)

Das ist zum bereinigen der Handles da, wenn du libnodave beendest.


----------

