Netzwerk-ECHO? Arduino Mega puffert ungewollt

Guten Morgen.
Ich habe einen Arduino Mega (Controllino Maxi). Dieser steuert einen Schrottmotor von Trinamic und ein Rollo an.
Das ist u.a. auch über das Netzwerk möglich -> TCP.
Als Software für den Netzwerktest nutze ich Hercules Setup Utility.
Jetzt ist es so dass wenn ich einen Befehl sende dieser auch problemlos an den Schrottmotor weitergesendet wird wie z.B. "Fahre nach links". Dann passiert das bis der Endschalter erreicht wurde. Wurde allerdings der Endschalter Links erreicht und ich sende erneut den Befehl für "Fahre nach links" passiert nichts ABER wenn ich danach sage "Fahre nach rechts" fährt er bis zum Endschalter nach rechts und fährt dann sofort wieder nach links weil irgendwo anscheinend noch das "Fahre nach links" zwischengespeichert ist.

Ich gebe auch via Netzwerk aktuelle Meldungen auch zurück.
-Taste nach Links gedrückt
-Motor fährt nach links
-Motor ist links

Bin ich ganz links und drücke die Taste für nach links bekomme ich auch die richtige Meldung zurück und eigentlich müsste es ja dann damit getan sein. Ich leere auch den Befehlt-Puffer aber irgendwie merkt der sich das alles noch so lange bis auch der Motor den Befehl bekommen kann

Das gleiche passiert bei dem Rollo auch.

Wenn ich den Motor im "Handbetrieb" also per Tastendruck nach links fahre, bis zum Endschalter, dann wieder nach links drücke (passiert nichts), dann wieder bis zum Endschalter nach rechts fahre passiert es nicht das der Motor automatisch nach links fährt sondern nur beim Netzwerkbetrieb.

Das ist mein Netzwerkcode:

#include <SPI.h>
#include <Ethernet.h>


// Arduino Server MAC Addresse
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };       // Selbst erstellte Arduino MAC Adresse
  
IPAddress ip(169,254,230, 5);                 // Selbst erstellte Arduino IP Adresse

// Arduino server port
const int port = 23;

EthernetServer server(port);

String commandStr;                            // Zum Speichern des Befehls vom Client

SETUP

  Serial.begin(baudrate1);                                                               //Serielle Kommunikatiob beginnen
  Serial2.begin(baudrate2);


  Ethernet.begin(mac, ip);                            // Initialisierung des Ethernet-Servers
  server.begin();
 
  Serial.print("Server IP: ");                        // Ausgabe der IP-Adresse des Arduino-Servers am seriellen Monitor
  Serial.println(Ethernet.localIP());

LOOP

EthernetClient client = server.available();
       
    
    if (client.available()) {
        char c = client.read();                                                   // Zeichen bis zum Zeilenvorschub lesen
        if (c != '\n') {
            commandStr += c;                                                      // Erhaltenes Zeichen zu String-Variablen hinzufügen
        } else {
            Serial.println("Command: " + commandStr);                             // Den empfangenen Befehl am seriellen Monitor ausgeben
   
            processCommand_FERN(commandStr);                                      // Verarbeiten des empfangenen Befehls - NETZWERKBETRIEB
   
            commandStr = "";                                                      // Variable fuer den naechsten Befehl loeschen
        }
    }

Beispiel für die Ansteuerung im LOOP

  if ((digitalRead(ESRO) == LOW) && (digitalRead(MORR) == LOW))
  {                                                                                // Wenn Taster hoch gedrueckt und Endschalter oben nicht erreicht und Taster runter nicht gedrueckt und Endschalter Box zu erreicht und Motor Rollo hoch nicht aktive
    if (Fern_TARH == 1)
    {
     digitalWrite(MORH, HIGH);                                                      // Motor AN
     digitalWrite(TLRH, HIGH);                                                      // Taster-LED AN
     server.println("Rollo faehrt hoch");     

     Merker_Rollo = 1;
     Fern_TARH = 0;
    }
  }
  else
  {
    if ((digitalRead(SSPN) == LOW) || (digitalRead(SSPV) == LOW) || (digitalRead(ESRO) == HIGH))
    {                                                                              // Wenn Modus gewaechelt, Endschalter erreicht
      digitalWrite(MORH, LOW);                                                     // Motor AUS
      digitalWrite(TLRH, LOW);                                                     // Taster-LED AUS   
      Meldung_Netzwerk = 1;      

    }
  }
  if ((digitalRead(ESBA) == LOW) && (digitalRead(ESRO) == HIGH) && (digitalRead(MOBZ) == LOW))
  {                                                                                 // Wenn Taster rechts betaetigt und Endschalter Box auf nicht erreicht und Taster links nicht betaetigt und Endschalter Rollo oben erreicht und Motor Box zu nicht aktiviert
    if ((vorlauf == 0) || (vorlauf == 2))
    {                                                                               // Wenn Endschalterfehler
     if (Fern_TABA == 1)
     {
      digitalWrite(MOBA, HIGH);                                                       // Motor AN
      Motor(2 , 2, 0, 0, 150);                                                        // RECHTS AUF  motor,befehl,typ,bank,wert - MOTOR 2 da an COM 2
      server.println("Box faehrt auf");      
      Merker_Box = 2;

      digitalWrite(TLBA, HIGH);                                                       // Taster-LED AN
      Fern_TABA = 0;
     }
    }
  }
   else
  {
    if ((digitalRead(SSPN) == LOW) || (digitalRead(SSPV) == LOW) || (digitalRead(ESBA) == HIGH) || (digitalRead(ESRO) == LOW))
    {                                                                               // Wenn nicht im Normal-Modus oder nicht im Vorort-Modus oder Endschalter Box auf erreicht oder Endschalter Rollo oben nicht erreicht
      if (digitalRead(MOBA) == HIGH)                                                // Wenn Motor Box Zu AN
      {
       digitalWrite(MOBA, LOW);                                                      // Motor AUS
       Motor(2 , 3, 0, 0, 0);                                                        // STOP      motor,befehl,typ,bank,wert - MOTOR 2 da an COM 2
       //server.println("Box angehalten");

       digitalWrite(TLBA, LOW);                                                      // Taster-LED AUS
      }
    }

  }

AUSSERHALB (processCommand ist doppelt da ich einmal MIT und OHNE Netzwerkzugriff befehle zurück geben will)

// NETZWERKBEFEHLE UMWANDELN


void processCommand_FERN(String cmd)                                               // TCP Befehle umsetzten
{
    if (cmd == "RH")                                                               // Befehl Taste RH gedrueckt
    {
        char c = "";  
        Fern_TARH = 1;
        server.println("Taste >Rollo hoch< gedrueckt");

    }
    if (cmd == "RR")                                                               // Befehl Taste RR gedrueckt
    {
        char c = ""; 
        Fern_TARR = 1;
        server.println("Taste >Rollo runter< gedrueckt");

    } 
    if (cmd == "BA")                                                               // Befehl Taste BA gedrueckt
    {
        char c = ""; 
        Fern_TABA = 1;
        server.println("Taste >Box auf< gedrueckt");

    }
    if (cmd == "BZ")                                                               // Befehl Taste BZ gedrueckt
    {
        char c = ""; 
        Fern_TABZ = 1;
        server.println("Taste >Box zu< gedrueckt");

    }  
}
  


void processCommand(String cmd)                                               // TCP Befehle umsetzten
{
    if (cmd != "")                                                            // Befehl Taste RH gedrueckt
    {
        server.println("Aktuell kein Netzwerkzugriff moeglich");
    }
}

Ich hoffe mir kann jemand weiterhelfen.

Ich dachte zuerst liegt es am Schrittmotor der via RS232 angesprochen wird aber auch das Rollo welches direkt angesprochen wird hat das gleiche Problem.

Es handelt sich hierbei um ein Projekt auf einem Steckbrett also es gibt kein Rollo sondern eine LED die AN oder AUS geht.
Den Motor gibt es allerdings und ist auch am Brett bzw. Arduino dran.

Danke vorab.

Mit dieser willkürlich zerrupften Darstellung wirst Du wenig Freunde gewinnen :frowning:

Vermutlich liegt es an Deinem Code, was wann passiert obwohl es nicht soll. Mir fehlt da z.B. ein "Box faehrt zu".

Zusätzlich kann die Verwendung von String Ärger bereiten, insbesondere wegen dynamischer Speicherverwendung.

Hardware-Nahe Sketches ohne der gleichen Hardware zu debuggen ist sehr schwierig. Insbesondere wenn du nicht einen kompilierbaren Sketch zur Verfügung stellst.

Damit du leichter Fehler findest kann ich dir nur raten viel mehr Serial Debug-Ausgaben zu deinen Ifs ergänzen damit du siehst was dein Code macht (bzw. nicht macht) und im Serial.Monitor dann beobachten, weswegen bei Erreichen des einen Endschalters der Rückweg angestoßen wird

Hallo und schon mal danke für die Rückmeldung.

Der Code ist aktuell doch schon sehr lang und ich dachte dass es vielleicht reicht die eigentliches Punkte als Code einzustellen. Die eingestellten Punkte sind ja die wesentliche Funktion.

Also wie bereits erwähnt, die Funktion funktioniert ohne die Netzwerkbefehle 100% und auch wenn ich anstelle des Motors nur eine LED per digital write ansteure (wie beim Rollo)

Der Arduino reagiert auch auf die Befehle über das Netzwerk nur anscheinend speichert er die Befehle zwischen obwohl sie eigentlich ausgeführt wurden.

Als Beispiel:
Wenn der Endschalter für Box offen erreicht ist und ich trotzdem via Netzwerk die Taste für Box auffahren "drücke" bekomme ich die Rückmeldung über das Netzwerk dass ich die Taste "gedrückt" habe.
Allerdings merkt das Programm sich, dass wohl der Motor noch nicht gefahren ist und holt das nach wenn er beim anderen Endschalter angekommen ist.

Nach dem der empfangene Befehl verarbeitet wurde wird ja auch commandStr = ""; gesetzt also müsste doch da nichts mehr im Raum rumschwirren

Was benötigt ihr denn noch um mir da helfen zu können?

WAMBO:
Der Arduino reagiert auch auf die Befehle über das Netzwerk nur anscheinend speichert er die Befehle zwischen obwohl sie eigentlich ausgeführt wurden.

Annahme: nein.

Du setzt "irgendwelche" Variablen die du dann in IF's auswertest. Durch Änderung einer Variable kommst du in einen Abschnitt die dann wiederum andere Variablen berücksichtigt die noch immer gleich ist.

das ist nur ein Beispiel, muss nicht der Fehler sein:

if ((vorlauf == 0) || (vorlauf == 2))
    {                                                                               // Wenn Endschalterfehler
     if (Fern_TABA == 1)

Daher zwei Herangehensweisen:

a) ergänze Deine IF Zweige mit Serial Prints damit du einen Programmablauf mitlesen kannst. Es muss ja einen Grund geben, warum es zum Rückweg kommt. Gib deine Statusvariablen mit aus
b) mach einen Mini Sketch und konzentrier dich nur auf die Logik.

Hi noiasca, du hast Recht. Ich habe es mal mit einem gekürztem Code getestet und da gibt es Kein Problem.

#include <SPI.h>
#include <Ethernet.h>


// Arduino Server MAC Addresse
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };       // Selbst erstellte Arduino MAC Adresse
  
IPAddress ip(169,254,230, 5);                 // Selbst erstellte Arduino IP Adresse

// Arduino server port
const int port = 23;

EthernetServer server(port);

String commandStr;                            // Zum Speichern des Befehls vom Client




  int Fern_TARH = 0;    // Variable fuer Fernzugriff: TAster Rollo Hoch
  int Fern_TARR = 0;    // Variable fuer Fernzugriff: TAster Rollo Runter
  int Fern_TABZ = 0;    // Variable fuer Fernzugriff: TAster Box Zu
  int Fern_TABA = 0;    // Variable fuer Fernzugriff: TAster Box Auf


  int MORH = A6;        // MOtor Rollo Hoch
  int MORR = A8;        // MOtor Rollo Runter
  int MOBZ = A10;       // MOtor Box Zu
  int MOBA = A12;       // MOtor Box Auf



  int ESRO = A11;       // EndSchalter Rollo Oben
  int ESRU = A9;        // EndSchalter Rollo Unten
  int ESBZ = A4;        // EndSchalter Box Zu
  int ESBA = A7;        // EndSchalter Box Auf



  int baudrate1 = 9600;                                                                  // Variable fuer die Baudrate
  int baudrate2 = 9600;                                                                  // Variable fuer die Baudrate (Zweite falls abweichend zur ersten)


void setup() {
  // put your setup code here, to run once:

  pinMode(MORH, OUTPUT);     // PIN 4 (digi out) - "MOTOR": Rollo hoch
  digitalWrite(MORH, LOW);   // Ausgang beim Start auf LOW
  pinMode(MORR, OUTPUT);     // PIN 5 (digi out) - "MOTOR": Rollo runter
  digitalWrite(MORR, LOW);   // Ausgang beim Start auf LOW


  pinMode(ESRO, INPUT);      // PIN 32 (digi in) - Endschalter: Rollo oben
  digitalWrite(ESRO, LOW);   // Eingang beim Start auf LOW
  pinMode(ESRU, INPUT);      // PIN 33 (digi in) - Endschalter: Rollo unten
  digitalWrite(ESRU, LOW);   // Eingang beim Start auf LOW
  pinMode(ESBZ, INPUT);      // PIN 34 (digi in) - Endschalter: Box zu
  digitalWrite(ESBZ, LOW);   // Eingang beim Start auf LOW
  pinMode(ESBA, INPUT);      // PIN 35 (digi in) - Endschalter: Box auf
  digitalWrite(ESBA, LOW);   // Eingang beim Start auf LOW
  

  Serial.begin(baudrate1);                                                               //Serielle Kommunikatiob beginnen
  Serial1.begin(baudrate2);
  Serial2.begin(baudrate2);
  Serial3.begin(baudrate2);



  Ethernet.begin(mac, ip);                            // Initialisierung des Ethernet-Servers
  server.begin();
 
  Serial.print("Server IP: ");                        // Ausgabe der IP-Adresse des Arduino-Servers am seriellen Monitor
  Serial.println(Ethernet.localIP());



}

void loop() {
  // put your main code here, to run repeatedly:

Serial.println(commandStr);                                                   // Ausgabe der Werte am Monitor




EthernetClient client = server.available();
       
    
    if (client.available()) {
        char c = client.read();                                                   // Zeichen bis zum Zeilenvorschub lesen
        if (c != '\n') {
            commandStr += c;                                                      // Erhaltenes Zeichen zu String-Variablen hinzufügen
        } else {
            //Serial.println("Command: " + commandStr);                             // Den empfangenen Befehl am seriellen Monitor ausgeben
   
            processCommand_FERN(commandStr);                                      // Verarbeiten des empfangenen Befehls - NETZWERKBETRIEB
   
            commandStr = "";                                                      // Variable fuer den naechsten Befehl loeschen
        }
    }




if ((Fern_TARH) == 1)
{
  digitalWrite(MORH, HIGH);
  Fern_TARH = 0;
}
if ((Fern_TARR) == 1)
{
  digitalWrite(MORR, HIGH);
  Fern_TARR = 0;
}

if (digitalRead(ESRO) == HIGH)
{
  digitalWrite(MORH, LOW);
}
if (digitalRead(ESRU) == HIGH)
{
  digitalWrite(MORR, LOW);
}


}














// NETZWERKBEFEHLE UMWANDELN


void processCommand_FERN(String cmd)                                               // TCP Befehle umsetzten
{
    if (cmd == "RH")                                                               // Befehl Taste RH gedrueckt
    {
        char c = "";  
        Fern_TARH = 1;
        server.println("Taste >Rollo hoch< gedrueckt");

    }
    if (cmd == "RR")                                                               // Befehl Taste RR gedrueckt
    {
        char c = ""; 
        Fern_TARR = 1;
        server.println("Taste >Rollo runter< gedrueckt");

    } 
    if (cmd == "BA")                                                               // Befehl Taste BA gedrueckt
    {
        char c = ""; 
        Fern_TABA = 1;
        server.println("Taste >Box auf< gedrueckt");

    }
    if (cmd == "BZ")                                                               // Befehl Taste BZ gedrueckt
    {
        char c = ""; 
        Fern_TABZ = 1;
        server.println("Taste >Box zu< gedrueckt");

    }  
}

Jetzt muss ich gucken wo beim eigentlichen Code der Fehler ist.

Danke