# LibNodave mit Routing usw...



## Jochen Kühner (31 Mai 2010)

hab hier mal jetzt meine geupdatete libnodave und auch eine neue .net Bibliothek dafür. Auch mein Connection Lib habe Ich angepasst.

Routing wird jetzt bei S7online und TCP unterstützt. Nur Routing mit einem TCP/IP Zielnetz denke ich geht bei S7Online noch nicht (da Ich noch nicht weis in welches Feld Rack/Slot der Routing Ziel CPU gehört).

Auch geht jetzt über S7Online eine TCP/IP Verbindung.

Download ab jetzt immer hier:
http://jochensserver.dyndns.org/wordpress/?page_id=55


----------



## bool (1 Juni 2010)

Jochen Kühner schrieb:


> hab hier mal jetzt meine geupdatete libnodave und auch eine neue .net Bibliothek dafür. Auch mein Connection Lib habe Ich angepasst.
> 
> Routing wird jetzt bei S7online und TCP unterstützt. Nur Routing mit einem TCP/IP Zielnetz denke ich geht bei S7Online noch nicht (da Ich noch nicht weis in welches Feld Rack/Slot der Routing Ziel CPU gehört).
> 
> Auch geht jetzt über S7Online eine TCP/IP Verbindung.


 
hab grade eben mal die libnodave.dll in mein Projekt übernommen und die libnodave.net.cs aus Deiner Connection Library in die für mein VB.NET Projekt nötige libnodave.net.dll compiliert.
Sobald ich nun eine Verbindung zur SPS (sowohl ISO als auch S7Online)aufbauen möchte kommt jedoch folgende Exception:

01.06.2010 01:50:53:269 Opening Connection to PLC failed. Exception message: Die DLL "libnodave.dll": Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E) kann nicht geladen werden.

Es scheint wieder das alte Problem zu sein, welches wir schon mal mit dem compilieren der libnodave.dll hatten. weisst Du noch wie Du sie damals compiliert hast damit sie danach auch bei mir mit meinem VB.NET Projekt ging?


----------



## Jochen Kühner (1 Juni 2010)

bool schrieb:


> hab grade eben mal die libnodave.dll in mein Projekt übernommen und die libnodave.net.cs aus Deiner Connection Library in die für mein VB.NET Projekt nötige libnodave.net.dll compiliert.
> Sobald ich nun eine Verbindung zur SPS (sowohl ISO als auch S7Online)aufbauen möchte kommt jedoch folgende Exception:
> 
> 01.06.2010 01:50:53:269 Opening Connection to PLC failed. Exception message: Die DLL "libnodave.dll": Das angegebene Modul wurde nicht gefunden. (Ausnahme von HRESULT: 0x8007007E) kann nicht geladen werden.
> ...



Nicht das du noch ne andere libnodave.dll im System32 Verzeichnis hast?


----------



## bool (1 Juni 2010)

Jochen Kühner schrieb:


> Nicht das du noch ne andere libnodave.dll im System32 Verzeichnis hast?


 
...hab grad nochmal den Einsatz der DLL überprüft.
Die dlls habe ich nur im Projekt-, Debug- und Releaseverzeichnis liegen.
Ich habe die libnodave.dll und libnodave.net.dll in allen drei Verzeichnissen ausgetauscht, dann den Verweis auf die libnodave.net.dll neu verbunden, die Releaseversion neu erstellt und ausgeführt... leider wieder die selbe Fehlermeldung. Sobald ich dann nur die eine libnodave.dll im Releaseverzeichnis wieder gegen meine (Deine) alte dll vom 12.05.2010 (147kB) austausche funktioniert der Kommunikationsaufbau zur SPS wieder.


----------



## Jochen Kühner (1 Juni 2010)

Jo, hab gemerkt das meine libnodave noch eine abhänigkeit von msvcrt100d.dll hat ( oder ähnlich). Muss mal sehen was ich in vs2010 ändern muss, das dies nicht der fall ist! Fahr aber grad auf montage, also frühstens heut abend...


----------



## bool (1 Juni 2010)

Jochen Kühner schrieb:


> Jo, hab gemerkt das meine libnodave noch eine abhänigkeit von msvcrt100d.dll hat ( oder ähnlich). Muss mal sehen was ich in vs2010 ändern muss, das dies nicht der fall ist! Fahr aber grad auf montage, also frühstens heut abend...


 
ok, super. Ich bin auf jeden Fall schon mal froh, dass es nicht an mir gelegen hat, da ich Hochsprachen technisch noch nicht so der Hirsch bin und ich mich erst in die Materie einarbeite.

Danke auf jeden Fall schon mal fürs Nachsehen und die Info.

Gruss,

bool


----------



## Jochen Kühner (1 Juni 2010)

bool schrieb:


> ok, super. Ich bin auf jeden Fall schon mal froh, dass es nicht an mir gelegen hat, da ich Hochsprachen technisch noch nicht so der Hirsch bin und ich mich erst in die Materie einarbeite.
> 
> Danke auf jeden Fall schon mal fürs Nachsehen und die Info.
> 
> ...



So, hiermit sollte es gehen...


----------



## Jochen Kühner (3 Juni 2010)

@bool

Und hat beine Lib Jetzt was bei deinen Problemen gebracht?


----------



## bool (3 Juni 2010)

Jochen Kühner schrieb:


> @bool
> 
> Und hat beine Lib Jetzt was bei deinen Problemen gebracht?


 
Hi, habs leider nur kurz antesten können, da ich momentan auch grad uwegs bin. Die S7Online Freigabe nach Verbindungsabbau ohne Beenden des Programms hat bei meinen gestrigen Tests leider nicht funktioniert.
Morgen oder spät. am Samstag hoffe ich dass ich wieder etwas mehr Zeit finden werde und würde dann auch mal das TCP/IP über S7Online ausprobieren wollen. Wenn ich das richtig verstanden habe ist dies mit der neuen Version auch schon möglich, richtig? Muss ich beim Verbindungsaufbau irgend was spezielles (z.B. anderen Funktionen aufrufen o.ä.) beachten? 

Gruss,

bool


----------



## Jochen Kühner (3 Juni 2010)

bool schrieb:


> Hi, habs leider nur kurz antesten können, da ich momentan auch grad uwegs bin. Die S7Online Freigabe nach Verbindungsabbau ohne Beenden des Programms hat bei meinen gestrigen Tests leider nicht funktioniert.
> Morgen oder spät. am Samstag hoffe ich dass ich wieder etwas mehr Zeit finden werde und würde dann auch mal das TCP/IP über S7Online ausprobieren wollen. Wenn ich das richtig verstanden habe ist dies mit der neuen Version auch schon möglich, richtig? Muss ich beim Verbindungsaufbau irgend was spezielles (z.B. anderen Funktionen aufrufen o.ä.) beachten?
> 
> Gruss,
> ...



Rufst du denn disconnectPLC auf?

Ja, für die tcp ip verbindung musst du die verbindung mit libnodave.daveConnection aufbauen, aber mit dem 2ten konstruktor mit mehr parametern!


----------



## bool (6 Juni 2010)

Jochen Kühner schrieb:


> Rufst du denn disconnectPLC auf?
> 
> Ja, für die tcp ip verbindung musst du die verbindung mit libnodave.daveConnection aufbauen, aber mit dem 2ten konstruktor mit mehr parametern!


 
So nachdem ich dieses Wochenende der Gartenarbeit und Familie gewidmet hatte, habe ich nun noch ein bischen Zeit um mich wieder um das libnodave Projekt zu kümmern.

Der Test mit Deiner neusten libnodave.dll (01.06. 23:44 mit 147kB) und libnodave.net.dll (compilierte libnodave.net.cs vom 28.05.2010 22:43) brachten bei mir leider das Ergebnis, dass selbst beim ersten Verbindungsaufbau (direkt nach Applikationsstart) via S7Online sich die Funktion dc.connectPLC mit dem Ergebnis -1 "no message defined" verabschiedet. Nach Wechseln der libnodave.dll zur älteren Version vom 12.05.2010 geht dann die S7Online Verbindung auch wieder.
Interessanterweise hatte die Funktion diListReachablePartners() vor dem dc.connectPLC() auch bei der neuen dll die richtigen MPI Teilnehmer zurückgegeben.

Die ISO on TCP und auch die MPI Verbindung via RS232 Adapter funktionierten übrigens auch mit der neuen dll weiterhin, die S7Verbindung wie beschrieben jedoch leider nicht.

Um zu Deiner Frage zurück zu kommen, ja ich rufe die Funktion 
dc.disconnectPLC() beim Verbindungabbau auf, danach 
di.disconnectAdapter() und im Anschluss 
libnodave.closeS7online(fds.rfd) wenn es sich um eine S7Online Verbindung gehandelt hat.

Ich hoffe Du hast noch eine Idee an was das liegen könnte. 
Wie bereits erwähnt, habe ich die dlls nicht im Systemverzeichnis, sondern nur im Projektverzeichnis liegen.

Gruss,

bool


----------



## Jochen Kühner (6 Juni 2010)

bool schrieb:


> So nachdem ich dieses Wochenende der Gartenarbeit und Familie gewidmet hatte, habe ich nun noch ein bischen Zeit um mich wieder um das libnodave Projekt zu kümmern.
> 
> Der Test mit Deiner neusten libnodave.dll und libnodave.net.dll brachten bei mir leider das Ergebnis, dass selbst beim ersten Verbindungsaufbau (direkt nach Applikationsstart) via S7Online sich die Funktion dc.connectPLC mit dem Ergebnis -1 "no message defined" verabschiedet. Nach Wechseln der libnodave.dll zur älteren Version vom 12.05.2010 geht dann die S7Online Verbindung auch wieder.
> Interessanterweise hatte die Funktion diListReachablePartners() vor dem dc.connectPLC() auch bei der neuen dll die richtigen MPI Teilnehmer zurückgegeben.
> ...



Das liegt nicht an der dll denke ich. Habe im Moment das Problem, das Ich Änderungen welche ich vornehme nur mit einem tcp/ip zugang über s7online testen kann, da ich nur einen netlink usb als mpi adapter habe, welcher unter win7 im moment nicht über .net anwendungen ansprechbar ist! Werd mal schauen was ich nächste woche noch weiter darn machen kann, melde mich...


----------



## bool (6 Juni 2010)

Bitte prüfe doch kurz, ob ich Deine aktuellsten libnodave.dll und libnodave.net.cs (siehe Zeitstempel in meinem obigen Post) verwende oder ob es hier bereits neuere Versionen gibt welche zu testen es sich lohnen würde.

Danke und Gruss,

bool


----------



## Jochen Kühner (6 Juni 2010)

bool schrieb:


> Bitte prüfe doch kurz, ob ich Deine aktuellsten libnodave.dll und libnodave.net.cs (siehe Zeitstempel in meinem obigen Post) verwende oder ob es hier bereits neuere Versionen gibt welche zu testen es sich lohnen würde.
> 
> Danke und Gruss,
> 
> bool



Denke schon, wenn es die Versionen aus diesem Thread sind! (Kann das nicht vergleichen, da Ich die Versionen im Moment nicht vorhalte, da Ich laufend was ändere ;-) ). Hab aber noch was gefunden, was Ich bei S7Online noch falsch mache... Ich bin ab Donnerstag wieder im Büro, dann such Ich mal meinen alten Seriellen MPI Adapter und Versuchs nochmal...

Und danach mach Ich mich an's Routing von Netlink und Netlink lite...


----------



## bool (7 Juni 2010)

Jochen Kühner schrieb:


> Ja, für die tcp ip verbindung musst du die verbindung mit libnodave.daveConnection aufbauen, aber mit dem 2ten konstruktor mit mehr parametern!


 

Habe ich das richtig verstanden?
Für die TCP/IP Verbindung über S7Online muss ich die "libnodave.openS7online()" Funktionsvariante aufrufen bei welcher ich als zweiten Parameter das Fensterhandle übergebe und danach muss ich dann die neue Funktion "libnodave.daveNewExtendedConnection()" aufrufen und entsprechend parametrieren? Ist dies so korrekt? Muss ich dann trotzdem für die MPI über S7Online Verbindung die herkommliche "daveConnection" aufrufen oder kann ich dann für alle möglichen Verbindungen (MPI/Prifibus/TCP) diese erweiterte Funktion verwenden? Geht eigentlich dann auch ISOonTCP über S7Online? Ist zwar eigentlich unnötig, da es ja auch so geht, aber interessant wäre es auf jeden Fall zu wissen, ob man diese Verbindung weiterhin abfangen/blockieren muss.
...

...
hab nun grad mal versucht die erweitere Funktion in meinem Programm aufyurufen, doch leider wird die Deklaration aus der libnodave.net.dll nicht erkannt.

Ausug aus der libnodave.net.cs welche ich als dll compiliert und als dll eingebunden habe. Die entsprechende libnodve.dll liegt im selben Verzeichnis.

 [DllImport("libnodave.dll"/*, PreserveSig=false */ )]
        protected static extern IntPtr daveNewExtendedConnection(
        IntPtr di,
        byte[] destination,
        int DestinationIsIP,
        int rack,
        int slot,
        int routing,
        int routingSubnetFirst,
        int routingSubnetSecond,
        int routingRack,
        int routingSlot,
        byte[] routingDestination,
        int routingDestinationIsIP
    );

Kannst Du ggf. noch ein paar Worte dazu schreiben was die einzelnen Routing Parameter bedeuten, auch unter dem Parmeter "byte[] destination" kann mir noch nicht so wirklich viel vorstellen. 



Danke und Gruss,

bool


----------



## Jochen Kühner (7 Juni 2010)

bool schrieb:


> Habe ich das richtig verstanden?
> Für die TCP/IP Verbindung über S7Online muss ich die "libnodave.openS7online()" Funktionsvariante aufrufen bei welcher ich als zweiten Parameter das Fensterhandle übergebe und danach muss ich dann die neue Funktion "libnodave.daveNewExtendedConnection()" aufrufen und entsprechend parametrieren? Ist dies so korrekt? Muss ich dann trotzdem für die MPI über S7Online Verbindung die herkommliche "daveConnection" aufrufen oder kann ich dann für alle möglichen Verbindungen (MPI/Prifibus/TCP) diese erweiterte Funktion verwenden? Geht eigentlich dann auch ISOonTCP über S7Online? Ist zwar eigentlich unnötig, da es ja auch so geht, aber interessant wäre es auf jeden Fall zu wissen, ob man diese Verbindung weiterhin abfangen/blockieren muss.
> ...
> 
> ...



Die libnodave.daveNewExtendedConnection() muss verwendet werden, wenn ich S7Online mit Routing oder TCP/IP verwende, da Ich dort mehr Parameter brauche. Auch bei TCP/IP mit Routing musst du diese verwenden. Bei den anderen Verbindungstypen werden bisher die zusätzlichen Parameter einfach ignoriert!

  byte[] destination ==> Vorhanden, da bei TCP/Ip über S7Online eine Ip übergeben werden muss (als Char array)
        int DestinationIsIP ==> Ist das Ziel eine IP oder eine MPi Adresse
        int routing ==>Routing Benutzen
        int routingSubnetFirst ==>Subnetz ID wie in Netpro
        int routingSubnetSecond ==> Subnetz ID wie in Netpro

Du kannst das ganze ja mit meiner Connection Library prüfen, da ist das ganze schon implementiert (Da ist ja auch ein Beispiel Programm dabei!)


----------



## bool (7 Juni 2010)

Jochen Kühner schrieb:


> Die libnodave.daveNewExtendedConnection() muss verwendet werden, wenn ich S7Online mit Routing oder TCP/IP verwende, da Ich dort mehr Parameter brauche. Auch bei TCP/IP mit Routing musst du diese verwenden. Bei den anderen Verbindungstypen werden bisher die zusätzlichen Parameter einfach ignoriert!
> 
> byte[] destination ==> Vorhanden, da bei TCP/Ip über S7Online eine Ip übergeben werden muss (als Char array)
> int DestinationIsIP ==> Ist das Ziel eine IP oder eine MPi Adresse
> ...


 
ok, Danke für die Info. 

Werde ich mich gegen Ende der Woche damit beschäftigen.

Gruss,

bool


----------



## Jochen Kühner (9 Juni 2010)

*Ok...*

Ok, mit meiner Lib geht über S7Online kein Serieller Adapter mehr, habs grad getestet... Morgen schau Ich mir das dann... Melde mich!


----------



## Jochen Kühner (10 Juni 2010)

*Soooo*

So, nun hab Ich mal wieder was gemacht...

MPI Adapter sollten nun auch wieder über S7Online gehen (kann leider nur mit einem Seriellen testen, sobald NetlinkUSB auch unter Windows 7 richtig läuft teste Ich auch damit!)

Auch in meiner Connection Lib gibts ein bischen was neues:

auslesen der CPU Bausteine, auslesen CPU Status (noch fehlerhaft, geht heute oder morgen abend).

Download ab jetzt immer hier: http://jochensserver.dyndns.org/wordpress/?page_id=55


----------



## bool (11 Juni 2010)

Jochen Kühner schrieb:


> So, nun hab Ich mal wieder was gemacht...
> 
> MPI Adapter sollten nun auch wieder über S7Online gehen (kann leider nur mit einem Seriellen testen, sobald NetlinkUSB auch unter Windows 7 richtig läuft teste Ich auch damit!)


 
Hab grad mal schnell die neue libnodave.dll mit ner CP5611 getestet, die S7Online Verbindung geht wieder, nach Verbindungstrennung wird die CP aber leider noch immer nicht für eine erneute Verbindung freigegeben.

Gruss,

bool


----------



## Jochen Kühner (11 Juni 2010)

bool schrieb:


> Hab grad mal schnell die neue libnodave.dll mit ner CP5611 getestet, die S7Online Verbindung geht wieder, nach Verbindungstrennung wird die CP aber leider noch immer nicht für eine erneute Verbindung freigegeben.
> 
> Gruss,
> 
> bool



Wie sieht das denn bei dir aus ??? Also wenn ich mit dem Seriellen Adapter die Verbindung trenne und neu verbinde klappts ohne Probleme. (Zumindest mit meinem Programm). Hast du das jetzt mit deinem Code, oder mit meinem Programm versucht?

Hab auch noch einen CP5611 rumliegen, der läuft aber nicht mit meinem aktuellen Laptop, muss mal sehen, vielleicht kann Ich da nächste Woche nochmal was probieren!


----------



## bool (11 Juni 2010)

Jochen Kühner schrieb:


> Wie sieht das denn bei dir aus ??? Also wenn ich mit dem Seriellen Adapter die Verbindung trenne und neu verbinde klappts ohne Probleme. (Zumindest mit meinem Programm). Hast du das jetzt mit deinem Code, oder mit meinem Programm versucht?
> 
> Hab auch noch einen CP5611 rumliegen, der läuft aber nicht mit meinem aktuellen Laptop, muss mal sehen, vielleicht kann Ich da nächste Woche nochmal was probieren!


 
Habs mit meinem eigenen Programm ausprobiert, der S7Online Verbindungsauf- und Abbau funktioniert eigentlich ganz unspektakulär wie in meinem separten Thread gepostet, siehe: 
http://www.sps-forum.de/showthread.php?t=35831

Allerdings habe ich bei meinem Test heute noch die libnodave.Connection() aufgerufen, nicht die für TCP/IP überarbeitete neue Funktion.
Ich werde jetzt am Wochenende mal versuchen Deine Connection lib zu verwenden. Vielleicht läuft es dann mit dem Reconnect in Verbindung mit S7Online besser, alle anderen Verbindungsarten über MPI,MPI2 und ISO onTCP funktionieren ja auch bei mir via Reconnect (z.B. wenn jemand während dem Protokollieren das Kabel gezogen und wieder eingesteckt hat) problemlos. 

Gruss,

bool


----------



## Jochen Kühner (11 Juni 2010)

bool schrieb:


> Habs mit meinem eigenen Programm ausprobiert, der S7Online Verbindungsauf- und Abbau funktioniert eigentlich ganz unspektakulär wie in meinem separten Thread gepostet, siehe:
> http://www.sps-forum.de/showthread.php?t=35831
> 
> Allerdings habe ich bei meinem Test heute noch die libnodave.Connection() aufgerufen, nicht die für TCP/IP überarbeitete neue Funktion.
> ...



Also Ich habe auf jeden Fall was geändert, das wenn du DisconnectPLC aufrufst, beim S7Online Protokoll auch was gesendet wird!

Rufst du bei dir auch sicher DisconnectPLC auf?


----------



## bool (11 Juni 2010)

Jochen Kühner schrieb:


> Also Ich habe auf jeden Fall was geändert, das wenn du DisconnectPLC aufrufst, beim S7Online Protokoll auch was gesendet wird!
> 
> Rufst du bei dir auch sicher DisconnectPLC auf?


 
Jup, wird auch jedes mal ins Debugfile geloggt. Hier mal ein Beispiel wenn nach wiederholten Lesefehler automatisch die Verbindung abgebaut wird. Der Lesefehler kommt hier zustande, da die S7Online Verbindung nach dem ersten Reconnect nicht wirklich funktioniert, da die Schnittstelle zuvor von wem auch immer (Programm, .NET, OS...) nicht wieder freigegeben wurde. Die S7Online Verbindung gibt interessanter Weise jedoch wie man im Log erkennen kann beim connectPLC grünes Licht...:

11.06.2010 07:19:06:906 Start Connection via S7Online ...
11.06.2010 07:19:06:921 S7Online Local Address: 0
11.06.2010 07:19:06:921 S7Online Remote Address: 2
11.06.2010 07:19:06:921 S7Online Baudrate: 187.5k
11.06.2010 07:19:06:921 S7Online CPU rack: 0
11.06.2010 07:19:06:921 S7Online CPU slot: 2
11.06.2010 07:19:06:937 S7Online Reconnecting after: 5 read errors
11.06.2010 07:19:06:937 S7Online Reconnecting Interval: 20000 ms
11.06.2010 07:19:06:953 Open S7Online Connection (PG/PC Interface) - Used Adapter: CP5611(Auto)
11.06.2010 07:19:06:953 Open S7Online Connection (PG/PC Interface) - Local Address: 0
11.06.2010 07:19:06:953 Open S7Online Connection (PG/PC Interface) - Timeout: 1sec (L4_TIMEOUT = 18)
11.06.2010 07:19:06:968 Open S7Online Connection (GetForegroundWindow)... hWnd=328754
11.06.2010 07:19:06:968 Open S7Online Connection (before 1st call of libnodave.openS7online)... fds.rfd=1
11.06.2010 07:19:06:968 Open S7Online Connection (libnodave.openS7online)... fds.rfd=1
11.06.2010 07:19:06:984 Open S7Online Connection (libnodave.openS7online)... S7Online intern=Kein Fehler
11.06.2010 07:19:06:984 *Open S7Online Connection (di.initAdapter)... res=0 - ok*
11.06.2010 07:19:07:750 Open S7Online Connection (di.listReachablePartners) ... Result: 126
11.06.2010 07:19:07:781 Open S7Online Connection - detected MPI/Profibus device addresses: 0 2 
11.06.2010 07:19:08:578 *Open S7Online Connection (dc.connectPLC)... res=0 - ok*
11.06.2010 07:19:08:593 Open S7Online Connection successfull
11.06.2010 07:19:10:421 Datalogger: Starting without Trigger
11.06.2010 07:19:10:421 Datalogger: Preparing Poll data...
11.06.2010 07:19:10:578 Datalogger: Logfile started...
11.06.2010 07:19:10:578 Datalogger: Polling data started...
11.06.2010 07:19:10:781 Error from dc.execReadRequest: -128 = Unexpected function code in answer
11.06.2010 07:19:10:984 Error from dc.execReadRequest: -128 = Unexpected function code in answer
11.06.2010 07:19:11:187 Error from dc.execReadRequest: -128 = Unexpected function code in answer
11.06.2010 07:19:12:796 Error from dc.execReadRequest: -128 = Unexpected function code in answer
11.06.2010 07:19:12:812 Error from dc.execReadRequest: -128 = Unexpected function code in answer
11.06.2010 07:19:12:812 *Close Connection (dc.disconnectPLC)... res=0 - ok*
11.06.2010 07:19:12:812 *Close Connection (di.disconnectAdapter)... IntPtr=0*
11.06.2010 07:19:12:828 Close Connection (closeS7online)... fds.rfd=1
11.06.2010 07:19:12:828 *Close Connection (closeS7online)... res=0 - ok*


Habe grad mal versucht Dein TestVB Programm zu starten nachdem ich das erforderliche .NET Framework 4.0 auf meinem Rechner installiert habe (mein Programm basiert der Kompatibilität halber noch auf .NET Framework 2.0 auf, kann das ggf. das Problem sein?) bekam ich nachdem ich das TestVB Programm geöffnet hatte leider 17 Fehlermeldungen und musste feststellen, dass die ConnectionLibrary bei den Projekt-Verweisen nicht gefunden werden konnte. Ich hab dann versucht diese per Link auf die DLL (per Durchsuchen und Auswählen der LibNoDaveConnectionLibrary.dll) neu einzubinden, es kam jedoch beim Pfad immer wieder die selbe Meldung "<System kann den angegebenen Verweis nicht finden>". Was mache ich hier falsch?
Bin wie gesagt VB.NET bzw. hochsprachentechnisch noch am einsteigen, vor allem was "komplexere" Projektverlinkungen anbelangt.

Danke schon mal im voraus für jeden Tipp.

Gruss,

bool


----------



## Jochen Kühner (12 Juni 2010)

Nutze mal die test csharp. das müsste es auch schon ein exe file geben! nur zum testen ob der reconnect geht!


----------



## bool (12 Juni 2010)

Jochen Kühner schrieb:


> Nutze mal die test csharp. das müsste es auch schon ein exe file geben! nur zum testen ob der reconnect geht!


 
Gesagt, getan und tut? ...leider nicht:

Hab die bereits von Dir erstellte TestLibrary.exe (unter Verwendung der libnodave.dll vom 10.06. 08:31 mit 148kB) ausgeführt, doch auch mit dem Programm funktioniert nur der erste Connect via S7Online mittels der CP5611 (PCI), nach einem Disconnect und erneutem Connect (auch mit Warten mehrer Minuten zwischen Disconnect und Reconnect) wird beim anschliessenden zyklischen Lesen einer Variablen (hier Taktmerkerbyte MB190) ebenfalls "Error: Unexpected function code in answer" ausgegeben. 
Interessanterweise funktionierte das Lesen über S7Online bei Deinem Programm 1-2 mal wieder wenn zwischendurch z.B. eine Verbindung über ISOonTCP aufgebaut wurde, dann ging auf einmal auch das nicht mehr.

Beobachtung:
Auch wenn eine S7Online Verbindung über "Disconnect" abgebaut wird, wird die Schnittstelle nicht wieder freigegeben. Dies äussert sich dadurch, dass wenn man unter "PG/PC Schnittstelle einstellen" geht und sich die Parameter des eben verwendeten Adapters ansehen möchte folgende Meldung kommt: "Die benutze Schnittstelle kommuniziert gerade.Sie können die Eigenschaft im Moment nicht ändern.". Auch kann, solange das Programm welches die Verbindung aufgebaut hatte, geöffnet ist kein anderer Adapter unter "PG/PC Schnittstelle einstellen" ausgewählt werden. Das zeigt doch, dass diese nicht wieder freigegeben wurde. Daran ändert sich nichts ob man nur 5 Sekunden oder 10 Minuten wartet. Erst das Beenden des Programms bringt die erhoffte Schnittstellenfreigabe. 

Ich hoffe Du kannst dieses Verhalten auf Deinem System ebenfalls nachvollziehen, da sich Dein Testprogramm TestLibrary.exe bei mir ebenso verhalten hat.

Gruss,

bool


----------



## Jochen Kühner (12 Juni 2010)

bool schrieb:


> Gesagt, getan und tut? ...leider nicht:
> 
> Hab die bereits von Dir erstellte TestLibrary.exe (unter Verwendung der libnodave.dll vom 10.06. 08:31 mit 148kB) ausgeführt, doch auch mit dem Programm funktioniert nur der erste Connect via S7Online mittels der CP5611 (PCI), nach einem Disconnect und erneutem Connect (auch mit Warten mehrer Minuten zwischen Disconnect und Reconnect) wird beim anschliessenden zyklischen Lesen einer Variablen (hier Taktmerkerbyte MB190) ebenfalls "Error: Unexpected function code in answer" ausgegeben.
> Interessanterweise funktionierte das Lesen über S7Online bei Deinem Programm 1-2 mal wieder wenn zwischendurch z.B. eine Verbindung über ISOonTCP aufgebaut wurde, dann ging auf einmal auch das nicht mehr.
> ...



Also ich kann das nicht nachvollziehen, zumindest nicht mit dem seriellen Adapter über S7Online! Bei mir hat jeder Verbindungs auf und Abbau geklappt! Bei mir machts mit S7Online nur Probleme wenn Step 7 im Hintergrund läuft... (Ich habe alle Prozesse mit s7 gekillt!). Funktioniert das ganze den richtig wenn du agling statts libnodave verwendest?


----------



## bool (12 Juni 2010)

Jochen Kühner schrieb:


> Also ich kann das nicht nachvollziehen, zumindest nicht mit dem seriellen Adapter über S7Online! Bei mir hat jeder Verbindungs auf und Abbau geklappt! Bei mir machts mit S7Online nur Probleme wenn Step 7 im Hintergrund läuft... (Ich habe alle Prozesse mit s7 gekillt!). Funktioniert das ganze den richtig wenn du agling statts libnodave verwendest?


 
Der Verbindungsaufbau an sich (auch nach einem Abbau) wird bei mir auch immer positiv gemeldet (siehe auch Debugfileauszug weiter oben), jeflicher Zugriff auf die SPS wie z.B. Lesefunktionen gehen im Anschluss jedoch schief!!!
Hast Du nach dem Connect -> Disconnect -> Connect im Anschluss auch eine Variable versucht zu lesen und das ging bei Dir fehlerfrei?

Das Abschiessen der gesamten S7 Prozesse habe ich noch nicht versucht, wenn dies jedoch für das Funktionieren der Kommunikation mit libnodave via S7Online nötig sein sollte, wäre das auf jeden Fall nicht grade sehr elegant, Ich werde es heute abned auf jeden Fall mal ausprobieren.

Hast Du auch mal nach einem S/Online Connect -> Read ON -> Read OFF -> Disconnect versucht die Schnittstellen Paramter des "PG PC Schnittstelle einstellen" Dialogs zu öffnen und hat dieser dann nicht reklamiert, dass die Schnittstelle noch in Verwendung ist? (wichtig: bevor das Programm beendet wurde welches die Schnittstelle verwendet hat)

Gruss,

bool


----------



## Jochen Kühner (12 Juni 2010)

bool schrieb:


> Der Verbindungsaufbau an sich (auch nach einem Abbau) wird bei mir auch immer positiv gemeldet (siehe auch Debugfileauszug weiter oben), jeflicher Zugriff auf die SPS wie z.B. Lesefunktionen gehen im Anschluss jedoch schief!!!
> Hast Du nach dem Connect -> Disconnect -> Connect im Anschluss auch eine Variable versucht zu lesen und das ging bei Dir fehlerfrei?
> 
> Das Abschiessen der gesamten S7 Prozesse habe ich noch nicht versucht, wenn dies jedoch für das Funktionieren der Kommunikation mit libnodave via S7Online nötig sein sollte, wäre das auf jeden Fall nicht grade sehr elegant, Ich werde es heute abned auf jeden Fall mal ausprobieren.
> ...



Jo, hab Ich alles Probiert, und das ging bei mir auch ohne Probleme. Sowohl mit TCP/IP über S7Online als auch mit der Seriellen Schnittstelle über S7Online. Keine Probleme. Hab auch meine CP 5511 Karte gefunden, mit der probier Ich es am Montag mit dem alten Laptop nochmal.


----------



## bool (14 Juni 2010)

Jochen Kühner schrieb:


> Jo, hab Ich alles Probiert, und das ging bei mir auch ohne Probleme. Sowohl mit TCP/IP über S7Online als auch mit der Seriellen Schnittstelle über S7Online. Keine Probleme. Hab auch meine CP 5511 Karte gefunden, mit der probier Ich es am Montag mit dem alten Laptop nochmal.


 
Ok, da bin ich auf jeden Fall mal gespannt, was das Ergebnis mit Deinem Laptop sein wird. Meine beiden Systeme (Laptop und Desktop) welche Probleme mit dem Reconnect von libnodave unter S7Online haben sind übrigens beides Rechner mit XP SP3.

Nach noch ein bischen herum probieren mit dem von Dir zur Verfügung gestellten vorcompilierten Programm "TestLibrary" habe ich ausserdem noch festgestellt, dass wenn man zum Forcieren eines Übertragungsfehlers z.B. das MPI Kabel während des zyklischen Lesens entfernt hat und danach wieder gesteckt hat, das Lesen der Testvariable hin und wieder wieder möglich war wenn man einen "Connect" ausgeführt hat, ohne zuvor zu "disconnecten". Wurde vor dem "Connect" ein "Disconnect" ausgeführt wie man (oder zumindest ich) es eigentlich erwarten würde, dann klappte der darauffogende Lesebefehl wie zuvor gepostet nicht.

Kurz zusammen gefasst:

Connect (erst bei 2tem Versuch ok) -> Read (MB190) -> MPI Kabel gezogen (erzwungener Lesefehler)-> Kabel wieder gesteckt -> Stop Read -> Disconnect -> Connect -> Read -> geht nicht! (Lesefehler)

Connect (erst bei 2tem Versuch ok) -> Read (MB190) -> MPI Kabel gezogen (erzwungener Lesefehler)-> Kabel wieder gesteckt -> Stop Read -> Connect *ohne* Disconnect -> Read -> geht!

Wie auch zuvor beschrieben wurde auch mit der "Testlibrary" (Version vom 10.06.) nach einem S7Online Connect -> Read (MB190) -> Stop Read -> Disconnect der Adapter unter "PG/PC Schnittstelle einstellen" nicht wieder freigegeben, auch nicht wenn ich die vier "S7***" Prozesse über den Taskmanager abgeschossen habe. Dies äussert sich bei mir indem ich eine Meldung bekomme, dass der Adapter grade kommuniziert und die Parameter nur schreibgeschützt geöffnet werden können. Erst wenn das "TestLibrary" Programm beendet wurde, wird bei meinem Desktop der ADapter wieder freigegeben. (mein Laptop hat noch kein .NET 4.0 installiert-> Was ist eigentlich der Grund für die Abhängigkeit der Testlibrary von .NET 4.0?) 

Es wäre auf jeden Fall klasse wenn Du der Reproduzierbarkeit halber das oben beschriebene Verhalten ebenfalls mit dem Programm "Testlibrary" vom 10.06. ausprobieren könntest, Danke schon mal im voraus.

Gruss,

bool


----------



## Jochen Kühner (14 Juni 2010)

bool schrieb:


> Ok, da bin ich auf jeden Fall mal gespannt, was das Ergebnis mit Deinem Laptop sein wird. Meine beiden Systeme (Laptop und Desktop) welche Probleme mit dem Reconnect von libnodave unter S7Online haben sind übrigens beides Rechner mit XP SP3.
> 
> Nach noch ein bischen herum probieren mit dem von Dir zur Verfügung gestellten vorcompilierten Programm "TestLibrary" habe ich ausserdem noch festgestellt, dass wenn man zum Forcieren eines Übertragungsfehlers z.B. das MPI Kabel während des zyklischen Lesens entfernt hat und danach wieder gesteckt hat, das Lesen der Testvariable hin und wieder wieder möglich war wenn man einen "Connect" ausgeführt hat, ohne zuvor zu "disconnecten". Wurde vor dem "Connect" ein "Disconnect" ausgeführt wie man (oder zumindest ich) es eigentlich erwarten würde, dann klappte der darauffogende Lesebefehl wie zuvor gepostet nicht.
> 
> ...



Mhhmmm, also Ich habe das oben geschriebene Phänomen gearde probiert und nicht feststellen können. Habe es aber auch mit einem Seriellen MPI Adapter gemacht! Der Test mit dem CP5511 folgt noch...

.NET 4.0 ?? Eingendlich keine, habs halt mit VS2010 erstellt. Habs gerade Probiert auf 2.0 zurückzustellen, das geht aber nicht da Ich irgendwo Extension Methods verwende. Ich werd sehen das Ich das ändere und auf 2.0 zurückfalle! Zumindest mit der Lib und den Testprogrammen (aber nicht mit dem WPF Testprogramm (geht ja nicht ;-) ))


----------



## Jochen Kühner (14 Juni 2010)

*Nochmal...*

Ok, habs nun auch mit dem CP5511 Probiert...

Read -> Stecker ziehen (unexpected usw..) -> Stecker drauf -> Disconnect -> Connect -> geht!

paar mal probiert! ohne Probleme!!!


----------



## bool (14 Juni 2010)

Jochen Kühner schrieb:


> Ok, habs nun auch mit dem CP5511 Probiert...
> 
> Read -> Stecker ziehen (unexpected usw..) -> Stecker drauf -> Disconnect -> Connect -> geht!
> 
> paar mal probiert! ohne Probleme!!!


 

Hmm, danke auf jeden Fall für Deine Tests.

Da frage ich mich nun wo bei den Systemen der Unterschied liegt.

Welches OS und SP hast Du auf dem Laptop und welche Step7 Version ist installiert? Ist auf dem Laptop die Step7 Lizenz drauf oder benutzt Du nur die DLL ohne lauffähige Step7 Installation?
Was könnte es sonst noch für entscheidende Unterschiede geben?

Gruss,

bool


----------



## Jochen Kühner (14 Juni 2010)

bool schrieb:


> Hmm, danke auf jeden Fall für Deine Tests.
> 
> Da frage ich mich nun wo bei den Systemen der Unterschied liegt.
> 
> ...



Kein Plan, einmal Windows XP (Serieller Adapter), einmal Windows 7 (CP5511) , Step 7 ist jw installiert, mit Lizens, denke das dürfte aber keine Auswirkungen haben!


----------



## Jochen Kühner (14 Juni 2010)

*Mein Programm??*

Und die probleme traten jetzt mit meinem Beispielprogramm auch auf??


----------



## bool (14 Juni 2010)

Jochen Kühner schrieb:


> Und die probleme traten jetzt mit meinem Beispielprogramm auch auf??


 
Wie gesagt, die Probleme wie oben beschrieben waren mit Deinem von Dir compilierten Programm "Testlibrary.exe" (unverändert) vom 10.06. und der aktuellen libnodave.dll genau wie oben beschrieben nachvollziehbar und reproduzierbar. 
Das ist es ja was mich erstaunt, dass das Programm bei Dir fehlerfrei läuft und sich bei mir genau so verhält wie mein eigenes Programm auch, egal ob S7Online via CP5611 oder S7Online via RS232 -> MPI Adapter.

Ich bin echt ratlos.......

Gruss,

bool


----------



## Jochen Kühner (14 Juni 2010)

Ja für mich auch, probiers doch jetzt mal noch mit der demo von Accon AGLink, ob dies die gleichen Probleme verursacht!


----------



## bool (14 Juni 2010)

Jochen Kühner schrieb:


> Ja für mich auch, probiers doch jetzt mal noch mit der demo von Accon AGLink, ob dies die gleichen Probleme verursacht!


 
Gibt es bei der Accon AGLink Demo ebenfalls die Möglichkeit die S7Online Schnittstelle zu benutzen oder inwiefern bekomme ich hierbei eine Aussage bezüglich meines Problems über S7Online?

Ich werde die Demo morgen mal installieren, für heute bin ich einfach zu platt und werde mich gleich waagerecht legen.

Soweit schon mal ä guts nächtle.

Gruss,

bool


----------



## Jochen Kühner (14 Juni 2010)

bool schrieb:


> Gibt es bei der Accon AGLink Demo ebenfalls die Möglichkeit die S7Online Schnittstelle zu benutzen oder inwiefern bekomme ich hierbei eine Aussage bezüglich meines Problems über S7Online?
> 
> Ich werde die Demo morgen mal installieren, für heute bin ich einfach zu platt und werde mich gleich waagerecht legen.
> 
> ...



Ja die gibt es! Will damit nur prüfen ob es ein LibNoDave oder ein generelles Problem ist! Wenn es damit funktioniert können wir viel. über ein Telegrammlog das Problem eingrenzen..


----------



## bool (16 Juni 2010)

Jochen Kühner schrieb:


> Ja die gibt es! Will damit nur prüfen ob es ein LibNoDave oder ein generelles Problem ist! Wenn es damit funktioniert können wir viel. über ein Telegrammlog das Problem eingrenzen..


 
Hallo, sorry dass ich mich erst jetzt wieder melde, aber gestern war grillen angesagt, wir mussten den regenfreien Abend ausnutzen.
Inzwischen habe ich mir das Accon AGLink heruntergeladen, es scheint sich hier ähnlich wie bei lbnodave um Funktionslibraries zu handeln.
Muss ich um den S7Online Verbindungsauf- und Abbau zu überprüfen diese nun in mein Programm einbinden oder gibt es für die S7Online Schnittstelle schon ein fertiges Beispielprogramm welches ich für einen einfachen Funktionstests verwenden kann?

Gruss,

bool


----------



## Rainer Hönle (16 Juni 2010)

Bei ACCON-AGLink gibt es den Konfigurator. Dort ist es direkt möglich, die Verbindung zu testen. Ebenfalls mitinstalliert wird der API-Guide. Dort kann ohne eine Zeile zu programmieren jede Funktion aufgerufen und getestet werden. Desweiteren sind einige Beispielprogramme enthalten, die sofort ausgeführt werden können. Wenn es um die Verbindungsüberwachung, dann mal ConnTest genauer ansehen. Über welchen Verbindungsweg ACCON-AGLink kommuniziert, kann übrigens komplett von außen über AGLink40_Config.EXE eingestellt werden.


----------



## Jochen Kühner (16 Juni 2010)

Da sind beispielprogramme dabei, aber verbindung aufbauen & abbauen kannst du auch mit dem aglink config programm versuchen, dort kann man die eingestellte verbindung testen.


----------



## bool (16 Juni 2010)

Jochen Kühner schrieb:


> Da sind beispielprogramme dabei, aber verbindung aufbauen & abbauen kannst du auch mit dem aglink config programm versuchen, dort kann man die eingestellte verbindung testen.


So, habe es nun endlich geschafft die Verbindung mittels Accon AGLink zu prüfen. Hierfür habe ich das Programm "AGLink40_Config.exe" ausgeführt und die Schnittstelle "S7-PC/CP" eingestellt, bei PG/PC Schnittstelle habe ich dann sowohl den RS232-> MPI Adapter als auch die CP5611 ausprobiert und den Kommunikationstest gestartet, alle geprüften Funktionen gaben "kein Fehler" zurück: 

AGL_OpenDevice( DevNr=0 ) : Kein Fehler
AGL_DialUp( DevNr=0, boWait=true ) : Kein Fehler
AGL_InitAdapter( DevNr=0, boWait=true ) : Kein Fehler
AGL_GetLifeList( DevNr=0, List, boWait=true ) : 2 
AGL_PLCConnect( DevNr=0, PlcNr=2, boWait=true ) : Kein Fehler
AGL_ReadMLFBNr( ConnNr=0x800, MLFBNr, boWait=true ) : 6ES7 317-2EK13-0AB0 
AGL_PLCDisconnect( ConnNr=0x800, boWait=true ) : Kein Fehler
AGL_ExitAdapter( DevNr=0, boWait=true ) : Kein Fehler
AGL_HangUp( DevNr=0, boWait=true ) : Kein Fehler
AGL_CloseDevice( DevNr=0 ) : Kein Fehler


Während der Test lief wurde man unter "PG/PC Schnittstelle einstellen" erwartungsgemäss darauf hingewiesen, dass der Adapter gerade kommuniziert und die Parameter nicht geändert werden können, nachdem der Test beendet war, konnten die Parameter wieder ohne Meldung modifiziert werden.

Die Testprogramme "*.exe" hingegen bringen entweder dass "AGL4DotNET, Version 4.4.0.0" nicht geladen werden konnte oder die folgende Meldung:

Fehler FFF0000D (Geraet ist nicht konfiguriert oder wird nicht unterstuetzt) in AGL_OpenDevice
Bitte <ESC> zum Beenden drcken ...

Was bedeuten diese Meldungen und was muss ich noch einstellen/installieren, dass die AGLink Testprogramme benutzt werden können? 

Summasummarum scheint es sich jedoch verbindungstechnisch aber bei meinem Problem um ein libnodave spezifisches Problem zu handeln, da der Adapter an sich bei Accon AGLink nach dem Verbindungsauf- und Abbau wieder anstandslos freigegeben wurde. Interessant wäre hier nun noch zu erfahren, ob auch eine/mehrere Variable (Merker oder DB-Variable) nach jeder Neuverbindung fehlerfrei gelesen werden kann/können.

Jetzt stellt sich die Frage ob man aus diesem Test bezüglich der libnodave Problematik die Ursache bereits eingrenzen kann?

Gruss,

bool



Ergänzung:
Habs nun auch geschafft mit ACCON AGLink API Guide die Verbindung aufzubauen und Daten (MB190) zu lesen. Während dessen war die PG/PC Schnittstelle erwartungsgemäss blockiert, nach dem Verbindungsabbau war diese wieder frei.
Auch ein Reconnect über S7Online hat mittels AGLink mehrfach und problemlos funktioniert, inklusive das erneute Lesen von Daten. Was macht also AGLink anders als libnodave ????


----------



## Jochen Kühner (16 Juni 2010)

Ich kann dein Problem halt nicht nachvollziehen, da Ich die Schnitstelle immer wieder ändern kann (auch nach der Verwendung mit libNoDave). Du kannst ja mal versuchen während eines verbindungstests mit aglinkconfig den Stecker zu ziehen, um zu sehen obs danach noch läuft!

Wegen den anderen aglink problemen kann ich dir auch nicht helfen, da müsste man viel. bei deltalogic nachfragen...


----------



## Jochen Kühner (16 Juni 2010)

bool schrieb:


> Auch ein Reconnect über S7Online hat mittels AGLink mehrfach und problemlos funktioniert, inklusive das erneute Lesen von Daten. Was macht also AGLink anders als libnodave ????



Falls man die Situation genau nachstellen kann wie es zustande kommt und bei aglink geht und bei libnodave nicht, kann ich dir meinen s7onlinex wrapper zuschicken, eine dll die die aufrufe an die s7onlinex.dll abfängt und protokolliert, so kannst man genau analysieren was für telegramme geschickt werden!


----------



## bool (16 Juni 2010)

Jochen Kühner schrieb:


> Falls man die Situation genau nachstellen kann wie es zustande kommt und bei aglink geht und bei libnodave nicht, kann ich dir meinen s7onlinex wrapper zuschicken, eine dll die die aufrufe an die s7onlinex.dll abfängt und protokolliert, so kannst man genau analysieren was für telegramme geschickt werden!


 
ok, wäre auf jeden Fall einen Versuch wert.


----------



## bool (17 Juni 2010)

Jochen Kühner schrieb:


> Ich kann dein Problem halt nicht nachvollziehen, da Ich die Schnitstelle immer wieder ändern kann (auch nach der Verwendung mit libNoDave). Du kannst ja mal versuchen während eines verbindungstests mit aglinkconfig den Stecker zu ziehen, um zu sehen obs danach noch läuft!


 
Wenn ich während einer aktiven Verbindung via S7Online über AGLink das Kabel ziehe geht das darauf folgende "Read" schief, dabei scheint dann automatisch die Verbindung wieder abgebaut zu werden, denn der Adapter wird wieder freigegeben. Nach einem erneuten Verbinden funktioniert das "Read" wieder problemlos, d.h. AGLink verhält sich bei mir stabil und so wie man es eigentlich erwartet.

Gruss,

bool


----------



## Rainer Hönle (17 Juni 2010)

bool schrieb:


> AGLink verhält sich bei mir stabil und so wie man es eigentlich erwartet.


Da haben wir auch einiges dafür getan ;-)


----------



## Jochen Kühner (17 Juni 2010)

bool schrieb:


> Wenn ich während einer aktiven Verbindung via S7Online über AGLink das Kabel ziehe geht das darauf folgende "Read" schief, dabei scheint dann automatisch die Verbindung wieder abgebaut zu werden, denn der Adapter wird wieder freigegeben. Nach einem erneuten Verbinden funktioniert das "Read" wieder problemlos, d.h. AGLink verhält sich bei mir stabil und so wie man es eigentlich erwartet.
> 
> Gruss,
> 
> bool



Ich habe mir das mal angesehen, AGLink schickt auf jeden fall das Telegramm das es bei einem Disconnect schickt dann auch automatisch wenn die Verbindung unterbrochen wurde.

Aber mein größtes Problem ist das Ich das von dir beschriebene Verhalten bei mir nicht nachstellen kann, sonst könnte Ich versuchen wie man es behebt! Bei mir geht nach klick auf Disconnect und Connect das Read wieder! Und auch bleibt die Schnittstelle nicht belegt!


----------



## Rainer Hönle (17 Juni 2010)

bool schrieb:


> Während dessen war die PG/PC Schnittstelle erwartungsgemäss blockiert, nach dem Verbindungsabbau war diese wieder frei.


Was bedeutet "Schnittstelle blockiert"? Mit AGLink kann selbstverständlich parallel zu anderen Applikation (die sich an die Regeln halten) über die S7Online-Schnittstelle auf die CPU zugegriffen werden ohne dass etwas blockiert. Einfach mal mit STEP7, WinCC flex, ... und AGLink parallel versuchen. 
Oder können nur die Schnittstelleneinstellungen nicht geändert werden? Dies ist normal bei einer geöffneten Verbindung. Eine Inspektion am Auto kann ich auch nicht auf der Autobahn machen sondern muss dazu anhalten.


----------



## Jochen Kühner (17 Juni 2010)

Rainer Hönle schrieb:


> Was bedeutet "Schnittstelle blockiert"? Mit AGLink kann selbstverständlich parallel zu anderen Applikation (die sich an die Regeln halten) über die S7Online-Schnittstelle auf die CPU zugegriffen werden ohne dass etwas blockiert. Einfach mal mit STEP7, WinCC flex, ... und AGLink parallel versuchen.
> Oder können nur die Schnittstelleneinstellungen nicht geändert werden? Dies ist normal bei einer geöffneten Verbindung. Eine Inspektion am Auto kann ich auch nicht auf der Autobahn machen sondern muss dazu anhalten.



Ich glaube er meint das die Schnittstelle nicht geändert werden kann (fehler der ausgewählte Adapter kommuniziert gerade!) 

Mal ne Frage, gibt es von Siemens eigentlich doku zu der s7onlinex Kommunikation mit einer CPU, oder habt ihr das auch alles durch probieren, analysieren usw rausgefunden?


----------



## Rainer Hönle (17 Juni 2010)

Jochen Kühner schrieb:


> Ich glaube er meint das die Schnittstelle nicht geändert werden kann (fehler der ausgewählte Adapter kommuniziert gerade!)
> 
> Mal ne Frage, gibt es von Siemens eigentlich doku zu der s7onlinex Kommunikation mit einer CPU, oder habt ihr das auch alles durch probieren, analysieren usw rausgefunden?


Es gibt keine Doku von Siemens zu dieser Schnittstelle (intern wahrscheinlich schon, aber da haben wir keinen Zugriff darauf).


----------



## bool (17 Juni 2010)

Jochen Kühner schrieb:


> Ich habe mir das mal angesehen, AGLink schickt auf jeden fall das Telegramm das es bei einem Disconnect schickt dann auch automatisch wenn die Verbindung unterbrochen wurde.
> 
> Aber mein größtes Problem ist das Ich das von dir beschriebene Verhalten bei mir nicht nachstellen kann, sonst könnte Ich versuchen wie man es behebt! Bei mir geht nach klick auf Disconnect und Connect das Read wieder! Und auch bleibt die Schnittstelle nicht belegt!


 
Wenn es hilft, kann ich gerne mal mit dem wrapper versuchen den Reconnect auf meinem Rechner mitzuloggen, vielleicht kann man durch den Log dem Problem auf die Schliche kommen. Wenn Du kurz beschreiben könntest wie ich hierfür vorgehen muss wäre ich Dir auf jeden Fall sehr dankbar.

Gruss,

bool


----------



## bool (17 Juni 2010)

Rainer Hönle schrieb:


> Was bedeutet "Schnittstelle blockiert"? Mit AGLink kann selbstverständlich parallel zu anderen Applikation (die sich an die Regeln halten) über die S7Online-Schnittstelle auf die CPU zugegriffen werden ohne dass etwas blockiert. Einfach mal mit STEP7, WinCC flex, ... und AGLink parallel versuchen.
> Oder können nur die Schnittstelleneinstellungen nicht geändert werden? Dies ist normal bei einer geöffneten Verbindung. Eine Inspektion am Auto kann ich auch nicht auf der Autobahn machen sondern muss dazu anhalten.


 
Wie von Jochen beschrieben meine ich mit "Schnittstelle blockieren" nur, dass diese unter "PG/PC Schnittstelle einstellen" nicht verändert werden kann. Eine Parallele Verbindung über die STEP7 Online Verbindung oder Variable beobachten ist auch bei mir möglich.
Das Problem was ich bei mir jedoch festgestellt habe ist, dass auch nach dem Disconnect der Adapter unter "PG/PC Schnittstelle einstellen" nicht wieder freigegeben wird (auch wenn STEP7 etc z.B. gar nicht gestartet wurde). Diese Freigabe geschieht bei meinem Programm genau wie bei dem Programm "Testlibrary" von Jochen Kühner (zumindest auf meinem Rechner) erst wenn ich die ganze Applikation beende.

Dieses Phänomen konnte/musste ich sowohl auf meinem Laptop als auch auf dem Desktop (wo ich testweise Step7 installiert habe) beobachten (beide deutsches WinXP SP3 und Step7 V5.4 SP muss ich nochmals nachsehen). Seltsam ausserdem ist, dass es sogar zwischendurch ein paar mal (max 5x in Folge) funktioniert hat und im Anschluss ohne Programänderung wieder nicht.

Ich habe mir schon einmal überlegt ob es ggf Sinn macht den Aufwand zu betreiben und den gesamten Kommunikationsaufbau in einen eigenen Thread/Form zu verlegen und zu probieren ob nach dessen Schliessen der Disconnect /Schnittstellefreigabe besser funktioniert.

Gruss,

bool


----------



## Jochen Kühner (17 Juni 2010)

bool schrieb:


> Wenn es hilft, kann ich gerne mal mit dem wrapper versuchen den Reconnect auf meinem Rechner mitzuloggen, vielleicht kann man durch den Log dem Problem auf die Schliche kommen. Wenn Du kurz beschreiben könntest wie ich hierfür vorgehen muss wäre ich Dir auf jeden Fall sehr dankbar.
> 
> Gruss,
> 
> bool



Hab meinen wrapper angehängt. Du musst im Windows System32 verzeichnis die s7onlinx.dll in mys7onlinx.dll umbenennen und meine s7onlinex.dll ins system32 verzeichnis kopieren. Meine Dll ruft nach dem Schreiben der Protokolldatei die Funktion in mys7onlinx.dll auf!

Bei jedem Zugriff auf die Dll Funktionen Open, Put und Get schreibt der Wrapper auf c:\ eine datei log.txt

Nun kannst du mir ja mal eine datei vom Read mit gezogen kabel, vom verbindungsabbau und vom neuaufbau alles mit libnodave schicken.

Die log.txt bitte immer löschen und mir nicht das ganze protokoll schicken, d.h. z.B.: Verbindung aufbauen, Variable lesen (obs geht), log.txt löschen, Kabel ziehen, eine Variable lesen, log.txt umbenennen, verbindung abbauen, log.txt umbenennen, verbindung aufbauen log.txt umbenennen...

Mfg....


----------



## bool (17 Juni 2010)

Jochen Kühner schrieb:


> Hab meinen wrapper angehängt. Du musst im Windows System32 verzeichnis die s7onlinx.dll in mys7onlinx.dll umbenennen und meine s7onlinex.dll ins system32 verzeichnis kopieren. Meine Dll ruft nach dem Schreiben der Protokolldatei die Funktion in mys7onlinx.dll auf!
> 
> Bei jedem Zugriff auf die Dll Funktionen Open, Put und Get schreibt der Wrapper auf c:\ eine datei log.txt
> 
> ...


 
ok, das hört sich auch für mich verständlich an. Werde ich heute am späteren Abend in Angriff nehmen. Danke auf jeden Fall schon mal für den klasse Support.

Gruss,

bool


----------



## Jochen Kühner (17 Juni 2010)

*Routing*

Habe mal Routing für den Netlink lite implementiert... Kanns aber im Moment nicht testen, nur eine CPU vorhanden... Wenns jemand probieren könnte...


----------



## bool (18 Juni 2010)

Jochen Kühner schrieb:


> Hab meinen wrapper angehängt. Du musst im Windows System32 verzeichnis die s7onlinx.dll in mys7onlinx.dll umbenennen und meine s7onlinex.dll ins system32 verzeichnis kopieren. Meine Dll ruft nach dem Schreiben der Protokolldatei die Funktion in mys7onlinx.dll auf!
> 
> Bei jedem Zugriff auf die Dll Funktionen Open, Put und Get schreibt der Wrapper auf c:\ eine datei log.txt
> 
> ...


 
So, anbei meine ersten Ergebnisse:
Ich habe folgende Tests gemacht:

S7Online Verbindung mit folgenden Programmen aufgebaut und im Anschluss wieder abgebaut (ohne Variablen zu lesen um das Logfile zunächst übersichtlich zu halten):

A) Testlibrary (von JK)
B) MeinProg (von mir)
C) Accon AGLing API Guide

Was hierbei sofort auffällt ist, dass sowohl bei meinem Programm, als auch bei der Testlibrary die S7Online Verbindung 2x aufgemacht wird beim Accon AGLink jedoch nur einmal und hier liegt vermutlich der Hund begraben. Bei meinem Prog geschieht dies durch eine Schleife automatisch bis das Ergebnis von openS7online > 0 ergibt. Dies habe ich einem Beispiel entnommen und entsprechend angewand:

Dim hWnd As IntPtr = Me.Handle
WriteDebugInfo("Open S7Online Connection (GetForegroundWindow)... hWnd=" & CStr(hWnd))
WriteDebugInfo("Open S7Online Connection (before 1st call of libnodave.openS7online)... fds.rfd=" & CStr(fds.rfd))
For i = 0 To 3
fds.rfd = libnodave.openS7online(S7Online_Accesspoint, CInt(hWnd))
WriteDebugInfo("Open S7Online Connection (libnodave.openS7online)... fds.rfd=" & CStr(fds.rfd))
WriteDebugInfo("Open S7Online Connection (libnodave.openS7online)... S7Online intern=" & libnodave.daveStrS7onlineError())
If fds.rfd > 0 Then
fds.wfd = fds.rfd
ExitFor
EndIf
Next


Wenn hier keine Schleife und Abfrage durchgefuehrt und fd.rdf gleich 0 akzeptiert wird geht dafuer das anschliessende dc = New libnodave.daveConnection(di,...) schief, bzw. das Programm haengt sich auf.


Bei der Testlibrary hatte ich bereits festgestellt, dass der Connect erst funktioniert wenn ich die Connect-Taste ein zweites Mal gedrückt habe beim ersten Connect kommt die Fehlermeldung: "Error connecting: Could not creating the Physical Interface (Maybe wrong IP, COM-Port not Ready,...)", doch hatte ich dem nicht so viel Bedeutung zugeschrieben, da es bei meinem Programm ja auch meist einen zweiten Versuch erfordert. Nach dem zweiten Connect erhalte ich dann das Feedback "Connected".

Ich vermute, das dann beim "Disconnect" nur noch der zweite "Connect" freigegeben wird, der erste jedoch im "Nirvana" verweilt bis die Applikation geschlossen wird.
Beobachtung: Nach dem ersten "Connect" wird bereits der Adapter unter "PG/PC Schnittstelle einstellen" reserviert/fürs editieren gesperrt. Wenn ich dann im Anschluss "Disconnect" drücke wird dieser auch anstandslos wieder freigegeben, auch wenn dies mehrmals wieder holt wird (Connect->Disconnect->Connect->Disconnect...). Wenn ich aber nun 2x "Connect" betätige wird auch 2x openS7online() ausgeführt und danach auch nach einem oder gar mehrmaligem "Disconnect" der Adapter unter "PG/PC Schnittstelle einstellen" nicht wieder freigegeben.

Jetzt gilt es herauszufinden wieso bei mir mit libnodave eine S7Online Verbindung offenbar nicht nach dem ersten Connect funktioniert.

Hat da vielleicht jemand eine Idee?

Gruss,

bool


----------



## Jochen Kühner (18 Juni 2010)

bool schrieb:


> So, anbei meine ersten Ergebnisse:
> Ich habe folgende Tests gemacht:
> 
> S7Online Verbindung mit folgenden Programmen aufgebaut und im Anschluss wieder abgebaut (ohne Variablen zu lesen um das Logfile zunächst übersichtlich zu halten):
> ...



Als bei mir wird definitiv nach dem ersten Click auf Connect die Verbindung aufgebaut. gehts denn, wenn du nach dem ersten klick auf connect dann auf disconnect und dann wieder connect drückst? (Auch wenn nicht verbunden wurde!) Dann sollte die Verbindung geschlossen werden.

Achso nochwas, das Close der S7Online Verbindung protokolliere ich noch gar nicht!  Viel. sollte Ich das auch noch einbauen!


----------



## bool (18 Juni 2010)

*Geeeeeeeeschaaaaaaaaft !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*



bool schrieb:


> So, anbei meine ersten Ergebnisse:
> Ich habe folgende Tests gemacht:
> 
> S7Online Verbindung mit folgenden Programmen aufgebaut und im Anschluss wieder abgebaut (ohne Variablen zu lesen um das Logfile zunächst übersichtlich zu halten):
> ...


 
GEEEEEEEESCHAAAAAAAAFT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Der Ansatz war schon richtig, fds.rdf darf oder muss ggf sogar = 0 sein!
Ich hatte nur noch das "fds.wfd = fds.rfd" mit deaktiviert, als ich grade eben die Schleife auskommentiert habe.

Es muss also einfach un knapp heissen:

fds.rfd = libnodave.openS7online(S7Online_Accesspoint, CInt(hWnd))
fds.wfd = fds.rfd

... und schon gehts, der Reconnect funzt und die S7Online Adapterparameter sind nach dem Disconnect wieder editierbar.

Vielen Dank vor allem an Jochen Kühner, dessen Wrapper mit Logfunktion hier Licht ins Dunkel gebracht hat.

Viele Grüsse,

bool


----------



## Jochen Kühner (18 Juni 2010)

bool schrieb:


> GEEEEEEEESCHAAAAAAAAFT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
> 
> Der Ansatz war schon richtig, fds.rdf darf oder muss ggf sogar = 0 sein!
> Ich hatte nur noch das "fds.wfd = fds.rfd" mit deaktiviert, als ich grade eben die Schleife auskommentiert habe.
> ...



Dann haben wir nun endlich dieses problem gelöst... ;-)


----------



## Sersch (19 August 2011)

*aktuellste libnodave.net.dll ??*

Hallo zusammen.

Hab dasselbe Problem gehabt, welches dann schliesslich in diesem Thread gelöst wurde.
Doch es scheint, dass ich noch eine falsche/alte DLL benutzte.
=> Entwickle in  vb.net 2008
=> benutze libnodave.net.dll vom 12.07.2009.

Hier gibts aber den Parameter zur Handle-Angabe noch nicht:

fds.rfd = libnodave.openS7online("S7ONLINE", me.handle)

Wo krieg ich die aktuellste DLL her?

Besten Dank für eure Hilfe


----------



## Jochen Kühner (20 August 2011)

*Hmm...*

Die orginale libnodave bkommst du unter http://libnodave.sourceforge.net/
Der handle parameter ist immer noch drinn, du kannst aber auch 0 übergeben, das macht nix!

Meine erweiterte Version (mit Routing, Ethernetsupport über S7Online) bekommst du unter http://siemensplctoolboxlib.codeplex.com/

Mfg.


----------



## Sersch (21 August 2011)

*absolut Adresse aus symbolischer Adresse ???*

Seit einigen Wochen suche ich eine Lösung für folgendes problem:
ich entwickle ein kleines hilfe tool in VB.NET zum schnell-anzeigen von aktuellen steuerungswerten aufgrund von der symbolischen adresse.

Der sps code in unserer firma wird in SCL (step7) geschrieben d.h.wir benutzen symbolische adressierung mit strukturen: z.b.:
MEIN_DB.BEREICH1.VALUE
Gibt es eine möglichkeit, um aus diesem string-Ausdruck die zugehörige absolut adresse zu ermitteln? auf die selbe weise wie es die Variablentabelle tut? Eine funktion, die mir die abs. adresse aufgrund der symb. zurückgibt?

Mittels dieser abs. adresse möchte ich dann über OPC den wert aus der sps lesen und anzeigen...

vielen dank für eure hilfe.


----------



## Jochen Kühner (21 August 2011)

Mhmm... Mit meiner lib kannst du das Step 7 Projekt laden, und dann denn DB öffnen und die Adressen auslesen!


----------



## Sersch (21 August 2011)

hallo jochen.
hast du ein VB.NET beispiel? kenne deine lib leider noch nicht so gut.
Reicht es wenn ich deine libnodave.net.dll einbinde?
besten dank


----------



## Jochen Kühner (21 August 2011)

*Jo*

Geh doch mal auf http://siemensplctoolboxlib.codeplex.com/ und lad dir den Source herunter! Dort ist auch ein kleines Vb.net Programm enthalten...

Aber auch das Beispiel Programm ExampleWpfVisualization sollte sich einfach in Vb umsetzen lassen, da es fast. Nur xaml und ganz wenig code enthält!


----------



## Sersch (22 August 2011)

*Umwandlungsfunktion Simbolisch => Absolut Adresse*

Hallo Jochen.

Hab deine Lib(s) bereits heruntergeladen und eine paar Bsp angeschaut - doch leider noch nichts gefunden, was mich weiterbringt.

Hab auch noch das Bsp unter http://s7net.codeplex.com/ angeschaut. 
Thema: http://www.sps-forum.de/showthread.php?t=40006
Hier muss aber der Struct von der SPS Welt auch auf Seite Applikation nachgebildet werden, was für meinen Anwendungsbereich zu wenig dynamisch ist.

Suche eine einfache Umwandlungsfunktion von einem STRING (mehrfach verschalteteter struct)
*SymbolDB_X.[struct_1].[struct_2].[struct_3]*
zur zugehörigen absolut Adresse
*DBxxx.DBx yy*

Also sowas:
*SymbolDB_1000.Modul1.Temp4.Value    =>   DB3826.DBW22*

Der Benutzer soll später nicht browsen müssen (Projectfiles.SelectProjectPart.SelectTAG o.ä.), sondern aus einem String den ich vom SCL Code her einlese soll direkt die abs. Adresse und dann der akt. Wert ermittelt werden.

Hat Deine Lib bereits eine ähnliche Funktion?

Besten Dank für die Hilfe und Denkanstösse....

*vde*


----------



## Jochen Kühner (22 August 2011)

Sersch schrieb:


> Suche eine einfache Umwandlungsfunktion von einem STRING (mehrfach verschalteteter struct)
> *SymbolDB_X.[struct_1].[struct_2].[struct_3]*
> zur zugehörigen absolut Adresse
> *DBxxx.DBx yy*
> ...



So direkt nicht, aber das kannst du damit auf jeden Fall realisieren!

Vielleicht komme Ich morgen dazu dir ein bisschen Beispielcode zu posten!

Aber der Nutzer braucht dazu auf jeden Fall auch das Projektfile, das ist dir klar, oder? Da auf der SPS die Symbolischen Namen nicht gespeichert werden!


----------



## Jochen Kühner (23 August 2011)

```
Dim searchValue As String
        Dim db As String

        Dim tag As PLCTag
        Dim prj As Step7ProjectV5
        Dim fld As Projectfolders.Step7V5.BlocksOfflineFolder
        Dim blk As S7DataBlock

        searchValue = "SymbolDB_1000.Modul1.Temp4.Value"
        db = searchValue.Split(".")(0)
        searchValue = searchValue.Substring(db.Length + 1)
        prj = New Step7ProjectV5("C:\\Offenau_.s7p", False)

        
        fld = prj.BlocksOfflineFolders(1)

        For Each projectBlockInfo As S7ProjectBlockInfo In fld.readPlcBlocksList()
            If Not projectBlockInfo.SymbolTabelEntry Is Nothing And projectBlockInfo.SymbolTabelEntry.Symbol = db Then
                blk = fld.GetBlock(projectBlockInfo)
            End If
        Next

        If Not blk Is Nothing Then
            For Each s7DataRow As S7DataRow In s7DataRow.GetChildrowsAsList(blk.GetArrayExpandedStructure())
                If s7DataRow.StructuredName = searchValue Then
                    tag = s7DataRow.PlcTag
                End If
            Next
        End If
```

so ungefähr könnte gehen... ist aber ohne größeres fehlerhandling, etc...

fld = prj.BlocksOfflineFolders(1) musst du natürlich anpassen, oder alle Folder durchlaufen.

Du musst aber die neuste Version meiner Lib nutzen, da die prj.BlocksOfflineFolders Auflistung leider in den alten Versionen nicht gefüllt wurde!

Mfg.


----------



## Sersch (23 August 2011)

*Dll ?*

Hallo Jochen.

Hört sich vielversprechend an, genial !!!
Habe Code in mein Projekt genommen und getestet - scheitere an Zeile:
 
fld = prj.BlocksOfflineFolders(1)       _prj.BlocksOfflineFolders.Count = 0_

was offensichtlich mit der nicht-aktuellen DLL zu tun hat.
Kannst du mir noch die *DotNetSiemensPLCToolBoxLibrary.dll* posten? Hab sie im ZIP File nicht gefunden...

MERCI, Serge


----------



## Jochen Kühner (23 August 2011)

Hab Sie hier mal angehängt. Die Dll ist nie in kompilierter Form enthalten, da musst du die Lib selbst übersetzen!


----------



## Sersch (26 August 2011)

*Verbindungsabbau-Problem*

Hallo Jochen.

Besten Dank für deine Code Hilfe, hab meine Funktion "GetAbsAdressFromSymbolic" zum Laufen gebracht! GENIAL!!!

Hab mittlerweile auch das VisualStudio C# installiert, bin aber eher ein VB Mensch - entwickle auch weiterhin in VB.NET.

Bin aber immer noch am *Reconnect-Problem* dran.
Ich baue Verbindung auf, 
lese Werte, 
baue Verbindung ab:

PLCConnect(4, 0, 2)
PLCReadItem(Area.DataBlocks, s1, s2, s3, s4)
PLCDisconnect()


Nach einem Verbindung-Abbau mittels PLCDisconnect() bleibt meine Verbindung trotzdem noch bestehen, wird irgendwie *nicht sauber abgebaut*.
Jeden falls kann ich immer noch mittels PLCReadItem() Werte lesen ???

Hier noch die 2 Methoden:


```
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Private[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Function[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] PLCConnect([/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] MPIAddress [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]String[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Optional[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] PLCRack [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Integer[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] = 0, [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Optional[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] PLCSlot [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Integer[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] = 2) [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Boolean[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] ConnectionOpened [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Boolean[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] initSuccess [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Integer[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] = 0[/SIZE]
[SIZE=2]fds.rfd = libnodave.openS7online([/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]"S7ONLINE"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])[/SIZE]
[SIZE=2]fds.wfd = fds.rfd[/SIZE]
[SIZE=2]di = [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]New[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] libnodave.daveInterface(fds, [/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]"IF1"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], 0, libnodave.daveProtoS7online, libnodave.daveSpeed187k)[/SIZE]
[SIZE=2]di.setTimeout(1000)[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] j [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Integer[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]For[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] j = 0 [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]To[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] 2[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] (0 = di.initAdapter) [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Then[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2]initSuccess = 1[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Exit[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]For[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Else[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2]di.disconnectAdapter()[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Next[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] initSuccess <> 1 [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Then[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2]ListBox1.Items.Add([/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]"Couldn't connect to Adapter!"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Exit[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Function[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2]dc = [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]New[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] libnodave.daveConnection(di, MPIAddress, PLCRack, PLCSlot)[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] ErrorCode [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Integer[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] = dc.connectPLC()[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] ErrorCode = 0 [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Then[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2]ListBox1.Items.Add([/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]"Connection opened."[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])[/SIZE]
[SIZE=2]ConnectionOpened = [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]True[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Else[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2]ListBox1.Items.Add([/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]"Error opening connection. Check rack & slot."[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] & [/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]" = "[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] & libnodave.daveStrerror(ErrorCode))[/SIZE]
[SIZE=2]ConnectionOpened = [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]False[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Return[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] ConnectionOpened[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Function[/COLOR][/SIZE][/COLOR][/SIZE]
```
 


```
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Private[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Sub[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] PLCDisconnect()[/SIZE]
[SIZE=2][COLOR=#008000][SIZE=2][COLOR=#008000]'' Verbindung abbauen[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] RetCode [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Long[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2]RetCode = dc.disconnectPLC()[/SIZE]
[SIZE=2]RetCode = di.disconnectAdapter()[/SIZE]
[SIZE=2]RetCode = libnodave.closePort(fds.rfd)[/SIZE]
[SIZE=2]RetCode = ListBox1.Items.Add([/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]"Disconnected."[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])[/SIZE]
```
 
Und nochwas: Solange ich eine VarTab offen hab und mit dieser online bin, kann ich KEINE Verbindung mehr mit meiner Applikation aufbauen. *Erst wenn die VarTab schliesse, kann ich wieder (einmalig) eine Verbindung aufbauen*.
Andersrum funktionierts folgendermassen: Kann eine erste Verbindung mit meiner App aufbauen und anschliessend auch VarTab starten + online gehen ??????


Hab folgende Verweise:
DotNetSiemensPLCToolBoxLibrary.dll
ICSharpCode.SharpZipLib.dll
libnodave.net.dll
libnodave.dll ist im \bin\debug\ Ordner vorhanden...

Ist da eine Problem beim Verbindung-Abbau ??? :-(
Eine Idee?


----------



## Jochen Kühner (26 August 2011)

Wenn du schon meine lib benutzt, warum nutzt du dann nicht auch gleich die Online funktionen der lib? Da kannst du z.b. Direkt das Plctag objekt aus dem datenbaustein von der steuerung lesen lassen und musst dich nicht um den ganzen verbindungs auf/abbbau kümmern!


----------



## Sersch (29 August 2011)

*Problem beim Verbindungsaufbau*

Hallo Jochen.

Würde gerne die DotNetSiemensPLCToolBoxLibrary benutzten, wenn ich Verbindung auch aufbauen könnte. Kämpfe noch mit Einstellungen- kann Fehler nicht finden...

Benutzte einen Siemens Adapter "CP5511/CP5512".
Mittels libnodave kann ich eine "S7Online"-Verbindung aufbauen - siehe PLCConnect(MPI=4, Rack=0, Slot=2) im vorherigen Eintrag. Jedoch mit Reconnect Problemen.

Wenn ich jedoch das ganze mit deiner DotNetSiemensPLCToolBoxLibrary versuche, und deinen "Connection Editor" benutzte, kommt keine Verbindung zustande:

Hab folgende Einstellungen im "Connection Editor":
- Protocoll: UseStep7dll
- Zugangspunkt: S7Online
- CPU-Rack: 0
- CPU-Slot: 2
- CPU-MPI: 4

Beim "Verbindung testen" kommt immer die msg "Error: S7Online: Gerät bereits/noch nicht geöffnet" bzw. bei "Verbindung 1 herstellen" kommt Msg "Verbindung zu 'SPS1' konnte nicht hergestellt werden!"

Eine Idee???
Besten Dank.


----------



## Jochen Kühner (29 August 2011)

Sersch schrieb:


> Hallo Jochen.
> 
> Würde gerne die DotNetSiemensPLCToolBoxLibrary benutzten, wenn ich Verbindung auch aufbauen könnte. Kämpfe noch mit Einstellungen- kann Fehler nicht finden...
> 
> ...



Im Moment absolut keine. Ich hab aber Zuhause noch eine CP5511 Karte, werds in den nächsten Tag mal damit probieren und mich dann nochmals melden!


----------



## Sersch (30 August 2011)

Hallo Jochen.

Hab Fehler gefunden: falsche Slot Angabe! 
Warum ich aber mittels libnodave trotzdem einen Wert lesen konnte, ist mir nicht klar ?? Jedenfalls funzt die Verbindung mittels "PLCConnect()" jetzt...
Danke trotzdem.

Bin noch an der Funktion "GetAbsAdressFromSymbolic" dran - melde mich evt. nochmals diesbezüglich.

Gruss Sersch


----------



## Jochen Kühner (30 August 2011)

Danke für die Info, so brauch Ich meinen alten CP5511 nicht rauskramen!

Wenn du meine Lib dann auch für die Verbindung verwendest, brauchst du mit GetAbsAdressFromSymbolic ja nicht die Adresse auslesen, sondern nimmst direkt das PLCTag Objekt von der s7DataRow und liest dies mit "ReadValue" oder bei mehreren Tags auf einmal "ReadValues" des "PLCConnection" Objektes ein


----------



## Jochen Kühner (30 August 2011)

Sersch schrieb:


> Hab Fehler gefunden: falsche Slot Angabe!
> Warum ich aber mittels libnodave trotzdem einen Wert lesen konnte, ist mir nicht klar ?? Jedenfalls funzt die Verbindung mittels "PLCConnect()" jetzt...
> Danke trotzdem.



Soweit Ich es noch in Erinnerung habe, wird in der orginalen LibNoDave bei S7Online Rack/Slot gar nicht berücksichtigt, das hab Ich glaub mal eingebaut! Deshalb hat's bei dir Funktioniert (mit der orginalen)


----------

