Problemi adattamento SW da comunicazione su eth shield a board standalone ESP32,

Ciao ragazzi!

Tempo fa utilizzando Arduino Uno e la buona e vecchia ethernet shield ho creato un piccolo remoto I/O modus TCP che dialoga con un PLC. Lo sketch si basa totalmente su una libreria che si chiama mudbus.
Funziona a meraviglia quasi ininterrottamente da circa 2 anni.

Oggi mi sono deciso di passare a una scheda con WIFI e ho preso questa board con ESP32:
ESP32 Built-in OLED - Heltec WiFi Kit 32 – Robot Zero OneRobot Zero One.

Cosi, ho preso lo sketch usato nel Arduino uno con eth shield e l’ho adattato per la libreria Wifi ESP32 che si trova su Arduino.
L’ho adattata agendo cosi sui file h e cpp:

  • ethernetServer -->wiFiServer
  • ethernetClient → wiFiClient
  • Aggiunto Wifi.config per assegnare indirizzo fisso alla connessione IP del ESP32
  • sostituito vari indirizzi dei PIN per digitalWrite - analogRead, senza utilizzare i pin della parte ADC2…

Cosi modificato il sistema si compila, parte e si collega alla rete con l’indirizzo IP e la porta corretta, ma il dialogo con il PLC non funziona!. Sembra che l’ESP32 non rilevi le chiamate TCP-IP che richiede il PLC .
Ho notato che la vecchia arduino uno cona la shield ethernet se pingo ho circa 4ms, mentre con l’ESP 32 a volte arrivo anche a 230-240ms.
Sembra quasi che l’ESP32 sia lento nel riceve i pacchetti in ingresso, o forse proprio non li legge.
Aggiungendo qualche delay nel loop del file cpp sembra che qualche dato dall’ESP32 al PLC arriva, ma cmq è corrotto-errato.

Dove sbaglio? C’e qualche parametro o passaggio da impostare sul ESP32??
Qualcuno gentilmente ha qualche dritta da darmi? Grazie mille a chi mi aiuta

Non allego il mio codice poiché praticamente la mia parte è una semplice lettura/scrittura di bit su un array che viene creato da questa libreria. Allego la versione di GitHub creata per la WiFi Shield.

Occhio alla scheda ESP32 perché è abbastanza schizzinosa su molte cose.
Vai su QUESTA pagina e vedi se tutto ciò che hai collegato uno "urta la sensibilità" della scheda.
La tua scheda è diversa, ma i GPIO sono uguali. Quindi controlla di non aver collegato qualcosa su ADC2 perchè usi il WiFi, vedi se hai usato uscite dove hai solo ingressi (34 - 35- 36 - 39) ecc. ecc...

Allora…Innanzitutto grazie.

Avevi ragione, ora lo scambio dei dati è piu massivo e stabile, ma il problema purtoppo rimane.

Avevo utilizzato dei pin sotto al gruppo “ADC2” ed effettivamente dopo aver selezionato degli altri pin liberi il sistema dialoga in maniera piu efficace.

Ma per fare in modo che il mio ESP32 mandi qualche pacchetto in risposta al PLC, ho dovuto modificare la parte di programma dove si attende la ricezione dei dati… Nel file ccp della libreria mudbuswifi prendendo spunto da altri esempi ho modificato la parte if(client.available()) in if(Client) e ho aggiunto un delay di 10 ms prima del while client.available().
Senza quel delay il sistema non funziona. Se aumento il tempo il sistema peggiora, al punto tale che a 200-300 ms non si inviano più nessun pacchetto.
Qui sotto la parte del sketch originale per la Eth/WiFi shield, sotto quella modificata da me:

Originale:

//****************** Read from socket ****************
  // For Arduino 1.0
  WiFiClient client = MbServer.available();
 
if(client.available())

  {
    Reads = 1 + Reads * (Reads < 999);
    int i = 0;
    while(client.available())
    {
      ByteArray[i] = client.read();
      i++;
    }
    SetFC(ByteArray[7]);  //Byte 7 of request is FC
    if(!Active)
    {
      Active = true;
      PreviousActivityTime = millis();
      #ifdef MbDebug
        Serial.println("Mb active");
      #endif
    }
  }

Modificato:

  //****************** Read from socket ****************
  // For Arduino 1.0
  WiFiClient client = MbServer.available();
   
   if(client)
   delay(10);

  { 
    Reads = 1 + Reads * (Reads < 999);
    int i = 0;
    while(client.available())
    { 
      ByteArray[i] = client.read();
      i++;
    }
    SetFC(ByteArray[7]);  //Byte 7 of request is FC
    if(!Active)
    {
      Active = true;
      PreviousActivityTime = millis();
      #ifdef MbDebug
        Serial.println("Mb active");
      #endif
    }
  }

In questi giorni ho letto e riletto la documentazione della libreria Wi-Fi per ESP32.
Le classi client e server del Wi-Fi delle ESP32 dovrebbero lavorare alla stessa maniera della Ethernet shield dell’arduino uno...

Non capisco dove sbaglio. Spero che qualcuno di voi possa aiutarmi con qualche dritta sennò devo abbandonare il progetto...