Ankündigung

Einklappen
Keine Ankündigung bisher.

connecttcp

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #16
    Wow, danke! Werde ich heute Abend ausprobieren und berichten!
    Vielen Dank!

    Kommentar


      #17
      Zitat von DerMitdemBusSpricht Beitrag anzeigen
      Ich bekomme bei meiner Verbindung zum Raspberry immer die 1 angezeigt - wieso weiß ich nicht (raspi ist über telnet auf jedenfall noch unter der gleichen adresse erreichbar und nimmt neue Verbindungen entgegen) und vielleicht weiß jemand wie ich auch dem Zustand rauskommen kann?
      Ich denke, da musst Du mal mit dem Wireshark schauen. Nimmt der Raspi auch die Verbindung über den Port des EibPC an?
      offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
      Enertex Produkte kaufen

      Kommentar


        #18
        Die Verbindung hatte er genau einmal am Anfang gemacht - danach nicht mehr.
        Ich teste jetzt mal das neue Skript. Werde berichten.

        Kommentar


          #19
          So das neue Script macht schon was es soll. Verbindungsaufbau, Datentransfer und close sind nun voll in Ordnung.
          Das einzige was komisch war, das ich dann das ganze ein paar mal ausgeführt habe (unmittelbar hintereinander) und dann ging der Status in Fehler 2.
          Dort verweilt er nun auch gerade, von diesem Status bekomme ich ihn nun nicht mehr weg.

          Aber nachdem nun der Haupteil funktioniert werde ich nun mal probieren dies für meine Tatsächliche Anwendung umzusetzen (EWL21 und Ultraschall Modul für Zisterne).

          Vielen Dank!

          Kommentar


            #20
            Baue bei unmittelbaren Mehrfachaufrufen unbedingt eine after() Funktion ein

            if after (Raspy_Query_State == Raspy_Query_State_Idle, 5000u64) then Raspy_Starbedingung = EIN endif

            Damit verhinderst Du das sich die einzelnen Zwischenschritte des Prozesses gegenseitig beeinflußen.
            Zuletzt geändert von Jambala; 29.04.2015, 18:02.

            Kommentar


              #21
              Werde ich probieren, danke. Zwischenzeitlich habe ich nun auch den Pi dahin gebracht das er mir das schickt was ich möchte.
              Ich denke das Projekt ist sicherlich auch für den ein oder anderen Interessant und werde es nach Abschluss mal in einem separaten Thread posten.

              Kommentar


                #22
                So, ich denke ich brauche nun doch noch mal Hilfe.
                Also dein Script funktioniert wunderbar. Allerdings ist das Ergebniss noch nicht so wie ich es gerne hätte...
                1. Nachdem die Verbindung entgegen genommen wurde schickt mir die Gegenstelle einen "Hello Welcome...." String den ich auch sehe.
                2. Nun muss ich ein Zeichen schicken mit CRLF -> Da wäre meine erste Frage: bei c1400 wird der doch schon automatisch mit angehangen!?
                3. Also nächstes schickt mir die Gegenstelle einen Wert welche ich verweden möchte.
                4. Verbindungs abbau.

                (Im weiteren möchte ich gerne Schritt 2. und 3. gerne 5mal im Abstand von 1 sec. machen und davon den Mittelwert bilden)

                So siehts aus - aber funktioniert noch nicht:
                Code:
                Raspy_Send_String = $R$c1400
                
                // TCP Verbindung öffnen, sofern sie nicht bereits hergestellt wird oder bereits besteht
                
                if change(Raspy_Startbedingung) and (Raspy_Startbedingung==EIN and Raspy_TCP_ConnectionState >= 2u08) then \\
                Raspy_TCP_ConnectionState = connecttcp(Raspy_Port_int, Raspy_IP_int); LogTxtHaus=$ConnectTCP Ausgeführt$ \\
                endif
                
                // Welcome Text abholen und ignorieren
                if change(Raspy_TCP_ConnectionState) \\
                and Raspy_TCP_ConnectionState == 0u08 then \\
                readtcp(Raspy_Port_int, Raspy_IP_int, Raspy_RawData); \\
                Raspy_Receive_String = Raspy_RawData \\
                endif
                
                // Wenn TCP Verbindung besteht und Startfreigabe besteht Anfrage senden
                
                if change(Raspy_TCP_ConnectionState) \\
                and Raspy_TCP_ConnectionState == 0u08 then \\
                sendtcp(Raspy_Port_int, Raspy_IP_int, Raspy_Send_String); \\
                Raspy_Query_State = Raspy_Query_State_QueryStarted \\
                endif
                
                
                // Fehlerhafte TCP Verbindung verzögert erneut aufbauen
                
                if change(Raspy_TCP_ConnectionState) \\
                and Raspy_TCP_ConnectionState >= 2u08 \\
                and Raspy_TCP_ConnectionState <= 6u08 \\
                and Raspy_TCP_Error_Counter <= 5u08 then \\
                Raspy_Init = EIN \\
                endif
                
                // Empfang der TCP Daten
                
                if event(readtcp(Raspy_Port_int, Raspy_IP_int, Raspy_RawData)) \\
                and Raspy_TCP_ConnectionState == 0u08 then\\
                Raspy_Receive_String = Raspy_RawData; \\
                Raspy_Query_State = Raspy_Query_State_QuerySuccess; \\
                endif
                
                // Daten auf Gültigkeit prüfen 'Welcome to...'
                if change (Raspy_Receive_String) then StringPos=find(Raspy_Receive_String,$to$,1u16) endif
                if (StringPos==EOS) then Level=convert(Raspy_Receive_String,0.0) endif
                
                
                // TCP Verbindung schliessen
                
                if after(Raspy_Query_State == Raspy_Query_State_QuerySuccess, 3000u64) \\
                and (Raspy_TCP_ConnectionState == 0u08 \\
                or Raspy_TCP_ConnectionState == 1u08) then \\
                closetcp(Raspy_Port_int, Raspy_IP_int); \\
                Raspy_TCP_ConnectionState = 7u08; \\
                Raspy_Query_State = Raspy_Query_State_Idle \\
                Vielen Dank!

                Kommentar


                  #23
                  grob geht das so. Timing und Details muß Du selbst anpassen. Abfragen auf 1sec Basis würde ich nicht unbedingt machen.


                  Raspy_Send_String = $R$c1400
                  Raspy_ACK_String = $????????$
                  Raspy_CRLF = $$

                  // TCP Verbindung öffnen, sofern sie nicht bereits hergestellt wird oder bereits besteht

                  if change(Raspy_Startbedingung) and (Raspy_Startbedingung==EIN and Raspy_TCP_ConnectionState >= 2u08) then \\
                  Raspy_TCP_ConnectionState = connecttcp(Raspy_Port_int, Raspy_IP_int); LogTxtHaus=$ConnectTCP Ausgeführt$ \\
                  endif

                  // Welcome Text abholen und ignorieren
                  if change(Raspy_TCP_ConnectionState) \\
                  and Raspy_TCP_ConnectionState == 0u08 then \\
                  readtcp(Raspy_Port_int, Raspy_IP_int, Raspy_RawData); \\
                  Raspy_Receive_String = Raspy_RawData \\
                  endif

                  // Wenn TCP Verbindung besteht und Startfreigabe besteht Anfrage senden

                  if change(Raspy_TCP_ConnectionState) \\
                  and Raspy_TCP_ConnectionState == 0u08 then \\
                  sendtcp(Raspy_Port_int, Raspy_IP_int, Raspy_Send_String); \\
                  Raspy_Query_State = Raspy_Query_State_QueryStarted \\
                  endif

                  // Fehlerhafte TCP Verbindung verzögert erneut aufbauen

                  if change(Raspy_TCP_ConnectionState) \\
                  and Raspy_TCP_ConnectionState >= 2u08 \\
                  and Raspy_TCP_ConnectionState <= 6u08 \\
                  and Raspy_TCP_Error_Counter <= 5u08 then \\
                  Raspy_Init = EIN \\
                  endif

                  // Empfang der 1. TCP Daten

                  if event(readtcp(Raspy_Port_int, Raspy_IP_int, Raspy_RawData)) \\
                  and Raspy_TCP_ConnectionState == 0u08 then\\
                  Raspy_Receive_String1 = Raspy_RawData \\
                  endif

                  // Daten auf Gültigkeit prüfen 'Welcome to...'
                  if change (Raspy_Receive_String) then \\
                  StringPos=find(Raspy_Receive_String,$to$,1u16) \\
                  endif
                  if (StringPos==EOS) then \\
                  ˜Level=convert(Raspy_Receive_String,0.0) \\
                  else Raspy_ACK = EIN \\
                  endif

                  // 'Welcome to...' bestätigen
                  if Raspy_ACK == EIN then \\
                  sendtcp(Raspy_Port_int, Raspy_IP_int, Raspy_ACK_String + Raspy_CRLF);\\
                  Raspy_ACK = AUS \\
                  endif

                  // Empfang der 2. TCP Daten

                  if event(readtcp(Raspy_Port_int, Raspy_IP_int, Raspy_RawData)) \\
                  and Raspy_TCP_ConnectionState == 0u08 then\\
                  Raspy_Receive_String2 = Raspy_RawData; \\
                  Raspy_Query_State = Raspy_Query_State_QuerySuccess; \\
                  endif

                  // TCP Verbindung schliessen

                  if after(Raspy_Query_State == Raspy_Query_State_QuerySuccess, 3000u64) \\
                  and (Raspy_TCP_ConnectionState == 0u08 \\
                  or Raspy_TCP_ConnectionState == 1u08) then \\
                  closetcp(Raspy_Port_int, Raspy_IP_int); \\
                  Raspy_TCP_ConnectionState = 7u08; \\
                  Raspy_Query_State = Raspy_Query_State_Idle \\

                  Kommentar


                    #24
                    Schon mal vielen Dank für deine Hilfe. Ich sehe das nun die Zeichkette nach dem Empfang der Welcome Nachricht offensichtlich nicht verschickt wird.
                    Deshalb noch mal die Nachfrage nach dem CRLF -> ist da ein $$ ausreichend?
                    Danke!

                    Kommentar


                      #25
                      in meinem bisherigen Makros funktioniert das genau so

                      Kommentar


                        #26
                        Ich habe gestern noch mal einige Zeit investiert um da neue Erkenntnisse zu bekommen - und ehrlich gesagt, ich bekomme es nicht auf die Palette ;-)
                        Fakt ist, die Verbindung wird aufgebaut und der Welcome String wird entgegengenommen. Aber noch bevor er den String raussendet (als ACK) baut er anscheinend noch mal eine Verbindung auf, denn das Ergebnis ist wieder die gleiche Welcome Nachricht. Ich werde das heute Abend noch mal Prüfen indem ich schaue wie Viele Verbindungen auf der Server Seite her aufgemacht werden. Aber wieso und weshalb erschließt sich mir nicht...

                        Kommentar


                          #27
                          Dann baue Dir einfach bei jedem wichtigen Code Abschnitt Counter und Buffer ein. So findest Du Kommunikations- oder Timing-Probleme meistens schnell.
                          Also z.B. im Code Block des Verbindungsaufbaus:

                          Counter1 = Counter1 + 1u08 -> so kannst Du über den Debugger immer abfragen wie oft der Teilprozess schon aktiv war.
                          Buffer1 = Buffer1 + Counter1 + $: $ + Status + $; $ -> so kannst Du den aktuellen Status (Zustand der Verbindung, Sendewert, Empfangswert) leicht loggen

                          Wenn Du dies in alle wesentlichen Codeblöcke einbaust, kannst Du über den Debugger beobachten was live passiert.

                          Das geht natürlich auch über den Einbau von UDP Nachrichten, aber wenn es nur der temporären Fehlersuche dient, gehe ich so immer vor.

                          Kommentar


                            #28
                            Probiere ich aus, danke!

                            Kommentar


                              #29
                              Kleines Update von meiner Seite:
                              Also der Einsatz der Counter war ein guter Tip und hat meine Theorie auch bestätigt: es wurden hintereinander TCP Connect ausgeführt und deshalb habe ich die Werte nicht sehen können. Ich bin nun also einen schritt weiter. Die Lösung lag darin, unmittelbar nach dem ersten lesen den String zu senden und dann kommt auch sofort ein Wert.
                              Leider habe ich noch ein Problem mit der convert() funktion, ich denke das bekomme ich aber noch hin.
                              Wenn das ganze Funktioniert poste ich nochmal den modifizierten kompletten Quelltext.
                              Danke!

                              Kommentar

                              Lädt...
                              X