TCP Verbindungsprobleme

Hallo
hat jemand hierzu eine lösung
http://forum.arduino.cc/index.php?PHPSESSID=n2s7j0nc3jmmmbkroklnh50er3&topic=221880.0

Du solltest im englischen Yun-Forum keine deutschen Fragen posten.

Zu Deinem Problem:

ch habe mit einem Arduino Yun eine TCP Verbindung zu einer SPS erstellt.
Das Arduino baut hierbei aktiv die Verbindung zur SPS auf. Dies funktioniert auch soweit.
Wenn allerdings die SPS nicht erreichbar ist hört das arduino Programm auf die Loop schleife zu durchlaufen. Die konnte ich feststellen da ich eine LED Blinken lies. Was kann hierfür die Ursache sein?

Definiere "SPS nicht erreichbar". Trennst Du sie vom Netz oder schaltest Du sie ab?
Wieso hast Du den Code für die blinkende LED nicht auch gepostet? Es wäre interessant zu sehen, wo das Stehenbleiben passiert.
Was passiert, wenn Du die SPS wieder anschliesst? Läuft dann der Sketch weiter?

Im aktuellen Bridge-Code auf Linux-Seite kann ich keine Hinweise entdecken, die auf eine blockierende Ausführung hindeuten würden, weshalb ich eigentlich davon ausgegangen wäre, dass Dein Code weiterlaufen sollte.
Allerdings ist es schon nicht beste Schule, kurz zu prüfen, ob die Verbindung noch steht, dann relativ langsame Operationen (Sensor auslesen) durchzuführen und dann einfach auf die Verbindung zu schreiben, ohne nochmals deren Verfügbarkeit zu prüfen. Einen blockierenden Aufruf würde ich allerdings auch nicht erwarten. Wieso gibst Du nicht etwas mehr Debug-Info auf die serielle Schnittstelle aus und schaust, wo Dein Code genau stehen bleibt?

Hallo
das Blinkende LED ist im Code enthalten

void loop()
{
// listen for incoming clients
YunClient client;// = server.accept();
// LED aus wenn Client nicht verbunden
digitalWrite(13, HIGH);
delay(50);
digitalWrite(13, LOW);
delay(300);

Es ist so wenn ich das Arduino einschalte und die SPS ist nicht erreichbar ist Blinkt die Rote LED. Wenn die Verbindung nicht innerhalb ca. 2 Min erreichbar ist hört die LED auf zu blinken.
Wenn ich nur den RESET Eingang betätige Startet das Arduino nicht neu. Ich muss es erst wieder aus und einschalten.
Mir kommt es vor als ob das Arduinoprogramm abstürzt.

Zu deinen Fragen. Ich schalte das WLAN am Router aus. oder Ich beende die Verbindung an der SPS
Wenn ich die SPS wieder anschließe wird keine Verbindung vom Arduino aufgebaut da ja das Programm nicht mehr läuft.
Wenn ich innerhalb der 2min die Verbindung unterbreche und wieder aufbaue funktioniert es.

  #include <SPI.h>
  #include <Wire.h> 
  #include <Bridge.h>
  #include <YunServer.h>
  #include <YunClient.h>
  #include <Console.h>
  #include <DHT22.h>
  #include "IRremote.h"
  
  // SPS Port und IP 
  #define PORT 2500
  IPAddress PLC(192,168,178,30); // PLC Address
 // YunServer server(PORT);
  
  // Temperatursensor PIN
  #define DHT22_PIN 4
  DHT22 myDHT22(DHT22_PIN);
  
  // Zeitlicher Funktionsaufruf
  long previousMillis = 0; 
  long interval = 2500; 
  unsigned long currentMillis;
  
  
  // IR Empfenger
  int receiver = 3;
  IRrecv irrecv(receiver);           // create instance of 'irrecv'
  decode_results results; 
  
  
   void setup() {
    
    irrecv.enableIRIn(); // Start the receiver
    Bridge.begin();      // Sarte Bridge
    digitalWrite(13, HIGH);
    Console.begin();     // Starte Console
   //  server.begin();     // Starte Server
    // while (!Console); // warte bis Console run
    delay(1000);
     
     
   }
   
   //******************************************************************Hautprogramm********************************************************
   void loop()
   {
    // listen for incoming clients
    YunClient client;// = server.accept(); 
    // LED aus wenn Client nicht verbunden
    digitalWrite(13, HIGH); 
    delay(50);
    digitalWrite(13, LOW);
    delay(300);
        //Verbindungsaufbaue wenn Client verfügbar
    if (client.connect(PLC,PORT)){
        Console.println("connected");    
      while (client.connected()) {
        //LED an wenn Connected
        digitalWrite(13, HIGH);
        
        // Zeit für Zeitliche aufruf              
         unsigned long currentMillis = millis();
         
        //  Temperaturwerte alle 2,5sec senden
         if(currentMillis - previousMillis > interval) {
            previousMillis = currentMillis; 
            TempFeuchte (client);  
         }
            
          if (irrecv.decode(&results)) {// have we received an IR signal?
             translateIR(client); 
             irrecv.resume(); // receive the next value
            }  
    
      }  
        
      
      delay(1000);
      // close the connection:
      client.stop();
      client.flush();
    
    }
     }
   
  //***********************************************
  //**     Funktion Temperatur Feuchtw           **
  //***********************************************
   
   // Temperatur und Feuchte abfragen und senden
   void TempFeuchte (YunClient client) {
   
   DHT22_ERROR_t errorCode;  
   errorCode = myDHT22.readData();  
   int value;
   String cString;
   
   switch(errorCode) 
   { 
    case DHT_ERROR_NONE:  
    value = myDHT22.getTemperatureC()*100;
    
   // Value nur senden wenn nicht 0
        if (value != 0) { 
           cString ="GV/01"+String(value,DEC);
           client.write((uint8_t*)&cString[0], cString.length());
           Console.println(cString);
         }
   
    value = myDHT22.getHumidity()*100; 
        // Value nur senden wenn nicht 0
        if (value > 0) {
           cString ="GV/02"+String(value,DEC);
           client.write((uint8_t*)&cString[0], cString.length());
           Console.println(cString);
           }
    break;
    }
   }
   
   //***********************************************
  //**     Funktion IR Empfänger                 **
  //***********************************************
  void translateIR(YunClient client) {
    String cString;
    int i;
    
    switch(results.value)
    
    {
  
    case 0x2A0:  
      Console.println("Rollo AUF");
      i=1;
      break;
  
    case 0x2A1:  
      Console.println("Rollo ZU"); 
      i=2;
      break;
  
    case 0xAA1:  
      Console.println("Rollo ZU"); 
      i=2;
      break;
  
    case 0xAA0:  
      Console.println("Rollo AUF"); 
      i=1;
      break;
    
    
    default:
      i=0; 
      //Console.println(" other button   ");
  
    }
    if(i>0) {
      Console.println(i);
      cString ="IR/"+String(i,DEC)+"/1";
      client.write((uint8_t*)&cString[0], cString.length());
      Console.println(cString);  
      delay(1000);
      cString ="IR/"+String(i,DEC)+"/0";
      client.write((uint8_t*)&cString[0], cString.length());
      Console.println(cString); 
      i=0;
    }
    
    }

Hallo
ich habe mal der Verbindungsaufbau start vereinfacht. Bin zu folgender erkenntnis gekommern.
Wenn ich keiner Verbindung zu der SPS erhalte bleibt das Arduino Programm nach ca 200 - 250 Verbindungsversuche stehen. Dies habe ich über einen Zähler an die Console ausgegeben.

Wenn Ihr das Programm auf euer Arduino Yun ladet müsste es genau so sein, da Ihr ja keine Verbindung zu den Teilbehmer erreicht.

Was ist die Ursache hierfür ???

Die Linux seite ist weite erreichbar. Ich kann auch über das Arduino 1.5.5 Programm das c++ Programm neu Hochladen.

  #include <SPI.h>
  #include <Bridge.h>
  #include <YunServer.h>
  #include <YunClient.h>
  #include <Console.h>
  
  
  // SPS Port und IP 
  #define PORT 2500
  IPAddress PLC(192,168,178,30); // PLC Address
    
  int Zaehler;
     
   void setup() {
    
    Bridge.begin();      // Sarte Bridge
    digitalWrite(13, HIGH);
    Console.begin();     // Starte Console
    delay(1000);
      
     
   }
   
   //******************************************************************Hautprogramm********************************************************
   void loop()
   {
    
    YunClient client;
    // LED aus wenn Client nicht verbunden
    digitalWrite(13, HIGH); 
    delay(50);
    digitalWrite(13, LOW);
    delay(100);
        //Verbindungsaufbaue wenn Client verfügbar
    if (client.connect(PLC,PORT)){
        Console.println("connected");  
        Zaehler = 0;  
      while (client.connected()) {
        //LED an wenn Connected
        digitalWrite(13, HIGH);
        Console.println("Datenaustausch");
        delay(2000);   
      }  
        
            delay(1000);
      Console.println("Client Stop");
      // close the connection:
      client.stop();
      client.flush();
    
    }
    delay(100);
    Zaehler = Zaehler +1;
    Console.print("keine Verbindung ");
    Console.println(Zaehler);
    
     }

Hallo
kurzes update

Versuche einen Verbindungsaufbau nur alle 3min, somit erhalte ich nur 200 Verbindungsversuche wenn das Wlan 10 Stunden aus ist.
Verbindungaufbau wird somit nachdem das Wlan über Nacht aus ist aufgebaut.

Wenn ich nur den RESET Eingang betätige Startet das Arduino nicht neu. Ich muss es erst wieder aus und einschalten.

Das tönt ganz fest nach einem Problem im Linux-Teil der Bridge. Es könnte sein, dass die Verbindung im Aufbau sind, aber nicht korrekt geschlossen werden, wenn die Arduino-Seite aufgibt. Hast Du mal versucht, das client.stop() auch in dem Fall aufzurufen, wenn keine Verbindung zustande kam?

Ja habe ich.
ich habe den client.stop() am Programmende eingefügt, das wenn keine Verbindung zu stande kommt der Befehl trotzdem ausgeführt wird.
War aber das selbe Problem.

Hallo
ich werde noch verrückt. Zwei Tage hat der Verbindungsaufbau am Morgen Funktioniert. Heute habe ich geschaut ob die Verbindung erneut aufgebaut wurde, da war die Rote LED aus, Kein Verbindungsaufbau nach WLAN ein.

Das kann doch nicht sein ???

Was hattest Du geändert, dass es für zwei Tage funktionierte?

Hallo
habe die Verzögerungszeit von

delay(100);
    Zaehler = Zaehler +1;
    Console.print("keine Verbindung ");
    Console.println(Zaehler);

auf

delay(180000);
    Zaehler = Zaehler +1;
    Console.print("keine Verbindung ");
    Console.println(Zaehler);

verändert.

Seit gestern habe ich die Zeit nochmals erhöht auf 360000ms = 6min.

Es dürfte somit etwas mit den begrenzten Resourcen des Linux-Systems auf dem Yun zu tun haben. Wenn Du länger wartest, gibst Du dem System mehr Zeit, seine Timeouts auch wirklich zu erreichen und nicht mangels freier Netzwerk-Resourcen quasi zu verhungern. Davon abgesehen hatte Dein Netzwerk wahrscheinlich auch nicht gerade Freude, dass es jede Zehntelsekunde mit einem neuen Request bombardiert wurde, wenn die SPS mal gerade nicht erreichbar war.