# Libnodave und WinLC RTX 2005



## Human (2 Juni 2008)

Hallo,

Ich habe das Problem, dass ich mit NoDave auf eine WinLC RTX zugreifen möchte. Die WinLC und das Programm laufen auf dem gleichen PC. Als Verbindung benutze ich ISO over TCP.
Im Komponentenkonfigurator ist auf Slot 2 die LC auf Slot 3 eine IE Allgemein, damit die Verbindung darüber funktioniert.

Die Verbindung funktiert fast einwandfrei, das einzige Problem, das ich habe ist, dass beim Hochfahren mein Programm schon versucht zu verbinden und die WinLC bzw. der Komponentenkonfigurator noch nicht bereit sind und das Programm keine Verbindung bekommt bis ich es  neu starte, habe mir auch ein Testprogrämmchen gemacht, das ich heute Abend hochladen kann.

Muss ich einen anderen Verbindungstyp nehmen oder was mach ich falsch bzw. wie kann ich mich mit der WinLC verbinden ohne das Programm neu zu starten?

[edit]Das Programm ist mit dem BDS2006 geschrieben und benutzt die NoDave-Delphikomponente.[/edit]


----------



## afk (2 Juni 2008)

Human schrieb:


> Muss ich einen anderen Verbindungstyp nehmen oder was mach ich falsch bzw. wie kann ich mich mit der WinLC verbinden ohne das Programm neu zu starten?


Wenn es nach dem Neiustart des Programms funktioniert, kann es an der Verbindungskonfiguration eigentlich nicht liegen.

Das hört sich für mich eher so an, als ob Dein Programm nach einem fehlgeschlagenen Verbindungsversuch und nach einem Verbindungsabbruch nicht selbsttätig versucht sich wieder zu verbinden. Falls das stimmt, dann bau das noch mit in Dein Programm ein, und der Neustart vom Programm ist dann nicht mehr nötig.

Eine andere Möglichkeit ist, den Start Deines Programms zu verzögern, um den Siemens-Diensten die notwendige Zeit zum Starten zu geben. Die Zeit solltest Du dann aber ausreichend groß wählen, um noch Reserve zu haben, falls Siemens aus irgendeinem Grund mal etwas länger braucht ...


Gruß Axel


----------



## Human (2 Juni 2008)

Das mit dem automatischen Verbinden ist drin und das funktioniert auch, das weiss ich, weil ich bei der WinLC den Controler geschlossen - Verbindung tot - und dann wieder gestartet - Verbindung wurde wieder aufgebaut.

Und ich hab mein Programm auch schon mit geschlossenem Controller gestartet und dann irgendwann den Controler wieder gestartet und das hat auch funktioniert.

Auf Grund der Versuche die ich gemacht habe scheint mein Programm zu funktionieren. Das passiert nur, wenn der PC gestartet wird und ich mich versuche zu verbinden ohne dass alles gladen ist.


----------



## Human (4 Juni 2008)

Hat niemand eine Idee, Zottel, Question_Mark, afk oder jemand anderes? :-?


----------



## Rainer Hönle (4 Juni 2008)

ich kann mir nur vorstellen, dass der Komponenten-Konfigurator in einem Zustand ist, dass er zwar schon was annimmt aber noch nichts hat an der er weitergeben kann. Und dass ab dann mit dir beleidigt ist. 
Ich würde einfach ein verzögertes Starten deiner Applikation bzw. deiner Kommunikation implementieren.
Schlägt der IP-Verbindungsaufbau auf Port 102 schon fehl oder erst das nachfolgende Connect auf die SPS? Meldest du dich im Fehlerfalle komplett vom IP ab und danach wieder neu an?


----------



## Zottel (4 Juni 2008)

Ich verstehe nicht gut worin dein Problem besteht. 
Die Funktion openSocket() sollte dann erfolgreich sein, wenn ein Programm auf Port 102 hört. Das sollte erst nach dem Start von WinLC der Fall sein und WinLC sollte den Diens erst anbieten, wenn es auch bereit ist zu antworten.
Liefert openSocket keine gültige Verbindung solltest du es wieder probieren, bis das Serverprogramm (WinLC) bereit ist.
Bekommt dein Programm mittels der Funktion openSocket() eine Verbindung zu WinLC, obwohl dies noch nicht läuft? Oder zu einem dritten Programm, daß vor WinLC startet und später von diesem verdrängt wird? Oder passiert irgendwas Merkwürdiges beim Start von PC/Windows, was sich von der Situation beim Neustart beider Programme unterscheidet? (z.B. Dein Programm sucht WinLC unter der festen IP-Adresse 123.45.67.89. Diese bekommt der PC aber erst später per DHCP?). Dann lieber 127.0.0.1 für lokalen host nehmen! So Sachen kannst du auch abklären, indem du dein Programm und WinLC auf verschiedenen PCs laufen läßt.


----------



## Human (4 Juni 2008)

Hi Rainer, Hi Zottel,

Um es nochmal kurz zu erklären: Wenn ich versuche eine Verbindung zu der WinLC aufzubauen bevor diese bereit ist dann versucht das Programm dies alle 20 Sekunden erneut. Ich schaffe es erst wieder eine Verbindung zu dieser aufzubauen, wenn ich/der Kunde das Programm einmal neu gestartet hat und dann auf anhieb.

Nachdem ich mir die Delphi-Komponente mal genauer angeschaut habe: Wenn ich den Socket geöffnet habe und kein Interface oder Verbindung zustandegekommen ist, muss der Socket dann wieder irgendwie geschlossen werden?
Hab mich darum noch nie wirklich gekümmert, die Komponente von afk hat einfach immer funktioniert... :TOOL:

Bei starten des PCs passiert eigentlich nichts ausergewöhliches, außer dass da noch das SOM-Programm (Temperaturüberwachung und so) von Siemens startet.

Der Unterschied zwischen dem 1. und dem 2. Starten ist eigentlich nur, dass die WinLC beim 2. Mal hochgefahren und verbindungsfähig ist.

Die IP ist fest und wird nicht von DHCP zugewiesen. Und die 127.0.0.1 habe ich auch schon des öfteren probiert, aber die hat die komische Angewohnheit, dass man sich damit nichtmehr damit verbinden kann, wenn ein Netzwerkkabel eingesteckt ist.

Die Verbindung wenn auf einem PC mein Programm läuft und auf dem anderen die WinLC, dann funktioniert das ohne Probleme, nur auf einem Rechner habe ich das.


----------



## Zottel (4 Juni 2008)

Human schrieb:


> Hi Rainer, Hi Zottel,
> 
> Um es nochmal kurz zu erklären: Wenn ich versuche eine Verbindung zu der WinLC aufzubauen bevor diese bereit ist dann versucht das Programm dies alle 20 Sekunden erneut.


Was ist das Ergebnis von openSocket bei diesen Fehlversuchen?


> Nachdem ich mir die Delphi-Komponente mal genauer angeschaut habe: Wenn ich den Socket geöffnet habe und kein Interface oder Verbindung zustandegekommen ist, muss der Socket dann wieder irgendwie geschlossen werden?


Das würde ich mal versuchen.


----------



## Human (4 Juni 2008)

Inzwischen habe ich es auch mal mit der S7Online probiert, gleiches Resultat, ich bin am verzweifeln... 

Im Programm, das beim Neustart gestartet wird:
OpenSocket -> 0
OpenS7Online -> 1 

Im Programm, das nach dem Laden der WinLC RTX gestartet wird:
OpenSocket -> 160
OpenS7Online -> 9


----------



## Zottel (4 Juni 2008)

Human schrieb:


> Inzwischen habe ich es auch mal mit der S7Online probiert...


Vergiß S7online.


> Im Programm, das beim Neustart gestartet wird:
> OpenSocket -> 0


Das ist ein Fehler



> Im Programm, das nach dem Laden der WinLC RTX gestartet wird:
> OpenSocket -> 160


Und das ist ein socket-handle.
Möglicherweise versuchst du, indem du mit dem socket handle 0 weitermachst, darauf zu schreiben.
Möglicherweise ist der Versuch strafbar, da er zu irgendwelchen Fehlerzuständen in winsock.dll, windows, der runtime-Library deines Programms oder weiß der Teufel wo führt. Wiederhole mal:
repeat
  sh=openSocket(..);
  writeln("sh is:",sh);
  if sh=0 then warteEineSekunde;
until sh<>0;

oder so.


----------



## Human (4 Juni 2008)

Zottel schrieb:


> repeat
> sh=openSocket(..);
> writeln("sh is:",sh);
> if sh=0 then warteEineSekunde;
> ...


So ähnlich mach ich das auch schon... und ich hab jetzt eine Lösung gefunden, die zwar nicht das Problem mit dem Verbindungsaufbau löst, sondern nur wann der ist:
Es gibt ja das "Station einrichten" von Siemens und da kann man Programme starten lassen, wenn die Station vollständig geladen ist und dann tut das ohne Probleme (bis jetzt ).

Trotzdem vielen Dank für die Hilfe!!! 



Zottel schrieb:


> Vergiß S7online.


Was hat denn das, dass du immer davor warnst?


----------



## afk (4 Juni 2008)

Zottel schrieb:


> Human schrieb:
> 
> 
> > Im Programm, das nach dem Laden der WinLC RTX gestartet wird:
> ...


Meine Komponente versucht nur dann, mit daveNewInterface weiterzumachen, wenn ein Handle > 0 von OpenSocket zurückgeliefert wird. Daran kann es also nicht liegen. Allerdings erzeugt die Komponente in diesem Fall keinen OnError-Event, und versucht auch nicht selbständig, die Verbindung erneut herzustellen.

@Human:
Wenn der erste Verbindungsversuch fehlschlägt, dann mußt Du das anhand der "Active"-Eigenschaft erkennen (die bleibt dann "False"), und nach einer kurzen Zeit erneut versuchen, die Verbindung aufzubauen.


Gruß Axel


----------

