libnodave Begriffserklärungen rund um PLC - Verbindungen

Limette

Level-2
Beiträge
282
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

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

Code:
libnodave.closeSocket(fds.rfd);

dc.disconnectPLC();

di.disconnectAdapter();

libnodave.closePort(fds.rfd)

libnodave.closeS7online(fds.rfd)
 
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.
Code:
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.
Code:
dc.disconnectPLC();
Beendet eine über "connectPLC" aufgebaute Verbindung
Code:
di.disconnectAdapter();
Schliesst den Adapter. Soweit ich weis ist der bei TCP Verbindungen nicht nötig, soll aber trotzdem verwendet werden.
Code:
libnodave.closePort(fds.rfd)

Schliesst den geöffneten Port bei Seriellen Verbindungen.
Code:
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:
Code:
[SIZE=2]dc.disconnectPLC();
[/SIZE][SIZE=2]di.disconnectAdapter();
[/SIZE][SIZE=2]libnodave.closeSocket(fds.rfd);[/SIZE][SIZE=2]
[/SIZE]

 
Zuviel Werbung?
-> Hier kostenlos registrieren

Bei TCP-Verbindungen müsste ein Verbindungsabbau in etwa in dieser Reihenfolge passieren:
Code:
[SIZE=2]dc.disconnectPLC();
[/SIZE][SIZE=2]di.disconnectAdapter();
[/SIZE][SIZE=2]libnodave.closeSocket(fds.rfd);[/SIZE][SIZE=2]
[/SIZE]


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.
 
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.
 
Code:
[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
Code:
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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?
Code:
[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:
Code:
dc.disconnectPLC();
hab es noch nicht mitgelogt was die Exception sagt, werde es aber noch machen.
 
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.


 
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.
Code:
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:
Code:
Func _LibNoDave_Free($_pConnection)
    DllCall($__ghLNDDll, "none", "daveFree", "ptr", $_pConnection)
    If @error Then Return SetError(@error, 0, False)
    Return True
EndFunc
 
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.
Code:
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:
Code:
Func _LibNoDave_Free($_pConnection)
    DllCall($__ghLNDDll, "none", "daveFree", "ptr", $_pConnection)
    If @error Then Return SetError(@error, 0, False)
    Return True
EndFunc

Ja, Verbindung aufbauen geht. Kommunikation geht auch. Ist ne 317F-2PN/DP
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.


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.
 
Zurück
Oben