Socket neu Verbinden ...

Hallo zusammen und guten Morgen …

kann man eigentlich eine Server Socket Instanz den Connect
selber aktiv setzen?

Kommt es mal zu Verbindngsabbrüchen etc. findet kein IPS reconnect statt.
Ich muss immer wieder mal den IPS SocketServer inakitv/aktiv setzen damit wieder auf der Client Seite
der Connect aufgebaut werden kann.

Gruß
MacToolz

IPS_SetProperty — IP-Symcon :: Automatisierungssoftware

Aber ich behaupte dein Client hat eher ein Problem.
Er muss ja den Abbruch erkennen und eine neue Verbindung aufbauen.
Der ServerSocket wartet ja nur auf ankommende Verbindungen.
Welches Gerät hat den Probleme sich neu zu verbinden?
Michael

Hi,

nein der Client hat keine Probleme er probiert es endlos nach Fehler wenn er nicht den connect aufbauen konnte.
Zeit verzögert wird es immer wieder Probiert.

Setze ich den ServerSocket inaktiv und wieder aktiv ist die Verbindung wieder sofort da.

Meine SPS verbindet sich mit IPS.

Gruß
MacToolz

Welche IPS Version ?

Schau im bitte im Debug des ServerSocket.
Wenn sich die SPS verbindet steht da deren IP und Port von wo sie kommt.
Ist der Port nach einem schließen und öffnen des IPS ServerSockets wieder gleich ? Dieser sollte sich eigentlich bei jeder neuen Verbindung ändern.

Wenn ja, scheint die SPS die verlorene Verbindung nicht zu erkennen (woran merkst du dass die weg ist ?).

Wenn nein, dann kann es wirklich sein, dass die alte Verbindung in IPS ‚hängt‘ und somit dieser Port blockiert ist bis du den Socket einmal schließt.
Letzteres könnte ein Fehler im IPS Serversocket sein, aber auch schlecht von der SPS dass sie abgehend immer den gleichen Port nutzt. TCP abgehend sollte eigentlich einen zufälligen High-Port wählen.

Michael

IPS 4.4

Ich schaue mir die Ports an … gebe bescheid …

Die SPS bekommt eine Status Doppelwort, was mir in 4 Bytes diverse Stati anzeigt unter anderem auch das nicht verbunden werden konnte. Liegt der Fehler vor, wird automatisch im Intervall von 5s versucht immer wieder neu zu starten.
Vom Prinzip her reagieren auch beide Seiten vollkommen normal, egal welche Seite ich jetzt im Netzwerkverkehr blockiere. Ist die Kommunikation wieder möglich, verbindet sich die SPS wieder und alles geht seinen normalen weg.

Ich sehe das auch daran das ich in einem Zeitintervall einen Zähler in meinen Daten mitsende, so als eine Art ToggleBit, nur halt als Zähler der ständig hoch zählt.

Das mit dem SPS Port stimmt nicht ganz, er ist ständig anders. Das passt auch soweit.

Gruß
MacToolz

Hallo,

ich muss das Thema nochmal aufkommen lassen.

Ich frage zum Beispiel mit der IPS_GetProperty „OPEN“ ob der Socket Client aktiv ist ,z.B.
in dem Fall mein Lightify Gateway.

Jetzt ist es so, das z.b. das Gateway nicht reagiert und schaue mir den Status im Client unter den IO-Instanzen an.
Dort wird die Info ausgegeben das die Schnittstelle fehlerhaft markiert ist.

Aber der Client ist noch aktiv. Das aktiv scheint aber über die Property nicht wirklich zu prüfen
ob der tatsächlich der Socket geöffnet ist.

Ist das richtig so ?

Wie kann ich heraus finden das die Schnittstelle fehlerhaft ist, damit ich wieder den Connect zum Client neu schließen/öffnen kann.

Gruß
MacToolz

Das Property Open spiegelt nie den Status wieder.
Geht auch nicht, weil wenn Open auf false steht, wird ja nie eine Verbindung aufgebaut.

Den Status kannst du mit IPS_GetInstance — IP-Symcon :: Automatisierungssoftware auslesen.
Um durch IPS das Script zu starten um den neuen Status auszulesen, benutzt du das Event Control — IP-Symcon :: Automatisierungssoftware
Michael

Hi,

also das ist nur um in der Konfig den Port active zu setzen, das hat also nicht mit „Open“ Socket geöffnet zu tun ???

Gruß

Natürlich hat es was damit zu tun.
Das ist die Konfiguration welche du auch per hand in der Konsole einstellen kannst.
Aber der Status der Instanz beeinflusst nicht rückwärts die Eigenschaft.
Der Status bleibt auf inaktiv (Verbindung geschlossen o.ä.) wenn man die Eigenschaft Open abwählt bzw auf false setzt.
Aber wenn die Eigenschaft auf True steht, dann kann der Status ja sowohl verbunden (aktiv) als auch fehlerhaft (Error) sein.
Michael

Hi,

okay hab verstanden, also dann wieder den Status der Instanz abrufen.

Hab es gerade so getestet wie du gesagt hast, passt …

Danke und Gruß

Hi,

jetzt muss ich aber nochmal fragen. Wenn ich im EventControl ein Script hinterlege.

Mit dem Script kann ich ja nur den Socket neu öffnen in dem ich das Active auf FALSE setze
und dann wieder auf TRUE etc.

        
IPS_SetProperty($SocketServerID, $PropName, FALSE);
IPS_Sleep(1000); 
IPS_ApplyChanges($SocketServerID);  
IPS_Sleep(1000);        
IPS_SetProperty($SocketServerID, $PropName, TRUE);
IPS_Sleep(1000);        
IPS_ApplyChanges($SocketServerID);
IPS_Sleep(2000); 

Das Codemuster ist nur die Kurzform, damit man nur sieht wie ich versuche den Socket zu schließen und wieder zu öffnen.

Mit jeder Änderung der Eigenschaft der Instanz wird immer wieder das Event neu ausgelöst.
Ich hab ja keine andere Wahl um mit SetPorperty den Port zu schließen und wieder active zu setzen, damit er wieder geöffnet wird.

Oder liege ich da immer noch falsch?

Gruß

Du musst schon den Status abfragen.
So hast du eine Endlosschleife.
Und ein einfaches IPS_Applychanges sollte reichen.
Davon abgesehen, um welches Modul handelt es sich genau?
Weil bei IOs und Splitter versucht IPS selbstständig die Instanz zu reparieren indem es ein IPS_Applychanges ausführt.
Michael

Hi,

also ich habe mir alle meine Clients als Event angelegt die ich mit dem Netzwerk überwachen möchte bzw.
wieder versuchen möchte den Socket erneut zu öffnen.

Den Status frage ich auch ab, entweder auf 104 = inaktiv, oder >=200 auf Fehler …

Wann muss ich genau das ApllayChanges ausführen?

Gruß

Das heißt hier bekomme ich auch wieder eine Endlosschleife.

Aber woher weiß ich denn welches Modul bzw. IOs / Splitterinstanzen das Apply
in sich benutzen ?

Gruß

Der Sinn von dem letzen Satz erschließt sich mir nicht.

Michael

So wie es aussieht kann ich nicht immer das IPS_Applychanges anwenden.

Weil ich habe z.B. gemerkt das bei der Splitter Instanz für das „AVMAHA“ Modul ich eine Endlosschleife bekomme
wenn ich das IPSApplychanges anwende.

Woher weiß ich das wer diese Methode für selber aufruft ?

Gruß

Die Schleife kommt weil das EventControl bei jeder Änderung des Status dein Script ausführt.
Und du ohne Prüfung des Status einfach immer Applychanges ausführst was wieder das EventControl triggert…usw…
Um das zu verhindern gibt es die $_IPS Systemvariable wo das EventControl den gemeldeten Status übergibt.
So kannst du Applychanges nur dann ausführen wenn der Statuscode größer 200 (alles über 200 ist Fehlerstatus) ist.

Wie aber oben schon geschrieben, Splitter und IO versucht IPS von sich aus schon zu reparieren.

Michael

ich hatte doch geschrieben das ich die Stati auch prüfe. Das hier das Eventcontrol erneut triggert ist mir auch klar.

Muss ich den Status über die Systemvariabel abfragen? Weil die Stati werden meiner Meinung nach
schon entsprechend aus der Instanz von mir ausgelesen und gegen geprüft.

Oder ist es zwingend mit $_IPS Systemvariable zu abreiten ?

z.B. aus dem Modul AVMAHA bekomme ich auch die Endlosscheife, heißt hier wird auch das Apply im Modul
selbstständig angewandt.

Daher meine Frage nochmal. Woher weiß ich wer das Apply verwendet.

Gruß

Mit $_IPS hat den Vorteil daß du auslösenden Zustand hast.
Bei IPS_GetInstance hast du den gerade aktuellen Zustand
Eigentlich sollten die identisch sein.

Zum Verhalten der AVMAHA Instanz kann ich dir nichts sagen, außer:
Wenn du ganz normal ein IPS_Applychanges ausführst, darf das keine Schleife geben.
Sonst kannst du ja nie die Instanz in der Konsole übernehmen.

Im Zweifelsfall bei solchen komischen Effekten den Autor kontaktieren.
Michael

Hi,

ok dann nehme ich doch eher die Systemvariabel.

Ok, wie kann ich aber dann einen Socket neu öffnen wenn die Eigenschaft „Open“ nicht vorhanden ist ?

Gruß